From 181838168c8845c4f8148de715023f24fb244ac8 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 2 Aug 2021 11:31:04 +0100 Subject: [PATCH 001/441] Fix resetting TimestampAdjuster with DO_NOT_OFFSET Prior to this change, an initalized TimestampAdjuster that's then reset with DO_NOT_OFFSET would incorrectly continue to apply the offset. Also add a test case for this issue, and for some other simple use cases. #minor-release PiperOrigin-RevId: 388182645 --- .../exoplayer2/util/TimestampAdjuster.java | 18 ++-- .../util/TimestampAdjusterTest.java | 84 +++++++++++++++++++ 2 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java index a76cf9b512..a19bc9fd74 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java @@ -53,8 +53,7 @@ public final class TimestampAdjuster { * microseconds, or {@link #DO_NOT_OFFSET} if timestamps should not be offset. */ public TimestampAdjuster(long firstSampleTimestampUs) { - this.firstSampleTimestampUs = firstSampleTimestampUs; - lastSampleTimestampUs = C.TIME_UNSET; + reset(firstSampleTimestampUs); } /** @@ -80,18 +79,18 @@ public final class TimestampAdjuster { * * * @param canInitialize Whether the caller is able to initialize the adjuster, if needed. - * @param startTimeUs The desired first sample timestamp of the caller, in microseconds. Only used - * if {@code canInitialize} is {@code true}. + * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp in + * microseconds. Only used if {@code canInitialize} is {@code true}. * @throws InterruptedException If the thread is interrupted whilst blocked waiting for * initialization to complete. */ - public synchronized void sharedInitializeOrWait(boolean canInitialize, long startTimeUs) - throws InterruptedException { + public synchronized void sharedInitializeOrWait( + boolean canInitialize, long firstSampleTimestampUs) throws InterruptedException { if (canInitialize && !sharedInitializationStarted) { - firstSampleTimestampUs = startTimeUs; + reset(firstSampleTimestampUs); sharedInitializationStarted = true; } - if (!canInitialize || startTimeUs != firstSampleTimestampUs) { + if (!canInitialize || this.firstSampleTimestampUs != firstSampleTimestampUs) { while (lastSampleTimestampUs == C.TIME_UNSET) { wait(); } @@ -134,7 +133,7 @@ public final class TimestampAdjuster { } /** - * Resets the instance to its initial state. + * Resets the instance. * * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp after * this reset, in microseconds, or {@link #DO_NOT_OFFSET} if timestamps should not be offset. @@ -142,6 +141,7 @@ public final class TimestampAdjuster { public synchronized void reset(long firstSampleTimestampUs) { this.firstSampleTimestampUs = firstSampleTimestampUs; lastSampleTimestampUs = C.TIME_UNSET; + timestampOffsetUs = 0; sharedInitializationStarted = false; } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java new file mode 100644 index 0000000000..f509e294ec --- /dev/null +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.util; + +import static com.google.android.exoplayer2.util.TimestampAdjuster.DO_NOT_OFFSET; +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for {@link TimestampAdjuster}. */ +@RunWith(AndroidJUnit4.class) +public class TimestampAdjusterTest { + + @Test + public void adjustSampleTimestamp_fromZero() { + TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); + long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); + long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); + + assertThat(firstAdjustedTimestampUs).isEqualTo(0); + assertThat(secondAdjustedTimestampUs).isEqualTo(4000); + } + + @Test + public void adjustSampleTimestamp_fromNonZero() { + TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 1000); + long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); + long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); + + assertThat(firstAdjustedTimestampUs).isEqualTo(1000); + assertThat(secondAdjustedTimestampUs).isEqualTo(5000); + } + + @Test + public void adjustSampleTimestamp_doNotOffset() { + TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ DO_NOT_OFFSET); + long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); + long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); + + assertThat(firstAdjustedTimestampUs).isEqualTo(2000); + assertThat(secondAdjustedTimestampUs).isEqualTo(6000); + } + + @Test + public void adjustSampleTimestamp_afterResetToNotOffset() { + TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); + // Let the adjuster establish an offset, to make sure that reset really clears it. + adjuster.adjustSampleTimestamp(/* timeUs= */ 1000); + adjuster.reset(/* firstSampleTimestampUs= */ DO_NOT_OFFSET); + long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); + long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); + + assertThat(firstAdjustedTimestampUs).isEqualTo(2000); + assertThat(secondAdjustedTimestampUs).isEqualTo(6000); + } + + @Test + public void adjustSampleTimestamp_afterResetToDifferentStartTime() { + TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); + // Let the adjuster establish an offset, to make sure that reset really clears it. + adjuster.adjustSampleTimestamp(/* timeUs= */ 1000); + adjuster.reset(/* firstSampleTimestampUs= */ 5000); + long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); + long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); + + assertThat(firstAdjustedTimestampUs).isEqualTo(5000); + assertThat(secondAdjustedTimestampUs).isEqualTo(9000); + } +} From ce7c04fac14ef29161a7570c69626d7355e098d2 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 2 Aug 2021 12:11:42 +0100 Subject: [PATCH 002/441] Move setFrameRate calls into wrapper class PiperOrigin-RevId: 388187294 --- .../video/VideoFrameReleaseHelper.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java index 524460ab7a..aee8376333 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java @@ -27,6 +27,7 @@ import android.view.Choreographer.FrameCallback; import android.view.Display; import android.view.Surface; import android.view.WindowManager; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -346,7 +347,7 @@ public final class VideoFrameReleaseHelper { return; } this.surfacePlaybackFrameRate = surfacePlaybackFrameRate; - setSurfaceFrameRateV30(surface, surfacePlaybackFrameRate); + SurfaceApi30.setFrameRate(surface, surfacePlaybackFrameRate); } /** Clears the frame-rate of the current {@link #surface}. */ @@ -355,20 +356,7 @@ public final class VideoFrameReleaseHelper { return; } surfacePlaybackFrameRate = 0; - setSurfaceFrameRateV30(surface, /* frameRate= */ 0); - } - - @RequiresApi(30) - private static void setSurfaceFrameRateV30(Surface surface, float frameRate) { - int compatibility = - frameRate == 0 - ? Surface.FRAME_RATE_COMPATIBILITY_DEFAULT - : Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE; - try { - surface.setFrameRate(frameRate, compatibility); - } catch (IllegalStateException e) { - Log.e(TAG, "Failed to call Surface.setFrameRate", e); - } + SurfaceApi30.setFrameRate(surface, /* frameRate= */ 0); } // Display refresh rate and vsync logic. @@ -417,6 +405,24 @@ public final class VideoFrameReleaseHelper { return displayHelper; } + // Nested classes. + + @RequiresApi(30) + private static final class SurfaceApi30 { + @DoNotInline + public static void setFrameRate(Surface surface, float frameRate) { + int compatibility = + frameRate == 0 + ? Surface.FRAME_RATE_COMPATIBILITY_DEFAULT + : Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE; + try { + surface.setFrameRate(frameRate, compatibility); + } catch (IllegalStateException e) { + Log.e(TAG, "Failed to call Surface.setFrameRate", e); + } + } + } + /** Helper for listening to changes to the default display. */ private interface DisplayHelper { From f7262121808c1f3d734a299ac50d99742afd13bc Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 2 Aug 2021 16:36:52 +0100 Subject: [PATCH 003/441] Simplify TimestampAdjuster logic - Use timestampOffsetUs == C.TIME_UNSET directly as the way of determining whether the adjuster has determined the offset, rather than relying on lastSampleTimestampUs checks for this. - Remove comment referring to lastSampleTimestampUs as holding the "adjusted PTS". Its value may not have originated from a PTS timestamp. It's also confusing to refer to it as "adjusted" given timestampOffsetUs has not been applied to it. - Fix PassthroughSectionPayloadReader to make sure it'll never output a sample with an unset timestamp. #minor-release PiperOrigin-RevId: 388226180 --- .../exoplayer2/util/TimestampAdjuster.java | 47 +++++++------------ .../ts/PassthroughSectionPayloadReader.java | 12 ++--- .../source/hls/TimestampAdjusterProvider.java | 5 +- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java index a19bc9fd74..cb7edd527b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java @@ -46,7 +46,7 @@ public final class TimestampAdjuster { private long timestampOffsetUs; @GuardedBy("this") - private long lastSampleTimestampUs; + private long lastUnadjustedTimestampUs; /** * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp in @@ -91,7 +91,7 @@ public final class TimestampAdjuster { sharedInitializationStarted = true; } if (!canInitialize || this.firstSampleTimestampUs != firstSampleTimestampUs) { - while (lastSampleTimestampUs == C.TIME_UNSET) { + while (timestampOffsetUs == C.TIME_UNSET) { wait(); } } @@ -108,28 +108,21 @@ public final class TimestampAdjuster { /** * Returns the last value obtained from {@link #adjustSampleTimestamp}. If {@link * #adjustSampleTimestamp} has not been called, returns the result of calling {@link - * #getFirstSampleTimestampUs()}. If this value is {@link #DO_NOT_OFFSET}, returns {@link - * C#TIME_UNSET}. + * #getFirstSampleTimestampUs()} unless that value is {@link #DO_NOT_OFFSET}, in which case {@link + * C#TIME_UNSET} is returned. */ public synchronized long getLastAdjustedTimestampUs() { - return lastSampleTimestampUs != C.TIME_UNSET - ? (lastSampleTimestampUs + timestampOffsetUs) + return lastUnadjustedTimestampUs != C.TIME_UNSET + ? lastUnadjustedTimestampUs + timestampOffsetUs : firstSampleTimestampUs != DO_NOT_OFFSET ? firstSampleTimestampUs : C.TIME_UNSET; } /** - * Returns the offset between the input of {@link #adjustSampleTimestamp(long)} and its output. If - * {@link #DO_NOT_OFFSET} was provided to the constructor, 0 is returned. If the timestamp - * adjuster is yet not initialized, {@link C#TIME_UNSET} is returned. - * - * @return The offset between {@link #adjustSampleTimestamp(long)}'s input and output. {@link - * C#TIME_UNSET} if the adjuster is not yet initialized and 0 if timestamps should not be - * offset. + * Returns the offset between the input of {@link #adjustSampleTimestamp(long)} and its output, or + * {@link C#TIME_UNSET} if the offset has not yet been determined. */ public synchronized long getTimestampOffsetUs() { - return firstSampleTimestampUs == DO_NOT_OFFSET - ? 0 - : lastSampleTimestampUs == C.TIME_UNSET ? C.TIME_UNSET : timestampOffsetUs; + return timestampOffsetUs; } /** @@ -140,8 +133,8 @@ public final class TimestampAdjuster { */ public synchronized void reset(long firstSampleTimestampUs) { this.firstSampleTimestampUs = firstSampleTimestampUs; - lastSampleTimestampUs = C.TIME_UNSET; - timestampOffsetUs = 0; + timestampOffsetUs = firstSampleTimestampUs == DO_NOT_OFFSET ? 0 : C.TIME_UNSET; + lastUnadjustedTimestampUs = C.TIME_UNSET; sharedInitializationStarted = false; } @@ -155,10 +148,10 @@ public final class TimestampAdjuster { if (pts90Khz == C.TIME_UNSET) { return C.TIME_UNSET; } - if (lastSampleTimestampUs != C.TIME_UNSET) { + if (lastUnadjustedTimestampUs != C.TIME_UNSET) { // The wrap count for the current PTS may be closestWrapCount or (closestWrapCount - 1), // and we need to snap to the one closest to lastSampleTimestampUs. - long lastPts = usToNonWrappedPts(lastSampleTimestampUs); + long lastPts = usToNonWrappedPts(lastUnadjustedTimestampUs); long closestWrapCount = (lastPts + (MAX_PTS_PLUS_ONE / 2)) / MAX_PTS_PLUS_ONE; long ptsWrapBelow = pts90Khz + (MAX_PTS_PLUS_ONE * (closestWrapCount - 1)); long ptsWrapAbove = pts90Khz + (MAX_PTS_PLUS_ONE * closestWrapCount); @@ -180,18 +173,12 @@ public final class TimestampAdjuster { if (timeUs == C.TIME_UNSET) { return C.TIME_UNSET; } - // Record the adjusted PTS to adjust for wraparound next time. - if (lastSampleTimestampUs != C.TIME_UNSET) { - lastSampleTimestampUs = timeUs; - } else { - if (firstSampleTimestampUs != DO_NOT_OFFSET) { - // Calculate the timestamp offset. - timestampOffsetUs = firstSampleTimestampUs - timeUs; - } - lastSampleTimestampUs = timeUs; - // Notify threads waiting for this adjuster to be initialized. + if (timestampOffsetUs == C.TIME_UNSET) { + timestampOffsetUs = firstSampleTimestampUs - timeUs; + // Notify threads waiting for the timestamp offset to be determined. notifyAll(); } + lastUnadjustedTimestampUs = timeUs; return timeUs + timestampOffsetUs; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PassthroughSectionPayloadReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PassthroughSectionPayloadReader.java index 72667e2a3f..111cfd8750 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PassthroughSectionPayloadReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PassthroughSectionPayloadReader.java @@ -62,9 +62,10 @@ public final class PassthroughSectionPayloadReader implements SectionPayloadRead @Override public void consume(ParsableByteArray sectionData) { assertInitialized(); + long sampleTimestampUs = timestampAdjuster.getLastAdjustedTimestampUs(); long subsampleOffsetUs = timestampAdjuster.getTimestampOffsetUs(); - if (subsampleOffsetUs == C.TIME_UNSET) { - // Don't output samples without a known subsample offset. + if (sampleTimestampUs == C.TIME_UNSET || subsampleOffsetUs == C.TIME_UNSET) { + // Don't output samples without a known sample timestamp and subsample offset. return; } if (subsampleOffsetUs != format.subsampleOffsetUs) { @@ -73,12 +74,7 @@ public final class PassthroughSectionPayloadReader implements SectionPayloadRead } int sampleSize = sectionData.bytesLeft(); output.sampleData(sectionData, sampleSize); - output.sampleMetadata( - timestampAdjuster.getLastAdjustedTimestampUs(), - C.BUFFER_FLAG_KEY_FRAME, - sampleSize, - 0, - null); + output.sampleMetadata(sampleTimestampUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); } @EnsuresNonNull({"timestampAdjuster", "output"}) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java index 9249bec7a5..0509376f72 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.source.hls; import android.util.SparseArray; +import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.TimestampAdjuster; /** Provides {@link TimestampAdjuster} instances for use during HLS playbacks. */ @@ -37,9 +38,9 @@ public final class TimestampAdjusterProvider { * @return A {@link TimestampAdjuster}. */ public TimestampAdjuster getAdjuster(int discontinuitySequence) { - TimestampAdjuster adjuster = timestampAdjusters.get(discontinuitySequence); + @Nullable TimestampAdjuster adjuster = timestampAdjusters.get(discontinuitySequence); if (adjuster == null) { - adjuster = new TimestampAdjuster(TimestampAdjuster.DO_NOT_OFFSET); + adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); timestampAdjusters.put(discontinuitySequence, adjuster); } return adjuster; From 401361219432192622d7f0128f40d3770a9d136f Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 2 Aug 2021 18:58:10 +0100 Subject: [PATCH 004/441] HLS: Avoid stuck-buffering issues Issue: #8850 Issue: #9153 #minor-release PiperOrigin-RevId: 388257563 --- RELEASENOTES.md | 8 +- .../exoplayer2/util/TimestampAdjuster.java | 109 +++++++++++------- .../util/TimestampAdjusterTest.java | 11 +- .../source/hls/TimestampAdjusterProvider.java | 4 +- 4 files changed, 80 insertions(+), 52 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a0dbfe8c15..e59c861854 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -106,9 +106,13 @@ * Deprecate `setControlDispatcher` in `PlayerView`, `StyledPlayerView`, `PlayerControlView`, `StyledPlayerControlView` and `PlayerNotificationManager`. +* HLS: + * Fix issue that could cause some playbacks to be stuck buffering + ([#8850](https://github.com/google/ExoPlayer/issues/8850), + [#9153](https://github.com/google/ExoPlayer/issues/9153)). * Extractors: * Add support for DTS-UHD in MP4 - ([#9163](https://github.com/google/ExoPlayer/issues/9163). + ([#9163](https://github.com/google/ExoPlayer/issues/9163)). * Text: * TTML: Inherit the `rubyPosition` value from a containing `` element. @@ -167,7 +171,7 @@ * Add support for multiple base URLs and DVB attributes in the manifest. Apps that are using `DefaultLoadErrorHandlingPolicy` with such manifests have base URL fallback automatically enabled - ([#771](https://github.com/google/ExoPlayer/issues/771) and + ([#771](https://github.com/google/ExoPlayer/issues/771), [#7654](https://github.com/google/ExoPlayer/issues/7654)). * HLS: * Fix issue where playback of a live event could become stuck rather than diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java index cb7edd527b..1f5da87a59 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java @@ -19,16 +19,32 @@ import androidx.annotation.GuardedBy; import com.google.android.exoplayer2.C; /** - * Offsets timestamps according to an initial sample timestamp offset. MPEG-2 TS timestamps scaling - * and adjustment is supported, taking into account timestamp rollover. + * Adjusts and offsets sample timestamps. MPEG-2 TS timestamps scaling and adjustment is supported, + * taking into account timestamp rollover. */ public final class TimestampAdjuster { /** * A special {@code firstSampleTimestampUs} value indicating that presentation timestamps should - * not be offset. + * not be offset. In this mode: + * + *
    + *
  • {@link #getFirstSampleTimestampUs()} will always return {@link C#TIME_UNSET}. + *
  • The only timestamp adjustment performed is to account for MPEG-2 TS timestamp rollover. + *
*/ - public static final long DO_NOT_OFFSET = Long.MAX_VALUE; + public static final long MODE_NO_OFFSET = Long.MAX_VALUE; + + /** + * A special {@code firstSampleTimestampUs} value indicating that the adjuster will be shared by + * multiple threads. In this mode: + * + *
    + *
  • {@link #getFirstSampleTimestampUs()} will always return {@link C#TIME_UNSET}. + *
  • Calling threads must call {@link #sharedInitializeOrWait} prior to adjusting timestamps. + *
+ */ + public static final long MODE_SHARED = Long.MAX_VALUE - 1; /** * The value one greater than the largest representable (33 bit) MPEG-2 TS 90 kHz clock @@ -36,9 +52,6 @@ public final class TimestampAdjuster { */ private static final long MAX_PTS_PLUS_ONE = 0x200000000L; - @GuardedBy("this") - private boolean sharedInitializationStarted; - @GuardedBy("this") private long firstSampleTimestampUs; @@ -48,11 +61,19 @@ public final class TimestampAdjuster { @GuardedBy("this") private long lastUnadjustedTimestampUs; + /** + * Next sample timestamps for calling threads in shared mode when {@link #timestampOffsetUs} has + * not yet been set. + */ + private final ThreadLocal nextSampleTimestampUs; + /** * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp in - * microseconds, or {@link #DO_NOT_OFFSET} if timestamps should not be offset. + * microseconds, or {@link #MODE_NO_OFFSET} if timestamps should not be offset, or {@link + * #MODE_SHARED} if the adjuster will be used in shared mode. */ public TimestampAdjuster(long firstSampleTimestampUs) { + nextSampleTimestampUs = new ThreadLocal<>(); reset(firstSampleTimestampUs); } @@ -60,37 +81,33 @@ public final class TimestampAdjuster { * For shared timestamp adjusters, performs necessary initialization actions for a caller. * *
    - *
  • If the adjuster does not yet have a target {@link #getFirstSampleTimestampUs first sample - * timestamp} and if {@code canInitialize} is {@code true}, then initialization is started - * by setting the target first sample timestamp to {@code firstSampleTimestampUs}. The call - * returns, allowing the caller to proceed. Initialization completes when a caller adjusts - * the first timestamp. - *
  • If {@code canInitialize} is {@code true} and the adjuster already has a target {@link - * #getFirstSampleTimestampUs first sample timestamp}, then the call returns to allow the - * caller to proceed only if {@code firstSampleTimestampUs} is equal to the target. This - * ensures a caller that's previously started initialization can continue to proceed. It - * also allows other callers with the same {@code firstSampleTimestampUs} to proceed, since - * in this case it doesn't matter which caller adjusts the first timestamp to complete - * initialization. - *
  • If {@code canInitialize} is {@code false} or if {@code firstSampleTimestampUs} differs - * from the target {@link #getFirstSampleTimestampUs first sample timestamp}, then the call - * blocks until initialization completes. If initialization has already been completed the - * call returns immediately. + *
  • If the adjuster has already established a {@link #getTimestampOffsetUs timestamp offset} + * then this method is a no-op. + *
  • If {@code canInitialize} is {@code true} and the adjuster has not yet established a + * timestamp offset, then the adjuster records the desired first sample timestamp for the + * calling thread and returns to allow the caller to proceed. If the timestamp offset has + * still not been established when the caller attempts to adjust its first timestamp, then + * the recorded timestamp is used to set it. + *
  • If {@code canInitialize} is {@code false} and the adjuster has not yet established a + * timestamp offset, then the call blocks until the timestamp offset is set. *
* * @param canInitialize Whether the caller is able to initialize the adjuster, if needed. - * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp in - * microseconds. Only used if {@code canInitialize} is {@code true}. + * @param nextSampleTimestampUs The desired timestamp for the next sample loaded by the calling + * thread, in microseconds. Only used if {@code canInitialize} is {@code true}. * @throws InterruptedException If the thread is interrupted whilst blocked waiting for * initialization to complete. */ - public synchronized void sharedInitializeOrWait( - boolean canInitialize, long firstSampleTimestampUs) throws InterruptedException { - if (canInitialize && !sharedInitializationStarted) { - reset(firstSampleTimestampUs); - sharedInitializationStarted = true; - } - if (!canInitialize || this.firstSampleTimestampUs != firstSampleTimestampUs) { + public synchronized void sharedInitializeOrWait(boolean canInitialize, long nextSampleTimestampUs) + throws InterruptedException { + Assertions.checkState(firstSampleTimestampUs == MODE_SHARED); + if (timestampOffsetUs != C.TIME_UNSET) { + // Already initialized. + return; + } else if (canInitialize) { + this.nextSampleTimestampUs.set(nextSampleTimestampUs); + } else { + // Wait for another calling thread to complete initialization. while (timestampOffsetUs == C.TIME_UNSET) { wait(); } @@ -99,22 +116,22 @@ public final class TimestampAdjuster { /** * Returns the value of the first adjusted sample timestamp in microseconds, or {@link - * #DO_NOT_OFFSET} if timestamps will not be offset. + * C#TIME_UNSET} if timestamps will not be offset or if the adjuster is in shared mode. */ public synchronized long getFirstSampleTimestampUs() { - return firstSampleTimestampUs; + return firstSampleTimestampUs == MODE_NO_OFFSET || firstSampleTimestampUs == MODE_SHARED + ? C.TIME_UNSET + : firstSampleTimestampUs; } /** - * Returns the last value obtained from {@link #adjustSampleTimestamp}. If {@link - * #adjustSampleTimestamp} has not been called, returns the result of calling {@link - * #getFirstSampleTimestampUs()} unless that value is {@link #DO_NOT_OFFSET}, in which case {@link - * C#TIME_UNSET} is returned. + * Returns the last adjusted timestamp, in microseconds. If no timestamps have been adjusted yet + * then the result of {@link #getFirstSampleTimestampUs()} is returned. */ public synchronized long getLastAdjustedTimestampUs() { return lastUnadjustedTimestampUs != C.TIME_UNSET ? lastUnadjustedTimestampUs + timestampOffsetUs - : firstSampleTimestampUs != DO_NOT_OFFSET ? firstSampleTimestampUs : C.TIME_UNSET; + : getFirstSampleTimestampUs(); } /** @@ -129,13 +146,13 @@ public final class TimestampAdjuster { * Resets the instance. * * @param firstSampleTimestampUs The desired value of the first adjusted sample timestamp after - * this reset, in microseconds, or {@link #DO_NOT_OFFSET} if timestamps should not be offset. + * this reset in microseconds, or {@link #MODE_NO_OFFSET} if timestamps should not be offset, + * or {@link #MODE_SHARED} if the adjuster will be used in shared mode. */ public synchronized void reset(long firstSampleTimestampUs) { this.firstSampleTimestampUs = firstSampleTimestampUs; - timestampOffsetUs = firstSampleTimestampUs == DO_NOT_OFFSET ? 0 : C.TIME_UNSET; + timestampOffsetUs = firstSampleTimestampUs == MODE_NO_OFFSET ? 0 : C.TIME_UNSET; lastUnadjustedTimestampUs = C.TIME_UNSET; - sharedInitializationStarted = false; } /** @@ -174,7 +191,11 @@ public final class TimestampAdjuster { return C.TIME_UNSET; } if (timestampOffsetUs == C.TIME_UNSET) { - timestampOffsetUs = firstSampleTimestampUs - timeUs; + long desiredSampleTimestampUs = + firstSampleTimestampUs == MODE_SHARED + ? Assertions.checkNotNull(nextSampleTimestampUs.get()) + : firstSampleTimestampUs; + timestampOffsetUs = desiredSampleTimestampUs - timeUs; // Notify threads waiting for the timestamp offset to be determined. notifyAll(); } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java index f509e294ec..d7466362be 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/TimestampAdjusterTest.java @@ -15,7 +15,7 @@ */ package com.google.android.exoplayer2.util; -import static com.google.android.exoplayer2.util.TimestampAdjuster.DO_NOT_OFFSET; +import static com.google.android.exoplayer2.util.TimestampAdjuster.MODE_NO_OFFSET; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -47,8 +47,9 @@ public class TimestampAdjusterTest { } @Test - public void adjustSampleTimestamp_doNotOffset() { - TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ DO_NOT_OFFSET); + public void adjustSampleTimestamp_noOffset() { + TimestampAdjuster adjuster = + new TimestampAdjuster(/* firstSampleTimestampUs= */ MODE_NO_OFFSET); long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); @@ -57,11 +58,11 @@ public class TimestampAdjusterTest { } @Test - public void adjustSampleTimestamp_afterResetToNotOffset() { + public void adjustSampleTimestamp_afterResetToNoOffset() { TimestampAdjuster adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); // Let the adjuster establish an offset, to make sure that reset really clears it. adjuster.adjustSampleTimestamp(/* timeUs= */ 1000); - adjuster.reset(/* firstSampleTimestampUs= */ DO_NOT_OFFSET); + adjuster.reset(/* firstSampleTimestampUs= */ MODE_NO_OFFSET); long firstAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 2000); long secondAdjustedTimestampUs = adjuster.adjustSampleTimestamp(/* timeUs= */ 6000); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java index 0509376f72..54de6425e6 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/TimestampAdjusterProvider.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.source.hls; +import static com.google.android.exoplayer2.util.TimestampAdjuster.MODE_SHARED; + import android.util.SparseArray; import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.TimestampAdjuster; @@ -40,7 +42,7 @@ public final class TimestampAdjusterProvider { public TimestampAdjuster getAdjuster(int discontinuitySequence) { @Nullable TimestampAdjuster adjuster = timestampAdjusters.get(discontinuitySequence); if (adjuster == null) { - adjuster = new TimestampAdjuster(/* firstSampleTimestampUs= */ 0); + adjuster = new TimestampAdjuster(MODE_SHARED); timestampAdjusters.put(discontinuitySequence, adjuster); } return adjuster; From f329adbc23ed01466a98481ec04f6702784f5c45 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 2 Aug 2021 19:06:55 +0100 Subject: [PATCH 005/441] Opt ExoPlayer out of transcoding when reading content URIs PiperOrigin-RevId: 388260014 --- RELEASENOTES.md | 1 + constants.gradle | 4 +-- .../upstream/ContentDataSource.java | 36 +++++++++++++++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e59c861854..424a083c67 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -50,6 +50,7 @@ * Change interface of `LoadErrorHandlingPolicy` to support configuring the behavior of track and location fallback. Location fallback is currently only supported for DASH manifests with multiple base URLs. + * Disable platform transcoding when playing content URIs on Android 12. * Remove deprecated symbols: * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and diff --git a/constants.gradle b/constants.gradle index 94dd89fc6a..bb93d790dc 100644 --- a/constants.gradle +++ b/constants.gradle @@ -17,8 +17,8 @@ project.ext { releaseVersionCode = 2014002 minSdkVersion = 16 appTargetSdkVersion = 29 - targetSdkVersion = 30 - compileSdkVersion = 30 + targetSdkVersion = 31 + compileSdkVersion = 31 dexmakerVersion = '2.28.1' junitVersion = '4.13.2' // Use the same Guava version as the Android repo: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java index 3e53896ac0..b18ec6647f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java @@ -21,10 +21,18 @@ import static java.lang.Math.min; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; +import android.media.ApplicationMediaCapabilities; +import android.media.MediaFeature; +import android.media.MediaFormat; import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.util.Util; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -70,10 +78,17 @@ public final class ContentDataSource extends BaseDataSource { this.uri = uri; transferInitializing(dataSpec); - AssetFileDescriptor assetFileDescriptor = resolver.openAssetFileDescriptor(uri, "r"); + + Bundle providerOptions = new Bundle(); + if (Util.SDK_INT >= 31) { + Api31.disableTranscoding(providerOptions); + } + + AssetFileDescriptor assetFileDescriptor = + resolver.openTypedAssetFileDescriptor(uri, /* mimeType= */ "*/*", providerOptions); this.assetFileDescriptor = assetFileDescriptor; if (assetFileDescriptor == null) { - // openAssetFileDescriptor returns null if the provider recently crashed. + // openTypedAssetFileDescriptor returns null if the provider recently crashed. throw new ContentDataSourceException( new IOException("Could not open file descriptor for: " + uri), PlaybackException.ERROR_CODE_IO_UNSPECIFIED); @@ -205,4 +220,21 @@ public final class ContentDataSource extends BaseDataSource { } } } + + @RequiresApi(31) + private static final class Api31 { + + @DoNotInline + public static void disableTranscoding(Bundle providerOptions) { + ApplicationMediaCapabilities mediaCapabilities = + new ApplicationMediaCapabilities.Builder() + .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) + .addSupportedHdrType(MediaFeature.HdrType.DOLBY_VISION) + .addSupportedHdrType(MediaFeature.HdrType.HDR10) + .addSupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) + .addSupportedHdrType(MediaFeature.HdrType.HLG) + .build(); + providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); + } + } } From 6f67cb839c0d33fbc1014a34034a012aa0756316 Mon Sep 17 00:00:00 2001 From: Colin Barr Date: Mon, 2 Aug 2021 21:15:33 +0100 Subject: [PATCH 006/441] Handle trailing semicolon on RTSP fmtp attribute --- .../source/rtsp/MediaDescription.java | 3 +- .../source/rtsp/RtspMediaTrackTest.java | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java index f5547e119c..86dc08cb5f 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java @@ -314,7 +314,8 @@ import java.util.HashMap; // Format of the parameter: RFC3640 Section 4.4.1: // =[; =]. - String[] parameters = Util.split(fmtpComponents[1], ";\\s?"); + // Split with implicit limit of 0 to handle an optional trailing semicolon. + String[] parameters = fmtpComponents[1].split(";\\s?"); ImmutableMap.Builder formatParametersBuilder = new ImmutableMap.Builder<>(); for (String parameter : parameters) { // The parameter values can bear equal signs, so splitAtFirst must be used. diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java index 363533536e..0901fd5fde 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java @@ -80,6 +80,48 @@ public class RtspMediaTrackTest { assertThat(format).isEqualTo(expectedFormat); } + @Test + public void generatePayloadFormat_withH264MediaDescriptionAndFmtpTrailingSemicolon_succeeds() { + MediaDescription mediaDescription = + new MediaDescription.Builder( + MEDIA_TYPE_VIDEO, /* port= */ 0, RTP_AVP_PROFILE, /* payloadType= */ 96) + .setConnection("IN IP4 0.0.0.0") + .setBitrate(500_000) + .addAttribute(ATTR_RTPMAP, "96 H264/90000") + .addAttribute( + ATTR_FMTP, + "96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z2QAH6zZQPARabIAAAMACAAAAwGcHjBjLA==,aOvjyyLA;") + .addAttribute(ATTR_CONTROL, "track1") + .build(); + + RtpPayloadFormat format = RtspMediaTrack.generatePayloadFormat(mediaDescription); + RtpPayloadFormat expectedFormat = + new RtpPayloadFormat( + new Format.Builder() + .setSampleMimeType(MimeTypes.VIDEO_H264) + .setAverageBitrate(500_000) + .setPixelWidthHeightRatio(1.0f) + .setHeight(544) + .setWidth(960) + .setCodecs("avc1.64001F") + .setInitializationData( + ImmutableList.of( + new byte[] { + 0, 0, 0, 1, 103, 100, 0, 31, -84, -39, 64, -16, 17, 105, -78, 0, 0, 3, 0, + 8, 0, 0, 3, 1, -100, 30, 48, 99, 44 + }, + new byte[] {0, 0, 0, 1, 104, -21, -29, -53, 34, -64})) + .build(), + /* rtpPayloadType= */ 96, + /* clockRate= */ 90_000, + /* fmtpParameters= */ ImmutableMap.of( + "packetization-mode", "1", + "profile-level-id", "64001F", + "sprop-parameter-sets", "Z2QAH6zZQPARabIAAAMACAAAAwGcHjBjLA==,aOvjyyLA")); + + assertThat(format).isEqualTo(expectedFormat); + } + @Test public void generatePayloadFormat_withAacMediaDescription_succeeds() { MediaDescription mediaDescription = From 0921efab3e7d9e5657898b147033fa55113c0f91 Mon Sep 17 00:00:00 2001 From: Colin Barr Date: Tue, 3 Aug 2021 10:33:49 +0100 Subject: [PATCH 007/441] Switch to an explicit limit of 0 for splitting on RTSP fmtp parameters --- .../android/exoplayer2/source/rtsp/MediaDescription.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java index 86dc08cb5f..8b523b4fcc 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java @@ -314,8 +314,8 @@ import java.util.HashMap; // Format of the parameter: RFC3640 Section 4.4.1: // =[; =]. - // Split with implicit limit of 0 to handle an optional trailing semicolon. - String[] parameters = fmtpComponents[1].split(";\\s?"); + // Split with an explicit limit of 0 to handle an optional trailing semicolon. + String[] parameters = fmtpComponents[1].split(";\\s?", /* limit= */ 0); ImmutableMap.Builder formatParametersBuilder = new ImmutableMap.Builder<>(); for (String parameter : parameters) { // The parameter values can bear equal signs, so splitAtFirst must be used. From bffa3e0afbea15e51a0be9afc85a9e84562716e2 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 3 Aug 2021 10:36:57 +0100 Subject: [PATCH 008/441] ContentDataSource: Restore ability to open file URIs PiperOrigin-RevId: 388410558 --- .../upstream/ContentDataSource.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java index b18ec6647f..3b5ec65788 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java @@ -79,16 +79,22 @@ public final class ContentDataSource extends BaseDataSource { transferInitializing(dataSpec); - Bundle providerOptions = new Bundle(); - if (Util.SDK_INT >= 31) { - Api31.disableTranscoding(providerOptions); + AssetFileDescriptor assetFileDescriptor; + if ("content".equals(dataSpec.uri.getScheme())) { + Bundle providerOptions = new Bundle(); + if (Util.SDK_INT >= 31) { + Api31.disableTranscoding(providerOptions); + } + assetFileDescriptor = + resolver.openTypedAssetFileDescriptor(uri, /* mimeType= */ "*/*", providerOptions); + } else { + // This path supports file URIs, although support may be removed in the future. See + // [Internal ref: b/195384732]. + assetFileDescriptor = resolver.openAssetFileDescriptor(uri, "r"); } - - AssetFileDescriptor assetFileDescriptor = - resolver.openTypedAssetFileDescriptor(uri, /* mimeType= */ "*/*", providerOptions); this.assetFileDescriptor = assetFileDescriptor; if (assetFileDescriptor == null) { - // openTypedAssetFileDescriptor returns null if the provider recently crashed. + // assetFileDescriptor may be null if the provider recently crashed. throw new ContentDataSourceException( new IOException("Could not open file descriptor for: " + uri), PlaybackException.ERROR_CODE_IO_UNSPECIFIED); From 8cddd4d80dc3f3491ffae59d26c5c8bc1f50426e Mon Sep 17 00:00:00 2001 From: apodob Date: Tue, 3 Aug 2021 12:25:07 +0100 Subject: [PATCH 009/441] Add `font-size` support to WebVTT `CssParser`. This CL addresses the github issue [#8946](https://github.com/google/ExoPlayer/issues/8964). That issue requests support for `font-size` CSS property in WebVTT subtitle format. This CL: * Adds support for `font-size` property by extending capabilities of WebVTT `CssParser`. Implementation of `font-size` property value parsing is based on the one in `TtmlDecoder`. * Adds unit test along with test file containing WebVTT subtitles with all currently supported `font-size` units. #minor-release PiperOrigin-RevId: 388423859 --- RELEASENOTES.md | 2 + .../{CssParser.java => WebvttCssParser.java} | 38 +++++++++++-- .../text/webvtt/WebvttCssStyle.java | 2 +- .../exoplayer2/text/webvtt/WebvttDecoder.java | 4 +- ...rserTest.java => WebvttCssParserTest.java} | 14 ++--- .../text/webvtt/WebvttDecoderTest.java | 53 +++++++++++++++++++ .../test/assets/media/webvtt/with_font_size | 49 +++++++++++++++++ 7 files changed, 149 insertions(+), 13 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/{CssParser.java => WebvttCssParser.java} (90%) rename library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/{CssParserTest.java => WebvttCssParserTest.java} (96%) create mode 100644 testdata/src/test/assets/media/webvtt/with_font_size diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 424a083c67..99510826c9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -117,6 +117,8 @@ * Text: * TTML: Inherit the `rubyPosition` value from a containing `` element. + * WebVTT: Add support for CSS `font-size` property + ([#8964](https://github.com/google/ExoPlayer/issues/8964)). * Ad playback: * Support changing ad break positions in the player logic ([#5067](https://github.com/google/ExoPlayer/issues/5067). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java similarity index 90% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java rename to library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java index 7302324b48..6fd236e98f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java @@ -20,8 +20,10 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.text.span.TextAnnotation; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ColorParser; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; +import com.google.common.base.Ascii; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -31,9 +33,9 @@ import java.util.regex.Pattern; * Provides a CSS parser for STYLE blocks in Webvtt files. Supports only a subset of the CSS * features. */ -/* package */ final class CssParser { +/* package */ final class WebvttCssParser { - private static final String TAG = "CssParser"; + private static final String TAG = "WebvttCssParser"; private static final String RULE_START = "{"; private static final String RULE_END = "}"; @@ -41,6 +43,7 @@ import java.util.regex.Pattern; private static final String PROPERTY_BGCOLOR = "background-color"; private static final String PROPERTY_FONT_FAMILY = "font-family"; private static final String PROPERTY_FONT_WEIGHT = "font-weight"; + private static final String PROPERTY_FONT_SIZE = "font-size"; private static final String PROPERTY_RUBY_POSITION = "ruby-position"; private static final String VALUE_OVER = "over"; private static final String VALUE_UNDER = "under"; @@ -54,12 +57,14 @@ import java.util.regex.Pattern; private static final String VALUE_ITALIC = "italic"; private static final Pattern VOICE_NAME_PATTERN = Pattern.compile("\\[voice=\"([^\"]*)\"\\]"); + private static final Pattern FONT_SIZE_PATTERN = + Pattern.compile("^((?:[0-9]*\\.)?[0-9]+)(px|em|%)$"); // Temporary utility data structures. private final ParsableByteArray styleInput; private final StringBuilder stringBuilder; - public CssParser() { + public WebvttCssParser() { styleInput = new ParsableByteArray(); stringBuilder = new StringBuilder(); } @@ -213,6 +218,8 @@ import java.util.regex.Pattern; if (VALUE_ITALIC.equals(value)) { style.setItalic(true); } + } else if (PROPERTY_FONT_SIZE.equals(property)) { + parseFontSize(value, style); } // TODO: Fill remaining supported styles. } @@ -336,6 +343,31 @@ import java.util.regex.Pattern; return stringBuilder.toString(); } + private static void parseFontSize(String fontSize, WebvttCssStyle style) { + Matcher matcher = FONT_SIZE_PATTERN.matcher(Ascii.toLowerCase(fontSize)); + if (!matcher.matches()) { + Log.w(TAG, "Invalid font-size: '" + fontSize + "'."); + return; + } + String unit = Assertions.checkNotNull(matcher.group(2)); + switch (unit) { + case "px": + style.setFontSizeUnit(WebvttCssStyle.FONT_SIZE_UNIT_PIXEL); + break; + case "em": + style.setFontSizeUnit(WebvttCssStyle.FONT_SIZE_UNIT_EM); + break; + case "%": + style.setFontSizeUnit(WebvttCssStyle.FONT_SIZE_UNIT_PERCENT); + break; + default: + // this line should never be reached because when the fontSize matches the FONT_SIZE_PATTERN + // unit must be one of: px, em, % + throw new IllegalStateException(); + } + style.setFontSize(Float.parseFloat(Assertions.checkNotNull(matcher.group(1)))); + } + /** * Sets the target of a {@link WebvttCssStyle} by splitting a selector of the form {@code * ::cue(tag#id.class1.class2[voice="someone"]}, where every element is optional. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java index 5b0b572aba..587f7d5ab5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java @@ -263,7 +263,7 @@ public final class WebvttCssStyle { return this; } - public WebvttCssStyle setFontSizeUnit(short unit) { + public WebvttCssStyle setFontSizeUnit(@FontSizeUnit int unit) { this.fontSizeUnit = unit; return this; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java index c7d0e24429..0d04a3f4be 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java @@ -44,12 +44,12 @@ public final class WebvttDecoder extends SimpleSubtitleDecoder { private static final String STYLE_START = "STYLE"; private final ParsableByteArray parsableWebvttData; - private final CssParser cssParser; + private final WebvttCssParser cssParser; public WebvttDecoder() { super("WebvttDecoder"); parsableWebvttData = new ParsableByteArray(); - cssParser = new CssParser(); + cssParser = new WebvttCssParser(); } @Override diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java similarity index 96% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java index 2dcb3af157..095dd02b66 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java @@ -15,7 +15,7 @@ */ package com.google.android.exoplayer2.text.webvtt; -import static com.google.android.exoplayer2.text.webvtt.CssParser.parseNextToken; +import static com.google.android.exoplayer2.text.webvtt.WebvttCssParser.parseNextToken; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -29,15 +29,15 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -/** Unit test for {@link CssParser}. */ +/** Unit test for {@link WebvttCssParser}. */ @RunWith(AndroidJUnit4.class) -public final class CssParserTest { +public final class WebvttCssParserTest { - private CssParser parser; + private WebvttCssParser parser; @Before public void setUp() { - parser = new CssParser(); + parser = new WebvttCssParser(); } @Test @@ -232,13 +232,13 @@ public final class CssParserTest { private void assertSkipsToEndOfSkip(String expectedLine, String s) { ParsableByteArray input = new ParsableByteArray(Util.getUtf8Bytes(s)); - CssParser.skipWhitespaceAndComments(input); + WebvttCssParser.skipWhitespaceAndComments(input); assertThat(input.readLine()).isEqualTo(expectedLine); } private void assertInputLimit(String expectedLine, String s) { ParsableByteArray input = new ParsableByteArray(Util.getUtf8Bytes(s)); - CssParser.skipStyleBlock(input); + WebvttCssParser.skipStyleBlock(input); assertThat(input.readLine()).isEqualTo(expectedLine); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java index eb565b09f5..4044d3d390 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java @@ -54,6 +54,7 @@ public class WebvttDecoderTest { private static final String WITH_BAD_CUE_HEADER_FILE = "media/webvtt/with_bad_cue_header"; private static final String WITH_TAGS_FILE = "media/webvtt/with_tags"; private static final String WITH_CSS_STYLES = "media/webvtt/with_css_styles"; + private static final String WITH_FONT_SIZE = "media/webvtt/with_font_size"; private static final String WITH_CSS_COMPLEX_SELECTORS = "media/webvtt/with_css_complex_selectors"; private static final String WITH_CSS_TEXT_COMBINE_UPRIGHT = @@ -400,6 +401,58 @@ public class WebvttDecoderTest { assertThat(secondCue.text.toString()).isEqualTo("This is the third subtitle."); } + @Test + public void decodeWithCssFontSizeStyle() throws Exception { + WebvttSubtitle subtitle = getSubtitleForTestAsset(WITH_FONT_SIZE); + + assertThat(subtitle.getEventTimeCount()).isEqualTo(12); + + assertThat(subtitle.getEventTime(0)).isEqualTo(0L); + assertThat(subtitle.getEventTime(1)).isEqualTo(2_000_000L); + Cue firstCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(0))); + assertThat(firstCue.text.toString()).isEqualTo("Sentence with font-size set to 4.4em."); + assertThat((Spanned) firstCue.text) + .hasRelativeSizeSpanBetween(0, "Sentence with font-size set to 4.4em.".length()) + .withSizeChange(4.4f); + + assertThat(subtitle.getEventTime(2)).isEqualTo(2_100_000L); + assertThat(subtitle.getEventTime(3)).isEqualTo(2_400_000L); + Cue secondCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(2))); + assertThat(secondCue.text.toString()).isEqualTo("Sentence with bad font-size unit."); + assertThat((Spanned) secondCue.text).hasNoSpans(); + + assertThat(subtitle.getEventTime(4)).isEqualTo(2_500_000L); + assertThat(subtitle.getEventTime(5)).isEqualTo(4_000_000L); + Cue thirdCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(4))); + assertThat(thirdCue.text.toString()).isEqualTo("Absolute font-size expressed in px unit!"); + assertThat((Spanned) thirdCue.text) + .hasAbsoluteSizeSpanBetween(0, "Absolute font-size expressed in px unit!".length()) + .withAbsoluteSize(2); + + assertThat(subtitle.getEventTime(6)).isEqualTo(4_500_000L); + assertThat(subtitle.getEventTime(7)).isEqualTo(6_000_000L); + Cue fourthCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(6))); + assertThat(fourthCue.text.toString()).isEqualTo("Relative font-size expressed in % unit!"); + assertThat((Spanned) fourthCue.text) + .hasRelativeSizeSpanBetween(0, "Relative font-size expressed in % unit!".length()) + .withSizeChange(0.035f); + + assertThat(subtitle.getEventTime(8)).isEqualTo(6_100_000L); + assertThat(subtitle.getEventTime(9)).isEqualTo(6_400_000L); + Cue fifthCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(8))); + assertThat(fifthCue.text.toString()).isEqualTo("Sentence with bad font-size value."); + assertThat((Spanned) secondCue.text).hasNoSpans(); + + assertThat(subtitle.getEventTime(10)).isEqualTo(6_500_000L); + assertThat(subtitle.getEventTime(11)).isEqualTo(8_000_000L); + Cue sixthCue = Iterables.getOnlyElement(subtitle.getCues(subtitle.getEventTime(10))); + assertThat(sixthCue.text.toString()) + .isEqualTo("Upper and lower case letters in font-size unit."); + assertThat((Spanned) sixthCue.text) + .hasAbsoluteSizeSpanBetween(0, "Upper and lower case letters in font-size unit.".length()) + .withAbsoluteSize(2); + } + @Test public void webvttWithCssStyle() throws Exception { WebvttSubtitle subtitle = getSubtitleForTestAsset(WITH_CSS_STYLES); diff --git a/testdata/src/test/assets/media/webvtt/with_font_size b/testdata/src/test/assets/media/webvtt/with_font_size new file mode 100644 index 0000000000..91ff9b7801 --- /dev/null +++ b/testdata/src/test/assets/media/webvtt/with_font_size @@ -0,0 +1,49 @@ +WEBVTT + +STYLE +::cue(.unit-em) { + font-size: 4.4em; +} + +STYLE +::cue(.unit-px) { + font-size: 2px; +} + +STYLE +::cue(.unit-percent) { + font-size: 3.5% +} + +STYLE +::cue(.case-insensitivity) { + font-size: 2Px; +} + +STYLE +::cue(.bad-unit) { + font-size: 4.4ef; +} + +STYLE +::cue(.bad-value) { + font-size: 3.5.5% +} + +00:00.000 --> 00:02.000 +Sentence with font-size set to 4.4em. + +00:02.100 --> 00:02.400 +Sentence with bad font-size unit. + +00:02.500 --> 00:04.000 +Absolute font-size expressed in px unit! + +00:04.500 --> 00:06.000 +Relative font-size expressed in % unit! + +00:06.100 --> 00:06.400 +Sentence with bad font-size value. + +00:06.500 --> 00:08.000 +Upper and lower case letters in font-size unit. From cc8f4dcc6becb80088f13302755556ee65080666 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 3 Aug 2021 14:07:29 +0100 Subject: [PATCH 010/441] Downgrade targetSdkVersion to 30 PiperOrigin-RevId: 388437245 --- constants.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index bb93d790dc..27b4aa5d2a 100644 --- a/constants.gradle +++ b/constants.gradle @@ -17,7 +17,9 @@ project.ext { releaseVersionCode = 2014002 minSdkVersion = 16 appTargetSdkVersion = 29 - targetSdkVersion = 31 + // Upgrading this requires [Internal ref: b/162763326] to be fixed, or some + // additional robolectric config. + targetSdkVersion = 30 compileSdkVersion = 31 dexmakerVersion = '2.28.1' junitVersion = '4.13.2' From 5e4cd1293eda0ca06afde2340ac1a274e06b0ec3 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 3 Aug 2021 14:10:07 +0100 Subject: [PATCH 011/441] Use AudioTrack.isDirectPlaybackSupported on TVs only Issue: #9239 #minor-release PiperOrigin-RevId: 388437614 --- RELEASENOTES.md | 4 ++++ .../android/exoplayer2/audio/AudioCapabilities.java | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 99510826c9..ab3989eaef 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -51,6 +51,10 @@ behavior of track and location fallback. Location fallback is currently only supported for DASH manifests with multiple base URLs. * Disable platform transcoding when playing content URIs on Android 12. + * Restrict use of `AudioTrack.isDirectPlaybackSupported` to TVs, to avoid + listing audio offload encodings as supported for passthrough mode on + mobile devices + ([#9239](https://github.com/google/ExoPlayer/issues/9239)). * Remove deprecated symbols: * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java index 57e7f91aad..a12f63deeb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java @@ -88,9 +88,12 @@ public final class AudioCapabilities { && Global.getInt(context.getContentResolver(), EXTERNAL_SURROUND_SOUND_KEY, 0) == 1) { return EXTERNAL_SURROUND_SOUND_CAPABILITIES; } - if (Util.SDK_INT >= 29) { + // AudioTrack.isDirectPlaybackSupported returns true for encodings that are supported for audio + // offload, as well as for encodings we want to list for passthrough mode. Therefore we only use + // it on TV devices, which generally shouldn't support audio offload for surround encodings. + if (Util.SDK_INT >= 29 && Util.isTv(context)) { return new AudioCapabilities( - AudioTrackWrapperV29.getDirectPlaybackSupportedEncodingsV29(), DEFAULT_MAX_CHANNEL_COUNT); + Api29.getDirectPlaybackSupportedEncodingsV29(), DEFAULT_MAX_CHANNEL_COUNT); } if (intent == null || intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, 0) == 0) { return DEFAULT_AUDIO_CAPABILITIES; @@ -185,7 +188,7 @@ public final class AudioCapabilities { } @RequiresApi(29) - private static final class AudioTrackWrapperV29 { + private static final class Api29 { @DoNotInline public static int[] getDirectPlaybackSupportedEncodingsV29() { ImmutableList.Builder supportedEncodingsListBuilder = ImmutableList.builder(); From 6157c615b21247658e48b322e63008180f587579 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 4 Aug 2021 09:09:09 +0100 Subject: [PATCH 012/441] Standardise API-level specific nested classes This change aligns all the names for classes that are 'holders of static methods' to be `ApiNN`. Classes that hold state are named meaningfully based on that state. PiperOrigin-RevId: 388641064 --- .../exoplayer2/audio/AudioCapabilities.java | 4 ++-- .../android/exoplayer2/drm/DrmUtil.java | 19 ++++++++----------- .../exoplayer2/upstream/FileDataSource.java | 4 ++-- .../video/VideoFrameReleaseHelper.java | 8 ++++---- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java index a12f63deeb..1510aa6e22 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java @@ -93,7 +93,7 @@ public final class AudioCapabilities { // it on TV devices, which generally shouldn't support audio offload for surround encodings. if (Util.SDK_INT >= 29 && Util.isTv(context)) { return new AudioCapabilities( - Api29.getDirectPlaybackSupportedEncodingsV29(), DEFAULT_MAX_CHANNEL_COUNT); + Api29.getDirectPlaybackSupportedEncodings(), DEFAULT_MAX_CHANNEL_COUNT); } if (intent == null || intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, 0) == 0) { return DEFAULT_AUDIO_CAPABILITIES; @@ -190,7 +190,7 @@ public final class AudioCapabilities { @RequiresApi(29) private static final class Api29 { @DoNotInline - public static int[] getDirectPlaybackSupportedEncodingsV29() { + public static int[] getDirectPlaybackSupportedEncodings() { ImmutableList.Builder supportedEncodingsListBuilder = ImmutableList.builder(); for (int encoding : ALL_SURROUND_ENCODINGS) { if (AudioTrack.isDirectPlaybackSupported( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java index cb92010110..bd89d2d373 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java @@ -64,16 +64,13 @@ public final class DrmUtil { @PlaybackException.ErrorCode public static int getErrorCodeForMediaDrmException( Exception exception, @ErrorSource int errorSource) { - if (Util.SDK_INT >= 21 && PlatformOperationsWrapperV21.isMediaDrmStateException(exception)) { - return PlatformOperationsWrapperV21.mediaDrmStateExceptionToErrorCode(exception); - } else if (Util.SDK_INT >= 23 - && PlatformOperationsWrapperV23.isMediaDrmResetException(exception)) { + if (Util.SDK_INT >= 21 && Api21.isMediaDrmStateException(exception)) { + return Api21.mediaDrmStateExceptionToErrorCode(exception); + } else if (Util.SDK_INT >= 23 && Api23.isMediaDrmResetException(exception)) { return PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR; - } else if (Util.SDK_INT >= 18 - && PlatformOperationsWrapperV18.isNotProvisionedException(exception)) { + } else if (Util.SDK_INT >= 18 && Api18.isNotProvisionedException(exception)) { return PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED; - } else if (Util.SDK_INT >= 18 - && PlatformOperationsWrapperV18.isDeniedByServerException(exception)) { + } else if (Util.SDK_INT >= 18 && Api18.isDeniedByServerException(exception)) { return PlaybackException.ERROR_CODE_DRM_DEVICE_REVOKED; } else if (exception instanceof UnsupportedDrmException) { return PlaybackException.ERROR_CODE_DRM_SCHEME_UNSUPPORTED; @@ -98,7 +95,7 @@ public final class DrmUtil { // Internal classes. @RequiresApi(18) - private static final class PlatformOperationsWrapperV18 { + private static final class Api18 { @DoNotInline public static boolean isNotProvisionedException(@Nullable Throwable throwable) { @@ -112,7 +109,7 @@ public final class DrmUtil { } @RequiresApi(21) - private static final class PlatformOperationsWrapperV21 { + private static final class Api21 { @DoNotInline public static boolean isMediaDrmStateException(@Nullable Throwable throwable) { @@ -130,7 +127,7 @@ public final class DrmUtil { } @RequiresApi(23) - private static final class PlatformOperationsWrapperV23 { + private static final class Api23 { @DoNotInline public static boolean isMediaDrmResetException(@Nullable Throwable throwable) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java index 85284ee220..fdef36244b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java @@ -192,7 +192,7 @@ public final class FileDataSource extends BaseDataSource { // different SDK versions. throw new FileDataSourceException( e, - Util.SDK_INT >= 21 && PlatformOperationsWrapperV21.isPermissionError(e.getCause()) + Util.SDK_INT >= 21 && Api21.isPermissionError(e.getCause()) ? PlaybackException.ERROR_CODE_IO_NO_PERMISSION : PlaybackException.ERROR_CODE_IO_FILE_NOT_FOUND); } catch (SecurityException e) { @@ -203,7 +203,7 @@ public final class FileDataSource extends BaseDataSource { } @RequiresApi(21) - private static final class PlatformOperationsWrapperV21 { + private static final class Api21 { @DoNotInline private static boolean isPermissionError(@Nullable Throwable e) { return e instanceof ErrnoException && ((ErrnoException) e).errno == OsConstants.EACCES; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java index aee8376333..637b3cbe4c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java @@ -347,7 +347,7 @@ public final class VideoFrameReleaseHelper { return; } this.surfacePlaybackFrameRate = surfacePlaybackFrameRate; - SurfaceApi30.setFrameRate(surface, surfacePlaybackFrameRate); + Api30.setSurfaceFrameRate(surface, surfacePlaybackFrameRate); } /** Clears the frame-rate of the current {@link #surface}. */ @@ -356,7 +356,7 @@ public final class VideoFrameReleaseHelper { return; } surfacePlaybackFrameRate = 0; - SurfaceApi30.setFrameRate(surface, /* frameRate= */ 0); + Api30.setSurfaceFrameRate(surface, /* frameRate= */ 0); } // Display refresh rate and vsync logic. @@ -408,9 +408,9 @@ public final class VideoFrameReleaseHelper { // Nested classes. @RequiresApi(30) - private static final class SurfaceApi30 { + private static final class Api30 { @DoNotInline - public static void setFrameRate(Surface surface, float frameRate) { + public static void setSurfaceFrameRate(Surface surface, float frameRate) { int compatibility = frameRate == 0 ? Surface.FRAME_RATE_COMPATIBILITY_DEFAULT From 07c49cdad867a246603db662b582a027f29c9a24 Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 4 Aug 2021 12:55:00 +0100 Subject: [PATCH 013/441] Change how AnalyticsCollector releases listeners The AnalyticsCollector releases listeners lazily so that listener callbacks triggered on the application looper after SimpleExoPlayer.release() are still handled. The change in ListenerSet to post the onEvents callback on the front of the application looper changed (correctly) how onEvents are propagated, however this made the AnalyticsCollector deliver onEvents with out-of-order EventTimes. This change fixes AnalyticsCollector to trigger onPlayerReleased() and the matching onEvents() event in the correct order. #minor-release PiperOrigin-RevId: 388668739 --- .../android/exoplayer2/util/ListenerSet.java | 37 ++++--------------- .../exoplayer2/util/ListenerSetTest.java | 29 --------------- .../analytics/AnalyticsCollector.java | 11 +++++- 3 files changed, 16 insertions(+), 61 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java b/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java index 43d57f988b..7f2ce9759a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java @@ -67,7 +67,6 @@ public final class ListenerSet { } private static final int MSG_ITERATION_FINISHED = 0; - private static final int MSG_LAZY_RELEASE = 1; private final Clock clock; private final HandlerWrapper handler; @@ -220,37 +219,15 @@ public final class ListenerSet { released = true; } - /** - * Releases the set of listeners after all already scheduled {@link Looper} messages were able to - * trigger final events. - * - *

After the specified released callback event, no other events are sent to a listener. - * - * @param releaseEventFlag An integer flag indicating the type of the release event, or {@link - * C#INDEX_UNSET} to report this event without a flag. - * @param releaseEvent The release event. - */ - public void lazyRelease(int releaseEventFlag, Event releaseEvent) { - handler.obtainMessage(MSG_LAZY_RELEASE, releaseEventFlag, 0, releaseEvent).sendToTarget(); - } - private boolean handleMessage(Message message) { - if (message.what == MSG_ITERATION_FINISHED) { - for (ListenerHolder holder : listeners) { - holder.iterationFinished(iterationFinishedEvent); - if (handler.hasMessages(MSG_ITERATION_FINISHED)) { - // The invocation above triggered new events (and thus scheduled a new message). We need - // to stop here because this new message will take care of informing every listener about - // the new update (including the ones already called here). - break; - } + for (ListenerHolder holder : listeners) { + holder.iterationFinished(iterationFinishedEvent); + if (handler.hasMessages(MSG_ITERATION_FINISHED)) { + // The invocation above triggered new events (and thus scheduled a new message). We need + // to stop here because this new message will take care of informing every listener about + // the new update (including the ones already called here). + break; } - } else if (message.what == MSG_LAZY_RELEASE) { - int releaseEventFlag = message.arg1; - @SuppressWarnings("unchecked") - Event releaseEvent = (Event) message.obj; - sendEvent(releaseEventFlag, releaseEvent); - release(); } return true; } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/ListenerSetTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/ListenerSetTest.java index f98f9f0965..d350e99c32 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/ListenerSetTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/ListenerSetTest.java @@ -22,7 +22,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import android.os.Handler; import android.os.Looper; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; @@ -367,34 +366,6 @@ public class ListenerSetTest { verify(listener, never()).callback1(); } - @Test - public void lazyRelease_stopsForwardingEventsFromNewHandlerMessagesAndCallsReleaseCallback() { - ListenerSet listenerSet = - new ListenerSet<>(Looper.myLooper(), Clock.DEFAULT, TestListener::iterationFinished); - TestListener listener = mock(TestListener.class); - listenerSet.add(listener); - - // In-line event before release. - listenerSet.sendEvent(EVENT_ID_1, TestListener::callback1); - // Message triggering event sent before release. - new Handler().post(() -> listenerSet.sendEvent(EVENT_ID_1, TestListener::callback1)); - // Lazy release with release callback. - listenerSet.lazyRelease(EVENT_ID_3, TestListener::callback3); - // In-line event after release. - listenerSet.sendEvent(EVENT_ID_1, TestListener::callback1); - // Message triggering event sent after release. - new Handler().post(() -> listenerSet.sendEvent(EVENT_ID_2, TestListener::callback2)); - ShadowLooper.runMainLooperToNextTask(); - - // Verify all events are delivered except for the one triggered by the message sent after the - // lazy release. - verify(listener, times(3)).callback1(); - verify(listener).callback3(); - verify(listener, times(2)).iterationFinished(createFlagSet(EVENT_ID_1)); - verify(listener).iterationFinished(createFlagSet(EVENT_ID_3)); - verifyNoMoreInteractions(listener); - } - private interface TestListener { default void callback1() {} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 5e4682ef46..00d7547202 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.analytics; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import android.os.Looper; import android.util.SparseArray; @@ -50,6 +51,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.ListenerSet; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener; @@ -82,6 +84,7 @@ public class AnalyticsCollector private ListenerSet listeners; private @MonotonicNonNull Player player; + private @MonotonicNonNull HandlerWrapper handler; private boolean isSeeking; /** @@ -131,6 +134,7 @@ public class AnalyticsCollector Assertions.checkState( this.player == null || mediaPeriodQueueTracker.mediaPeriodQueue.isEmpty()); this.player = checkNotNull(player); + handler = clock.createHandler(looper, null); listeners = listeners.copy( looper, @@ -146,10 +150,13 @@ public class AnalyticsCollector public void release() { EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); eventTimes.put(AnalyticsListener.EVENT_PLAYER_RELEASED, eventTime); + sendEvent( + eventTime, + AnalyticsListener.EVENT_PLAYER_RELEASED, + listener -> listener.onPlayerReleased(eventTime)); // Release listeners lazily so that all events that got triggered as part of player.release() // are still delivered to all listeners. - listeners.lazyRelease( - AnalyticsListener.EVENT_PLAYER_RELEASED, listener -> listener.onPlayerReleased(eventTime)); + checkStateNotNull(handler).post(() -> listeners.release()); } /** From 4b1609d569d2a5976b5856432e9b5a37dc483a87 Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 4 Aug 2021 13:54:47 +0100 Subject: [PATCH 014/441] Set HlsSampleStreamWrapper.trackType for audio-only playlists For audio-only playlists, when formats are communicated to the app with AnalyticsListener.onDownstreamFormatChanged(), the passed MediaLoadData do not indicate this is an audio track and therefore the PlaybackStatsListener cannot derive audio format-related information. This change sets the main SampleStreamWrappers track type to AUDIO, if the master playlist contains only audio variants. Issue: #9175 #minor-release PiperOrigin-RevId: 388676060 --- RELEASENOTES.md | 6 ++++++ .../android/exoplayer2/source/hls/HlsMediaPeriod.java | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ab3989eaef..fb98ceca1c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -144,6 +144,12 @@ * Deprecate `setControlDispatcher` in `MediaSessionConnector`. The `ControlDispatcher` parameter has also been deprecated in all `MediaSessionConnector` listener methods. +* HLS: + * Report audio track type in + `AnalyticsListener.onDownstreamFormatChanged()` for audio-only + playlists, so that the `PlaybackStatsListener` can derive audio + format-related information. + ([#9175](https://github.com/google/ExoPlayer/issues/9175)). ### 2.14.2 (2021-07-20) 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 a13a7bb3a1..785e7f1d36 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 @@ -628,9 +628,13 @@ public final class HlsMediaPeriod numberOfAudioCodecs <= 1 && numberOfVideoCodecs <= 1 && numberOfAudioCodecs + numberOfVideoCodecs > 0; + int trackType = + !useVideoVariantsOnly && numberOfAudioCodecs > 0 + ? C.TRACK_TYPE_AUDIO + : C.TRACK_TYPE_DEFAULT; HlsSampleStreamWrapper sampleStreamWrapper = buildSampleStreamWrapper( - C.TRACK_TYPE_DEFAULT, + trackType, selectedPlaylistUrls, selectedPlaylistFormats, masterPlaylist.muxedAudioFormat, From a34809bb9dde44a586d68e621b89f63f5690547f Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 4 Aug 2021 14:36:13 +0100 Subject: [PATCH 015/441] Tweak use of TimestampAdjuster for seeking - Fix use of getTimestampOffsetUs in TsExtractor where getFirstSampleTimestampUs should have been used. - Don't reset TimestampAdjuster if it's in no-offset mode. - Improve comment clarity #minor-release PiperOrigin-RevId: 388682711 --- .../exoplayer2/extractor/ts/PsExtractor.java | 27 ++++++++------ .../exoplayer2/extractor/ts/TsExtractor.java | 27 ++++++++------ .../ts/sample_h262_mpeg_audio.ts.1.dump | 12 +++---- .../ts/sample_h262_mpeg_audio.ts.2.dump | 12 +++---- .../ts/sample_h262_mpeg_audio.ts.3.dump | 4 +-- .../extractordumps/ts/sample_h263.ts.1.dump | 36 +++++++++---------- .../ts/sample_h264_mpeg_audio.ts.1.dump | 12 +++---- .../ts/sample_h264_mpeg_audio.ts.2.dump | 12 +++---- ...e_h264_no_access_unit_delimiters.ts.1.dump | 8 ++--- ...e_h264_no_access_unit_delimiters.ts.2.dump | 8 ++--- .../extractordumps/ts/sample_scte35.ts.1.dump | 20 +++++------ .../extractordumps/ts/sample_scte35.ts.2.dump | 20 +++++------ .../extractordumps/ts/sample_scte35.ts.3.dump | 6 ++-- .../extractordumps/ts/sample_with_junk.1.dump | 12 +++---- .../extractordumps/ts/sample_with_junk.2.dump | 12 +++---- .../extractordumps/ts/sample_with_junk.3.dump | 4 +-- 16 files changed, 123 insertions(+), 109 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java index 29ef815b25..4611a25825 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java @@ -135,16 +135,23 @@ public final class PsExtractor implements Extractor { @Override public void seek(long position, long timeUs) { - boolean hasNotEncounteredFirstTimestamp = - timestampAdjuster.getTimestampOffsetUs() == C.TIME_UNSET; - if (hasNotEncounteredFirstTimestamp - || (timestampAdjuster.getFirstSampleTimestampUs() != 0 - && timestampAdjuster.getFirstSampleTimestampUs() != timeUs)) { - // - If the timestamp adjuster in the PS stream has not encountered any sample, it's going to - // treat the first timestamp encountered as sample time 0, which is incorrect. In this case, - // we have to set the first sample timestamp manually. - // - If the timestamp adjuster has its timestamp set manually before, and now we seek to a - // different position, we need to set the first sample timestamp manually again. + // If the timestamp adjuster has not yet established a timestamp offset, we need to reset its + // expected first sample timestamp to be the new seek position. Without this, the timestamp + // adjuster would incorrectly establish its timestamp offset assuming that the first sample + // after this seek corresponds to the start of the stream (or a previous seek position, if there + // was one). + boolean resetTimestampAdjuster = timestampAdjuster.getTimestampOffsetUs() == C.TIME_UNSET; + if (!resetTimestampAdjuster) { + long adjusterFirstSampleTimestampUs = timestampAdjuster.getFirstSampleTimestampUs(); + // Also reset the timestamp adjuster if its offset was calculated based on a non-zero position + // in the stream (other than the position being seeked to), since in this case the offset may + // not be accurate. + resetTimestampAdjuster = + adjusterFirstSampleTimestampUs != C.TIME_UNSET + && adjusterFirstSampleTimestampUs != 0 + && adjusterFirstSampleTimestampUs != timeUs; + } + if (resetTimestampAdjuster) { timestampAdjuster.reset(timeUs); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java index 1411541e88..1ff9c06e79 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java @@ -252,16 +252,23 @@ public final class TsExtractor implements Extractor { int timestampAdjustersCount = timestampAdjusters.size(); for (int i = 0; i < timestampAdjustersCount; i++) { TimestampAdjuster timestampAdjuster = timestampAdjusters.get(i); - boolean hasNotEncounteredFirstTimestamp = - timestampAdjuster.getTimestampOffsetUs() == C.TIME_UNSET; - if (hasNotEncounteredFirstTimestamp - || (timestampAdjuster.getTimestampOffsetUs() != 0 - && timestampAdjuster.getFirstSampleTimestampUs() != timeUs)) { - // - If a track in the TS stream has not encountered any sample, it's going to treat the - // first sample encountered as timestamp 0, which is incorrect. So we have to set the first - // sample timestamp for that track manually. - // - If the timestamp adjuster has its timestamp set manually before, and now we seek to a - // different position, we need to set the first sample timestamp manually again. + // If the timestamp adjuster has not yet established a timestamp offset, we need to reset its + // expected first sample timestamp to be the new seek position. Without this, the timestamp + // adjuster would incorrectly establish its timestamp offset assuming that the first sample + // after this seek corresponds to the start of the stream (or a previous seek position, if + // there was one). + boolean resetTimestampAdjuster = timestampAdjuster.getTimestampOffsetUs() == C.TIME_UNSET; + if (!resetTimestampAdjuster) { + long adjusterFirstSampleTimestampUs = timestampAdjuster.getFirstSampleTimestampUs(); + // Also reset the timestamp adjuster if its offset was calculated based on a non-zero + // position in the stream (other than the position being seeked to), since in this case the + // offset may not be accurate. + resetTimestampAdjuster = + adjusterFirstSampleTimestampUs != C.TIME_UNSET + && adjusterFirstSampleTimestampUs != 0 + && adjusterFirstSampleTimestampUs != timeUs; + } + if (resetTimestampAdjuster) { timestampAdjuster.reset(timeUs); } } diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump index 489763bbf8..8e996b6f31 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.1.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 55610 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 88977 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 44699 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 70821 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 96944 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 123066 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump index a7ef1ecf4b..8e996b6f31 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.2.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 77854 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 111221 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66943 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 93065 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 119188 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 145310 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.3.dump b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.3.dump index fffd040d68..f0fd81369f 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.3.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h262_mpeg_audio.ts.3.dump @@ -27,11 +27,11 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66733 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 1: - time = 92855 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump index a83a484f64..e67426081b 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h263.ts.1.dump @@ -17,75 +17,75 @@ track 256: initializationData: data = length 47, hash 7696BF67 sample 0: - time = 320000 + time = 240000 flags = 0 data = length 212, hash 835B0727 sample 1: - time = 360000 + time = 280000 flags = 0 data = length 212, hash E9AF0AB7 sample 2: - time = 400000 + time = 320000 flags = 0 data = length 212, hash E9517D06 sample 3: - time = 440000 + time = 360000 flags = 0 data = length 212, hash 4FA58096 sample 4: - time = 480000 + time = 400000 flags = 0 data = length 212, hash 4F47F2E5 sample 5: - time = 520000 + time = 440000 flags = 0 data = length 212, hash B59BF675 sample 6: - time = 560000 + time = 480000 flags = 1 data = length 11769, hash 3ED9DF06 sample 7: - time = 600000 + time = 520000 flags = 0 data = length 230, hash 2AF3505D sample 8: - time = 640000 + time = 560000 flags = 0 data = length 222, hash F4E7436D sample 9: - time = 680000 + time = 600000 flags = 0 data = length 222, hash F0F812FD sample 10: - time = 720000 + time = 640000 flags = 0 data = length 222, hash 18472E8C sample 11: - time = 760000 + time = 680000 flags = 0 data = length 222, hash 1457FE1C sample 12: - time = 800000 + time = 720000 flags = 0 data = length 222, hash 3BA719AB sample 13: - time = 840000 + time = 760000 flags = 0 data = length 222, hash 37B7E93B sample 14: - time = 880000 + time = 800000 flags = 0 data = length 222, hash 5F0704CA sample 15: - time = 920000 + time = 840000 flags = 0 data = length 222, hash 5B17D45A sample 16: - time = 960000 + time = 880000 flags = 0 data = length 222, hash 8266EFE9 sample 17: - time = 1000000 + time = 920000 flags = 0 data = length 222, hash 7E77BF79 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump index 295fa07e94..605daaf8dd 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.1.dump @@ -19,11 +19,11 @@ track 256: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 sample 0: - time = 88977 + time = 66733 flags = 1 data = length 12394, hash A39F5311 sample 1: - time = 122344 + time = 100100 flags = 0 data = length 813, hash 99F7B4FA track 257: @@ -37,19 +37,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 88977 + time = 66733 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 115099 + time = 92855 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 141221 + time = 118977 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 167343 + time = 145099 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump b/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump index 8bf63a3901..605daaf8dd 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h264_mpeg_audio.ts.2.dump @@ -19,11 +19,11 @@ track 256: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 sample 0: - time = 111221 + time = 66733 flags = 1 data = length 12394, hash A39F5311 sample 1: - time = 144588 + time = 100100 flags = 0 data = length 813, hash 99F7B4FA track 257: @@ -37,19 +37,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 111221 + time = 66733 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 137343 + time = 92855 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 163465 + time = 118977 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 189587 + time = 145099 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump index b53c622489..dbc51ba77d 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.1.dump @@ -19,19 +19,19 @@ track 256: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 sample 0: - time = 88977 + time = 66733 flags = 0 data = length 734, hash AF0D9485 sample 1: - time = 88977 + time = 66733 flags = 1 data = length 10938, hash 68420875 sample 2: - time = 155710 + time = 133466 flags = 0 data = length 6, hash 34E6CF79 sample 3: - time = 155710 + time = 133466 flags = 0 data = length 518, hash 546C177 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump b/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump index 89899bb4e1..dbc51ba77d 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_h264_no_access_unit_delimiters.ts.2.dump @@ -19,19 +19,19 @@ track 256: data = length 29, hash 4C2CAE9C data = length 9, hash D971CD89 sample 0: - time = 111221 + time = 66733 flags = 0 data = length 734, hash AF0D9485 sample 1: - time = 111221 + time = 66733 flags = 1 data = length 10938, hash 68420875 sample 2: - time = 177954 + time = 133466 flags = 0 data = length 6, hash 34E6CF79 sample 3: - time = 177954 + time = 133466 flags = 0 data = length 518, hash 546C177 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump index 7e7eb9ad0c..b9564a3ffc 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.1.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 55610 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 88977 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 44699 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 70821 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 96944 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 123066 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 track 600: @@ -55,17 +55,17 @@ track 600: sample count = 3 format 0: sampleMimeType = application/x-scte35 - subsampleOffsetUs = -1377756 + subsampleOffsetUs = -1400000 sample 0: - time = 55610 + time = 33366 flags = 1 data = length 35, hash A892AAAF sample 1: - time = 55610 + time = 33366 flags = 1 data = length 35, hash A892AAAF sample 2: - time = 55610 + time = 33366 flags = 1 data = length 35, hash DFA3EF74 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump index 2db85e42e0..b9564a3ffc 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.2.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 77854 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 111221 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66943 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 93065 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 119188 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 145310 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 track 600: @@ -55,17 +55,17 @@ track 600: sample count = 3 format 0: sampleMimeType = application/x-scte35 - subsampleOffsetUs = -1355512 + subsampleOffsetUs = -1400000 sample 0: - time = 77854 + time = 33366 flags = 1 data = length 35, hash A892AAAF sample 1: - time = 77854 + time = 33366 flags = 1 data = length 35, hash A892AAAF sample 2: - time = 77854 + time = 33366 flags = 1 data = length 35, hash DFA3EF74 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.3.dump b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.3.dump index cc1c346b49..e96f346e29 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.3.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_scte35.ts.3.dump @@ -27,11 +27,11 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66733 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 1: - time = 92855 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 track 600: @@ -39,5 +39,5 @@ track 600: sample count = 0 format 0: sampleMimeType = application/x-scte35 - subsampleOffsetUs = -1355512 + subsampleOffsetUs = -1400000 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.1.dump b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.1.dump index c1b7f37bf3..f61ecb193a 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.1.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.1.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 55610 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 88977 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 44699 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 70821 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 96944 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 123066 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.2.dump b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.2.dump index 4c0bb6d4ab..f61ecb193a 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.2.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.2.dump @@ -17,11 +17,11 @@ track 256: initializationData: data = length 22, hash CE183139 sample 0: - time = 77854 + time = 33366 flags = 1 data = length 20711, hash 34341E8 sample 1: - time = 111221 + time = 66733 flags = 0 data = length 18112, hash EC44B35B track 257: @@ -35,19 +35,19 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66943 + time = 22455 flags = 1 data = length 1253, hash 727FD1C6 sample 1: - time = 93065 + time = 48577 flags = 1 data = length 1254, hash 73FB07B8 sample 2: - time = 119188 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 3: - time = 145310 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.3.dump b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.3.dump index 3bdb0839ae..417481edc3 100644 --- a/testdata/src/test/assets/extractordumps/ts/sample_with_junk.3.dump +++ b/testdata/src/test/assets/extractordumps/ts/sample_with_junk.3.dump @@ -27,11 +27,11 @@ track 257: sampleRate = 44100 language = und sample 0: - time = 66733 + time = 74700 flags = 1 data = length 1254, hash 73FB07B8 sample 1: - time = 92855 + time = 100822 flags = 1 data = length 1254, hash 73FB07B8 tracksEnded = true From 7375fe31055f3850b28ae939832f5d8758895685 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Wed, 4 Aug 2021 17:34:56 +0100 Subject: [PATCH 016/441] Simplify network-related error codes This change removes ERROR_CODE_IO_NETWORK_UNAVAILABLE, ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED, and ERROR_CODE_IO_DNS_FAILED in favor of keeping only ERROR_CODE_IO_NETWORK_CONNECTION_FAILED. PiperOrigin-RevId: 388715972 --- .../ext/cronet/CronetDataSource.java | 46 ++++++------------- .../android/exoplayer2/PlaybackException.java | 46 +++++++++---------- .../exoplayer2/upstream/HttpDataSource.java | 28 +++++------ .../exoplayer2/upstream/UdpDataSource.java | 22 ++------- 4 files changed, 50 insertions(+), 92 deletions(-) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index ddf503be92..483df638b3 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -669,12 +669,11 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { if (message != null && Ascii.toLowerCase(message).contains("err_cleartext_not_permitted")) { throw new CleartextNotPermittedException(connectionOpenException, dataSpec); } - @PlaybackException.ErrorCode - int errorCode = - getErrorCodeForException( - connectionOpenException, /* occurredWhileOpeningConnection*/ true); throw new OpenException( - connectionOpenException, dataSpec, errorCode, getStatus(urlRequest)); + connectionOpenException, + dataSpec, + PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, + getStatus(urlRequest)); } else if (!connectionOpened) { // The timeout was reached before the connection was opened. throw new OpenException( @@ -685,10 +684,13 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { } } catch (InterruptedException e) { Thread.currentThread().interrupt(); + // An interruption means the operation is being cancelled, in which case this exception should + // not cause the player to fail. If it does, it likely means that the owner of the operation + // is failing to swallow the interruption, which makes us enter an invalid state. throw new OpenException( new InterruptedIOException(), dataSpec, - PlaybackException.ERROR_CODE_IO_UNSPECIFIED, + PlaybackException.ERROR_CODE_FAILED_RUNTIME_CHECK, Status.INVALID); } @@ -1029,7 +1031,9 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { throw new OpenException( e, dataSpec, - getErrorCodeForException(e, /* occurredWhileOpeningConnection= */ false), + e instanceof SocketTimeoutException + ? PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT + : PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, Status.READING_RESPONSE); } } @@ -1099,11 +1103,8 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { if (exception instanceof HttpDataSourceException) { throw (HttpDataSourceException) exception; } else { - throw new HttpDataSourceException( - exception, - dataSpec, - getErrorCodeForException(exception, /* occurredWhileOpeningConnection= */ false), - HttpDataSourceException.TYPE_READ); + throw HttpDataSourceException.createForIOException( + exception, dataSpec, HttpDataSourceException.TYPE_READ); } } } @@ -1116,27 +1117,6 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { return readBuffer; } - @PlaybackException.ErrorCode - private static int getErrorCodeForException( - IOException exception, boolean occurredWhileOpeningConnection) { - if (exception instanceof UnknownHostException) { - return PlaybackException.ERROR_CODE_IO_DNS_FAILED; - } - @Nullable String message = exception.getMessage(); - if (message != null) { - if (message.contains("net::ERR_INTERNET_DISCONNECTED")) { - return PlaybackException.ERROR_CODE_IO_NETWORK_UNAVAILABLE; - } else if (message.contains("net::ERR_CONTENT_LENGTH_MISMATCH") - || message.contains("net::ERR_SOCKET_NOT_CONNECTED")) { - return PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED; - } - } - if (occurredWhileOpeningConnection) { - return PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED; - } - return PlaybackException.ERROR_CODE_IO_UNSPECIFIED; - } - private static boolean isCompressed(UrlResponseInfo info) { for (Map.Entry entry : info.getAllHeadersAsList()) { if (entry.getKey().equalsIgnoreCase("Content-Encoding")) { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java index 6ac144bfa2..335dcf2612 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2; +import android.net.ConnectivityManager; import android.os.Bundle; import android.os.RemoteException; import android.os.SystemClock; @@ -48,13 +49,10 @@ public class PlaybackException extends Exception implements Bundleable { ERROR_CODE_TIMEOUT, ERROR_CODE_FAILED_RUNTIME_CHECK, ERROR_CODE_IO_UNSPECIFIED, - ERROR_CODE_IO_NETWORK_UNAVAILABLE, ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT, - ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED, ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE, ERROR_CODE_IO_BAD_HTTP_STATUS, - ERROR_CODE_IO_DNS_FAILED, ERROR_CODE_IO_FILE_NOT_FOUND, ERROR_CODE_IO_NO_PERMISSION, ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED, @@ -107,32 +105,38 @@ public class PlaybackException extends Exception implements Bundleable { /** Caused by an Input/Output error which could not be identified. */ public static final int ERROR_CODE_IO_UNSPECIFIED = 2000; - /** Caused by the lack of network connectivity while trying to access a network resource. */ - public static final int ERROR_CODE_IO_NETWORK_UNAVAILABLE = 2001; - /** Caused by a failure while establishing a network connection. */ - public static final int ERROR_CODE_IO_NETWORK_CONNECTION_FAILED = 2002; + /** + * Caused by a network connection failure. + * + *

The following is a non-exhaustive list of possible reasons: + * + *

    + *
  • There is no network connectivity (you can check this by querying {@link + * ConnectivityManager#getActiveNetwork}). + *
  • The URL's domain is misspelled or does not exist. + *
  • The target host is unreachable. + *
  • The server unexpectedly closes the connection. + *
+ */ + public static final int ERROR_CODE_IO_NETWORK_CONNECTION_FAILED = 2001; /** Caused by a network timeout, meaning the server is taking too long to fulfill a request. */ - public static final int ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT = 2003; - /** Caused by an existing connection being unexpectedly closed. */ - public static final int ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED = 2004; + public static final int ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT = 2002; /** * Caused by a server returning a resource with an invalid "Content-Type" HTTP header value. * *

For example, this can happen when the player is expecting a piece of media, but the server * returns a paywall HTML page, with content type "text/html". */ - public static final int ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE = 2005; + public static final int ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE = 2003; /** Caused by an HTTP server returning an unexpected HTTP response status code. */ - public static final int ERROR_CODE_IO_BAD_HTTP_STATUS = 2006; - /** Caused by the player failing to resolve a hostname. */ - public static final int ERROR_CODE_IO_DNS_FAILED = 2007; + public static final int ERROR_CODE_IO_BAD_HTTP_STATUS = 2004; /** Caused by a non-existent file. */ - public static final int ERROR_CODE_IO_FILE_NOT_FOUND = 2008; + public static final int ERROR_CODE_IO_FILE_NOT_FOUND = 2005; /** * Caused by lack of permission to perform an IO operation. For example, lack of permission to * access internet or external storage. */ - public static final int ERROR_CODE_IO_NO_PERMISSION = 2009; + public static final int ERROR_CODE_IO_NO_PERMISSION = 2006; /** * Caused by the player trying to access cleartext HTTP traffic (meaning http:// rather than * https://) when the app's Network Security Configuration does not permit it. @@ -140,9 +144,9 @@ public class PlaybackException extends Exception implements Bundleable { *

See this corresponding * troubleshooting topic. */ - public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2010; + public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2007; /** Caused by reading data out of the data bound. */ - public static final int ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE = 2011; + public static final int ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE = 2008; // Content parsing errors (3xxx). @@ -234,20 +238,14 @@ public class PlaybackException extends Exception implements Bundleable { return "ERROR_CODE_FAILED_RUNTIME_CHECK"; case ERROR_CODE_IO_UNSPECIFIED: return "ERROR_CODE_IO_UNSPECIFIED"; - case ERROR_CODE_IO_NETWORK_UNAVAILABLE: - return "ERROR_CODE_IO_NETWORK_UNAVAILABLE"; case ERROR_CODE_IO_NETWORK_CONNECTION_FAILED: return "ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"; case ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT: return "ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"; - case ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED: - return "ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED"; case ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE: return "ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"; case ERROR_CODE_IO_BAD_HTTP_STATUS: return "ERROR_CODE_IO_BAD_HTTP_STATUS"; - case ERROR_CODE_IO_DNS_FAILED: - return "ERROR_CODE_IO_DNS_FAILED"; case ERROR_CODE_IO_FILE_NOT_FOUND: return "ERROR_CODE_IO_FILE_NOT_FOUND"; case ERROR_CODE_IO_NO_PERMISSION: diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java index 5d590c3308..150d983348 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java @@ -23,11 +23,11 @@ import com.google.android.exoplayer2.util.Util; import com.google.common.base.Ascii; import com.google.common.base.Predicate; import java.io.IOException; +import java.io.InterruptedIOException; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.net.SocketTimeoutException; -import java.net.UnknownHostException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -215,24 +215,20 @@ public interface HttpDataSource extends DataSource { */ public static HttpDataSourceException createForIOException( IOException cause, DataSpec dataSpec, @Type int type) { - @PlaybackException.ErrorCode int errorCode = PlaybackException.ERROR_CODE_IO_UNSPECIFIED; + @PlaybackException.ErrorCode int errorCode; + @Nullable String message = cause.getMessage(); if (cause instanceof SocketTimeoutException) { errorCode = PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT; - } else if (cause instanceof UnknownHostException) { - errorCode = PlaybackException.ERROR_CODE_IO_DNS_FAILED; + } else if (cause instanceof InterruptedIOException) { + // An interruption means the operation is being cancelled, in which case this exception + // should not cause the player to fail. If it does, it likely means that the owner of the + // operation is failing to swallow the interruption, which makes us enter an invalid state. + errorCode = PlaybackException.ERROR_CODE_FAILED_RUNTIME_CHECK; + } else if (message != null + && Ascii.toLowerCase(message).matches("cleartext.*not permitted.*")) { + errorCode = PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED; } else { - @Nullable String message = cause.getMessage(); - if (message != null) { - if (Ascii.toLowerCase(message).matches("cleartext.*not permitted.*")) { - errorCode = PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED; - } else if (message.contains("unexpected end of stream")) { - errorCode = PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_CLOSED; - } - } - - if (type == TYPE_OPEN && errorCode == PlaybackException.ERROR_CODE_IO_UNSPECIFIED) { - errorCode = PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED; - } + errorCode = PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED; } return errorCode == PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED ? new CleartextNotPermittedException(cause, dataSpec) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java index 3af0cb9b24..df0ff1f1cc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java @@ -22,16 +22,12 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.PlaybackException; import java.io.IOException; -import java.net.BindException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MulticastSocket; -import java.net.PortUnreachableException; -import java.net.SocketException; import java.net.SocketTimeoutException; -import java.net.UnknownHostException; /** A UDP {@link DataSource}. */ public final class UdpDataSource extends BaseDataSource { @@ -115,25 +111,14 @@ public final class UdpDataSource extends BaseDataSource { } else { socket = new DatagramSocket(socketAddress); } + socket.setSoTimeout(socketTimeoutMillis); } catch (SecurityException e) { throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_NO_PERMISSION); - } catch (UnknownHostException e) { - // TODO (internal b/184262323): Handle the case where UnknownHostException is thrown due to - // lack of network access. - throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_DNS_FAILED); - } catch (BindException e) { - throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_NETWORK_UNAVAILABLE); } catch (IOException e) { throw new UdpDataSourceException( e, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED); } - try { - socket.setSoTimeout(socketTimeoutMillis); - } catch (SocketException e) { - throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_UNSPECIFIED); - } - opened = true; transferStarted(dataSpec); return C.LENGTH_UNSET; @@ -149,13 +134,12 @@ public final class UdpDataSource extends BaseDataSource { // We've read all of the data from the current packet. Get another. try { socket.receive(packet); - } catch (PortUnreachableException e) { - throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_NETWORK_UNAVAILABLE); } catch (SocketTimeoutException e) { throw new UdpDataSourceException( e, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT); } catch (IOException e) { - throw new UdpDataSourceException(e, PlaybackException.ERROR_CODE_IO_UNSPECIFIED); + throw new UdpDataSourceException( + e, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED); } packetRemaining = packet.getLength(); bytesTransferred(packetRemaining); From a533d8190ae28dacedba61ff2298492df8d99e7b Mon Sep 17 00:00:00 2001 From: sungsoo Date: Thu, 5 Aug 2021 03:07:35 +0100 Subject: [PATCH 017/441] Add a method to distinguish whether a player can be set by MediaSession PiperOrigin-RevId: 388835913 --- .../java/com/google/android/exoplayer2/BasePlayer.java | 10 ++++++++++ .../google/android/exoplayer2/ForwardingPlayer.java | 5 +++++ .../java/com/google/android/exoplayer2/Player.java | 3 +++ 3 files changed, 18 insertions(+) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index 74b5760ca7..02aa2527ae 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -89,6 +89,16 @@ public abstract class BasePlayer implements Player { return getAvailableCommands().contains(command); } + /** + * {@inheritDoc} + * + *

BasePlayer and its descendents will return {@code true}. + */ + @Override + public final boolean canAdvertiseSession() { + return true; + } + @Override public final void play() { setPlayWhenReady(true); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 7112efa8a2..f682ced4a7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -151,6 +151,11 @@ public class ForwardingPlayer implements Player { return player.isCommandAvailable(command); } + @Override + public boolean canAdvertiseSession() { + return player.canAdvertiseSession(); + } + @Override public Commands getAvailableCommands() { return player.getAvailableCommands(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index dfa80d40b4..a706dfe6ea 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -1543,6 +1543,9 @@ public interface Player { */ boolean isCommandAvailable(@Command int command); + /** Returns whether the player can be used to advertise a media session. */ + boolean canAdvertiseSession(); + /** * Returns the player's currently available {@link Commands}. * From 2946cbe190d539626928b1c91ab77dba9bb1cff4 Mon Sep 17 00:00:00 2001 From: gyumin Date: Thu, 5 Aug 2021 06:50:54 +0100 Subject: [PATCH 018/441] Update androidx.media version to 1.4.1 PiperOrigin-RevId: 388860854 --- constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index 27b4aa5d2a..b46d0b82ca 100644 --- a/constants.gradle +++ b/constants.gradle @@ -39,7 +39,7 @@ project.ext { androidxCollectionVersion = '1.1.0' androidxCoreVersion = '1.3.2' androidxFuturesVersion = '1.1.0' - androidxMediaVersion = '1.3.1' + androidxMediaVersion = '1.4.1' androidxMedia2Version = '1.1.3' androidxMultidexVersion = '2.0.1' androidxRecyclerViewVersion = '1.2.1' From a5cbd9f6c24dc62eb1e6fc2bc9d630084aa88512 Mon Sep 17 00:00:00 2001 From: claincly Date: Thu, 5 Aug 2021 08:40:00 +0100 Subject: [PATCH 019/441] Handle RTSP session id properly. Issue: #9254 #minor-release We used to allow only alphanumerical characters in session id. The spec also allows "$", "-", "_", ".", "+" (RFC2326 Sections 3.4 and 15.1). PiperOrigin-RevId: 388873742 --- RELEASENOTES.md | 2 ++ .../android/exoplayer2/source/rtsp/RtspMessageUtil.java | 4 ++-- .../exoplayer2/source/rtsp/RtspMessageUtilTest.java | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 21862c8ff4..f7bc8da661 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -142,6 +142,8 @@ ([#9182](https://github.com/google/ExoPlayer/issues/9182)). * Handle an extra semicolon in SDP fmtp attribute ([#9247](https://github.com/google/ExoPlayer/pull/9247)). + * Fix handling of special characters in the RTSP session ID + ([#9254](https://github.com/google/ExoPlayer/issues/9254)). * MediaSession extension: * Deprecate `setControlDispatcher` in `MediaSessionConnector`. The `ControlDispatcher` parameter has also been deprecated in all diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index 4ef559fdae..c8ffff2574 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -92,9 +92,9 @@ import java.util.regex.Pattern; private static final Pattern CONTENT_LENGTH_HEADER_PATTERN = Pattern.compile("Content-Length:\\s?(\\d+)", CASE_INSENSITIVE); - // Session header pattern, see RFC2326 Section 12.37. + // Session header pattern, see RFC2326 Sections 3.4 and 12.37. private static final Pattern SESSION_HEADER_PATTERN = - Pattern.compile("(\\w+)(?:;\\s?timeout=(\\d+))?"); + Pattern.compile("([\\w$-_.+]+)(?:;\\s?timeout=(\\d+))?"); // WWW-Authenticate header pattern, see RFC2068 Sections 14.46 and RFC2069. private static final Pattern WWW_AUTHENTICATION_HEADER_DIGEST_PATTERN = diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java index 0e9a3aaf74..92463f3085 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java @@ -350,6 +350,15 @@ public final class RtspMessageUtilTest { .isEqualTo(expectedRtspMessage.getBytes(RtspMessageChannel.CHARSET)); } + @Test + public void parseSessionHeader_withSessionIdContainingSpecialCharacters_succeeds() + throws Exception { + String sessionHeaderString = "610a63df-9b57.4856_97ac$665f+56e9c04"; + RtspMessageUtil.RtspSessionHeader sessionHeader = + RtspMessageUtil.parseSessionHeader(sessionHeaderString); + assertThat(sessionHeader.sessionId).isEqualTo("610a63df-9b57.4856_97ac$665f+56e9c04"); + } + @Test public void removeUserInfo_withUserInfo() { Uri uri = Uri.parse("rtsp://user:pass@foo.bar/foo.mkv"); From d0e426080bfe06a4508c909fb45ed6e266d1fa87 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 5 Aug 2021 10:36:35 +0100 Subject: [PATCH 020/441] Set StreamIndex Name as format.label in SS Issue: #9252 #minor-release PiperOrigin-RevId: 388889406 --- RELEASENOTES.md | 3 +++ .../manifest/SsManifestParser.java | 3 ++- .../manifest/SsManifestParserTest.java | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f7bc8da661..db60fb6b0e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -154,6 +154,9 @@ playlists, so that the `PlaybackStatsListener` can derive audio format-related information. ([#9175](https://github.com/google/ExoPlayer/issues/9175)). +* SS: + * Propagate `StreamIndex` element `Name` attribute value as `Format` + label ([#9252](https://github.com/google/ExoPlayer/issues/9252)). ### 2.14.2 (2021-07-20) diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java index b8d8594049..b26e2d41d8 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java @@ -192,7 +192,7 @@ public class SsManifestParser implements ParsingLoadable.Parser { * provided name, the parent element parser will be queried, and so on up the chain. * * @param key The name of the attribute. - * @return The stashed value, or null if the attribute was not be found. + * @return The stashed value, or null if the attribute was not found. */ @Nullable protected final Object getNormalizedAttribute(String key) { @@ -595,6 +595,7 @@ public class SsManifestParser implements ParsingLoadable.Parser { } putNormalizedAttribute(KEY_SUB_TYPE, subType); name = parser.getAttributeValue(null, KEY_NAME); + putNormalizedAttribute(KEY_NAME, name); url = parseRequiredString(parser, KEY_URL); maxWidth = parseInt(parser, KEY_MAX_WIDTH, Format.NO_VALUE); maxHeight = parseInt(parser, KEY_MAX_HEIGHT, Format.NO_VALUE); diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParserTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParserTest.java index e5a7ee5add..320db6bad2 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParserTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParserTest.java @@ -15,11 +15,12 @@ */ package com.google.android.exoplayer2.source.smoothstreaming.manifest; +import static com.google.common.truth.Truth.assertThat; + import android.net.Uri; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.testutil.TestUtil; -import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; @@ -32,7 +33,7 @@ public final class SsManifestParserTest { /** Simple test to ensure the sample manifests parse without any exceptions being thrown. */ @Test - public void parseSmoothStreamingManifest() throws IOException { + public void parseSmoothStreamingManifest() throws Exception { SsManifestParser parser = new SsManifestParser(); parser.parse( Uri.parse("https://example.com/test.ismc"), @@ -41,4 +42,15 @@ public final class SsManifestParserTest { Uri.parse("https://example.com/test.ismc"), TestUtil.getInputStream(ApplicationProvider.getApplicationContext(), SAMPLE_ISMC_2)); } + + @Test + public void parse_populatesFormatLabelWithStreamIndexName() throws Exception { + SsManifestParser parser = new SsManifestParser(); + SsManifest ssManifest = + parser.parse( + Uri.parse("https://example.com/test.ismc"), + TestUtil.getInputStream(ApplicationProvider.getApplicationContext(), SAMPLE_ISMC_1)); + + assertThat(ssManifest.streamElements[0].formats[0].label).isEqualTo("video"); + } } From 9dcfd90ef7497fc28513c073359d4cee15c2594f Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 5 Aug 2021 11:08:00 +0100 Subject: [PATCH 021/441] Cleanup some deprecated constants PiperOrigin-RevId: 388893920 --- RELEASENOTES.md | 5 ++ .../java/com/google/android/exoplayer2/C.java | 24 --------- .../google/android/exoplayer2/Renderer.java | 52 ++++--------------- 3 files changed, 16 insertions(+), 65 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index db60fb6b0e..56abb10cb9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -92,6 +92,11 @@ * Remove `CastPlayer` specific playlist manipulation methods. Use `setMediaItems`, `addMediaItems`, `removeMediaItem` and `moveMediaItem` instead. + * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named + constants in `C` instead. + * Remove `C.MSG_*` constants. Use identically named constants in + `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced + with `Renderer.MSG_SET_VIDEO_OUTPUT`. * UI: * Add `setUseRewindAction` and `setUseFastForwardAction` to `PlayerNotificationManager`, and `setUseFastForwardActionInCompactView` diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index b5df4c4e1c..ede2dc6001 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -708,30 +708,6 @@ public final class C { */ public static final UUID PLAYREADY_UUID = new UUID(0x9A04F07998404286L, 0xAB92E65BE0885F95L); - /** @deprecated Use {@code Renderer.MSG_SET_VIDEO_OUTPUT}. */ - @Deprecated public static final int MSG_SET_SURFACE = 1; - - /** @deprecated Use {@code Renderer.MSG_SET_VOLUME}. */ - @Deprecated public static final int MSG_SET_VOLUME = 2; - - /** @deprecated Use {@code Renderer.MSG_SET_AUDIO_ATTRIBUTES}. */ - @Deprecated public static final int MSG_SET_AUDIO_ATTRIBUTES = 3; - - /** @deprecated Use {@code Renderer.MSG_SET_SCALING_MODE}. */ - @Deprecated public static final int MSG_SET_SCALING_MODE = 4; - - /** @deprecated Use {@code Renderer.MSG_SET_AUX_EFFECT_INFO}. */ - @Deprecated public static final int MSG_SET_AUX_EFFECT_INFO = 5; - - /** @deprecated Use {@code Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER}. */ - @Deprecated public static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = 6; - - /** @deprecated Use {@code Renderer.MSG_SET_CAMERA_MOTION_LISTENER}. */ - @Deprecated public static final int MSG_SET_CAMERA_MOTION_LISTENER = 7; - - /** @deprecated Use {@code Renderer.MSG_CUSTOM_BASE}. */ - @Deprecated public static final int MSG_CUSTOM_BASE = 10000; - /** * The stereo mode for 360/3D/VR videos. One of {@link Format#NO_VALUE}, {@link * #STEREO_MODE_MONO}, {@link #STEREO_MODE_TOP_BOTTOM}, {@link #STEREO_MODE_LEFT_RIGHT} or {@link diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index 3e1d913829..1affb1d088 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -81,15 +81,13 @@ public interface Renderer extends PlayerMessage.Target { *

If the receiving renderer does not support the payload type as an output, then it will clear * any existing output that it has. */ - @SuppressWarnings("deprecation") - int MSG_SET_VIDEO_OUTPUT = C.MSG_SET_SURFACE; + int MSG_SET_VIDEO_OUTPUT = 1; /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link Float} with 0 being * silence and 1 being unity gain. */ - @SuppressWarnings("deprecation") - int MSG_SET_VOLUME = C.MSG_SET_VOLUME; + int MSG_SET_VOLUME = 2; /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be an {@link @@ -111,8 +109,7 @@ public interface Renderer extends PlayerMessage.Target { * {@link Util#getAudioUsageForStreamType(int)} and use the returned {@link C.AudioUsage} to build * an audio attributes instance. */ - @SuppressWarnings("deprecation") - int MSG_SET_AUDIO_ATTRIBUTES = C.MSG_SET_AUDIO_ATTRIBUTES; + int MSG_SET_AUDIO_ATTRIBUTES = 3; /** * The type of a message that can be passed to a {@link MediaCodec}-based video renderer via * {@link ExoPlayer#createMessage(Target)}. The message payload should be one of the integer @@ -121,42 +118,38 @@ public interface Renderer extends PlayerMessage.Target { *

Note that the scaling mode only applies if the {@link Surface} targeted by the renderer is * owned by a {@link android.view.SurfaceView}. */ - @SuppressWarnings("deprecation") - int MSG_SET_SCALING_MODE = C.MSG_SET_SCALING_MODE; + int MSG_SET_SCALING_MODE = 4; /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be an {@link AuxEffectInfo} * instance representing an auxiliary audio effect for the underlying audio track. */ - @SuppressWarnings("deprecation") - int MSG_SET_AUX_EFFECT_INFO = C.MSG_SET_AUX_EFFECT_INFO; + int MSG_SET_AUX_EFFECT_INFO = 5; /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link * VideoFrameMetadataListener} instance, or null. */ - @SuppressWarnings("deprecation") - int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; + int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = 6; /** * The type of a message that can be passed to a camera motion renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link CameraMotionListener} * instance, or null. */ - @SuppressWarnings("deprecation") - int MSG_SET_CAMERA_MOTION_LISTENER = C.MSG_SET_CAMERA_MOTION_LISTENER; + int MSG_SET_CAMERA_MOTION_LISTENER = 7; /** * The type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link Boolean} instance * telling whether to enable or disable skipping silences in the audio stream. */ - int MSG_SET_SKIP_SILENCE_ENABLED = 101; + int MSG_SET_SKIP_SILENCE_ENABLED = 8; /** * The type of a message that can be passed to audio and video renderers via {@link * ExoPlayer#createMessage(Target)}. The message payload should be an {@link Integer} instance * representing the audio session ID that will be attached to the underlying audio track. Video * renderers that support tunneling will use the audio session ID when tunneling is enabled. */ - int MSG_SET_AUDIO_SESSION_ID = 102; + int MSG_SET_AUDIO_SESSION_ID = 9; /** * The type of a message that can be passed to a {@link Renderer} via {@link * ExoPlayer#createMessage(Target)}, to inform the renderer that it can schedule waking up another @@ -164,35 +157,12 @@ public interface Renderer extends PlayerMessage.Target { * *

The message payload must be a {@link WakeupListener} instance. */ - int MSG_SET_WAKEUP_LISTENER = 103; + int MSG_SET_WAKEUP_LISTENER = 10; /** * Applications or extensions may define custom {@code MSG_*} constants that can be passed to * renderers. These custom constants must be greater than or equal to this value. */ - @SuppressWarnings("deprecation") - int MSG_CUSTOM_BASE = C.MSG_CUSTOM_BASE; - - /** @deprecated Use {@link C.VideoScalingMode}. */ - // VIDEO_SCALING_MODE_DEFAULT is an intentionally duplicated constant. - @SuppressWarnings({"UniqueConstants", "Deprecation"}) - @Documented - @Retention(RetentionPolicy.SOURCE) - @IntDef( - value = { - VIDEO_SCALING_MODE_DEFAULT, - VIDEO_SCALING_MODE_SCALE_TO_FIT, - VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING - }) - @Deprecated - @interface VideoScalingMode {} - /** @deprecated Use {@link C#VIDEO_SCALING_MODE_SCALE_TO_FIT}. */ - @Deprecated int VIDEO_SCALING_MODE_SCALE_TO_FIT = C.VIDEO_SCALING_MODE_SCALE_TO_FIT; - /** @deprecated Use {@link C#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}. */ - @Deprecated - int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = - C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING; - /** @deprecated Use {@code C.VIDEO_SCALING_MODE_DEFAULT}. */ - @Deprecated int VIDEO_SCALING_MODE_DEFAULT = C.VIDEO_SCALING_MODE_DEFAULT; + int MSG_CUSTOM_BASE = 10000; /** * The renderer states. One of {@link #STATE_DISABLED}, {@link #STATE_ENABLED} or {@link From 8525ef70bab4a6c7c325f28002ba363f81a3f8fd Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 5 Aug 2021 12:29:00 +0100 Subject: [PATCH 022/441] Remove SDK_INT codename checks for R and S These API levels have both been finalized. We're also calling methods from these API levels directly, which may not exist if a device is running a non-finalized R or S release. PiperOrigin-RevId: 388903410 --- .../main/java/com/google/android/exoplayer2/util/Util.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 e222e83ffb..f6c685dd7e 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 @@ -104,10 +104,7 @@ public final class Util { * Like {@link android.os.Build.VERSION#SDK_INT}, but in a place where it can be conveniently * overridden for local testing. */ - public static final int SDK_INT = - "S".equals(Build.VERSION.CODENAME) - ? 31 - : "R".equals(Build.VERSION.CODENAME) ? 30 : Build.VERSION.SDK_INT; + public static final int SDK_INT = Build.VERSION.SDK_INT; /** * Like {@link Build#DEVICE}, but in a place where it can be conveniently overridden for local From fc1db189f27dddb3af1b8e1ccdd0e42ab4935d4e Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 5 Aug 2021 13:01:00 +0100 Subject: [PATCH 023/441] Remove deprecated ExoPlayer GVR extension PiperOrigin-RevId: 388907645 --- RELEASENOTES.md | 2 + core_settings.gradle | 2 - extensions/gvr/README.md | 44 ---- extensions/gvr/build.gradle | 35 ---- extensions/gvr/src/main/AndroidManifest.xml | 16 -- .../exoplayer2/ext/gvr/GvrAudioProcessor.java | 197 ------------------ .../exoplayer2/ext/gvr/package-info.java | 19 -- 7 files changed, 2 insertions(+), 313 deletions(-) delete mode 100644 extensions/gvr/README.md delete mode 100644 extensions/gvr/build.gradle delete mode 100644 extensions/gvr/src/main/AndroidManifest.xml delete mode 100644 extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java delete mode 100644 extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/package-info.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 56abb10cb9..a795841ee8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -142,6 +142,8 @@ * Deprecate `setControlDispatcher` in `LeanbackPlayerAdapter`. * Media2 extension: * Deprecate `setControlDispatcher` in `SessionPlayerConnector`. +* GVR extension: + * Remove `GvrAudioProcessor`, which has been deprecated since 2.11.0. * RTSP: * Use standard RTSP header names ([#9182](https://github.com/google/ExoPlayer/issues/9182)). diff --git a/core_settings.gradle b/core_settings.gradle index ffee74bccf..7fc3a4c3e2 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -48,8 +48,6 @@ include modulePrefix + 'extension-ffmpeg' project(modulePrefix + 'extension-ffmpeg').projectDir = new File(rootDir, 'extensions/ffmpeg') include modulePrefix + 'extension-flac' project(modulePrefix + 'extension-flac').projectDir = new File(rootDir, 'extensions/flac') -include modulePrefix + 'extension-gvr' -project(modulePrefix + 'extension-gvr').projectDir = new File(rootDir, 'extensions/gvr') include modulePrefix + 'extension-ima' project(modulePrefix + 'extension-ima').projectDir = new File(rootDir, 'extensions/ima') include modulePrefix + 'extension-cast' diff --git a/extensions/gvr/README.md b/extensions/gvr/README.md deleted file mode 100644 index 43a9e2cb62..0000000000 --- a/extensions/gvr/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# ExoPlayer GVR extension # - -**DEPRECATED - If you still need this extension, please contact us by filing an -issue on our [issue tracker][].** - -The GVR extension wraps the [Google VR SDK for Android][]. It provides a -GvrAudioProcessor, which uses [GvrAudioSurround][] to provide binaural rendering -of surround sound and ambisonic soundfields. - -[Google VR SDK for Android]: https://developers.google.com/vr/android/ -[GvrAudioSurround]: https://developers.google.com/vr/android/reference/com/google/vr/sdk/audio/GvrAudioSurround -[issue tracker]: https://github.com/google/ExoPlayer/issues - -## Getting the extension ## - -The easiest way to use the extension is to add it as a gradle dependency: - -```gradle -implementation 'com.google.android.exoplayer:extension-gvr:2.X.X' -``` - -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. - -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. - -## Using the extension ## - -* If using `DefaultRenderersFactory`, override - `DefaultRenderersFactory.buildAudioProcessors` to return a - `GvrAudioProcessor`. -* If constructing renderers directly, pass a `GvrAudioProcessor` to - `MediaCodecAudioRenderer`'s constructor. - -[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md - -## Links ## - -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.gvr.*` - belong to this module. - -[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/gvr/build.gradle b/extensions/gvr/build.gradle deleted file mode 100644 index db508e5137..0000000000 --- a/extensions/gvr/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2017 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" - -android.defaultConfig.minSdkVersion 19 - -dependencies { - implementation project(modulePrefix + 'library-core') - implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion - api 'com.google.vr:sdk-base:1.190.0' - compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion - compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion -} - -ext { - javadocTitle = 'GVR extension' -} -apply from: '../../javadoc_library.gradle' - -ext { - releaseArtifact = 'extension-gvr' - releaseDescription = 'Google VR extension for ExoPlayer.' -} -apply from: '../../publish.gradle' diff --git a/extensions/gvr/src/main/AndroidManifest.xml b/extensions/gvr/src/main/AndroidManifest.xml deleted file mode 100644 index 6706b2507e..0000000000 --- a/extensions/gvr/src/main/AndroidManifest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java b/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java deleted file mode 100644 index 0fc6f54285..0000000000 --- a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.ext.gvr; - -import androidx.annotation.Nullable; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.audio.AudioProcessor; -import com.google.android.exoplayer2.util.Assertions; -import com.google.vr.sdk.audio.GvrAudioSurround; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * An {@link AudioProcessor} that uses {@code GvrAudioSurround} to provide binaural rendering of - * surround sound and ambisonic soundfields. - * - * @deprecated If you still need this component, please contact us by filing an issue on our issue tracker. - */ -@Deprecated -public class GvrAudioProcessor implements AudioProcessor { - - static { - ExoPlayerLibraryInfo.registerModule("goog.exo.gvr"); - } - - private static final int FRAMES_PER_OUTPUT_BUFFER = 1024; - private static final int OUTPUT_CHANNEL_COUNT = 2; - private static final int OUTPUT_FRAME_SIZE = OUTPUT_CHANNEL_COUNT * 2; // 16-bit stereo output. - private static final int NO_SURROUND_FORMAT = GvrAudioSurround.SurroundFormat.INVALID; - - private AudioFormat pendingInputAudioFormat; - private int pendingGvrAudioSurroundFormat; - @Nullable private GvrAudioSurround gvrAudioSurround; - private ByteBuffer buffer; - private boolean inputEnded; - - private float w; - private float x; - private float y; - private float z; - - /** Creates a new GVR audio processor. */ - public GvrAudioProcessor() { - // Use the identity for the initial orientation. - w = 1f; - pendingInputAudioFormat = AudioFormat.NOT_SET; - buffer = EMPTY_BUFFER; - pendingGvrAudioSurroundFormat = NO_SURROUND_FORMAT; - } - - /** - * Updates the listener head orientation. May be called on any thread. See {@code - * GvrAudioSurround.updateNativeOrientation}. - * - * @param w The w component of the quaternion. - * @param x The x component of the quaternion. - * @param y The y component of the quaternion. - * @param z The z component of the quaternion. - */ - public synchronized void updateOrientation(float w, float x, float y, float z) { - this.w = w; - this.x = x; - this.y = y; - this.z = z; - if (gvrAudioSurround != null) { - gvrAudioSurround.updateNativeOrientation(w, x, y, z); - } - } - - @SuppressWarnings("ReferenceEquality") - @Override - public synchronized AudioFormat configure(AudioFormat inputAudioFormat) - throws UnhandledAudioFormatException { - if (inputAudioFormat.encoding != C.ENCODING_PCM_16BIT) { - maybeReleaseGvrAudioSurround(); - throw new UnhandledAudioFormatException(inputAudioFormat); - } - switch (inputAudioFormat.channelCount) { - case 1: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.SURROUND_MONO; - break; - case 2: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.SURROUND_STEREO; - break; - case 4: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.FIRST_ORDER_AMBISONICS; - break; - case 6: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.SURROUND_FIVE_DOT_ONE; - break; - case 9: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.SECOND_ORDER_AMBISONICS; - break; - case 16: - pendingGvrAudioSurroundFormat = GvrAudioSurround.SurroundFormat.THIRD_ORDER_AMBISONICS; - break; - default: - throw new UnhandledAudioFormatException(inputAudioFormat); - } - if (buffer == EMPTY_BUFFER) { - buffer = - ByteBuffer.allocateDirect(FRAMES_PER_OUTPUT_BUFFER * OUTPUT_FRAME_SIZE) - .order(ByteOrder.nativeOrder()); - } - pendingInputAudioFormat = inputAudioFormat; - return new AudioFormat(inputAudioFormat.sampleRate, OUTPUT_CHANNEL_COUNT, C.ENCODING_PCM_16BIT); - } - - @Override - public boolean isActive() { - return pendingGvrAudioSurroundFormat != NO_SURROUND_FORMAT || gvrAudioSurround != null; - } - - @Override - public void queueInput(ByteBuffer inputBuffer) { - int position = inputBuffer.position(); - Assertions.checkNotNull(gvrAudioSurround); - int readBytes = - gvrAudioSurround.addInput(inputBuffer, position, inputBuffer.limit() - position); - inputBuffer.position(position + readBytes); - } - - @Override - public void queueEndOfStream() { - // TODO(internal b/174554082): assert gvrAudioSurround is non-null here and in getOutput. - if (gvrAudioSurround != null) { - gvrAudioSurround.triggerProcessing(); - } - inputEnded = true; - } - - @Override - public ByteBuffer getOutput() { - if (gvrAudioSurround == null) { - return EMPTY_BUFFER; - } - int writtenBytes = gvrAudioSurround.getOutput(buffer, 0, buffer.capacity()); - buffer.position(0).limit(writtenBytes); - return buffer; - } - - @Override - public boolean isEnded() { - return inputEnded - && (gvrAudioSurround == null || gvrAudioSurround.getAvailableOutputSize() == 0); - } - - @Override - public void flush() { - if (pendingGvrAudioSurroundFormat != NO_SURROUND_FORMAT) { - maybeReleaseGvrAudioSurround(); - gvrAudioSurround = - new GvrAudioSurround( - pendingGvrAudioSurroundFormat, - pendingInputAudioFormat.sampleRate, - pendingInputAudioFormat.channelCount, - FRAMES_PER_OUTPUT_BUFFER); - gvrAudioSurround.updateNativeOrientation(w, x, y, z); - pendingGvrAudioSurroundFormat = NO_SURROUND_FORMAT; - } else if (gvrAudioSurround != null) { - gvrAudioSurround.flush(); - } - inputEnded = false; - } - - @Override - public synchronized void reset() { - maybeReleaseGvrAudioSurround(); - updateOrientation(/* w= */ 1f, /* x= */ 0f, /* y= */ 0f, /* z= */ 0f); - inputEnded = false; - pendingInputAudioFormat = AudioFormat.NOT_SET; - buffer = EMPTY_BUFFER; - pendingGvrAudioSurroundFormat = NO_SURROUND_FORMAT; - } - - private void maybeReleaseGvrAudioSurround() { - if (gvrAudioSurround != null) { - gvrAudioSurround.release(); - gvrAudioSurround = null; - } - } -} diff --git a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/package-info.java b/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/package-info.java deleted file mode 100644 index 155317fc29..0000000000 --- a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@NonNullApi -package com.google.android.exoplayer2.ext.gvr; - -import com.google.android.exoplayer2.util.NonNullApi; From 9e798a647e7852dc1adce2c7803fcdac7e680190 Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 5 Aug 2021 13:34:29 +0100 Subject: [PATCH 024/441] Miscalleneous small fixes in Transformer PiperOrigin-RevId: 388911857 --- .../android/exoplayer2/transformer/Muxer.java | 4 ++-- .../exoplayer2/transformer/Transformer.java | 15 ++++++++++----- .../transformer/TransformerAudioRenderer.java | 4 ++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java index 72e5f0f6b8..b00fbadfd5 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java @@ -28,8 +28,8 @@ import java.nio.ByteBuffer; *

Query whether {@link #supportsSampleMimeType(String) sample MIME types are supported} and * {@link #addTrack(Format) add all tracks}, then {@link #writeSampleData(int, ByteBuffer, boolean, * long) write sample data} to mux samples. Once any sample data has been written, it is not - * possible to add tracks. After writing all sample data, {@link #release() release} the instance to - * finish writing to the output and return any resources to the system. + * possible to add tracks. After writing all sample data, {@link #release(boolean) release} the + * instance to finish writing to the output and return any resources to the system. */ /* package */ interface Muxer { diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index aa0437daba..57583c79ad 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -204,8 +204,10 @@ public final class Transformer { } /** - * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported - * values are: + * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. The + * output MIME type should be supported by the {@link + * Muxer.Factory#supportsOutputMimeType(String) muxer}. Values supported by the default {@link + * FrameworkMuxer} are: * *

    *
  • {@link MimeTypes#VIDEO_MP4} @@ -261,7 +263,8 @@ public final class Transformer { } /** - * Sets the factory for muxers that write the media container. + * Sets the factory for muxers that write the media container. The default value is a {@link + * FrameworkMuxer.Factory}. * * @param muxerFactory A {@link Muxer.Factory}. * @return This builder. @@ -407,7 +410,8 @@ public final class Transformer { * sources}, the highest bitrate video and audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the - * output container format and are described in {@link MediaMuxer#addTrack(MediaFormat)}. + * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are + * described in {@link MediaMuxer#addTrack(MediaFormat)}. * @param path The path to the output file. * @throws IllegalArgumentException If the path is invalid. * @throws IllegalStateException If this method is called from the wrong thread. @@ -431,7 +435,8 @@ public final class Transformer { * sources}, the highest bitrate video and audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the - * output container format and are described in {@link MediaMuxer#addTrack(MediaFormat)}. + * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are + * described in {@link MediaMuxer#addTrack(MediaFormat)}. * @param parcelFileDescriptor A readable and writable {@link ParcelFileDescriptor} of the output. * The file referenced by this ParcelFileDescriptor should not be used before the * transformation is completed. It is the responsibility of the caller to close the diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 6198054aa2..6504151db5 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -222,8 +222,8 @@ import java.nio.ByteBuffer; } /** - * Attempts to process decoder output audio, and returns whether it may be possible to process - * more data immediately by calling this method again. + * Attempts to process decoder output data, and returns whether it may be possible to process more + * data immediately by calling this method again. */ private boolean drainDecoderToFeedSonic() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); From bdff0d9374d2d9e65826f03876af2be40a9738bc Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 5 Aug 2021 15:29:08 +0100 Subject: [PATCH 025/441] Upgrade to gradle 7.0.2 PiperOrigin-RevId: 388929850 --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3092a9a7c7..da37ad7bf6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' + classpath 'com.android.tools.build:gradle:7.0.0' classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.2' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 76c4be41e9..0440a40b90 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.9-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-7.0.2-all.zip From 281fc84d15e89bc4cd1d08b80eb614725e3d3326 Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 5 Aug 2021 15:42:58 +0100 Subject: [PATCH 026/441] Add CueDecoder and CueEncoder. This CL introduces two classes: * CueEncoder - encodes list of Cue object into byte array. * CueDecoder - decodes byte array into list of Cue objects. This two classes are necessary in order to push Cues through SampleQueue. This classes are meant to be used by subtitle Extractor. PiperOrigin-RevId: 388932088 --- .../android/exoplayer2/text/CueDecoder.java | 48 +++++++ .../android/exoplayer2/text/CueEncoder.java | 44 ++++++ .../exoplayer2/text/CueSerializationTest.java | 126 ++++++++++++++++++ 3 files changed, 218 insertions(+) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java create mode 100644 library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java new file mode 100644 index 0000000000..d986c32f6e --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java @@ -0,0 +1,48 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.text; + +import android.os.Bundle; +import android.os.Parcel; +import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.common.collect.ImmutableList; +import java.util.ArrayList; + +/** Decodes data encoded by {@link CueEncoder}. */ +public final class CueDecoder { + + // key under which list of cues is saved in the bundle + static final String BUNDLED_CUES = "c"; + + /** + * Decodes byte array into list of {@link Cue} objects. + * + * @param bytes byte array produced by {@link CueEncoder} + * @return decoded list of {@link Cue} objects. + */ + public ImmutableList decode(byte[] bytes) { + Parcel parcel = Parcel.obtain(); + parcel.unmarshall(bytes, 0, bytes.length); + parcel.setDataPosition(0); + Bundle bundle = parcel.readBundle(Bundle.class.getClassLoader()); + parcel.recycle(); + ArrayList bundledCues = + Assertions.checkNotNull(bundle.getParcelableArrayList(BUNDLED_CUES)); + + return BundleableUtils.fromBundleList(Cue.CREATOR, bundledCues); + } +} diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java new file mode 100644 index 0000000000..773ec5aecf --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java @@ -0,0 +1,44 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.text; + +import android.os.Bundle; +import android.os.Parcel; +import com.google.android.exoplayer2.util.BundleableUtils; +import java.util.ArrayList; +import java.util.List; + +/** Encodes data that can be decoded by {@link CueDecoder}. */ +public final class CueEncoder { + /** + * Encodes an {@link List} of {@link Cue} to a byte array that can be decoded by {@link + * CueDecoder}. + * + * @param cues Cues to be encoded. + * @return The serialized byte array. + */ + public byte[] encode(List cues) { + ArrayList bundledCues = BundleableUtils.toBundleArrayList(cues); + Bundle allCuesBundle = new Bundle(); + allCuesBundle.putParcelableArrayList(CueDecoder.BUNDLED_CUES, bundledCues); + Parcel parcel = Parcel.obtain(); + parcel.writeBundle(allCuesBundle); + byte[] bytes = parcel.marshall(); + parcel.recycle(); + + return bytes; + } +} diff --git a/library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java b/library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java new file mode 100644 index 0000000000..16e07d77c3 --- /dev/null +++ b/library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java @@ -0,0 +1,126 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.text; + +import static com.google.common.truth.Truth.assertThat; + +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Typeface; +import android.text.Layout; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.SpannedString; +import android.text.style.StrikethroughSpan; +import android.text.style.StyleSpan; +import android.text.style.UnderlineSpan; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.testutil.truth.SpannedSubject; +import com.google.common.collect.ImmutableList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Test of {@link Cue} serialization and deserialization using {@link CueEncoder} and {@link + * CueDecoder}. + */ +@RunWith(AndroidJUnit4.class) +public class CueSerializationTest { + @Test + public void serializingCueWithoutSpans() { + CueEncoder encoder = new CueEncoder(); + CueDecoder decoder = new CueDecoder(); + Cue cue = + new Cue.Builder() + .setText(SpannedString.valueOf("text")) + .setTextAlignment(Layout.Alignment.ALIGN_CENTER) + .setMultiRowAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLine(5, Cue.LINE_TYPE_NUMBER) + .setLineAnchor(Cue.ANCHOR_TYPE_END) + .setPosition(0.4f) + .setPositionAnchor(Cue.ANCHOR_TYPE_MIDDLE) + .setTextSize(0.2f, Cue.TEXT_SIZE_TYPE_FRACTIONAL) + .setSize(0.8f) + .setWindowColor(Color.CYAN) + .setVerticalType(Cue.VERTICAL_TYPE_RL) + .setShearDegrees(-15f) + .build(); + + // encoding and decoding + byte[] encodedCues = encoder.encode(ImmutableList.of(cue)); + List cuesAfterDecoding = decoder.decode(encodedCues); + Cue cueAfterDecoding = cuesAfterDecoding.get(0); + + assertThat(cueAfterDecoding.text.toString()).isEqualTo(cue.text.toString()); + assertThat(cueAfterDecoding.textAlignment).isEqualTo(cue.textAlignment); + assertThat(cueAfterDecoding.multiRowAlignment).isEqualTo(cue.multiRowAlignment); + assertThat(cueAfterDecoding.line).isEqualTo(cue.line); + assertThat(cueAfterDecoding.lineType).isEqualTo(cue.lineType); + assertThat(cueAfterDecoding.position).isEqualTo(cue.position); + assertThat(cueAfterDecoding.positionAnchor).isEqualTo(cue.positionAnchor); + assertThat(cueAfterDecoding.textSize).isEqualTo(cue.textSize); + assertThat(cueAfterDecoding.textSizeType).isEqualTo(cue.textSizeType); + assertThat(cueAfterDecoding.size).isEqualTo(cue.size); + assertThat(cueAfterDecoding.windowColor).isEqualTo(cue.windowColor); + assertThat(cueAfterDecoding.windowColorSet).isEqualTo(cue.windowColorSet); + assertThat(cueAfterDecoding.verticalType).isEqualTo(cue.verticalType); + assertThat(cueAfterDecoding.shearDegrees).isEqualTo(cue.shearDegrees); + } + + @Test + public void serializingBitmapCueAndCueWithAndroidSpans() { + CueEncoder encoder = new CueEncoder(); + CueDecoder decoder = new CueDecoder(); + Spannable spannable = SpannableString.valueOf("text text"); + spannable.setSpan( + new StrikethroughSpan(), 0, "text".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan( + new StyleSpan(Typeface.BOLD), 0, "text text".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan( + new StyleSpan(Typeface.ITALIC), 0, "text text".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannable.setSpan( + new UnderlineSpan(), + "text ".length(), + "text text".length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + Cue textCue = new Cue.Builder().setText(spannable).build(); + Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + Cue bitmapCue = new Cue.Builder().setBitmap(bitmap).build(); + + // encoding and decoding + byte[] encodedCues = encoder.encode(ImmutableList.of(textCue, bitmapCue)); + List cuesAfterDecoding = decoder.decode(encodedCues); + + assertThat(cuesAfterDecoding).hasSize(2); + + Cue textCueAfterDecoding = cuesAfterDecoding.get(0); + Cue bitmapCueAfterDecoding = cuesAfterDecoding.get(1); + + assertThat(textCueAfterDecoding.text.toString()).isEqualTo(textCue.text.toString()); + SpannedSubject.assertThat((Spanned) textCueAfterDecoding.text) + .hasStrikethroughSpanBetween(0, "text".length()); + SpannedSubject.assertThat((Spanned) textCueAfterDecoding.text) + .hasBoldSpanBetween(0, "text text".length()); + SpannedSubject.assertThat((Spanned) textCueAfterDecoding.text) + .hasItalicSpanBetween(0, "text text".length()); + SpannedSubject.assertThat((Spanned) textCueAfterDecoding.text) + .hasUnderlineSpanBetween("text ".length(), "text text".length()); + + assertThat(bitmapCueAfterDecoding.bitmap.sameAs(bitmap)).isTrue(); + } +} From a5e772f91f55b47727a97d40de097848c5808ce5 Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 5 Aug 2021 19:16:07 +0100 Subject: [PATCH 027/441] Move SubtitleDecoder to common This CL moves SubtitleDecoder and all its dependencies to common in order to enable using it in extractor module while implementing SubtitleExtractor. PiperOrigin-RevId: 388979021 --- .../main/java/com/google/android/exoplayer2/decoder/Decoder.java | 0 .../com/google/android/exoplayer2/decoder/DecoderException.java | 0 .../java/com/google/android/exoplayer2/decoder/OutputBuffer.java | 0 .../main/java/com/google/android/exoplayer2/text/Subtitle.java | 0 .../java/com/google/android/exoplayer2/text/SubtitleDecoder.java | 0 .../google/android/exoplayer2/text/SubtitleDecoderException.java | 0 .../com/google/android/exoplayer2/text/SubtitleInputBuffer.java | 0 .../com/google/android/exoplayer2/text/SubtitleOutputBuffer.java | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/Subtitle.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/Subtitle.java b/library/common/src/main/java/com/google/android/exoplayer2/text/Subtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/Subtitle.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/Subtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java From 225081721dd582396f0f336fe0cdc6407d95052d Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 6 Aug 2021 15:21:19 +0100 Subject: [PATCH 028/441] Statically import TRACK_TYPE constants in SimpleExoPlayer PiperOrigin-RevId: 389170562 --- .../android/exoplayer2/SimpleExoPlayer.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 04ded28f2f..76db88f84f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -15,6 +15,9 @@ */ package com.google.android.exoplayer2; +import static com.google.android.exoplayer2.C.TRACK_TYPE_AUDIO; +import static com.google.android.exoplayer2.C.TRACK_TYPE_CAMERA_MOTION; +import static com.google.android.exoplayer2.C.TRACK_TYPE_VIDEO; import static com.google.android.exoplayer2.Renderer.MSG_SET_AUDIO_ATTRIBUTES; import static com.google.android.exoplayer2.Renderer.MSG_SET_AUDIO_SESSION_ID; import static com.google.android.exoplayer2.Renderer.MSG_SET_AUX_EFFECT_INFO; @@ -792,15 +795,15 @@ public class SimpleExoPlayer extends BasePlayer deviceInfo = createDeviceInfo(streamVolumeManager); videoSize = VideoSize.UNKNOWN; - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); - sendRendererMessage(C.TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); - sendRendererMessage(C.TRACK_TYPE_VIDEO, MSG_SET_SCALING_MODE, videoScalingMode); - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); + sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); + sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_SCALING_MODE, videoScalingMode); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); sendRendererMessage( - C.TRACK_TYPE_VIDEO, MSG_SET_VIDEO_FRAME_METADATA_LISTENER, frameMetadataListener); + TRACK_TYPE_VIDEO, MSG_SET_VIDEO_FRAME_METADATA_LISTENER, frameMetadataListener); sendRendererMessage( - C.TRACK_TYPE_CAMERA_MOTION, MSG_SET_CAMERA_MOTION_LISTENER, frameMetadataListener); + TRACK_TYPE_CAMERA_MOTION, MSG_SET_CAMERA_MOTION_LISTENER, frameMetadataListener); } finally { constructorFinished.open(); } @@ -860,7 +863,7 @@ public class SimpleExoPlayer extends BasePlayer public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { verifyApplicationThread(); this.videoScalingMode = videoScalingMode; - sendRendererMessage(C.TRACK_TYPE_VIDEO, MSG_SET_SCALING_MODE, videoScalingMode); + sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_SCALING_MODE, videoScalingMode); } @Override @@ -1026,7 +1029,7 @@ public class SimpleExoPlayer extends BasePlayer } if (!Util.areEqual(this.audioAttributes, audioAttributes)) { this.audioAttributes = audioAttributes; - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); streamVolumeManager.setStreamType(Util.getStreamTypeForAudioUsage(audioAttributes.usage)); analyticsCollector.onAudioAttributesChanged(audioAttributes); for (AudioListener audioListener : audioListeners) { @@ -1065,8 +1068,8 @@ public class SimpleExoPlayer extends BasePlayer initializeKeepSessionIdAudioTrack(audioSessionId); } this.audioSessionId = audioSessionId; - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); - sendRendererMessage(C.TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); + sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); analyticsCollector.onAudioSessionIdChanged(audioSessionId); for (AudioListener audioListener : audioListeners) { audioListener.onAudioSessionIdChanged(audioSessionId); @@ -1081,7 +1084,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void setAuxEffectInfo(AuxEffectInfo auxEffectInfo) { verifyApplicationThread(); - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_AUX_EFFECT_INFO, auxEffectInfo); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUX_EFFECT_INFO, auxEffectInfo); } @Override @@ -1121,7 +1124,7 @@ public class SimpleExoPlayer extends BasePlayer return; } this.skipSilenceEnabled = skipSilenceEnabled; - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); notifySkipSilenceEnabledChanged(); } @@ -1979,7 +1982,7 @@ public class SimpleExoPlayer extends BasePlayer // as to ensure onRenderedFirstFrame callbacks are still called in this case. List messages = new ArrayList<>(); for (Renderer renderer : renderers) { - if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { + if (renderer.getTrackType() == TRACK_TYPE_VIDEO) { messages.add( player .createMessage(renderer) @@ -2054,7 +2057,7 @@ public class SimpleExoPlayer extends BasePlayer private void sendVolumeToRenderers() { float scaledVolume = audioVolume * audioFocusManager.getVolumeMultiplier(); - sendRendererMessage(C.TRACK_TYPE_AUDIO, MSG_SET_VOLUME, scaledVolume); + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_VOLUME, scaledVolume); } @SuppressWarnings("SuspiciousMethodCalls") From d698e96a5760095f98f9d7a67f29809f96f95847 Mon Sep 17 00:00:00 2001 From: christosts Date: Fri, 6 Aug 2021 15:50:06 +0100 Subject: [PATCH 029/441] Fix bug in Timeline.getRemovedAdGroupCount() #minor-release PiperOrigin-RevId: 389174519 --- .../src/main/java/com/google/android/exoplayer2/Timeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 810c0702d5..5e9ff6a65d 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 @@ -710,7 +710,7 @@ public abstract class Timeline implements Bundleable { * 0} (inclusive) and {@code removedAdGroupCount} (exclusive) will be empty. */ public int getRemovedAdGroupCount() { - return adPlaybackState.adGroupCount; + return adPlaybackState.removedAdGroupCount; } /** From be19624a204682bee73008ffafe09dad397b8a9a Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 6 Aug 2021 17:54:46 +0100 Subject: [PATCH 030/441] Add a factory option to enable logging RTSP messages. Many GH users find it hard to print out RTSP messages if they use ExoPlayer as an external dependency. PiperOrigin-RevId: 389197812 --- RELEASENOTES.md | 4 +-- .../exoplayer2/source/rtsp/RtspClient.java | 19 +++++++++++-- .../source/rtsp/RtspMediaPeriod.java | 6 ++-- .../source/rtsp/RtspMediaSource.java | 28 +++++++++++++++++-- .../source/rtsp/RtspClientTest.java | 12 +++++--- .../source/rtsp/RtspMediaPeriodTest.java | 3 +- .../source/rtsp/RtspPlaybackTest.java | 4 ++- 7 files changed, 61 insertions(+), 15 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a795841ee8..2d9601dbf6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -162,8 +162,8 @@ format-related information. ([#9175](https://github.com/google/ExoPlayer/issues/9175)). * SS: - * Propagate `StreamIndex` element `Name` attribute value as `Format` - label ([#9252](https://github.com/google/ExoPlayer/issues/9252)). + * Propagate `StreamIndex` element `Name` attribute value as `Format` label + ([#9252](https://github.com/google/ExoPlayer/issues/9252)). ### 2.14.2 (2021-07-20) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java index 0c4cff6446..45d7bcad9a 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java @@ -47,7 +47,9 @@ import com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspPlaybackExc import com.google.android.exoplayer2.source.rtsp.RtspMessageChannel.InterleavedBinaryDataListener; import com.google.android.exoplayer2.source.rtsp.RtspMessageUtil.RtspAuthUserInfo; import com.google.android.exoplayer2.source.rtsp.RtspMessageUtil.RtspSessionHeader; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -65,6 +67,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** The RTSP client. */ /* package */ final class RtspClient implements Closeable { + private static final String TAG = "RtspClient"; private static final long DEFAULT_RTSP_KEEP_ALIVE_INTERVAL_MS = 30_000; /** A listener for session information update. */ @@ -100,6 +103,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final Uri uri; @Nullable private final RtspAuthUserInfo rtspAuthUserInfo; private final String userAgent; + private final boolean debugLoggingEnabled; private final ArrayDeque pendingSetupRtpLoadInfos; // TODO(b/172331505) Add a timeout monitor for pending requests. private final SparseArray pendingRequests; @@ -131,12 +135,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; SessionInfoListener sessionInfoListener, PlaybackEventListener playbackEventListener, String userAgent, - Uri uri) { + Uri uri, + boolean debugLoggingEnabled) { this.sessionInfoListener = sessionInfoListener; this.playbackEventListener = playbackEventListener; this.uri = RtspMessageUtil.removeUserInfo(uri); this.rtspAuthUserInfo = RtspMessageUtil.parseUserInfo(uri); this.userAgent = userAgent; + this.debugLoggingEnabled = debugLoggingEnabled; pendingSetupRtpLoadInfos = new ArrayDeque<>(); pendingRequests = new SparseArray<>(); messageSender = new MessageSender(); @@ -241,6 +247,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; messageSender.sendSetupRequest(loadInfo.getTrackUri(), loadInfo.getTransport(), sessionId); } + private void maybeLogMessage(List message) { + if (debugLoggingEnabled) { + Log.d(TAG, Joiner.on("\n").join(message)); + } + } + /** Returns a {@link Socket} that is connected to the {@code uri}. */ private static Socket getSocket(Uri uri) throws IOException { checkArgument(uri.getHost() != null); @@ -396,7 +408,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; int cSeq = Integer.parseInt(checkNotNull(request.headers.get(RtspHeaders.CSEQ))); checkState(pendingRequests.get(cSeq) == null); pendingRequests.append(cSeq, request); - messageChannel.send(RtspMessageUtil.serializeRequest(request)); + List message = RtspMessageUtil.serializeRequest(request); + maybeLogMessage(message); + messageChannel.send(message); lastRequest = request; } } @@ -421,6 +435,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } private void handleRtspMessage(List message) { + maybeLogMessage(message); RtspResponse response = RtspMessageUtil.parseResponse(message); int cSeq = Integer.parseInt(checkNotNull(response.headers.get(RtspHeaders.CSEQ))); diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java index 14bcdfceb6..435bb59a30 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java @@ -108,7 +108,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; RtpDataChannel.Factory rtpDataChannelFactory, Uri uri, Listener listener, - String userAgent) { + String userAgent, + boolean debugLoggingEnabled) { this.allocator = allocator; this.rtpDataChannelFactory = rtpDataChannelFactory; this.listener = listener; @@ -120,7 +121,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* sessionInfoListener= */ internalListener, /* playbackEventListener= */ internalListener, /* userAgent= */ userAgent, - /* uri= */ uri); + /* uri= */ uri, + debugLoggingEnabled); rtspLoaderWrappers = new ArrayList<>(); selectedLoadInfos = new ArrayList<>(); diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java index 89cbaeddb3..688c2f40b3 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java @@ -69,6 +69,7 @@ public final class RtspMediaSource extends BaseMediaSource { private long timeoutMs; private String userAgent; private boolean forceUseRtpTcp; + private boolean debugLoggingEnabled; public Factory() { timeoutMs = DEFAULT_TIMEOUT_MS; @@ -102,6 +103,20 @@ public final class RtspMediaSource extends BaseMediaSource { return this; } + /** + * Sets whether to log RTSP messages, the default value is {@code false}. + * + *

    This option presents a privacy risk, since it may expose sensitive information such as + * user's credentials. + * + * @param debugLoggingEnabled Whether to log RTSP messages. + * @return This Factory, for convenience. + */ + public Factory setDebugLoggingEnabled(boolean debugLoggingEnabled) { + this.debugLoggingEnabled = debugLoggingEnabled; + return this; + } + /** * Sets the timeout in milliseconds, the default value is {@link #DEFAULT_TIMEOUT_MS}. * @@ -186,7 +201,8 @@ public final class RtspMediaSource extends BaseMediaSource { forceUseRtpTcp ? new TransferRtpDataChannelFactory(timeoutMs) : new UdpDataSourceRtpDataChannelFactory(timeoutMs), - userAgent); + userAgent, + debugLoggingEnabled); } } @@ -209,6 +225,7 @@ public final class RtspMediaSource extends BaseMediaSource { private final RtpDataChannel.Factory rtpDataChannelFactory; private final String userAgent; private final Uri uri; + private final boolean debugLoggingEnabled; private long timelineDurationUs; private boolean timelineIsSeekable; @@ -217,11 +234,15 @@ public final class RtspMediaSource extends BaseMediaSource { @VisibleForTesting /* package */ RtspMediaSource( - MediaItem mediaItem, RtpDataChannel.Factory rtpDataChannelFactory, String userAgent) { + MediaItem mediaItem, + RtpDataChannel.Factory rtpDataChannelFactory, + String userAgent, + boolean debugLoggingEnabled) { this.mediaItem = mediaItem; this.rtpDataChannelFactory = rtpDataChannelFactory; this.userAgent = userAgent; this.uri = checkNotNull(this.mediaItem.playbackProperties).uri; + this.debugLoggingEnabled = debugLoggingEnabled; this.timelineDurationUs = C.TIME_UNSET; this.timelineIsPlaceholder = true; } @@ -259,7 +280,8 @@ public final class RtspMediaSource extends BaseMediaSource { timelineIsPlaceholder = false; notifySourceInfoRefreshed(); }, - userAgent); + userAgent, + debugLoggingEnabled); } @Override diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java index 129871c584..15237d1003 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java @@ -112,7 +112,8 @@ public final class RtspClientTest { }, EMPTY_PLAYBACK_LISTENER, /* userAgent= */ "ExoPlayer:RtspClientTest", - RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber())); + RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), + /* debugLoggingEnabled= */ false); rtspClient.start(); RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); @@ -153,7 +154,8 @@ public final class RtspClientTest { }, EMPTY_PLAYBACK_LISTENER, /* userAgent= */ "ExoPlayer:RtspClientTest", - RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber())); + RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), + /* debugLoggingEnabled= */ false); rtspClient.start(); RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); @@ -197,7 +199,8 @@ public final class RtspClientTest { }, EMPTY_PLAYBACK_LISTENER, /* userAgent= */ "ExoPlayer:RtspClientTest", - RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber())); + RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), + /* debugLoggingEnabled= */ false); rtspClient.start(); RobolectricUtil.runMainLooperUntil(() -> failureMessage.get() != null); @@ -241,7 +244,8 @@ public final class RtspClientTest { }, EMPTY_PLAYBACK_LISTENER, /* userAgent= */ "ExoPlayer:RtspClientTest", - RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber())); + RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), + /* debugLoggingEnabled= */ false); rtspClient.start(); RobolectricUtil.runMainLooperUntil(() -> failureCause.get() != null); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriodTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriodTest.java index 9072103958..da7da55d8e 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriodTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriodTest.java @@ -83,7 +83,8 @@ public final class RtspMediaPeriodTest { new TransferRtpDataChannelFactory(DEFAULT_TIMEOUT_MS), RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), /* listener= */ timing -> refreshedSourceDurationMs.set(timing.getDurationMs()), - /* userAgent= */ "ExoPlayer:RtspPeriodTest"); + /* userAgent= */ "ExoPlayer:RtspPeriodTest", + /* debugLoggingEnabled= */ false); mediaPeriod.prepare( new MediaPeriod.Callback() { diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java index e46737d3d7..61cde4a725 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java @@ -157,7 +157,9 @@ public final class RtspPlaybackTest { new RtspMediaSource( MediaItem.fromUri(RtspTestUtils.getTestUri(serverRtspPortNumber)), rtpDataChannelFactory, - "ExoPlayer:PlaybackTest")); + "ExoPlayer:PlaybackTest", + /* debugLoggingEnabled= */ false), + false); return player; } From eb74856c573b21a358ce3a7c1246d05a9a7d2bdd Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 09:39:07 +0100 Subject: [PATCH 031/441] Fix constants.gradle bug ref PiperOrigin-RevId: 389579365 --- constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index b46d0b82ca..3755fc2779 100644 --- a/constants.gradle +++ b/constants.gradle @@ -17,7 +17,7 @@ project.ext { releaseVersionCode = 2014002 minSdkVersion = 16 appTargetSdkVersion = 29 - // Upgrading this requires [Internal ref: b/162763326] to be fixed, or some + // Upgrading this requires [Internal ref: b/193254928] to be fixed, or some // additional robolectric config. targetSdkVersion = 30 compileSdkVersion = 31 From 0097a79c2d221dc55ef1147f6f3144f2735a997a Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 13:32:19 +0100 Subject: [PATCH 032/441] Add ability to disable Surface.setFrameRate calls Adding a CHANGE_FRAME_RATE_STRATEGY_ALWAYS strategy is omitted from this commit, since adding it is more complicated than just plumbing it through and leaving everything else unchanged. Specifically, VideoFrameReleaseTimeHelper would need updating to behave differently when such a strategy is enabled. It currently calls setFrameRate in cases such as pausing, seeking and re-buffering, on the assumption that changes to the underlying display refresh rate will only be made if they can be done seamlessly. For a mode in which this will not be the case, it makes more sense to stick to the content frame-rate when these events occur. It may also make sense to only use explicit content frame-rate values, and not those inferred from individual frame timestamps. Finally, for adaptive content containing a mix of frame-rates, it makes sense to use the maximal frame-rate across all variants, and to avoid calling setFrameRate on switches from one variant to another. Applications that know the frame-rate of their content can set ExoPlayer's strategy to CHANGE_FRAME_RATE_STRATEGY_OFF and then use setFrameRate directly on the output surface. Note that this is likely to be a better option for apps than anything we could implement in ExoPlayer, because the application layer most likely knows the frame-rate of the content earlier than ExoPlayer does (e.g., to perform the disruptive mode switch at the same time as an activity transition). Adding CHANGE_FRAME_RATE_STRATEGY_ALWAYS will be deferred until there's clear demand for it. In the meantime, we'll recommend the alternative approach above. PiperOrigin-RevId: 389610965 --- RELEASENOTES.md | 7 ++- .../java/com/google/android/exoplayer2/C.java | 21 ++++++- .../google/android/exoplayer2/ExoPlayer.java | 23 +++++++ .../google/android/exoplayer2/Renderer.java | 18 ++++-- .../android/exoplayer2/SimpleExoPlayer.java | 61 +++++++++++++++---- .../video/MediaCodecVideoRenderer.java | 5 ++ .../video/VideoFrameReleaseHelper.java | 49 ++++++++++++--- 7 files changed, 155 insertions(+), 29 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2d9601dbf6..fb47d9543b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -50,11 +50,16 @@ * Change interface of `LoadErrorHandlingPolicy` to support configuring the behavior of track and location fallback. Location fallback is currently only supported for DASH manifests with multiple base URLs. - * Disable platform transcoding when playing content URIs on Android 12. * Restrict use of `AudioTrack.isDirectPlaybackSupported` to TVs, to avoid listing audio offload encodings as supported for passthrough mode on mobile devices ([#9239](https://github.com/google/ExoPlayer/issues/9239)). +* Android 12 compatibility: + * Disable platform transcoding when playing content URIs on Android 12. + * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of + calls from the player to `Surface.setFrameRate`. This is useful for + applications wanting to call `Surface.setFrameRate` directly from + application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. * Remove deprecated symbols: * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index ede2dc6001..4364103ace 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -21,6 +21,7 @@ import android.media.AudioFormat; import android.media.AudioManager; import android.media.MediaCodec; import android.media.MediaFormat; +import android.view.Surface; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -491,6 +492,23 @@ public final class C { /** A default video scaling mode for {@link MediaCodec}-based renderers. */ public static final int VIDEO_SCALING_MODE_DEFAULT = VIDEO_SCALING_MODE_SCALE_TO_FIT; + /** Strategies for calling {@link Surface#setFrameRate}. */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF, VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}) + public @interface VideoChangeFrameRateStrategy {} + /** + * Strategy to never call {@link Surface#setFrameRate}. Use this strategy if you prefer to call + * {@link Surface#setFrameRate} directly from application code. + */ + public static final int VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF = Integer.MIN_VALUE; + /** + * Strategy to call {@link Surface#setFrameRate} with {@link + * Surface#CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS} when the output frame rate is known. + */ + public static final int VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS = + Surface.CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS; + /** * Track selection flags. Possible flag values are {@link #SELECTION_FLAG_DEFAULT}, {@link * #SELECTION_FLAG_FORCED} and {@link #SELECTION_FLAG_AUTOSELECT}. @@ -982,7 +1000,7 @@ public final class C { FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE }) - public static @interface FormatSupport {} + public @interface FormatSupport {} // TODO(b/172315872) Renderer was a link. Link to equivalent concept or remove @code. /** The {@code Renderer} is capable of rendering the format. */ public static final int FORMAT_HANDLED = 0b100; @@ -1023,6 +1041,7 @@ public final class C { * audio MIME type. */ public static final int FORMAT_UNSUPPORTED_TYPE = 0b000; + /** * Converts a time in microseconds to the corresponding time in milliseconds, preserving {@link * #TIME_UNSET} and {@link #TIME_END_OF_SOURCE} values. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index cd4d855f1e..17aa270f90 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2; import android.content.Context; import android.media.AudioTrack; +import android.media.MediaCodec; import android.os.Looper; import android.view.Surface; import android.view.SurfaceHolder; @@ -241,6 +242,9 @@ public interface ExoPlayer extends Player { /** * Sets the {@link C.VideoScalingMode}. * + *

    The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is + * enabled and if the output surface is owned by a {@link SurfaceView}. + * * @param videoScalingMode The {@link C.VideoScalingMode}. */ void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode); @@ -249,6 +253,25 @@ public interface ExoPlayer extends Player { @C.VideoScalingMode int getVideoScalingMode(); + /** + * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided + * with a video output {@link Surface}. + * + *

    The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. + * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to + * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link + * Surface#setFrameRate} from ExoPlayer, and should then call {@link Surface#setFrameRate} + * directly from application code. + * + * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. + */ + void setVideoChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy); + + /** Returns the {@link C.VideoChangeFrameRateStrategy}. */ + @C.VideoChangeFrameRateStrategy + int getVideoChangeFrameRateStrategy(); + /** * Adds a listener to receive video events. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index 1affb1d088..9c866e531b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -119,37 +119,43 @@ public interface Renderer extends PlayerMessage.Target { * owned by a {@link android.view.SurfaceView}. */ int MSG_SET_SCALING_MODE = 4; + /** + * The type of a message that can be passed to a video renderer via {@link + * ExoPlayer#createMessage(Target)}. The message payload should be one of the integer strategy + * constants in {@link C.VideoChangeFrameRateStrategy}. + */ + int MSG_SET_CHANGE_FRAME_RATE_STRATEGY = 5; /** * A type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be an {@link AuxEffectInfo} * instance representing an auxiliary audio effect for the underlying audio track. */ - int MSG_SET_AUX_EFFECT_INFO = 5; + int MSG_SET_AUX_EFFECT_INFO = 6; /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link * VideoFrameMetadataListener} instance, or null. */ - int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = 6; + int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = 7; /** * The type of a message that can be passed to a camera motion renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link CameraMotionListener} * instance, or null. */ - int MSG_SET_CAMERA_MOTION_LISTENER = 7; + int MSG_SET_CAMERA_MOTION_LISTENER = 8; /** * The type of a message that can be passed to an audio renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload should be a {@link Boolean} instance * telling whether to enable or disable skipping silences in the audio stream. */ - int MSG_SET_SKIP_SILENCE_ENABLED = 8; + int MSG_SET_SKIP_SILENCE_ENABLED = 9; /** * The type of a message that can be passed to audio and video renderers via {@link * ExoPlayer#createMessage(Target)}. The message payload should be an {@link Integer} instance * representing the audio session ID that will be attached to the underlying audio track. Video * renderers that support tunneling will use the audio session ID when tunneling is enabled. */ - int MSG_SET_AUDIO_SESSION_ID = 9; + int MSG_SET_AUDIO_SESSION_ID = 10; /** * The type of a message that can be passed to a {@link Renderer} via {@link * ExoPlayer#createMessage(Target)}, to inform the renderer that it can schedule waking up another @@ -157,7 +163,7 @@ public interface Renderer extends PlayerMessage.Target { * *

    The message payload must be a {@link WakeupListener} instance. */ - int MSG_SET_WAKEUP_LISTENER = 10; + int MSG_SET_WAKEUP_LISTENER = 11; /** * Applications or extensions may define custom {@code MSG_*} constants that can be passed to * renderers. These custom constants must be greater than or equal to this value. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 76db88f84f..3acffbca5a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -22,6 +22,7 @@ import static com.google.android.exoplayer2.Renderer.MSG_SET_AUDIO_ATTRIBUTES; import static com.google.android.exoplayer2.Renderer.MSG_SET_AUDIO_SESSION_ID; import static com.google.android.exoplayer2.Renderer.MSG_SET_AUX_EFFECT_INFO; import static com.google.android.exoplayer2.Renderer.MSG_SET_CAMERA_MOTION_LISTENER; +import static com.google.android.exoplayer2.Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY; import static com.google.android.exoplayer2.Renderer.MSG_SET_SCALING_MODE; import static com.google.android.exoplayer2.Renderer.MSG_SET_SKIP_SILENCE_ENABLED; import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; @@ -130,6 +131,7 @@ public class SimpleExoPlayer extends BasePlayer private boolean handleAudioBecomingNoisy; private boolean skipSilenceEnabled; @C.VideoScalingMode private int videoScalingMode; + @C.VideoChangeFrameRateStrategy private int videoChangeFrameRateStrategy; private boolean useLazyPreparation; private SeekParameters seekParameters; private long seekBackIncrementMs; @@ -168,6 +170,8 @@ public class SimpleExoPlayer extends BasePlayer *

  • {@code handleAudioBecomingNoisy}: {@code false} *
  • {@code skipSilenceEnabled}: {@code false} *
  • {@link C.VideoScalingMode}: {@link C#VIDEO_SCALING_MODE_DEFAULT} + *
  • {@link C.VideoChangeFrameRateStrategy}: {@link + * C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS} *
  • {@code useLazyPreparation}: {@code true} *
  • {@link SeekParameters}: {@link SeekParameters#DEFAULT} *
  • {@code seekBackIncrementMs}: {@link C#DEFAULT_SEEK_BACK_INCREMENT_MS} @@ -267,6 +271,7 @@ public class SimpleExoPlayer extends BasePlayer audioAttributes = AudioAttributes.DEFAULT; wakeMode = C.WAKE_MODE_NONE; videoScalingMode = C.VIDEO_SCALING_MODE_DEFAULT; + videoChangeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS; useLazyPreparation = true; seekParameters = SeekParameters.DEFAULT; seekBackIncrementMs = C.DEFAULT_SEEK_BACK_INCREMENT_MS; @@ -462,9 +467,8 @@ public class SimpleExoPlayer extends BasePlayer /** * Sets the {@link C.VideoScalingMode} that will be used by the player. * - *

    Note that the scaling mode only applies if a {@link MediaCodec}-based video {@link - * Renderer} is enabled and if the output surface is owned by a {@link - * android.view.SurfaceView}. + *

    The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is + * enabled and if the output surface is owned by a {@link SurfaceView}. * * @param videoScalingMode A {@link C.VideoScalingMode}. * @return This builder. @@ -476,6 +480,27 @@ public class SimpleExoPlayer extends BasePlayer return this; } + /** + * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided + * with a video output {@link Surface}. + * + *

    The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. + * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to + * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link + * Surface#setFrameRate} from ExoPlayer, and should then call {@link Surface#setFrameRate} + * directly from application code. + * + * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setVideoChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { + Assertions.checkState(!buildCalled); + this.videoChangeFrameRateStrategy = videoChangeFrameRateStrategy; + return this; + } + /** * Sets whether media sources should be initialized lazily. * @@ -661,6 +686,7 @@ public class SimpleExoPlayer extends BasePlayer private boolean surfaceHolderSurfaceIsVideoOutput; @Nullable private TextureView textureView; @C.VideoScalingMode private int videoScalingMode; + @C.VideoChangeFrameRateStrategy private int videoChangeFrameRateStrategy; private int surfaceWidth; private int surfaceHeight; @Nullable private DecoderCounters videoDecoderCounters; @@ -714,6 +740,7 @@ public class SimpleExoPlayer extends BasePlayer priorityTaskManager = builder.priorityTaskManager; audioAttributes = builder.audioAttributes; videoScalingMode = builder.videoScalingMode; + videoChangeFrameRateStrategy = builder.videoChangeFrameRateStrategy; skipSilenceEnabled = builder.skipSilenceEnabled; detachSurfaceTimeoutMs = builder.detachSurfaceTimeoutMs; componentListener = new ComponentListener(); @@ -799,6 +826,8 @@ public class SimpleExoPlayer extends BasePlayer sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_SCALING_MODE, videoScalingMode); + sendRendererMessage( + TRACK_TYPE_VIDEO, MSG_SET_CHANGE_FRAME_RATE_STRATEGY, videoChangeFrameRateStrategy); sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); sendRendererMessage( TRACK_TYPE_VIDEO, MSG_SET_VIDEO_FRAME_METADATA_LISTENER, frameMetadataListener); @@ -851,14 +880,6 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Sets the video scaling mode. - * - *

    Note that the scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} - * is enabled and if the output surface is owned by a {@link android.view.SurfaceView}. - * - * @param videoScalingMode The {@link C.VideoScalingMode}. - */ @Override public void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { verifyApplicationThread(); @@ -872,6 +893,24 @@ public class SimpleExoPlayer extends BasePlayer return videoScalingMode; } + @Override + public void setVideoChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { + verifyApplicationThread(); + if (this.videoChangeFrameRateStrategy == videoChangeFrameRateStrategy) { + return; + } + this.videoChangeFrameRateStrategy = videoChangeFrameRateStrategy; + sendRendererMessage( + TRACK_TYPE_VIDEO, MSG_SET_CHANGE_FRAME_RATE_STRATEGY, videoChangeFrameRateStrategy); + } + + @Override + @C.VideoChangeFrameRateStrategy + public int getVideoChangeFrameRateStrategy() { + return videoChangeFrameRateStrategy; + } + @Override public VideoSize getVideoSize() { return videoSize; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index e1eb1da0ba..e5e1af9408 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -83,6 +83,8 @@ import java.util.List; * payload should be one of the integer scaling modes in {@link C.VideoScalingMode}. Note that * the scaling mode only applies if the {@link Surface} targeted by this renderer is owned by * a {@link android.view.SurfaceView}. + *

  • Message with type {@link #MSG_SET_CHANGE_FRAME_RATE_STRATEGY} to set the strategy used to + * call {@link Surface#setFrameRate}. *
  • Message with type {@link #MSG_SET_VIDEO_FRAME_METADATA_LISTENER} to set a listener for * metadata associated with frames being rendered. The message payload should be the {@link * VideoFrameMetadataListener}, or null. @@ -515,6 +517,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { codec.setVideoScalingMode(scalingMode); } break; + case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + frameReleaseHelper.setChangeFrameRateStrategy((int) message); + break; case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: frameMetadataListener = (VideoFrameMetadataListener) message; break; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java index 637b3cbe4c..33a445f52f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java @@ -109,6 +109,7 @@ public final class VideoFrameReleaseHelper { private float surfacePlaybackFrameRate; private float playbackSpeed; + @C.VideoChangeFrameRateStrategy private int changeFrameRateStrategy; private long vsyncDurationNs; private long vsyncOffsetNs; @@ -132,6 +133,20 @@ public final class VideoFrameReleaseHelper { vsyncOffsetNs = C.TIME_UNSET; formatFrameRate = Format.NO_VALUE; playbackSpeed = 1f; + changeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS; + } + + /** + * Change the {@link C.VideoChangeFrameRateStrategy} used when calling {@link + * Surface#setFrameRate}. + */ + public void setChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) { + if (this.changeFrameRateStrategy == changeFrameRateStrategy) { + return; + } + this.changeFrameRateStrategy = changeFrameRateStrategy; + updateSurfacePlaybackFrameRate(/* forceUpdate= */ true); } /** Called when the renderer is enabled. */ @@ -146,7 +161,7 @@ public final class VideoFrameReleaseHelper { public void onStarted() { started = true; resetAdjustment(); - updateSurfacePlaybackFrameRate(/* isNewSurface= */ false); + updateSurfacePlaybackFrameRate(/* forceUpdate= */ false); } /** @@ -164,7 +179,7 @@ public final class VideoFrameReleaseHelper { } clearSurfaceFrameRate(); this.surface = surface; - updateSurfacePlaybackFrameRate(/* isNewSurface= */ true); + updateSurfacePlaybackFrameRate(/* forceUpdate= */ true); } /** Called when the renderer's position is reset. */ @@ -180,7 +195,7 @@ public final class VideoFrameReleaseHelper { public void onPlaybackSpeed(float playbackSpeed) { this.playbackSpeed = playbackSpeed; resetAdjustment(); - updateSurfacePlaybackFrameRate(/* isNewSurface= */ false); + updateSurfacePlaybackFrameRate(/* forceUpdate= */ false); } /** @@ -322,7 +337,7 @@ public final class VideoFrameReleaseHelper { if (shouldUpdate) { surfaceMediaFrameRate = candidateFrameRate; - updateSurfacePlaybackFrameRate(/* isNewSurface= */ false); + updateSurfacePlaybackFrameRate(/* forceUpdate= */ false); } } @@ -330,10 +345,16 @@ public final class VideoFrameReleaseHelper { * Updates the playback frame rate of the current {@link #surface} based on the playback speed, * frame rate of the content, and whether the renderer is started. * - * @param isNewSurface Whether the current {@link #surface} is new. + *

    Does nothing if {@link #changeFrameRateStrategy} is {@link + * C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF}. + * + * @param forceUpdate Whether to call {@link Surface#setFrameRate} even if the frame rate is + * unchanged. */ - private void updateSurfacePlaybackFrameRate(boolean isNewSurface) { - if (Util.SDK_INT < 30 || surface == null) { + private void updateSurfacePlaybackFrameRate(boolean forceUpdate) { + if (Util.SDK_INT < 30 + || surface == null + || changeFrameRateStrategy == C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF) { return; } @@ -343,16 +364,24 @@ public final class VideoFrameReleaseHelper { } // We always set the frame-rate if we have a new surface, since we have no way of knowing what // it might have been set to previously. - if (!isNewSurface && this.surfacePlaybackFrameRate == surfacePlaybackFrameRate) { + if (!forceUpdate && this.surfacePlaybackFrameRate == surfacePlaybackFrameRate) { return; } this.surfacePlaybackFrameRate = surfacePlaybackFrameRate; Api30.setSurfaceFrameRate(surface, surfacePlaybackFrameRate); } - /** Clears the frame-rate of the current {@link #surface}. */ + /** + * Clears the frame-rate of the current {@link #surface}. + * + *

    Does nothing if {@link #changeFrameRateStrategy} is {@link + * C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF}. + */ private void clearSurfaceFrameRate() { - if (Util.SDK_INT < 30 || surface == null || surfacePlaybackFrameRate == 0) { + if (Util.SDK_INT < 30 + || surface == null + || changeFrameRateStrategy == C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF + || surfacePlaybackFrameRate == 0) { return; } surfacePlaybackFrameRate = 0; From 849c3074028db8a76133ae3fff1331bc84015bf3 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 9 Aug 2021 14:12:29 +0100 Subject: [PATCH 033/441] Move `requiresSecureDecoder` logic into `ExoMediaDrm` The result is plumbed back to `MediaCodecRenderer` via a new `DrmSession#requiresSecureDecoder` method. This allows us to use the `MediaDrm#requiresSecureDecoder` method added in Android 12: https://developer.android.com/reference/android/media/MediaDrm#requiresSecureDecoder(java.lang.String) This change also removes `FrameworkMediaCrypto#forceAllowInsecureDecoderComponents`, replacing it with equivalent logic in `FrameworkMediaDrm#requiresSecureDecoder`. PiperOrigin-RevId: 389616038 --- .../exoplayer2/drm/DefaultDrmSession.java | 6 ++++ .../android/exoplayer2/drm/DrmSession.java | 9 +++++ .../exoplayer2/drm/DummyExoMediaDrm.java | 6 ++++ .../exoplayer2/drm/ErrorStateDrmSession.java | 5 +++ .../android/exoplayer2/drm/ExoMediaDrm.java | 9 +++++ .../exoplayer2/drm/FrameworkMediaDrm.java | 30 ++++++++++++++++ .../mediacodec/MediaCodecRenderer.java | 35 +++++-------------- .../exoplayer2/testutil/FakeExoMediaDrm.java | 5 +++ 8 files changed, 78 insertions(+), 27 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index ca7a657a0f..47483a027d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.drm; import static com.google.android.exoplayer2.util.Assertions.checkState; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import static java.lang.Math.min; import android.annotation.SuppressLint; @@ -285,6 +286,11 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return offlineLicenseKeySetId; } + @Override + public boolean requiresSecureDecoder(String mimeType) { + return mediaDrm.requiresSecureDecoder(checkStateNotNull(sessionId), mimeType); + } + @Override public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { checkState(referenceCount >= 0); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java index b993345613..7f07fd9c66 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java @@ -137,6 +137,15 @@ public interface DrmSession { @Nullable byte[] getOfflineLicenseKeySetId(); + /** + * Returns whether this session requires use of a secure decoder for the given MIME type. Assumes + * a license policy that requires the highest level of security supported by the session. + * + *

    The session must be in {@link #getState() state} {@link #STATE_OPENED} or {@link + * #STATE_OPENED_WITH_KEYS}. + */ + boolean requiresSecureDecoder(String mimeType); + /** * Increments the reference count. When the caller no longer needs to use the instance, it must * call {@link #release(DrmSessionEventListener.EventDispatcher)} to decrement the reference diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java index 9631b76491..b5c7692ab8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java @@ -93,6 +93,12 @@ public final class DummyExoMediaDrm implements ExoMediaDrm { throw new IllegalStateException(); } + @Override + public boolean requiresSecureDecoder(byte[] sessionId, String mimeType) { + // Should not be invoked. No session should exist. + throw new IllegalStateException(); + } + @Override public void acquire() { // Do nothing. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java index 068f1b3782..51cb019432 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java @@ -69,6 +69,11 @@ public final class ErrorStateDrmSession implements DrmSession { return null; } + @Override + public boolean requiresSecureDecoder(String mimeType) { + return false; + } + @Override public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { // Do nothing. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java index b20fc916c4..583fcf979a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java @@ -460,6 +460,15 @@ public interface ExoMediaDrm { */ Map queryKeyStatus(byte[] sessionId); + /** + * Returns whether the given session requires use of a secure decoder for the given MIME type. + * Assumes a license policy that requires the highest level of security supported by the session. + * + * @param sessionId The ID of the session. + * @param mimeType The content MIME type to query. + */ + boolean requiresSecureDecoder(byte[] sessionId, String mimeType); + /** * Increments the reference count. When the caller no longer needs to use the instance, it must * call {@link #release()} to decrement the reference count. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java index 48255714bd..8c2b1c3a62 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.drm; import android.annotation.SuppressLint; import android.media.DeniedByServerException; +import android.media.MediaCrypto; import android.media.MediaCryptoException; import android.media.MediaDrm; import android.media.MediaDrmException; @@ -24,6 +25,7 @@ import android.media.NotProvisionedException; import android.media.UnsupportedSchemeException; import android.os.PersistableBundle; import android.text.TextUtils; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -244,6 +246,26 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { return mediaDrm.queryKeyStatus(sessionId); } + @Override + public boolean requiresSecureDecoder(byte[] sessionId, String mimeType) { + if (Util.SDK_INT >= 31) { + return Api31.requiresSecureDecoder(mediaDrm, mimeType); + } + + MediaCrypto mediaCrypto; + try { + mediaCrypto = new MediaCrypto(uuid, sessionId); + } catch (MediaCryptoException e) { + // This shouldn't happen, but if it does then assume that a secure decoder may be required. + return true; + } + try { + return mediaCrypto.requiresSecureDecoderComponent(mimeType); + } finally { + mediaCrypto.release(); + } + } + @Override public synchronized void acquire() { Assertions.checkState(referenceCount > 0); @@ -476,4 +498,12 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { newData.put(xmlWithMockLaUrl.getBytes(Charsets.UTF_16LE)); return newData.array(); } + + @RequiresApi(31) + private static class Api31 { + @DoNotInline + public static boolean requiresSecureDecoder(MediaDrm mediaDrm, String mimeType) { + return mediaDrm.requiresSecureDecoder(mimeType); + } + } } 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 9d689faa03..2100847c7b 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 @@ -2099,7 +2099,14 @@ public abstract class MediaCodecRenderer extends BaseRenderer { // the case is to occur, so we re-initialize in this case. return true; } - if (!codecInfo.secure && maybeRequiresSecureDecoder(newMediaCrypto, newFormat)) { + + boolean requiresSecureDecoder; + if (newMediaCrypto.forceAllowInsecureDecoderComponents) { + requiresSecureDecoder = false; + } else { + requiresSecureDecoder = newSession.requiresSecureDecoder(newFormat.sampleMimeType); + } + if (!codecInfo.secure && requiresSecureDecoder) { // Re-initialization is required because newSession might require switching to the secure // output path. return true; @@ -2108,32 +2115,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return false; } - /** - * Returns whether a {@link DrmSession} may require a secure decoder for a given {@link Format}. - * - * @param sessionMediaCrypto The {@link DrmSession}'s {@link FrameworkMediaCrypto}. - * @param format The {@link Format}. - * @return Whether a secure decoder may be required. - */ - private boolean maybeRequiresSecureDecoder( - FrameworkMediaCrypto sessionMediaCrypto, Format format) { - if (sessionMediaCrypto.forceAllowInsecureDecoderComponents) { - return false; - } - MediaCrypto mediaCrypto; - try { - mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId); - } catch (MediaCryptoException e) { - // This shouldn't happen, but if it does then assume that a secure decoder may be required. - return true; - } - try { - return mediaCrypto.requiresSecureDecoderComponent(format.sampleMimeType); - } finally { - mediaCrypto.release(); - } - } - private void reinitializeCodec() throws ExoPlaybackException { releaseCodec(); maybeInitCodecOrBypass(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index e48307d7ee..0f8d3dc348 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -272,6 +272,11 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { : KEY_STATUS_UNAVAILABLE); } + @Override + public boolean requiresSecureDecoder(byte[] sessionId, String mimeType) { + return false; + } + @Override public void acquire() { Assertions.checkState(referenceCount > 0); From db1fe8041b78a97f3e762c03c20ececc8d8f1721 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 9 Aug 2021 14:15:42 +0100 Subject: [PATCH 034/441] Remove @DoNotInstrument from test classes This isn't needed now we've updated to Robolectric 4.6 Follow-up to https://github.com/google/ExoPlayer/commit/0df0df9aeece386b7421afde160e9009457512ab PiperOrigin-RevId: 389616471 --- .../com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java | 2 -- .../src/test/java/com/google/android/exoplayer2/RatingTest.java | 2 -- .../mediacodec/AsynchronousMediaCodecAdapterTest.java | 2 -- .../android/exoplayer2/source/dash/DashMediaPeriodTest.java | 2 -- .../android/exoplayer2/source/dash/DashMediaSourceTest.java | 2 -- .../com/google/android/exoplayer2/source/dash/DashUtilTest.java | 2 -- .../exoplayer2/source/dash/DefaultDashChunkSourceTest.java | 2 -- .../exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java | 2 -- .../android/exoplayer2/source/dash/EventSampleStreamTest.java | 2 -- .../exoplayer2/source/dash/e2etest/DashPlaybackTest.java | 2 -- .../exoplayer2/source/dash/manifest/DashManifestParserTest.java | 2 -- .../exoplayer2/source/dash/manifest/DashManifestTest.java | 2 -- .../android/exoplayer2/source/dash/manifest/RangedUriTest.java | 2 -- .../exoplayer2/source/dash/manifest/SegmentBaseTest.java | 2 -- .../exoplayer2/source/dash/manifest/UrlTemplateTest.java | 2 -- .../exoplayer2/source/dash/offline/DashDownloaderTest.java | 2 -- .../exoplayer2/source/dash/offline/DownloadHelperTest.java | 2 -- .../exoplayer2/source/dash/offline/DownloadManagerDashTest.java | 2 -- .../exoplayer2/source/dash/offline/DownloadServiceDashTest.java | 2 -- .../exoplayer2/extractor/ConstantBitrateSeekMapTest.java | 2 -- .../android/exoplayer2/extractor/DefaultExtractorInputTest.java | 2 -- .../exoplayer2/extractor/DefaultExtractorsFactoryTest.java | 2 -- .../com/google/android/exoplayer2/extractor/ExtractorTest.java | 2 -- .../google/android/exoplayer2/extractor/ExtractorUtilTest.java | 2 -- .../android/exoplayer2/extractor/FlacFrameReaderTest.java | 2 -- .../android/exoplayer2/extractor/FlacMetadataReaderTest.java | 2 -- .../android/exoplayer2/extractor/FlacStreamMetadataTest.java | 2 -- .../com/google/android/exoplayer2/extractor/Id3PeekerTest.java | 2 -- .../google/android/exoplayer2/extractor/VorbisBitArrayTest.java | 2 -- .../com/google/android/exoplayer2/extractor/VorbisUtilTest.java | 2 -- .../extractor/amr/AmrExtractorNonParameterizedTest.java | 2 -- .../exoplayer2/extractor/amr/AmrExtractorParameterizedTest.java | 2 -- .../android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java | 2 -- .../exoplayer2/extractor/flac/FlacExtractorSeekTest.java | 2 -- .../android/exoplayer2/extractor/flac/FlacExtractorTest.java | 2 -- .../android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java | 2 -- .../android/exoplayer2/extractor/flv/FlvExtractorTest.java | 2 -- .../android/exoplayer2/extractor/jpeg/JpegExtractorTest.java | 2 -- .../exoplayer2/extractor/jpeg/MotionPhotoDescriptionTest.java | 2 -- .../android/exoplayer2/extractor/mkv/DefaultEbmlReaderTest.java | 2 -- .../android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java | 2 -- .../android/exoplayer2/extractor/mkv/VarintReaderTest.java | 2 -- .../exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java | 2 -- .../android/exoplayer2/extractor/mp3/IndexSeekerTest.java | 2 -- .../android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java | 2 -- .../google/android/exoplayer2/extractor/mp3/XingSeekerTest.java | 2 -- .../android/exoplayer2/extractor/mp4/AtomParsersTest.java | 2 -- .../extractor/mp4/FragmentedMp4ExtractorNoSniffingTest.java | 2 -- .../exoplayer2/extractor/mp4/FragmentedMp4ExtractorTest.java | 2 -- .../android/exoplayer2/extractor/mp4/MetadataUtilTest.java | 2 -- .../android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java | 2 -- .../android/exoplayer2/extractor/mp4/PsshAtomUtilTest.java | 2 -- .../android/exoplayer2/extractor/mp4/SlowMotionDataTest.java | 2 -- .../android/exoplayer2/extractor/ogg/DefaultOggSeekerTest.java | 2 -- .../extractor/ogg/OggExtractorNonParameterizedTest.java | 2 -- .../exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java | 2 -- .../google/android/exoplayer2/extractor/ogg/OggPacketTest.java | 2 -- .../android/exoplayer2/extractor/ogg/OggPageHeaderTest.java | 2 -- .../android/exoplayer2/extractor/ogg/VorbisReaderTest.java | 2 -- .../android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java | 2 -- .../android/exoplayer2/extractor/ts/Ac3ExtractorTest.java | 2 -- .../android/exoplayer2/extractor/ts/Ac4ExtractorTest.java | 2 -- .../android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java | 2 -- .../android/exoplayer2/extractor/ts/AdtsExtractorTest.java | 2 -- .../google/android/exoplayer2/extractor/ts/AdtsReaderTest.java | 2 -- .../android/exoplayer2/extractor/ts/PsDurationReaderTest.java | 2 -- .../android/exoplayer2/extractor/ts/PsExtractorSeekTest.java | 2 -- .../google/android/exoplayer2/extractor/ts/PsExtractorTest.java | 2 -- .../android/exoplayer2/extractor/ts/SectionReaderTest.java | 2 -- .../android/exoplayer2/extractor/ts/TsDurationReaderTest.java | 2 -- .../android/exoplayer2/extractor/ts/TsExtractorSeekTest.java | 2 -- .../google/android/exoplayer2/extractor/ts/TsExtractorTest.java | 2 -- .../android/exoplayer2/extractor/wav/WavExtractorTest.java | 2 -- .../java/com/google/android/exoplayer2/ui/HtmlUtilsTest.java | 2 -- .../android/exoplayer2/ui/SpannedToHtmlConverterTest.java | 2 -- .../com/google/android/exoplayer2/ui/SubtitleViewUtilsTest.java | 2 -- 76 files changed, 152 deletions(-) diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java index ee889ab349..b26321757f 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java @@ -94,12 +94,10 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.stubbing.Answer; -import org.robolectric.annotation.internal.DoNotInstrument; import org.robolectric.shadows.ShadowSystemClock; /** Tests for {@link ImaAdsLoader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class ImaAdsLoaderTest { private static final long CONTENT_DURATION_US = 10 * C.MICROS_PER_SECOND; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/RatingTest.java b/library/common/src/test/java/com/google/android/exoplayer2/RatingTest.java index be77acd83b..fbe9a75eb5 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/RatingTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/RatingTest.java @@ -20,11 +20,9 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link Rating} and its subclasses. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class RatingTest { @Test diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java index 5dfeb04ff1..a7034dab2e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java @@ -30,11 +30,9 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link AsynchronousMediaCodecAdapter}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class AsynchronousMediaCodecAdapterTest { private AsynchronousMediaCodecAdapter adapter; private HandlerThread callbackThread; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java index fd55087b47..5c7600ee51 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaPeriodTest.java @@ -44,11 +44,9 @@ import java.io.InputStream; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link DashMediaPeriod}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DashMediaPeriodTest { @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index e9079e91d2..6f82c4f6fd 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -43,12 +43,10 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; import org.robolectric.shadows.ShadowLooper; /** Unit test for {@link DashMediaSource}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DashMediaSourceTest { private static final String SAMPLE_MPD_LIVE_WITHOUT_LIVE_CONFIGURATION = diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java index 1eb422d27c..655baea575 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java @@ -34,11 +34,9 @@ import java.util.Arrays; import java.util.Collections; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link DashUtil}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DashUtilTest { @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java index 1308416f18..88e8b3f84c 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java @@ -55,12 +55,10 @@ import java.util.List; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; import org.robolectric.shadows.ShadowSystemClock; /** Unit test for {@link DefaultDashChunkSource}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DefaultDashChunkSourceTest { private static final String SAMPLE_MPD_LIVE_WITH_OFFSET_INSIDE_WINDOW = diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java index 1e64b8d7a4..ab7f456c55 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java @@ -27,11 +27,9 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.MimeTypes; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for creating DASH media sources with the {@link DefaultMediaSourceFactory}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DefaultMediaSourceFactoryTest { private static final String URI_MEDIA = "http://exoplayer.dev/video"; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java index 7dfa4e6597..73ec3da58e 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/EventSampleStreamTest.java @@ -30,11 +30,9 @@ import com.google.android.exoplayer2.util.MimeTypes; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link EventSampleStream}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class EventSampleStreamTest { private static final String SCHEME_ID = "urn:test"; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index 9014a8c40b..e3615d8f8e 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -35,11 +35,9 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** End-to-end tests using DASH samples. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DashPlaybackTest { @Rule diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java index 8c3ea0c127..dc70713469 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java @@ -36,13 +36,11 @@ import java.util.Collections; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; /** Unit tests for {@link DashManifestParser}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DashManifestParserTest { private static final String SAMPLE_MPD_LIVE = "media/mpd/sample_mpd_live"; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestTest.java index 0b3a3efbbb..5b031c179a 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestTest.java @@ -30,11 +30,9 @@ import java.util.List; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link DashManifest}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DashManifestTest { private static final UtcTimingElement UTC_TIMING = new UtcTimingElement("", ""); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/RangedUriTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/RangedUriTest.java index 486ab08cd1..44af227d96 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/RangedUriTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/RangedUriTest.java @@ -21,11 +21,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link RangedUri}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class RangedUriTest { private static final String BASE_URI = "http://www.test.com/"; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/SegmentBaseTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/SegmentBaseTest.java index 49346c4f98..91ddfbbde9 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/SegmentBaseTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/SegmentBaseTest.java @@ -21,11 +21,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link SegmentBase}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class SegmentBaseTest { @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/UrlTemplateTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/UrlTemplateTest.java index 057844d848..6736840d82 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/UrlTemplateTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/UrlTemplateTest.java @@ -21,11 +21,9 @@ import static org.junit.Assert.fail; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link UrlTemplate}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class UrlTemplateTest { @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java index e47137baf9..d835b85725 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DashDownloaderTest.java @@ -57,11 +57,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link DashDownloader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DashDownloaderTest { private SimpleCache cache; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java index b7323c49a3..bfc11cb47a 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java @@ -25,11 +25,9 @@ import com.google.android.exoplayer2.testutil.FakeDataSource; import com.google.android.exoplayer2.util.MimeTypes; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test to verify creation of a DASH {@link DownloadHelper}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DownloadHelperTest { @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java index 29102dfe3e..6bdc84438b 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadManagerDashTest.java @@ -55,12 +55,10 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.internal.DoNotInstrument; import org.robolectric.shadows.ShadowLog; /** Tests {@link DownloadManager}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DownloadManagerDashTest { private static final int ASSERT_TRUE_TIMEOUT_MS = 5000; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java index e62a644af5..98a7f6e887 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java @@ -57,11 +57,9 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link DownloadService}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DownloadServiceDashTest { private SimpleCache cache; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMapTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMapTest.java index bbf72027f7..4d70fe3b69 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMapTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMapTest.java @@ -22,11 +22,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link ConstantBitrateSeekMap}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class ConstantBitrateSeekMapTest { private ConstantBitrateSeekMap constantBitrateSeekMap; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorInputTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorInputTest.java index 550b7515e0..cc5fe8e5e7 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorInputTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorInputTest.java @@ -31,11 +31,9 @@ import java.io.IOException; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Test for {@link DefaultExtractorInput}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DefaultExtractorInputTest { private static final String TEST_URI = "http://www.google.com"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactoryTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactoryTest.java index 6ad0554d07..1c6ce7b70c 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactoryTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactoryTest.java @@ -42,11 +42,9 @@ import java.util.List; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link DefaultExtractorsFactory}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DefaultExtractorsFactoryTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorTest.java index 4d3d8a7472..390d1a2c77 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorTest.java @@ -21,11 +21,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link Extractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class ExtractorTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorUtilTest.java index 6734face12..8959caa323 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorUtilTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ExtractorUtilTest.java @@ -27,11 +27,9 @@ import java.io.EOFException; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link ExtractorUtil}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class ExtractorUtilTest { private static final String TEST_URI = "http://www.google.com"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacFrameReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacFrameReaderTest.java index 3f37e5ca7b..75ef1a201e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacFrameReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacFrameReaderTest.java @@ -28,7 +28,6 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Unit tests for {@link FlacFrameReader}. @@ -37,7 +36,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; * href="https://xiph.org/flac/documentation_tools_flac.html">flac command. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class FlacFrameReaderTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java index 046b810a82..1648d548d2 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.util.ArrayList; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Unit tests for {@link FlacMetadataReader}. @@ -42,7 +41,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; * href="https://xiph.org/flac/documentation_tools_metaflac.html">metaflac command. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class FlacMetadataReaderTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacStreamMetadataTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacStreamMetadataTest.java index 3a4d515d20..9c6b63ee0a 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacStreamMetadataTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacStreamMetadataTest.java @@ -27,11 +27,9 @@ import java.io.IOException; import java.util.ArrayList; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link FlacStreamMetadata}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class FlacStreamMetadataTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/Id3PeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/Id3PeekerTest.java index 4a252fa097..e0cf957a38 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/Id3PeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/Id3PeekerTest.java @@ -29,11 +29,9 @@ import com.google.android.exoplayer2.testutil.FakeExtractorInput; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link Id3Peeker}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class Id3PeekerTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisBitArrayTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisBitArrayTest.java index 567be685db..95e8d7321d 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisBitArrayTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisBitArrayTest.java @@ -21,11 +21,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.testutil.TestUtil; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link VorbisBitArray}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class VorbisBitArrayTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisUtilTest.java index fb6892b364..0db0ebd79b 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisUtilTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/VorbisUtilTest.java @@ -28,11 +28,9 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link VorbisUtil}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class VorbisUtilTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorNonParameterizedTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorNonParameterizedTest.java index ea81846cee..4c31858a41 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorNonParameterizedTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorNonParameterizedTest.java @@ -35,7 +35,6 @@ import java.io.IOException; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Tests for {@link AmrExtractor} that test specific behaviours and don't need to be parameterized. @@ -44,7 +43,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; * AmrExtractorParameterizedTest}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class AmrExtractorNonParameterizedTest { private static final Random RANDOM = new Random(1234); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorParameterizedTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorParameterizedTest.java index 3fa8d8a742..d8f9f20ae3 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorParameterizedTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorParameterizedTest.java @@ -22,7 +22,6 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Unit tests for {@link AmrExtractor} that use parameterization to test a range of behaviours. @@ -31,7 +30,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; * AmrExtractorNonParameterizedTest}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class AmrExtractorParameterizedTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java index e4ce7d2c97..534cb2572f 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java @@ -32,11 +32,9 @@ import java.util.Random; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link AmrExtractor} seeking behaviour. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class AmrExtractorSeekTest { private static final Random random = new Random(1234L); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java index d89bcf4920..16f92e2b4b 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java @@ -32,11 +32,9 @@ import java.io.IOException; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Seeking tests for {@link FlacExtractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class FlacExtractorSeekTest { private static final String TEST_FILE_SEEK_TABLE = "media/flac/bear.flac"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorTest.java index 9a283928b8..1d776b9355 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorTest.java @@ -23,11 +23,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link FlacExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public class FlacExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java index cb1b04b9b9..e03b7ec6d6 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java @@ -34,11 +34,9 @@ import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Seeking tests for {@link FlvExtractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class FlvExtractorSeekTest { private static final String TEST_FILE_KEY_FRAME_INDEX = diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorTest.java index f6e6b6f2a1..5a7e0a5a3e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link FlvExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class FlvExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/JpegExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/JpegExtractorTest.java index fa493f4452..8e5556bf81 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/JpegExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/JpegExtractorTest.java @@ -20,11 +20,9 @@ import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit tests for {@link JpegExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class JpegExtractorTest { @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/MotionPhotoDescriptionTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/MotionPhotoDescriptionTest.java index 5c9635095d..6c068d2587 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/MotionPhotoDescriptionTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/jpeg/MotionPhotoDescriptionTest.java @@ -24,11 +24,9 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link MotionPhotoDescription}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class MotionPhotoDescriptionTest { private static final long TEST_PRESENTATION_TIMESTAMP_US = 5L; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReaderTest.java index 3ba902ec88..e1a700f5ed 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReaderTest.java @@ -27,11 +27,9 @@ import java.util.Arrays; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests {@link DefaultEbmlReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class DefaultEbmlReaderTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java index 28e7057577..64faff9a0e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link MatroskaExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class MatroskaExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/VarintReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/VarintReaderTest.java index 860bc009b2..e18d2cb40f 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/VarintReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/VarintReaderTest.java @@ -29,11 +29,9 @@ import java.io.EOFException; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link VarintReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class VarintReaderTest { private static final byte MAX_BYTE = (byte) 0xFF; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java index 713a269185..e3137a106d 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java @@ -34,11 +34,9 @@ import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link ConstantBitrateSeeker}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class ConstantBitrateSeekerTest { private static final String CONSTANT_FRAME_SIZE_TEST_FILE = "media/mp3/bear-cbr-constant-frame-size-no-seek-table.mp3"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java index 679ee526bc..24530c12f1 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java @@ -35,11 +35,9 @@ import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link IndexSeeker}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class IndexSeekerTest { private static final String TEST_FILE_NO_SEEK_TABLE = "media/mp3/bear-vbr-no-seek-table.mp3"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java index 5d9e0380fb..f209574de4 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java @@ -23,11 +23,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link Mp3Extractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class Mp3ExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/XingSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/XingSeekerTest.java index b18f32edb3..3b40bf85d7 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/XingSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/XingSeekerTest.java @@ -27,11 +27,9 @@ import com.google.android.exoplayer2.util.Util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link XingSeeker}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class XingSeekerTest { // Xing header/payload from http://storage.googleapis.com/exoplayer-test-media-0/play.mp3. diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/AtomParsersTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/AtomParsersTest.java index 226b40559b..497b623140 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/AtomParsersTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/AtomParsersTest.java @@ -24,11 +24,9 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link AtomParsers}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class AtomParsersTest { private static final String ATOM_HEADER = "000000000000000000000000"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorNoSniffingTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorNoSniffingTest.java index a470457044..969c9b8d5a 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorNoSniffingTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorNoSniffingTest.java @@ -25,13 +25,11 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Tests for {@link FragmentedMp4Extractor} that test behaviours where sniffing must not be tested. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public class FragmentedMp4ExtractorNoSniffingTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorTest.java index 14783a27b0..a9d2397ca7 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4ExtractorTest.java @@ -27,11 +27,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link FragmentedMp4Extractor} that test behaviours where sniffing must be tested. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class FragmentedMp4ExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtilTest.java index 471e654a09..70e483457a 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtilTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtilTest.java @@ -20,11 +20,9 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Test for {@link MetadataUtil}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class MetadataUtilTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java index 8d8bd0dfa1..4408ffab83 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link Mp4Extractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class Mp4ExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtilTest.java index e526c9e3c8..cee9e22af9 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtilTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtilTest.java @@ -27,11 +27,9 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import java.util.UUID; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link PsshAtomUtil}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class PsshAtomUtilTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/SlowMotionDataTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/SlowMotionDataTest.java index c22220931f..5b1c33303d 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/SlowMotionDataTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/SlowMotionDataTest.java @@ -24,11 +24,9 @@ import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link SlowMotionData} */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class SlowMotionDataTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/DefaultOggSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/DefaultOggSeekerTest.java index 1ee87d1b1d..e30f27713e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/DefaultOggSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/DefaultOggSeekerTest.java @@ -30,11 +30,9 @@ import java.io.IOException; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link DefaultOggSeeker}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class DefaultOggSeekerTest { private final Random random = new Random(/* seed= */ 0); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorNonParameterizedTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorNonParameterizedTest.java index 4131054775..d939d51b77 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorNonParameterizedTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorNonParameterizedTest.java @@ -28,7 +28,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Tests for {@link OggExtractor} that test specific behaviours and don't need to be parameterized. @@ -37,7 +36,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; * OggExtractorParameterizedTest}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class OggExtractorNonParameterizedTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java index 48828b9b4a..8cbe254f07 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java @@ -22,7 +22,6 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** * Unit tests for {@link OggExtractor} that use parameterization to test a range of behaviours. @@ -30,7 +29,6 @@ import org.robolectric.annotation.internal.DoNotInstrument; *

    For non-parameterized tests see {@link OggExtractorNonParameterizedTest}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class OggExtractorParameterizedTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPacketTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPacketTest.java index d9bbe348f9..e74ecf7be0 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPacketTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPacketTest.java @@ -28,11 +28,9 @@ import java.util.Arrays; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link OggPacket}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class OggPacketTest { private static final String TEST_FILE = "media/ogg/bear.opus"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeaderTest.java index 89c8306342..ad821401ae 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggPageHeaderTest.java @@ -28,11 +28,9 @@ import java.io.IOException; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link OggPageHeader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class OggPageHeaderTest { private final Random random; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/VorbisReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/VorbisReaderTest.java index e938743379..cab37c4183 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/VorbisReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/VorbisReaderTest.java @@ -30,11 +30,9 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link VorbisReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class VorbisReaderTest { @Test diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java index 5873bfc9b7..3856f2b573 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractorTest.java @@ -22,11 +22,9 @@ import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link RawCcExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class RawCcExtractorTest { @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac3ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac3ExtractorTest.java index 6f28ecde4a..8b0ffef80d 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac3ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac3ExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link Ac3Extractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class Ac3ExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac4ExtractorTest.java index 50f04c43fc..39ab1bb534 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/Ac4ExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link Ac4Extractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class Ac4ExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java index 59c5130050..2770d4ef66 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java @@ -32,11 +32,9 @@ import java.util.Random; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link AdtsExtractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class AdtsExtractorSeekTest { private static final Random random = new Random(1234L); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java index fb70fe603c..420d8d589b 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java @@ -23,11 +23,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link AdtsExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class AdtsExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsReaderTest.java index ed1726e50b..6869c0314c 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsReaderTest.java @@ -31,11 +31,9 @@ import java.util.Arrays; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Test for {@link AdtsReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class AdtsReaderTest { public static final byte[] ID3_DATA_1 = diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsDurationReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsDurationReaderTest.java index df79f0bba9..8c1805c568 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsDurationReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsDurationReaderTest.java @@ -27,11 +27,9 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link PsDurationReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class PsDurationReaderTest { private PsDurationReader tsDurationReader; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java index 9c8ee8687b..d2d76d6695 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java @@ -41,11 +41,9 @@ import java.util.Random; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Seeking tests for {@link PsExtractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class PsExtractorSeekTest { private static final String PS_FILE_PATH = "media/ts/elephants_dream.mpg"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorTest.java index 7143ca0783..688cc318f1 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorTest.java @@ -22,11 +22,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link PsExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class PsExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/SectionReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/SectionReaderTest.java index 7866e67d47..59054ebbab 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/SectionReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/SectionReaderTest.java @@ -31,11 +31,9 @@ import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Test for {@link SectionReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class SectionReaderTest { private byte[] packetPayload; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsDurationReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsDurationReaderTest.java index 97c74e4292..0e55d292b8 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsDurationReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsDurationReaderTest.java @@ -27,11 +27,9 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link TsDurationReader}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class TsDurationReaderTest { private TsDurationReader tsDurationReader; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java index 1123e14a96..a796f3c994 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java @@ -36,11 +36,9 @@ import java.util.Random; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Seeking tests for {@link TsExtractor}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public final class TsExtractorSeekTest { private static final String TEST_FILE = "media/ts/bbb_2500ms.ts"; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorTest.java index f113efbfa5..87215d45ee 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorTest.java @@ -42,11 +42,9 @@ import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameter; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link TsExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class TsExtractorTest { @Parameters(name = "{0}") diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java index cc35344b2a..4217a1528a 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/wav/WavExtractorTest.java @@ -21,11 +21,9 @@ import com.google.common.collect.ImmutableList; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; -import org.robolectric.annotation.internal.DoNotInstrument; /** Unit test for {@link WavExtractor}. */ @RunWith(ParameterizedRobolectricTestRunner.class) -@DoNotInstrument public final class WavExtractorTest { @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") diff --git a/library/ui/src/test/java/com/google/android/exoplayer2/ui/HtmlUtilsTest.java b/library/ui/src/test/java/com/google/android/exoplayer2/ui/HtmlUtilsTest.java index 68469e8886..82ddfb4202 100644 --- a/library/ui/src/test/java/com/google/android/exoplayer2/ui/HtmlUtilsTest.java +++ b/library/ui/src/test/java/com/google/android/exoplayer2/ui/HtmlUtilsTest.java @@ -21,11 +21,9 @@ import android.graphics.Color; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link HtmlUtils}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class HtmlUtilsTest { @Test diff --git a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java index 187dcf6204..09efaad709 100644 --- a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java +++ b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java @@ -39,11 +39,9 @@ import com.google.android.exoplayer2.text.span.TextEmphasisSpan; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link SpannedToHtmlConverter}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class SpannedToHtmlConverterTest { private final float displayDensity; diff --git a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SubtitleViewUtilsTest.java b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SubtitleViewUtilsTest.java index 1b211626c3..1ad530cc11 100644 --- a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SubtitleViewUtilsTest.java +++ b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SubtitleViewUtilsTest.java @@ -34,11 +34,9 @@ import com.google.android.exoplayer2.text.span.TextAnnotation; import com.google.android.exoplayer2.text.span.TextEmphasisSpan; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.internal.DoNotInstrument; /** Tests for {@link SubtitleView}. */ @RunWith(AndroidJUnit4.class) -@DoNotInstrument public class SubtitleViewUtilsTest { private static final Cue CUE = buildCue(); From 5dc8eeb4bfe19b2598954f127e3f3b9257899555 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 14:54:15 +0100 Subject: [PATCH 035/441] Remove IntArrayQueue from public API PiperOrigin-RevId: 389622428 --- .../exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java | 1 - .../exoplayer2/{util => mediacodec}/IntArrayQueue.java | 4 ++-- .../exoplayer2/{util => mediacodec}/IntArrayQueueTest.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/{util => mediacodec}/IntArrayQueue.java (96%) rename library/core/src/test/java/com/google/android/exoplayer2/{util => mediacodec}/IntArrayQueueTest.java (98%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java index 872cc77d6a..e4e76ad0b4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java @@ -27,7 +27,6 @@ import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import com.google.android.exoplayer2.util.IntArrayQueue; import com.google.android.exoplayer2.util.Util; import java.util.ArrayDeque; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/IntArrayQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/IntArrayQueue.java similarity index 96% rename from library/core/src/main/java/com/google/android/exoplayer2/util/IntArrayQueue.java rename to library/core/src/main/java/com/google/android/exoplayer2/mediacodec/IntArrayQueue.java index 5deb5f2b60..48461892d5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/IntArrayQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/IntArrayQueue.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.mediacodec; import java.util.NoSuchElementException; @@ -23,7 +23,7 @@ import java.util.NoSuchElementException; *

    Use this class instead of a {@link java.util.Deque} to avoid boxing int primitives to {@link * Integer} instances. */ -public final class IntArrayQueue { +/* package */ final class IntArrayQueue { /** Default capacity needs to be a power of 2. */ private static final int DEFAULT_INITIAL_CAPACITY = 16; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/IntArrayQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/IntArrayQueueTest.java similarity index 98% rename from library/core/src/test/java/com/google/android/exoplayer2/util/IntArrayQueueTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/mediacodec/IntArrayQueueTest.java index 7210a76644..d15972c592 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/util/IntArrayQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/IntArrayQueueTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.mediacodec; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; From e2ffb5e11b3e7a36b0f4d925145fe914fa923204 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 16:37:01 +0100 Subject: [PATCH 036/441] Remove DeviceListener PiperOrigin-RevId: 389640670 --- RELEASENOTES.md | 1 + .../com/google/android/exoplayer2/Player.java | 12 ++----- .../exoplayer2/device/DeviceListener.java | 33 ------------------- .../google/android/exoplayer2/ExoPlayer.java | 17 ---------- .../android/exoplayer2/SimpleExoPlayer.java | 28 ++++------------ 5 files changed, 11 insertions(+), 80 deletions(-) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/device/DeviceListener.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fb47d9543b..a36b41b197 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -102,6 +102,7 @@ * Remove `C.MSG_*` constants. Use identically named constants in `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced with `Renderer.MSG_SET_VIDEO_OUTPUT`. + * Remove `DeviceListener`. Use `Player.Listener` instead. * UI: * Add `setUseRewindAction` and `setUseFastForwardAction` to `PlayerNotificationManager`, and `setUseFastForwardActionInCompactView` diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index a706dfe6ea..e45cdc148b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioListener; import com.google.android.exoplayer2.device.DeviceInfo; -import com.google.android.exoplayer2.device.DeviceListener; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -874,12 +873,7 @@ public interface Player { *

    All methods have no-op default implementations to allow selective overrides. */ interface Listener - extends VideoListener, - AudioListener, - TextOutput, - MetadataOutput, - DeviceListener, - EventListener { + extends VideoListener, AudioListener, TextOutput, MetadataOutput, EventListener { @Override default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {} @@ -949,10 +943,10 @@ public interface Player { @Override default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {} - @Override + /** Called when the device information changes. */ default void onDeviceInfoChanged(DeviceInfo deviceInfo) {} - @Override + /** Called when the device volume or mute state changes. */ default void onDeviceVolumeChanged(int volume, boolean muted) {} @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/device/DeviceListener.java b/library/common/src/main/java/com/google/android/exoplayer2/device/DeviceListener.java deleted file mode 100644 index 408868da79..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/device/DeviceListener.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.device; - -import com.google.android.exoplayer2.Player; - -/** - * A listener for changes of {@link DeviceInfo} or device volume. - * - * @deprecated Use {@link Player.Listener}. - */ -@Deprecated -public interface DeviceListener { - - /** Called when the device information changes. */ - default void onDeviceInfoChanged(DeviceInfo deviceInfo) {} - - /** Called when the device volume or mute state changes. */ - default void onDeviceVolumeChanged(int volume, boolean muted) {} -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 17aa270f90..cee8bb8943 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -34,7 +34,6 @@ import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.device.DeviceInfo; -import com.google.android.exoplayer2.device.DeviceListener; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; @@ -471,22 +470,6 @@ public interface ExoPlayer extends Player { /** The device component of an {@link ExoPlayer}. */ interface DeviceComponent { - /** - * Adds a listener to receive device events. - * - * @deprecated Use {@link #addListener(Listener)}. - */ - @Deprecated - void addDeviceListener(DeviceListener listener); - - /** - * Removes a listener of device events. - * - * @deprecated Use {@link #removeListener(Listener)}. - */ - @Deprecated - void removeDeviceListener(DeviceListener listener); - /** Gets the device information. */ DeviceInfo getDeviceInfo(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 3acffbca5a..1eb4ad799c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -55,7 +55,6 @@ import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; import com.google.android.exoplayer2.device.DeviceInfo; -import com.google.android.exoplayer2.device.DeviceListener; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.Metadata; @@ -667,7 +666,7 @@ public class SimpleExoPlayer extends BasePlayer private final CopyOnWriteArraySet audioListeners; private final CopyOnWriteArraySet textOutputs; private final CopyOnWriteArraySet metadataOutputs; - private final CopyOnWriteArraySet deviceListeners; + private final CopyOnWriteArraySet deviceListeners; private final AnalyticsCollector analyticsCollector; private final AudioBecomingNoisyManager audioBecomingNoisyManager; private final AudioFocusManager audioFocusManager; @@ -1382,7 +1381,7 @@ public class SimpleExoPlayer extends BasePlayer addVideoListener(listener); addTextOutput(listener); addMetadataOutput(listener); - addDeviceListener(listener); + deviceListeners.add(listener); EventListener eventListener = listener; addListener(eventListener); } @@ -1402,7 +1401,7 @@ public class SimpleExoPlayer extends BasePlayer removeVideoListener(listener); removeTextOutput(listener); removeMetadataOutput(listener); - removeDeviceListener(listener); + deviceListeners.remove(listener); EventListener eventListener = listener; removeListener(eventListener); } @@ -1912,21 +1911,6 @@ public class SimpleExoPlayer extends BasePlayer } } - @Deprecated - @Override - public void addDeviceListener(DeviceListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); - deviceListeners.add(listener); - } - - @Deprecated - @Override - public void removeDeviceListener(DeviceListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - deviceListeners.remove(listener); - } - @Override public DeviceInfo getDeviceInfo() { verifyApplicationThread(); @@ -2476,7 +2460,8 @@ public class SimpleExoPlayer extends BasePlayer DeviceInfo deviceInfo = createDeviceInfo(streamVolumeManager); if (!deviceInfo.equals(SimpleExoPlayer.this.deviceInfo)) { SimpleExoPlayer.this.deviceInfo = deviceInfo; - for (DeviceListener deviceListener : deviceListeners) { + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener deviceListener : deviceListeners) { deviceListener.onDeviceInfoChanged(deviceInfo); } } @@ -2484,7 +2469,8 @@ public class SimpleExoPlayer extends BasePlayer @Override public void onStreamVolumeChanged(int streamVolume, boolean streamMuted) { - for (DeviceListener deviceListener : deviceListeners) { + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener deviceListener : deviceListeners) { deviceListener.onDeviceVolumeChanged(streamVolume, streamMuted); } } From 7e8ba0314712b592683afc212d1a570d87fcaeb8 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 18:11:18 +0100 Subject: [PATCH 037/441] Deprecate final non-nested Factory classes in upstream PiperOrigin-RevId: 389661768 --- .../exoplayer2/gldemo/MainActivity.java | 8 +-- .../android/exoplayer2/demo/DemoUtil.java | 6 +- .../exoplayer2/surfacedemo/MainActivity.java | 8 +-- docs/customization.md | 6 +- docs/network-stacks.md | 6 +- .../ext/flac/FlacExtractorSeekTest.java | 9 ++- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 4 +- .../exoplayer2/ext/ima/ImaPlaybackTest.java | 4 +- .../exoplayer2/ext/media2/PlayerTestRule.java | 6 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 4 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 4 +- .../source/DefaultMediaSourceFactory.java | 6 +- .../upstream/DefaultDataSource.java | 57 +++++++++++++++++++ .../upstream/DefaultDataSourceFactory.java | 6 +- .../upstream/PriorityDataSource.java | 31 ++++++++++ .../upstream/PriorityDataSourceFactory.java | 3 +- .../extractor/amr/AmrExtractorSeekTest.java | 3 +- .../extractor/flac/FlacExtractorSeekTest.java | 9 ++- .../extractor/flv/FlvExtractorSeekTest.java | 3 +- .../mp3/ConstantBitrateSeekerTest.java | 3 +- .../extractor/mp3/IndexSeekerTest.java | 3 +- .../extractor/ts/AdtsExtractorSeekTest.java | 3 +- .../extractor/ts/PsExtractorSeekTest.java | 3 +- .../extractor/ts/TsExtractorSeekTest.java | 3 +- .../playbacktests/gts/DashTestRunner.java | 8 +-- 25 files changed, 142 insertions(+), 64 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index 191602dfb8..abccb41c49 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -36,8 +36,8 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.EventLogger; @@ -144,7 +144,7 @@ public final class MainActivity extends Activity { String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); UUID drmSchemeUuid = Assertions.checkNotNull(Util.getDrmUuid(drmScheme)); - HttpDataSource.Factory licenseDataSourceFactory = new DefaultHttpDataSourceFactory(); + HttpDataSource.Factory licenseDataSourceFactory = new DefaultHttpDataSource.Factory(); HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(drmLicenseUrl, licenseDataSourceFactory); drmSessionManager = @@ -155,7 +155,7 @@ public final class MainActivity extends Activity { drmSessionManager = DrmSessionManager.DRM_UNSUPPORTED; } - DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this); + DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(this); MediaSource mediaSource; @C.ContentType int type = Util.inferContentType(uri, intent.getStringExtra(EXTENSION_EXTRA)); if (type == C.TYPE_DASH) { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java index 2d3f606b8a..dc283ddfe6 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java @@ -29,7 +29,7 @@ import com.google.android.exoplayer2.offline.DefaultDownloadIndex; import com.google.android.exoplayer2.offline.DownloadManager; import com.google.android.exoplayer2.ui.DownloadNotificationHelper; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.cache.Cache; @@ -127,8 +127,8 @@ public final class DemoUtil { public static synchronized DataSource.Factory getDataSourceFactory(Context context) { if (dataSourceFactory == null) { context = context.getApplicationContext(); - DefaultDataSourceFactory upstreamFactory = - new DefaultDataSourceFactory(context, getHttpDataSourceFactory(context)); + DefaultDataSource.Factory upstreamFactory = + new DefaultDataSource.Factory(context, getHttpDataSourceFactory(context)); dataSourceFactory = buildReadOnlyCacheDataSource(upstreamFactory, getDownloadCache(context)); } return dataSourceFactory; diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index a31cd7efe0..6a40cd48a4 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -40,8 +40,8 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; @@ -189,7 +189,7 @@ public final class MainActivity extends Activity { String drmScheme = Assertions.checkNotNull(intent.getStringExtra(DRM_SCHEME_EXTRA)); String drmLicenseUrl = Assertions.checkNotNull(intent.getStringExtra(DRM_LICENSE_URL_EXTRA)); UUID drmSchemeUuid = Assertions.checkNotNull(Util.getDrmUuid(drmScheme)); - HttpDataSource.Factory licenseDataSourceFactory = new DefaultHttpDataSourceFactory(); + HttpDataSource.Factory licenseDataSourceFactory = new DefaultHttpDataSource.Factory(); HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(drmLicenseUrl, licenseDataSourceFactory); drmSessionManager = @@ -200,7 +200,7 @@ public final class MainActivity extends Activity { drmSessionManager = DrmSessionManager.DRM_UNSUPPORTED; } - DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this); + DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(this); MediaSource mediaSource; @C.ContentType int type = Util.inferContentType(uri, intent.getStringExtra(EXTENSION_EXTRA)); if (type == C.TYPE_DASH) { diff --git a/docs/customization.md b/docs/customization.md index 7a5cf7e51a..38024a816b 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -53,10 +53,10 @@ default network stack with cross-protocol redirects enabled: HttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true); -// Wrap the HttpDataSource.Factory in a DefaultDataSourceFactory, which adds in +// Wrap the HttpDataSource.Factory in a DefaultDataSource.Factory, which adds in // support for requesting data from other sources (e.g., files, resources, etc). -DefaultDataSourceFactory dataSourceFactory = - new DefaultDataSourceFactory(context, httpDataSourceFactory); +DefaultDataSource.Factory dataSourceFactory = + new DefaultDataSource.Factory(context, httpDataSourceFactory); // Inject the DefaultDataSourceFactory when creating the player. SimpleExoPlayer player = diff --git a/docs/network-stacks.md b/docs/network-stacks.md index e0f2197176..ee89344bad 100644 --- a/docs/network-stacks.md +++ b/docs/network-stacks.md @@ -40,11 +40,11 @@ the Cronet network stack and also support playback of non-http(s) content. CronetDataSource.Factory cronetDataSourceFactory = new CronetDataSource.Factory(cronetEngine, executor); -// Wrap the CronetDataSource.Factory in a DefaultDataSourceFactory, which adds +// Wrap the CronetDataSource.Factory in a DefaultDataSource.Factory, which adds // in support for requesting data from other sources (e.g., files, resources, // etc). -DefaultDataSourceFactory dataSourceFactory = - new DefaultDataSourceFactory( +DefaultDataSource.Factory dataSourceFactory = + new DefaultDataSource.Factory( context, /* baseDataSourceFactory= */ cronetDataSourceFactory); diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacExtractorSeekTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacExtractorSeekTest.java index e6e66fbe29..21a2558dd9 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacExtractorSeekTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacExtractorSeekTest.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -43,10 +42,10 @@ public final class FlacExtractorSeekTest { "media/flac/bear_no_seek_table_no_num_samples.flac"; private static final int DURATION_US = 2_741_000; - private FlacExtractor extractor = new FlacExtractor(); - private FakeExtractorOutput extractorOutput = new FakeExtractorOutput(); - private DefaultDataSource dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()).createDataSource(); + private final FlacExtractor extractor = new FlacExtractor(); + private final FakeExtractorOutput extractorOutput = new FakeExtractorOutput(); + private final DefaultDataSource dataSource = + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()).createDataSource(); @Test public void flacExtractorReads_seekTable_returnSeekableSeekMap() throws IOException { diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index c2cfc4547d..ecf7d5f934 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.testutil.CapturingAudioSink; import com.google.android.exoplayer2.testutil.DumpFileAsserts; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -120,7 +120,7 @@ public class FlacPlaybackTest { player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( - new DefaultDataSourceFactory(context), MatroskaExtractor.FACTORY) + new DefaultDataSource.Factory(context), MatroskaExtractor.FACTORY) .createMediaSource(MediaItem.fromUri(uri)); player.setMediaSource(mediaSource); player.prepare(); diff --git a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java index d2f70d5e1b..d467743dfa 100644 --- a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java +++ b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java @@ -44,7 +44,7 @@ import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; @@ -235,7 +235,7 @@ public final class ImaPlaybackTest { protected MediaSource buildSource( HostActivity host, DrmSessionManager drmSessionManager, FrameLayout overlayFrameLayout) { Context context = host.getApplicationContext(); - DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context); + DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(context); MediaSource contentMediaSource = new DefaultMediaSourceFactory(context).createMediaSource(MediaItem.fromUri(contentUri)); return new AdsMediaSource( diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index 3c202ba375..89a58312ef 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -25,7 +25,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.List; @@ -116,10 +116,10 @@ import org.junit.rules.ExternalResource; private final class InstrumentingDataSourceFactory implements DataSource.Factory { - private final DefaultDataSourceFactory defaultDataSourceFactory; + private final DefaultDataSource.Factory defaultDataSourceFactory; public InstrumentingDataSourceFactory(Context context) { - defaultDataSourceFactory = new DefaultDataSourceFactory(context); + defaultDataSourceFactory = new DefaultDataSource.Factory(context); } @Override diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index d5d1adf899..0ca53d4b41 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -32,7 +32,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -100,7 +100,7 @@ public class OpusPlaybackTest { player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( - new DefaultDataSourceFactory(context), MatroskaExtractor.FACTORY) + new DefaultDataSource.Factory(context), MatroskaExtractor.FACTORY) .createMediaSource(MediaItem.fromUri(uri)); player.setMediaSource(mediaSource); player.prepare(); diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index b9d841ccf8..37b4d4110b 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -33,7 +33,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView; import org.junit.Before; @@ -134,7 +134,7 @@ public class VpxPlaybackTest { player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( - new DefaultDataSourceFactory(context), MatroskaExtractor.FACTORY) + new DefaultDataSource.Factory(context), MatroskaExtractor.FACTORY) .createMediaSource(MediaItem.fromUri(uri)); player.setVideoSurfaceView(new VideoDecoderGLSurfaceView(context)); player.setMediaSource(mediaSource); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 3a2fbdcd3b..445f82432c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -32,7 +32,7 @@ import com.google.android.exoplayer2.source.ads.AdsMediaSource; import com.google.android.exoplayer2.ui.AdViewProvider; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.Assertions; @@ -119,7 +119,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { * @param context Any context. */ public DefaultMediaSourceFactory(Context context) { - this(new DefaultDataSourceFactory(context)); + this(new DefaultDataSource.Factory(context)); } /** @@ -130,7 +130,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { * its container. */ public DefaultMediaSourceFactory(Context context, ExtractorsFactory extractorsFactory) { - this(new DefaultDataSourceFactory(context), extractorsFactory); + this(new DefaultDataSource.Factory(context), extractorsFactory); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java index c2963f386e..11b57d2039 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java @@ -55,6 +55,63 @@ import java.util.Map; */ public final class DefaultDataSource implements DataSource { + /** {@link DataSource.Factory} for {@link DefaultDataSource} instances. */ + public static final class Factory implements DataSource.Factory { + + private final Context context; + private final DataSource.Factory baseDataSourceFactory; + @Nullable private TransferListener transferListener; + + /** + * Creates an instance. + * + * @param context A context. + */ + public Factory(Context context) { + this(context, new DefaultHttpDataSource.Factory()); + } + + /** + * Creates an instance. + * + * @param context A context. + * @param baseDataSourceFactory The {@link DataSource.Factory} to be used to create base {@link + * DataSource DataSources} for {@link DefaultDataSource} instances. The base {@link + * DataSource} is normally an {@link HttpDataSource}, and is responsible for fetching data + * over HTTP and HTTPS, as well as any other URI schemes not otherwise supported by {@link + * DefaultDataSource}. + */ + public Factory(Context context, DataSource.Factory baseDataSourceFactory) { + this.context = context.getApplicationContext(); + this.baseDataSourceFactory = baseDataSourceFactory; + } + + /** + * Sets the {@link TransferListener} that will be used. + * + *

    The default is {@code null}. + * + *

    See {@link DataSource#addTransferListener(TransferListener)}. + * + * @param transferListener The listener that will be used. + * @return This factory. + */ + public Factory setTransferListener(@Nullable TransferListener transferListener) { + this.transferListener = transferListener; + return this; + } + + @Override + public DefaultDataSource createDataSource() { + DefaultDataSource dataSource = + new DefaultDataSource(context, baseDataSourceFactory.createDataSource()); + if (transferListener != null) { + dataSource.addTransferListener(transferListener); + } + return dataSource; + } + } + private static final String TAG = "DefaultDataSource"; private static final String SCHEME_ASSET = "asset"; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java index fb3df995ae..8bb62217e9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java @@ -19,10 +19,8 @@ import android.content.Context; import androidx.annotation.Nullable; import com.google.android.exoplayer2.upstream.DataSource.Factory; -/** - * A {@link Factory} that produces {@link DefaultDataSource} instances that delegate to {@link - * DefaultHttpDataSource}s for non-file/asset/content URIs. - */ +/** @deprecated Use {@link DefaultDataSource.Factory} instead. */ +@Deprecated public final class DefaultDataSourceFactory implements Factory { private final Context context; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java index 33e57ee2d1..c8dde48192 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java @@ -38,6 +38,37 @@ import java.util.Map; */ public final class PriorityDataSource implements DataSource { + /** {@link DataSource.Factory} for {@link PriorityDataSource} instances. */ + public static final class Factory implements DataSource.Factory { + + private final DataSource.Factory upstreamFactory; + private final PriorityTaskManager priorityTaskManager; + private final int priority; + + /** + * Creates an instance. + * + * @param upstreamFactory A {@link DataSource.Factory} that provides upstream {@link DataSource + * DataSources} for {@link PriorityDataSource} instances created by the factory. + * @param priorityTaskManager The {@link PriorityTaskManager} to which tasks using {@link + * PriorityDataSource} instances created by this factory will be registered. + * @param priority The priority of the tasks using {@link PriorityDataSource} instances created + * by this factory. + */ + public Factory( + DataSource.Factory upstreamFactory, PriorityTaskManager priorityTaskManager, int priority) { + this.upstreamFactory = upstreamFactory; + this.priorityTaskManager = priorityTaskManager; + this.priority = priority; + } + + @Override + public PriorityDataSource createDataSource() { + return new PriorityDataSource( + upstreamFactory.createDataSource(), priorityTaskManager, priority); + } + } + private final DataSource upstream; private final PriorityTaskManager priorityTaskManager; private final int priority; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java index 8f61480300..ebef55a40a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java @@ -18,7 +18,8 @@ package com.google.android.exoplayer2.upstream; import com.google.android.exoplayer2.upstream.DataSource.Factory; import com.google.android.exoplayer2.util.PriorityTaskManager; -/** A {@link DataSource.Factory} that produces {@link PriorityDataSource} instances. */ +/** @deprecated Use {@link PriorityDataSource.Factory}. */ +@Deprecated public final class PriorityDataSourceFactory implements Factory { private final Factory upstreamFactory; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java index 534cb2572f..0a7a7e36ef 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/amr/AmrExtractorSeekTest.java @@ -25,7 +25,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import java.io.IOException; import java.util.List; import java.util.Random; @@ -51,7 +50,7 @@ public final class AmrExtractorSeekTest { @Before public void setUp() { dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java index 16f92e2b4b..34bac567e4 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flac/FlacExtractorSeekTest.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -43,10 +42,10 @@ public class FlacExtractorSeekTest { "media/flac/bear_no_seek_table_no_num_samples.flac"; private static final int DURATION_US = 2_741_000; - private FlacExtractor extractor = new FlacExtractor(); - private FakeExtractorOutput extractorOutput = new FakeExtractorOutput(); - private DefaultDataSource dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()).createDataSource(); + private final FlacExtractor extractor = new FlacExtractor(); + private final FakeExtractorOutput extractorOutput = new FakeExtractorOutput(); + private final DefaultDataSource dataSource = + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()).createDataSource(); @Test public void flacExtractorReads_seekTable_returnSeekableSeekMap() throws IOException { diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java index e03b7ec6d6..bfd6c598f6 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/flv/FlvExtractorSeekTest.java @@ -27,7 +27,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -53,7 +52,7 @@ public class FlvExtractorSeekTest { extractor = new FlvExtractor(); extractorOutput = new FakeExtractorOutput(); dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java index e3137a106d..6779015379 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.Arrays; @@ -52,7 +51,7 @@ public class ConstantBitrateSeekerTest { extractor = new Mp3Extractor(); extractorOutput = new FakeExtractorOutput(); dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java index 24530c12f1..d2237505de 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/IndexSeekerTest.java @@ -28,7 +28,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -52,7 +51,7 @@ public class IndexSeekerTest { extractor = new Mp3Extractor(FLAG_ENABLE_INDEX_SEEKING); extractorOutput = new FakeExtractorOutput(); dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java index 2770d4ef66..5683fccedb 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorSeekTest.java @@ -25,7 +25,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import java.io.IOException; import java.util.Arrays; import java.util.Random; @@ -49,7 +48,7 @@ public final class AdtsExtractorSeekTest { @Before public void setUp() { dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java index d2d76d6695..bd02ae9711 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java @@ -33,7 +33,6 @@ import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.Arrays; @@ -68,7 +67,7 @@ public final class PsExtractorSeekTest { expectedTrackOutput = expectedOutput.trackOutputs.get(VIDEO_TRACK_ID); dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); totalInputLength = readInputLength(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java index a796f3c994..32143c22ae 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java @@ -28,7 +28,6 @@ import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.Arrays; @@ -62,7 +61,7 @@ public final class TsExtractorSeekTest { .get(AUDIO_TRACK_ID); dataSource = - new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext()) + new DefaultDataSource.Factory(ApplicationProvider.getApplicationContext()) .createDataSource(); } diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index f023a73e9c..836c05bb22 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -51,8 +51,8 @@ import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.RandomTrackSelection; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultDataSource; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -286,7 +286,7 @@ import java.util.List; return DrmSessionManager.DRM_UNSUPPORTED; } MediaDrmCallback drmCallback = - new HttpMediaDrmCallback(widevineLicenseUrl, new DefaultHttpDataSourceFactory()); + new HttpMediaDrmCallback(widevineLicenseUrl, new DefaultHttpDataSource.Factory()); DefaultDrmSessionManager drmSessionManager = new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider( @@ -327,7 +327,7 @@ import java.util.List; DataSource.Factory dataSourceFactory = this.dataSourceFactory != null ? this.dataSourceFactory - : new DefaultDataSourceFactory(host); + : new DefaultDataSource.Factory(host); return new DashMediaSource.Factory(dataSourceFactory) .setDrmSessionManager(drmSessionManager) .setLoadErrorHandlingPolicy(new DefaultLoadErrorHandlingPolicy(MIN_LOADABLE_RETRY_COUNT)) From 700ec93994e1326250712cd608ea786552ac4565 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 9 Aug 2021 19:20:20 +0100 Subject: [PATCH 038/441] Move DeviceInfo into root package PiperOrigin-RevId: 389681733 --- RELEASENOTES.md | 2 ++ .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../exoplayer2/{device => }/DeviceInfo.java | 3 +-- .../android/exoplayer2/ForwardingPlayer.java | 1 - .../com/google/android/exoplayer2/Player.java | 1 - .../exoplayer2/device/package-info.java | 19 ------------------- .../exoplayer2/device/DeviceInfoTest.java | 1 + .../google/android/exoplayer2/ExoPlayer.java | 1 - .../android/exoplayer2/ExoPlayerImpl.java | 1 - .../android/exoplayer2/SimpleExoPlayer.java | 1 - .../exoplayer2/testutil/StubExoPlayer.java | 2 +- 11 files changed, 6 insertions(+), 28 deletions(-) rename library/common/src/main/java/com/google/android/exoplayer2/{device => }/DeviceInfo.java (97%) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/device/package-info.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a36b41b197..9d60eff4a0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -54,6 +54,8 @@ listing audio offload encodings as supported for passthrough mode on mobile devices ([#9239](https://github.com/google/ExoPlayer/issues/9239)). + * Move `com.google.android.exoplayer2.device.DeviceInfo` to + `com.google.android.exoplayer2.DeviceInfo`. * Android 12 compatibility: * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index e1e752ea76..bb8026b479 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -28,6 +28,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.BasePlayer; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DeviceInfo; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaMetadata; @@ -36,7 +37,6 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/device/DeviceInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java similarity index 97% rename from library/common/src/main/java/com/google/android/exoplayer2/device/DeviceInfo.java rename to library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java index bfcbcee8ae..419cb8ff1d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/device/DeviceInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.device; +package com.google.android.exoplayer2; import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.Bundleable; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index f682ced4a7..c1dd1577d0 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -22,7 +22,6 @@ import android.view.SurfaceView; import android.view.TextureView; import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index e45cdc148b..bbd8d9237c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -25,7 +25,6 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioListener; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.TrackGroupArray; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/device/package-info.java b/library/common/src/main/java/com/google/android/exoplayer2/device/package-info.java deleted file mode 100644 index 400a2e1b50..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/device/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@NonNullApi -package com.google.android.exoplayer2.device; - -import com.google.android.exoplayer2.util.NonNullApi; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java b/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java index 922c38d046..03ff4f833f 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.device; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.DeviceInfo; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index cee8bb8943..b4a9ab2980 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -33,7 +33,6 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 85723c4dee..ad09ee28fb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -33,7 +33,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 1eb4ad799c..a8d4cce101 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -54,7 +54,6 @@ import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.Metadata; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 836a4bba05..488fa3fb11 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -22,6 +22,7 @@ import android.view.SurfaceView; import android.view.TextureView; import androidx.annotation.Nullable; import com.google.android.exoplayer2.BasePlayer; +import com.google.android.exoplayer2.DeviceInfo; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; @@ -32,7 +33,6 @@ import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.device.DeviceInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; From ff078cb4b50d82ac263f8299217f3304b0fe17f7 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 10 Aug 2021 09:57:54 +0100 Subject: [PATCH 039/441] Add explicit protected constructor to Timeline. Timeline is already abstract, so it can only be constructed from a subclass anyway. PiperOrigin-RevId: 389827960 --- .../src/main/java/com/google/android/exoplayer2/Timeline.java | 2 ++ 1 file changed, 2 insertions(+) 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 5e9ff6a65d..189efc3258 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 @@ -983,6 +983,8 @@ public abstract class Timeline implements Bundleable { } }; + protected Timeline() {} + /** Returns whether the timeline is empty. */ public final boolean isEmpty() { return getWindowCount() == 0; From 937bc008c1ac072ac9fdc51c56da100ec42cf1d9 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 10 Aug 2021 11:25:32 +0100 Subject: [PATCH 040/441] Use correct IntDef in FFmpegAudioDecoder PiperOrigin-RevId: 389840014 --- .../android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java index 1feeffeef9..5ab47293c3 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java @@ -41,7 +41,7 @@ import java.util.List; private final String codecName; @Nullable private final byte[] extraData; - @C.Encoding private final int encoding; + @C.PcmEncoding private final int encoding; private final int outputBufferSize; private long nativeContext; // May be reassigned on resetting the codec. @@ -158,7 +158,7 @@ import java.util.List; } /** Returns the encoding of output audio. */ - @C.Encoding + @C.PcmEncoding public int getEncoding() { return encoding; } From b627d700544e0a34b8f13f38958cb97ce7f09329 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 10 Aug 2021 12:02:55 +0100 Subject: [PATCH 041/441] Migrate uses of deprecated DataSource factories PiperOrigin-RevId: 389844289 --- .../exoplayer2/drm/DefaultDrmSessionManagerProvider.java | 5 ++--- .../android/exoplayer2/source/MediaSourceFactory.java | 4 ++-- .../exoplayer2/source/dash/offline/DashDownloader.java | 2 +- .../exoplayer2/source/hls/offline/HlsDownloader.java | 2 +- .../source/smoothstreaming/offline/SsDownloader.java | 2 +- .../exoplayer2/playbacktests/gts/DashDownloadTest.java | 4 ++-- .../playbacktests/gts/DashWidevineOfflineTest.java | 7 +++---- 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java index d8a16fc077..a11af2f8a0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java @@ -23,7 +23,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; import com.google.common.primitives.Ints; @@ -51,10 +50,10 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager /** * Sets the {@link HttpDataSource.Factory} to be used for creating {@link HttpMediaDrmCallback * HttpMediaDrmCallbacks} which executes key and provisioning requests over HTTP. If {@code null} - * is passed the {@link DefaultHttpDataSourceFactory} is used. + * is passed the {@link DefaultHttpDataSource.Factory} is used. * * @param drmHttpDataSourceFactory The HTTP data source factory or {@code null} to use {@link - * DefaultHttpDataSourceFactory}. + * DefaultHttpDataSource.Factory}. */ public void setDrmHttpDataSourceFactory( @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index 3a09452f24..755096bbe9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -25,7 +25,7 @@ import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.offline.StreamKey; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; @@ -83,7 +83,7 @@ public interface MediaSourceFactory { * #setDrmSessionManager(DrmSessionManager) concrete DrmSessionManager} are provided. * * @param drmHttpDataSourceFactory The HTTP data source factory, or {@code null} to use {@link - * DefaultHttpDataSourceFactory}. + * DefaultHttpDataSource.Factory}. * @return This factory, for convenience. * @deprecated Use {@link #setDrmSessionManagerProvider(DrmSessionManagerProvider)} and pass an * implementation that configures the returned {@link DrmSessionManager} with the desired diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java index 2029b370de..513ab6403c 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java @@ -51,7 +51,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; * CacheDataSource.Factory cacheDataSourceFactory = * new CacheDataSource.Factory() * .setCache(cache) - * .setUpstreamDataSourceFactory(new DefaultHttpDataSourceFactory(userAgent)); + * .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory()); * // Create a downloader for the first representation of the first adaptation set of the first * // period. * DashDownloader dashDownloader = diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java index e68ffcc7c9..0fe719c263 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java @@ -44,7 +44,7 @@ import java.util.concurrent.Executor; * CacheDataSource.Factory cacheDataSourceFactory = * new CacheDataSource.Factory() * .setCache(cache) - * .setUpstreamDataSourceFactory(new DefaultHttpDataSourceFactory(userAgent)); + * .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory()); * // Create a downloader for the first variant in a master playlist. * HlsDownloader hlsDownloader = * new HlsDownloader( diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java index 416e4b92a6..e5def39cd1 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java @@ -41,7 +41,7 @@ import java.util.concurrent.Executor; * CacheDataSource.Factory cacheDataSourceFactory = * new CacheDataSource.Factory() * .setCache(cache) - * .setUpstreamDataSourceFactory(new DefaultHttpDataSourceFactory(userAgent)); + * .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory()); * // Create a downloader for the first track of the first stream element. * SsDownloader ssDownloader = * new SsDownloader( diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java index 418cb69176..0518fec094 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java @@ -30,7 +30,7 @@ import com.google.android.exoplayer2.source.dash.manifest.Representation; import com.google.android.exoplayer2.source.dash.offline.DashDownloader; import com.google.android.exoplayer2.testutil.HostActivity; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.cache.CacheDataSource; import com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor; import com.google.android.exoplayer2.upstream.cache.SimpleCache; @@ -73,7 +73,7 @@ public final class DashDownloadTest { cache = new SimpleCache( tempFolder, new NoOpCacheEvictor(), new ExoDatabaseProvider(testRule.getActivity())); - httpDataSourceFactory = new DefaultHttpDataSourceFactory("ExoPlayer", null); + httpDataSourceFactory = new DefaultHttpDataSource.Factory(); offlineDataSourceFactory = new CacheDataSource.Factory().setCache(cache); } diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java index 9d962c281d..dd8f225075 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java @@ -35,7 +35,7 @@ import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.testutil.ActionSchedule; import com.google.android.exoplayer2.testutil.HostActivity; import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -51,10 +51,9 @@ import org.junit.runner.RunWith; public final class DashWidevineOfflineTest { private static final String TAG = "DashWidevineOfflineTest"; - private static final String USER_AGENT = "ExoPlayerPlaybackTests"; private DashTestRunner testRunner; - private DefaultHttpDataSourceFactory httpDataSourceFactory; + private DefaultHttpDataSource.Factory httpDataSourceFactory; private OfflineLicenseHelper offlineLicenseHelper; private byte[] offlineLicenseKeySetId; @@ -75,7 +74,7 @@ public final class DashWidevineOfflineTest { boolean useL1Widevine = DashTestRunner.isL1WidevineAvailable(MimeTypes.VIDEO_H264); String widevineLicenseUrl = DashTestData.getWidevineLicenseUrl(true, useL1Widevine); - httpDataSourceFactory = new DefaultHttpDataSourceFactory(USER_AGENT); + httpDataSourceFactory = new DefaultHttpDataSource.Factory(); if (Util.SDK_INT >= 18) { offlineLicenseHelper = OfflineLicenseHelper.newWidevineInstance( From 5a4f2348c806d2fd8592e03ed52bcfabd46217c3 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 10 Aug 2021 14:02:40 +0100 Subject: [PATCH 042/441] Update javadoc for 2.15.0 #minor-release PiperOrigin-RevId: 389862401 --- docs/doc/reference/allclasses-index.html | 2213 +++++------ docs/doc/reference/allclasses.html | 30 +- .../AbstractConcatenatedTimeline.html | 10 +- .../google/android/exoplayer2/BasePlayer.html | 368 +- .../android/exoplayer2/BaseRenderer.html | 121 +- .../google/android/exoplayer2/Bundleable.html | 2 +- ...ronetEngineSource.html => C.DataType.html} | 52 +- .../com/google/android/exoplayer2/C.html | 462 ++- .../android/exoplayer2/ControlDispatcher.html | 51 +- .../exoplayer2/DefaultControlDispatcher.html | 191 +- .../exoplayer2/DefaultRenderersFactory.html | 4 +- .../exoplayer2/ExoPlaybackException.html | 233 +- .../android/exoplayer2/ExoPlayer.Builder.html | 4 +- .../google/android/exoplayer2/ExoPlayer.html | 77 +- .../exoplayer2/ExoTimeoutException.html | 7 +- .../com/google/android/exoplayer2/Format.html | 474 +-- .../android/exoplayer2/ForwardingPlayer.html | 3219 +++++++++++++++++ .../google/android/exoplayer2/MediaItem.html | 23 +- .../exoplayer2/MediaMetadata.Builder.html | 354 +- ...er.html => MediaMetadata.PictureType.html} | 102 +- .../android/exoplayer2/MediaMetadata.html | 698 +++- .../android/exoplayer2/NoSampleRenderer.html | 97 +- .../android/exoplayer2/ParserException.html | 312 +- .../PlaybackException.ErrorCode.html | 188 + .../PlaybackException.FieldNumber.html | 189 + .../android/exoplayer2/PlaybackException.html | 1394 +++++++ .../android/exoplayer2/Player.Command.html | 2 +- .../exoplayer2/Player.Commands.Builder.html | 108 +- .../android/exoplayer2/Player.Commands.html | 84 +- ...ayer.EventFlags.html => Player.Event.html} | 10 +- .../exoplayer2/Player.EventListener.html | 247 +- .../android/exoplayer2/Player.Events.html | 83 +- .../android/exoplayer2/Player.Listener.html | 177 +- .../com/google/android/exoplayer2/Player.html | 931 +++-- .../exoplayer2/PlayerMessage.Target.html | 6 +- .../android/exoplayer2/PlayerMessage.html | 2 +- .../google/android/exoplayer2/Renderer.html | 57 +- .../exoplayer2/SimpleExoPlayer.Builder.html | 74 +- .../android/exoplayer2/SimpleExoPlayer.html | 368 +- .../android/exoplayer2/Timeline.Period.html | 113 +- .../Timeline.RemotableTimeline.html | 645 ++++ .../google/android/exoplayer2/Timeline.html | 87 +- .../analytics/AnalyticsCollector.html | 357 +- .../analytics/AnalyticsListener.Events.html | 8 +- .../analytics/AnalyticsListener.html | 495 ++- .../analytics/PlaybackStatsListener.html | 56 +- .../android/exoplayer2/audio/Ac3Util.html | 20 +- .../audio/AudioCapabilitiesReceiver.html | 3 +- .../exoplayer2/audio/AudioProcessor.html | 15 +- .../audio/AudioRendererEventListener.html | 4 +- .../exoplayer2/audio/AudioSink.Listener.html | 4 +- .../audio/AudioSink.WriteException.html | 3 +- .../android/exoplayer2/audio/AudioSink.html | 4 +- .../exoplayer2/audio/BaseAudioProcessor.html | 9 +- .../audio/DecoderAudioRenderer.html | 27 +- .../exoplayer2/audio/DefaultAudioSink.html | 34 +- .../exoplayer2/audio/ForwardingAudioSink.html | 4 +- .../audio/MediaCodecAudioRenderer.html | 37 +- .../exoplayer2/audio/SonicAudioProcessor.html | 9 +- .../android/exoplayer2/decoder/Buffer.html | 4 +- .../exoplayer2/decoder/DecoderCounters.html | 24 +- .../exoplayer2/decoder/SimpleDecoder.html | 4 +- .../drm/DrmSession.DrmSessionException.html | 63 +- .../android/exoplayer2/drm/DrmSession.html | 8 +- .../drm/DrmSessionEventListener.html | 4 +- .../exoplayer2/drm/DrmUtil.ErrorSource.html | 185 + .../android/exoplayer2/drm/DrmUtil.html | 396 ++ .../exoplayer2/drm/ErrorStateDrmSession.html | 8 +- .../android/exoplayer2/drm/ExoMediaDrm.html | 2 +- .../exoplayer2/drm/FrameworkMediaDrm.html | 6 +- .../exoplayer2/drm/package-summary.html | 38 +- .../android/exoplayer2/drm/package-tree.html | 2 + .../ext/av1/Libgav1VideoRenderer.html | 2 +- .../exoplayer2/ext/cast/CastPlayer.html | 498 ++- .../ext/cast/DefaultMediaItemConverter.html | 12 +- .../ext/cronet/CronetDataSource.Factory.html | 104 +- .../CronetDataSource.OpenException.html | 102 +- .../ext/cronet/CronetDataSource.html | 58 +- .../ext/cronet/CronetEngineWrapper.html | 243 +- .../exoplayer2/ext/cronet/CronetUtil.html | 287 ++ .../ext/cronet/package-summary.html | 25 +- .../exoplayer2/ext/cronet/package-tree.html | 9 +- .../ext/ffmpeg/FfmpegAudioRenderer.html | 2 +- .../exoplayer2/ext/flac/FlacExtractor.html | 4 +- .../ext/flac/LibflacAudioRenderer.html | 2 +- .../exoplayer2/ext/gvr/GvrAudioProcessor.html | 19 +- .../exoplayer2/ext/ima/ImaAdsLoader.html | 4 +- .../ext/leanback/LeanbackPlayerAdapter.html | 50 +- ...allbackBuilder.AllowedCommandProvider.html | 6 +- .../ext/media2/SessionPlayerConnector.html | 31 +- ...MediaSessionConnector.CommandReceiver.html | 10 +- ...SessionConnector.CustomActionProvider.html | 7 +- ...onnector.DefaultMediaMetadataProvider.html | 7 + ...sionConnector.MediaButtonEventHandler.html | 7 +- ...essionConnector.MediaMetadataProvider.html | 27 +- .../MediaSessionConnector.QueueNavigator.html | 21 +- .../mediasession/MediaSessionConnector.html | 149 +- .../RepeatModeActionProvider.html | 7 +- .../TimelineQueueEditor.QueueDataAdapter.html | 3 +- .../ext/mediasession/TimelineQueueEditor.html | 13 +- .../mediasession/TimelineQueueNavigator.html | 43 +- .../ext/mediasession/package-summary.html | 3 +- .../ext/okhttp/OkHttpDataSource.html | 11 +- .../ext/opus/LibopusAudioRenderer.html | 2 +- .../RtmpDataSource.Factory.html} | 198 +- .../exoplayer2/ext/rtmp/RtmpDataSource.html | 28 +- .../ext/rtmp/RtmpDataSourceFactory.html | 25 +- .../exoplayer2/ext/rtmp/package-summary.html | 10 +- .../exoplayer2/ext/rtmp/package-tree.html | 1 + .../ext/vp9/LibvpxVideoRenderer.html | 2 +- .../exoplayer2/ext/vp9/package-summary.html | 6 - .../exoplayer2/ext/vp9/package-tree.html | 13 - .../extractor/DefaultExtractorInput.html | 6 +- .../exoplayer2/extractor/Extractor.html | 10 +- .../exoplayer2/extractor/ExtractorInput.html | 10 +- .../exoplayer2/extractor/ExtractorUtil.html | 34 +- .../extractor/ForwardingExtractorInput.html | 6 +- .../extractor/GaplessInfoHolder.html | 12 +- .../extractor/TrackOutput.CryptoData.html | 6 +- .../exoplayer2/extractor/TrackOutput.html | 6 +- .../exoplayer2/extractor/VorbisUtil.html | 4 +- .../extractor/amr/AmrExtractor.html | 10 +- .../extractor/flac/FlacExtractor.html | 4 +- .../extractor/flv/FlvExtractor.html | 4 +- .../extractor/jpeg/JpegExtractor.html | 4 +- .../extractor/mkv/EbmlProcessor.html | 12 +- .../extractor/mkv/MatroskaExtractor.html | 8 +- .../extractor/mp3/Mp3Extractor.html | 7 +- .../extractor/mp4/FragmentedMp4Extractor.html | 8 +- .../extractor/mp4/Mp4Extractor.html | 4 +- .../extractor/mp4/PsshAtomUtil.html | 4 +- .../extractor/ogg/OggExtractor.html | 4 +- .../extractor/rawcc/RawCcExtractor.html | 4 +- .../exoplayer2/extractor/ts/Ac3Extractor.html | 4 +- .../exoplayer2/extractor/ts/Ac3Reader.html | 6 +- .../exoplayer2/extractor/ts/Ac4Extractor.html | 4 +- .../exoplayer2/extractor/ts/Ac4Reader.html | 6 +- .../extractor/ts/AdtsExtractor.html | 4 +- .../ts/DefaultTsPayloadReaderFactory.html | 13 +- .../exoplayer2/extractor/ts/PsExtractor.html | 4 +- .../exoplayer2/extractor/ts/TsExtractor.html | 4 +- .../extractor/ts/TsPayloadReader.Factory.html | 4 +- .../ts/TsPayloadReader.TrackIdGenerator.html | 3 +- .../extractor/wav/WavExtractor.html | 4 +- .../mediacodec/MediaCodecAdapter.html | 37 +- .../mediacodec/MediaCodecRenderer.html | 177 +- .../MediaCodecUtil.DecoderQueryException.html | 4 +- .../SynchronousMediaCodecAdapter.html | 40 +- .../metadata/MetadataInputBuffer.html | 6 +- .../exoplayer2/metadata/MetadataRenderer.html | 23 +- .../metadata/flac/PictureFrame.html | 33 +- .../metadata/flac/VorbisComment.html | 33 +- .../metadata/scte35/SpliceInsertCommand.html | 20 +- .../scte35/SpliceScheduleCommand.Event.html | 13 +- .../offline/DefaultDownloaderFactory.html | 2 +- .../exoplayer2/offline/DownloaderFactory.html | 6 +- .../offline/ProgressiveDownloader.html | 56 - .../android/exoplayer2/package-summary.html | 162 +- .../android/exoplayer2/package-tree.html | 19 +- .../robolectric/TestPlayerRunHelper.html | 82 +- .../exoplayer2/source/BaseMediaSource.html | 4 +- .../source/ClippingMediaSource.html | 37 +- .../source/CompositeMediaSource.html | 2 +- .../source/CompositeSequenceableLoader.html | 8 +- .../source/ConcatenatingMediaSource.html | 10 +- .../source/DefaultMediaSourceFactory.html | 2 +- .../exoplayer2/source/ForwardingTimeline.html | 4 +- .../exoplayer2/source/LoopingMediaSource.html | 34 +- .../exoplayer2/source/MaskingMediaPeriod.html | 6 +- ...askingMediaSource.PlaceholderTimeline.html | 4 +- .../exoplayer2/source/MaskingMediaSource.html | 39 +- .../exoplayer2/source/MediaLoadData.html | 13 +- .../source/MediaSource.MediaSourceCaller.html | 4 + .../exoplayer2/source/MediaSource.html | 43 +- ...iaSourceEventListener.EventDispatcher.html | 8 + .../source/MediaSourceEventListener.html | 4 +- .../exoplayer2/source/MergingMediaSource.html | 37 +- .../source/ProgressiveMediaSource.html | 41 +- .../exoplayer2/source/SampleQueue.html | 6 +- .../exoplayer2/source/SequenceableLoader.html | 8 +- .../exoplayer2/source/SilenceMediaSource.html | 35 +- .../source/SinglePeriodTimeline.html | 4 +- .../source/SingleSampleMediaSource.html | 35 +- .../UnrecognizedInputFormatException.html | 14 + .../source/ads/AdPlaybackState.AdGroup.html | 156 +- .../source/ads/AdPlaybackState.html | 250 +- .../source/ads/AdsLoader.EventListener.html | 2 +- .../exoplayer2/source/ads/AdsMediaSource.html | 35 +- .../ads/ServerSideInsertedAdsMediaSource.html | 1041 ++++++ .../source/ads/ServerSideInsertedAdsUtil.html | 568 +++ .../source/ads/SinglePeriodAdTimeline.html | 4 +- .../source/ads/package-summary.html | 12 + .../exoplayer2/source/ads/package-tree.html | 2 + .../exoplayer2/source/chunk/Chunk.html | 17 +- .../source/chunk/ChunkSampleStream.html | 8 +- .../exoplayer2/source/chunk/ChunkSource.html | 18 +- .../exoplayer2/source/chunk/DataChunk.html | 1 + .../chunk/MediaParserChunkExtractor.html | 6 +- .../source/dash/BaseUrlExclusionList.html | 407 +++ .../source/dash/DashChunkSource.Factory.html | 7 +- .../source/dash/DashChunkSource.html | 2 +- .../source/dash/DashMediaSource.html | 43 +- .../exoplayer2/source/dash/DashUtil.html | 165 +- .../dash/DefaultDashChunkSource.Factory.html | 11 +- ...tDashChunkSource.RepresentationHolder.html | 14 + .../source/dash/DefaultDashChunkSource.html | 30 +- ...yerEmsgHandler.PlayerTrackEmsgHandler.html | 6 +- .../source/dash/manifest/AdaptationSet.html | 4 +- .../source/dash/manifest/BaseUrl.html | 489 +++ .../source/dash/manifest/DashManifest.html | 14 +- ...DashManifestParser.RepresentationInfo.html | 18 +- .../dash/manifest/DashManifestParser.html | 52 +- ...esentation.MultiSegmentRepresentation.html | 32 +- ...sentation.SingleSegmentRepresentation.html | 14 +- .../source/dash/manifest/Representation.html | 44 +- .../source/dash/manifest/package-summary.html | 44 +- .../source/dash/manifest/package-tree.html | 1 + .../source/dash/offline/DashDownloader.html | 52 - .../source/dash/package-summary.html | 22 +- .../exoplayer2/source/dash/package-tree.html | 1 + .../hls/DefaultHlsExtractorFactory.html | 6 +- .../exoplayer2/source/hls/HlsMediaPeriod.html | 17 +- .../exoplayer2/source/hls/HlsMediaSource.html | 47 +- .../source/hls/TimestampAdjusterProvider.html | 8 +- .../source/hls/WebvttExtractor.html | 4 +- .../source/hls/offline/HlsDownloader.html | 52 - .../playlist/DefaultHlsPlaylistTracker.html | 57 +- ...PlaylistTracker.PlaylistEventListener.html | 13 +- .../hls/playlist/HlsPlaylistTracker.html | 54 +- .../source/rtsp/RtspMediaSource.html | 2 +- .../source/rtsp/reader/RtpAc3Reader.html | 6 +- .../DefaultSsChunkSource.Factory.html | 6 +- .../smoothstreaming/DefaultSsChunkSource.html | 22 +- .../source/smoothstreaming/SsChunkSource.html | 2 +- .../source/smoothstreaming/SsMediaSource.html | 51 +- ...sManifestParser.MissingFieldException.html | 28 +- .../smoothstreaming/offline/SsDownloader.html | 52 - ...urceContractTest.FakeTransferListener.html | 2 +- .../exoplayer2/testutil/ExoHostedTest.html | 17 +- .../testutil/ExoPlayerTestRunner.Builder.html | 3 +- .../testutil/ExoPlayerTestRunner.html | 21 +- .../testutil/FakeAdaptiveMediaSource.html | 2 +- .../testutil/FakeAudioRenderer.html | 6 +- .../exoplayer2/testutil/FakeChunkSource.html | 22 +- .../testutil/FakeDataSet.FakeData.html | 3 +- .../exoplayer2/testutil/FakeDataSource.html | 6 +- .../testutil/FakeExtractorInput.html | 6 +- .../testutil/FakeMediaClockRenderer.html | 2 +- .../FakeMediaSource.InitialTimeline.html | 4 +- .../exoplayer2/testutil/FakeMediaSource.html | 49 +- .../exoplayer2/testutil/FakeRenderer.html | 23 +- .../exoplayer2/testutil/FakeTimeline.html | 4 +- .../testutil/FakeTrackSelection.html | 12 +- .../testutil/FakeVideoRenderer.html | 12 +- .../testutil/HostActivity.HostedTest.html | 4 +- .../exoplayer2/testutil/HostActivity.html | 4 +- .../exoplayer2/testutil/NoUidTimeline.html | 4 +- .../exoplayer2/testutil/StubExoPlayer.html | 312 +- .../testutil/TestExoPlayerBuilder.html | 100 +- .../android/exoplayer2/text/Cue.Builder.html | 42 +- .../google/android/exoplayer2/text/Cue.html | 143 +- .../text/SimpleSubtitleDecoder.html | 10 +- .../exoplayer2/text/SubtitleDecoder.html | 4 +- .../exoplayer2/text/SubtitleInputBuffer.html | 6 +- .../exoplayer2/text/SubtitleOutputBuffer.html | 3 +- .../android/exoplayer2/text/TextRenderer.html | 23 +- .../exoplayer2/text/cea/Cea608Decoder.html | 4 +- .../exoplayer2/text/cea/Cea708Decoder.html | 4 +- .../exoplayer2/text/dvb/DvbDecoder.html | 6 +- .../android/exoplayer2/text/package-tree.html | 2 +- .../text/webvtt/WebvttCssStyle.html | 27 +- .../DefaultTrackSelector.Parameters.html | 353 +- ...efaultTrackSelector.ParametersBuilder.html | 76 +- .../trackselection/DefaultTrackSelector.html | 12 +- .../trackselection/ExoTrackSelection.html | 6 +- .../trackselection/MappingTrackSelector.html | 6 +- .../TrackSelectionParameters.Builder.html | 514 ++- .../TrackSelectionParameters.html | 369 +- .../trackselection/TrackSelectionUtil.html | 33 +- .../trackselection/TrackSelector.html | 6 +- .../trackselection/package-summary.html | 2 +- .../trackselection/package-tree.html | 2 +- .../exoplayer2/ui/CaptionStyleCompat.html | 11 +- .../ui/DefaultMediaDescriptionAdapter.html | 437 +++ .../android/exoplayer2/ui/DefaultTimeBar.html | 10 +- .../exoplayer2/ui/PlayerControlView.html | 133 +- .../ui/PlayerNotificationManager.Builder.html | 71 +- ...cationManager.MediaDescriptionAdapter.html | 17 + .../ui/PlayerNotificationManager.html | 573 +-- .../android/exoplayer2/ui/PlayerView.html | 139 +- .../ui/StyledPlayerControlView.html | 91 +- .../exoplayer2/ui/StyledPlayerView.html | 97 +- .../android/exoplayer2/ui/SubtitleView.html | 30 +- .../google/android/exoplayer2/ui/TimeBar.html | 8 +- .../exoplayer2/ui/package-summary.html | 28 +- .../android/exoplayer2/ui/package-tree.html | 1 + .../exoplayer2/upstream/Allocator.html | 10 +- ...etDataSource.AssetDataSourceException.html | 72 +- .../exoplayer2/upstream/AssetDataSource.html | 6 +- .../upstream/ByteArrayDataSource.html | 6 +- ...DataSource.ContentDataSourceException.html | 67 +- .../upstream/ContentDataSource.html | 6 +- .../exoplayer2/upstream/DataReader.html | 6 +- .../upstream/DataSchemeDataSource.html | 6 +- .../upstream/DataSource.Factory.html | 2 +- .../upstream/DataSourceException.html | 118 +- .../upstream/DataSourceInputStream.html | 4 +- .../exoplayer2/upstream/DefaultAllocator.html | 14 +- .../upstream/DefaultBandwidthMeter.html | 6 +- .../upstream/DefaultDataSource.html | 6 +- .../DefaultHttpDataSource.Factory.html | 25 +- .../upstream/DefaultHttpDataSource.html | 6 +- .../DefaultLoadErrorHandlingPolicy.html | 138 +- .../exoplayer2/upstream/DummyDataSource.html | 6 +- ...ileDataSource.FileDataSourceException.html | 107 +- .../exoplayer2/upstream/FileDataSource.html | 6 +- ...Source.CleartextNotPermittedException.html | 26 + ...taSource.HttpDataSourceException.Type.html | 2 + ...ttpDataSource.HttpDataSourceException.html | 285 +- ...ataSource.InvalidContentTypeException.html | 26 + ...taSource.InvalidResponseCodeException.html | 59 +- .../HttpDataSource.RequestProperties.html | 6 +- .../exoplayer2/upstream/HttpDataSource.html | 12 +- ...adErrorHandlingPolicy.FallbackOptions.html | 416 +++ ...ErrorHandlingPolicy.FallbackSelection.html | 344 ++ .../LoadErrorHandlingPolicy.FallbackType.html | 185 + .../upstream/LoadErrorHandlingPolicy.html | 256 +- .../android/exoplayer2/upstream/Loader.html | 8 +- .../upstream/LoaderErrorThrower.Dummy.html | 8 +- .../upstream/LoaderErrorThrower.html | 8 +- .../upstream/PriorityDataSource.html | 6 +- ...Source.RawResourceDataSourceException.html | 84 +- .../upstream/RawResourceDataSource.html | 6 +- .../upstream/ResolvingDataSource.html | 6 +- .../exoplayer2/upstream/StatsDataSource.html | 6 +- .../exoplayer2/upstream/TeeDataSource.html | 6 +- .../exoplayer2/upstream/TransferListener.html | 2 +- .../UdpDataSource.UdpDataSourceException.html | 54 +- .../exoplayer2/upstream/UdpDataSource.html | 6 +- .../exoplayer2/upstream/cache/Cache.html | 2 +- .../upstream/cache/CacheDataSource.html | 12 +- .../upstream/cache/CachedRegionTracker.html | 15 +- .../cache/DefaultContentMetadata.html | 22 +- .../upstream/cache/NoOpCacheEvictor.html | 6 +- .../upstream/crypto/AesCipherDataSink.html | 6 +- .../upstream/crypto/AesCipherDataSource.html | 12 +- .../exoplayer2/upstream/package-summary.html | 30 +- .../exoplayer2/upstream/package-tree.html | 10 +- .../android/exoplayer2/util/AtomicFile.html | 4 +- .../exoplayer2/util/BundleableUtils.html | 370 ++ .../exoplayer2/util/DebugTextViewHelper.html | 10 +- .../android/exoplayer2/util/EventLogger.html | 129 +- ...lags.Builder.html => FlagSet.Builder.html} | 128 +- .../util/{ExoFlags.html => FlagSet.html} | 14 +- .../exoplayer2/util/LibraryLoader.html | 3 +- .../ListenerSet.IterationFinishedEvent.html | 12 +- .../android/exoplayer2/util/ListenerSet.html | 53 +- .../google/android/exoplayer2/util/Log.html | 36 +- .../android/exoplayer2/util/MimeTypes.html | 112 +- .../android/exoplayer2/util/NalUnitUtil.html | 36 +- .../util/NetworkTypeObserver.Config.html | 270 ++ .../exoplayer2/util/NetworkTypeObserver.html | 7 + .../exoplayer2/util/ParsableByteArray.html | 12 +- .../exoplayer2/util/TimestampAdjuster.html | 114 +- .../android/exoplayer2/util/UriUtil.html | 32 +- .../google/android/exoplayer2/util/Util.html | 179 +- .../exoplayer2/util/package-summary.html | 80 +- .../android/exoplayer2/util/package-tree.html | 6 +- .../android/exoplayer2/video/ColorInfo.html | 52 +- .../video/DecoderVideoRenderer.html | 27 +- .../video/MediaCodecVideoRenderer.html | 33 +- .../video/VideoDecoderOutputBuffer.html | 4 - .../video/VideoRendererEventListener.html | 2 +- .../video/spherical/CameraMotionRenderer.html | 23 +- docs/doc/reference/constant-values.html | 1318 +++++-- docs/doc/reference/deprecated-list.html | 695 ++-- docs/doc/reference/index-all.html | 3061 +++++++++++----- docs/doc/reference/member-search-index.js | 2 +- docs/doc/reference/member-search-index.zip | Bin 131475 -> 136087 bytes docs/doc/reference/overview-tree.html | 77 +- docs/doc/reference/package-search-index.zip | Bin 706 -> 706 bytes docs/doc/reference/serialized-form.html | 88 +- docs/doc/reference/type-search-index.js | 2 +- docs/doc/reference/type-search-index.zip | Bin 9934 -> 10091 bytes 384 files changed, 26898 insertions(+), 9669 deletions(-) rename docs/doc/reference/com/google/android/exoplayer2/{ext/cronet/CronetEngineWrapper.CronetEngineSource.html => C.DataType.html} (67%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html rename docs/doc/reference/com/google/android/exoplayer2/{PlaybackPreparer.html => MediaMetadata.PictureType.html} (60%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/PlaybackException.ErrorCode.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/PlaybackException.FieldNumber.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/PlaybackException.html rename docs/doc/reference/com/google/android/exoplayer2/{Player.EventFlags.html => Player.Event.html} (96%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/Timeline.RemotableTimeline.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/drm/DrmUtil.ErrorSource.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/drm/DrmUtil.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetUtil.html rename docs/doc/reference/com/google/android/exoplayer2/ext/{vp9/VpxOutputBuffer.html => rtmp/RtmpDataSource.Factory.html} (55%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/BaseUrl.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/ui/DefaultMediaDescriptionAdapter.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackOptions.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackSelection.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackType.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/util/BundleableUtils.html rename docs/doc/reference/com/google/android/exoplayer2/util/{ExoFlags.Builder.html => FlagSet.Builder.html} (68%) rename docs/doc/reference/com/google/android/exoplayer2/util/{ExoFlags.html => FlagSet.html} (96%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/util/NetworkTypeObserver.Config.html diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html index 41f2dff59c..661b198996 100644 --- a/docs/doc/reference/allclasses-index.html +++ b/docs/doc/reference/allclasses-index.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":8,"i92":2,"i93":2,"i94":2,"i95":2,"i96":2,"i97":1,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":8,"i126":2,"i127":2,"i128":2,"i129":2,"i130":2,"i131":1,"i132":2,"i133":1,"i134":2,"i135":1,"i136":1,"i137":2,"i138":2,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":32,"i146":32,"i147":32,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":1,"i169":8,"i170":1,"i171":2,"i172":2,"i173":2,"i174":8,"i175":2,"i176":2,"i177":2,"i178":32,"i179":1,"i180":2,"i181":32,"i182":2,"i183":2,"i184":1,"i185":1,"i186":2,"i187":2,"i188":1,"i189":1,"i190":2,"i191":2,"i192":32,"i193":2,"i194":2,"i195":2,"i196":2,"i197":2,"i198":2,"i199":2,"i200":2,"i201":2,"i202":1,"i203":1,"i204":1,"i205":2,"i206":2,"i207":2,"i208":1,"i209":1,"i210":2,"i211":2,"i212":8,"i213":32,"i214":1,"i215":2,"i216":2,"i217":2,"i218":2,"i219":2,"i220":2,"i221":1,"i222":2,"i223":2,"i224":2,"i225":1,"i226":2,"i227":2,"i228":8,"i229":1,"i230":2,"i231":1,"i232":2,"i233":2,"i234":2,"i235":8,"i236":2,"i237":2,"i238":32,"i239":2,"i240":2,"i241":32,"i242":2,"i243":32,"i244":32,"i245":32,"i246":1,"i247":1,"i248":2,"i249":2,"i250":2,"i251":2,"i252":8,"i253":2,"i254":2,"i255":1,"i256":2,"i257":2,"i258":8,"i259":1,"i260":2,"i261":1,"i262":2,"i263":1,"i264":1,"i265":1,"i266":1,"i267":2,"i268":2,"i269":2,"i270":2,"i271":8,"i272":2,"i273":2,"i274":2,"i275":32,"i276":32,"i277":2,"i278":1,"i279":2,"i280":2,"i281":2,"i282":8,"i283":2,"i284":32,"i285":8,"i286":2,"i287":32,"i288":32,"i289":2,"i290":8,"i291":2,"i292":2,"i293":1,"i294":2,"i295":8,"i296":32,"i297":2,"i298":2,"i299":2,"i300":2,"i301":2,"i302":2,"i303":2,"i304":2,"i305":2,"i306":2,"i307":2,"i308":2,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":8,"i315":32,"i316":2,"i317":2,"i318":2,"i319":2,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":1,"i335":2,"i336":2,"i337":32,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":32,"i354":2,"i355":2,"i356":32,"i357":1,"i358":2,"i359":2,"i360":32,"i361":32,"i362":2,"i363":1,"i364":1,"i365":1,"i366":1,"i367":8,"i368":2,"i369":1,"i370":8,"i371":1,"i372":2,"i373":1,"i374":2,"i375":2,"i376":2,"i377":2,"i378":8,"i379":2,"i380":2,"i381":2,"i382":1,"i383":8,"i384":32,"i385":1,"i386":2,"i387":1,"i388":1,"i389":1,"i390":2,"i391":2,"i392":2,"i393":2,"i394":2,"i395":2,"i396":1,"i397":2,"i398":2,"i399":2,"i400":2,"i401":1,"i402":2,"i403":2,"i404":2,"i405":1,"i406":32,"i407":2,"i408":8,"i409":32,"i410":1,"i411":1,"i412":2,"i413":1,"i414":2,"i415":2,"i416":2,"i417":2,"i418":2,"i419":2,"i420":2,"i421":2,"i422":2,"i423":2,"i424":1,"i425":1,"i426":2,"i427":2,"i428":32,"i429":2,"i430":1,"i431":1,"i432":1,"i433":1,"i434":2,"i435":8,"i436":32,"i437":1,"i438":1,"i439":1,"i440":2,"i441":1,"i442":1,"i443":1,"i444":1,"i445":2,"i446":2,"i447":2,"i448":8,"i449":32,"i450":1,"i451":2,"i452":1,"i453":1,"i454":32,"i455":2,"i456":2,"i457":2,"i458":1,"i459":2,"i460":1,"i461":1,"i462":1,"i463":2,"i464":2,"i465":2,"i466":2,"i467":2,"i468":2,"i469":2,"i470":2,"i471":2,"i472":2,"i473":2,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":2,"i484":2,"i485":8,"i486":2,"i487":2,"i488":2,"i489":2,"i490":2,"i491":1,"i492":2,"i493":2,"i494":2,"i495":2,"i496":2,"i497":2,"i498":2,"i499":2,"i500":2,"i501":1,"i502":2,"i503":2,"i504":2,"i505":2,"i506":8,"i507":2,"i508":2,"i509":2,"i510":8,"i511":2,"i512":2,"i513":32,"i514":1,"i515":2,"i516":2,"i517":2,"i518":2,"i519":2,"i520":8,"i521":2,"i522":2,"i523":32,"i524":32,"i525":2,"i526":2,"i527":2,"i528":2,"i529":2,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":2,"i540":2,"i541":32,"i542":2,"i543":2,"i544":2,"i545":2,"i546":8,"i547":2,"i548":2,"i549":2,"i550":2,"i551":2,"i552":2,"i553":2,"i554":2,"i555":2,"i556":2,"i557":1,"i558":1,"i559":2,"i560":2,"i561":1,"i562":2,"i563":1,"i564":2,"i565":2,"i566":2,"i567":2,"i568":1,"i569":2,"i570":2,"i571":2,"i572":32,"i573":2,"i574":2,"i575":2,"i576":2,"i577":2,"i578":2,"i579":32,"i580":2,"i581":2,"i582":8,"i583":1,"i584":1,"i585":1,"i586":1,"i587":8,"i588":8,"i589":1,"i590":2,"i591":2,"i592":2,"i593":2,"i594":1,"i595":1,"i596":2,"i597":8,"i598":1,"i599":8,"i600":32,"i601":8,"i602":8,"i603":2,"i604":2,"i605":2,"i606":2,"i607":2,"i608":2,"i609":2,"i610":2,"i611":1,"i612":2,"i613":2,"i614":2,"i615":8,"i616":2,"i617":2,"i618":2,"i619":2,"i620":2,"i621":2,"i622":2,"i623":2,"i624":8,"i625":1,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":2,"i632":2,"i633":2,"i634":2,"i635":1,"i636":1,"i637":1,"i638":1,"i639":2,"i640":1,"i641":1,"i642":2,"i643":1,"i644":8,"i645":1,"i646":2,"i647":1,"i648":2,"i649":2,"i650":2,"i651":2,"i652":2,"i653":2,"i654":2,"i655":2,"i656":2,"i657":1,"i658":2,"i659":2,"i660":2,"i661":32,"i662":2,"i663":2,"i664":1,"i665":1,"i666":1,"i667":2,"i668":1,"i669":1,"i670":2,"i671":8,"i672":2,"i673":2,"i674":8,"i675":1,"i676":2,"i677":8,"i678":8,"i679":2,"i680":2,"i681":1,"i682":8,"i683":2,"i684":2,"i685":2,"i686":2,"i687":2,"i688":2,"i689":2,"i690":2,"i691":2,"i692":1,"i693":1,"i694":2,"i695":2,"i696":2,"i697":32,"i698":2,"i699":2,"i700":2,"i701":2,"i702":1,"i703":1,"i704":2,"i705":1,"i706":2,"i707":2,"i708":1,"i709":1,"i710":1,"i711":2,"i712":1,"i713":1,"i714":32,"i715":1,"i716":1,"i717":1,"i718":1,"i719":1,"i720":2,"i721":1,"i722":1,"i723":2,"i724":1,"i725":2,"i726":2,"i727":8,"i728":32,"i729":2,"i730":1,"i731":1,"i732":1,"i733":2,"i734":1,"i735":2,"i736":2,"i737":2,"i738":2,"i739":2,"i740":2,"i741":32,"i742":2,"i743":32,"i744":2,"i745":2,"i746":2,"i747":2,"i748":2,"i749":2,"i750":2,"i751":2,"i752":1,"i753":32,"i754":2,"i755":2,"i756":2,"i757":32,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":8,"i766":2,"i767":2,"i768":2,"i769":1,"i770":2,"i771":2,"i772":2,"i773":2,"i774":8,"i775":2,"i776":1,"i777":2,"i778":2,"i779":2,"i780":2,"i781":2,"i782":2,"i783":2,"i784":2,"i785":2,"i786":2,"i787":1,"i788":1,"i789":1,"i790":2,"i791":2,"i792":2,"i793":2,"i794":2,"i795":1,"i796":1,"i797":32,"i798":2,"i799":2,"i800":32,"i801":32,"i802":1,"i803":2,"i804":1,"i805":32,"i806":32,"i807":32,"i808":2,"i809":32,"i810":32,"i811":32,"i812":2,"i813":1,"i814":1,"i815":2,"i816":1,"i817":2,"i818":1,"i819":1,"i820":2,"i821":2,"i822":1,"i823":1,"i824":1,"i825":32,"i826":32,"i827":2,"i828":32,"i829":2,"i830":2,"i831":2,"i832":2,"i833":8,"i834":2,"i835":2,"i836":2,"i837":2,"i838":2,"i839":1,"i840":1,"i841":2,"i842":2,"i843":2,"i844":2,"i845":2,"i846":2,"i847":2,"i848":2,"i849":2,"i850":2,"i851":2,"i852":8,"i853":1,"i854":32,"i855":32,"i856":1,"i857":1,"i858":32,"i859":32,"i860":32,"i861":32,"i862":2,"i863":1,"i864":2,"i865":2,"i866":32,"i867":2,"i868":2,"i869":2,"i870":2,"i871":32,"i872":2,"i873":1,"i874":2,"i875":2,"i876":1,"i877":2,"i878":2,"i879":2,"i880":2,"i881":2,"i882":2,"i883":2,"i884":2,"i885":1,"i886":1,"i887":2,"i888":2,"i889":2,"i890":8,"i891":2,"i892":2,"i893":2,"i894":1,"i895":8,"i896":1,"i897":32,"i898":32,"i899":1,"i900":1,"i901":2,"i902":1,"i903":2,"i904":2,"i905":2,"i906":2,"i907":2,"i908":2,"i909":2,"i910":2,"i911":2,"i912":2,"i913":2,"i914":2,"i915":2,"i916":1,"i917":1,"i918":2,"i919":1,"i920":2,"i921":1,"i922":1,"i923":2,"i924":1,"i925":2,"i926":1,"i927":1,"i928":1,"i929":1,"i930":2,"i931":2,"i932":1,"i933":2,"i934":2,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":2,"i941":2,"i942":2,"i943":2,"i944":2,"i945":2,"i946":2,"i947":2,"i948":2,"i949":2,"i950":2,"i951":2,"i952":2,"i953":2,"i954":2,"i955":1,"i956":2,"i957":2,"i958":1,"i959":1,"i960":1,"i961":1,"i962":1,"i963":1,"i964":1,"i965":1,"i966":1,"i967":2,"i968":2,"i969":1,"i970":2,"i971":2,"i972":2,"i973":2,"i974":2,"i975":2,"i976":2,"i977":2,"i978":2,"i979":1,"i980":1,"i981":2,"i982":2,"i983":2,"i984":2,"i985":2,"i986":8,"i987":2,"i988":2,"i989":2,"i990":2,"i991":2,"i992":2,"i993":2,"i994":2,"i995":2,"i996":1,"i997":1,"i998":1,"i999":2,"i1000":32,"i1001":2,"i1002":1,"i1003":1,"i1004":8,"i1005":1,"i1006":2,"i1007":2,"i1008":2,"i1009":32,"i1010":2,"i1011":2,"i1012":2,"i1013":2,"i1014":1,"i1015":2,"i1016":2,"i1017":2,"i1018":2,"i1019":2,"i1020":2,"i1021":2,"i1022":32,"i1023":2,"i1024":32,"i1025":32,"i1026":2,"i1027":1,"i1028":2,"i1029":2,"i1030":1,"i1031":1,"i1032":2,"i1033":2,"i1034":2,"i1035":2,"i1036":2,"i1037":2,"i1038":1,"i1039":2,"i1040":1,"i1041":2,"i1042":2,"i1043":2,"i1044":2,"i1045":1,"i1046":2,"i1047":2,"i1048":32,"i1049":2,"i1050":2,"i1051":2,"i1052":1,"i1053":1,"i1054":2,"i1055":32,"i1056":1,"i1057":2,"i1058":2,"i1059":1,"i1060":2,"i1061":2,"i1062":2,"i1063":1,"i1064":2,"i1065":1,"i1066":2,"i1067":1,"i1068":2,"i1069":1,"i1070":2,"i1071":2,"i1072":1,"i1073":32,"i1074":2,"i1075":32,"i1076":1,"i1077":2,"i1078":2,"i1079":1,"i1080":32,"i1081":2,"i1082":2,"i1083":2,"i1084":2,"i1085":2,"i1086":8,"i1087":32,"i1088":8,"i1089":8,"i1090":32,"i1091":2,"i1092":2,"i1093":2,"i1094":2,"i1095":2,"i1096":2,"i1097":2,"i1098":2,"i1099":2,"i1100":2,"i1101":1,"i1102":1,"i1103":2,"i1104":1,"i1105":1,"i1106":2,"i1107":2,"i1108":2,"i1109":2,"i1110":2,"i1111":2,"i1112":2,"i1113":2,"i1114":2,"i1115":8,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":2,"i1121":2,"i1122":2,"i1123":2,"i1124":32,"i1125":32,"i1126":2,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":1,"i1135":2}; +var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":8,"i92":2,"i93":2,"i94":2,"i95":2,"i96":2,"i97":1,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":2,"i126":2,"i127":8,"i128":2,"i129":2,"i130":2,"i131":2,"i132":2,"i133":1,"i134":2,"i135":1,"i136":2,"i137":1,"i138":1,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":2,"i146":2,"i147":2,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":32,"i169":32,"i170":32,"i171":32,"i172":1,"i173":8,"i174":1,"i175":2,"i176":2,"i177":2,"i178":8,"i179":2,"i180":2,"i181":2,"i182":32,"i183":1,"i184":2,"i185":32,"i186":2,"i187":2,"i188":1,"i189":1,"i190":2,"i191":2,"i192":1,"i193":1,"i194":2,"i195":2,"i196":32,"i197":2,"i198":2,"i199":2,"i200":2,"i201":2,"i202":2,"i203":2,"i204":2,"i205":2,"i206":1,"i207":1,"i208":1,"i209":2,"i210":2,"i211":2,"i212":1,"i213":1,"i214":2,"i215":2,"i216":8,"i217":32,"i218":1,"i219":2,"i220":2,"i221":2,"i222":2,"i223":2,"i224":2,"i225":1,"i226":2,"i227":2,"i228":2,"i229":1,"i230":2,"i231":2,"i232":8,"i233":1,"i234":2,"i235":1,"i236":2,"i237":2,"i238":2,"i239":8,"i240":2,"i241":2,"i242":2,"i243":2,"i244":2,"i245":32,"i246":2,"i247":32,"i248":32,"i249":32,"i250":1,"i251":1,"i252":2,"i253":2,"i254":2,"i255":2,"i256":8,"i257":2,"i258":2,"i259":1,"i260":2,"i261":2,"i262":8,"i263":1,"i264":2,"i265":1,"i266":2,"i267":1,"i268":1,"i269":1,"i270":1,"i271":2,"i272":2,"i273":2,"i274":2,"i275":8,"i276":2,"i277":2,"i278":2,"i279":32,"i280":32,"i281":2,"i282":1,"i283":2,"i284":2,"i285":2,"i286":8,"i287":2,"i288":32,"i289":8,"i290":2,"i291":32,"i292":32,"i293":2,"i294":8,"i295":2,"i296":2,"i297":1,"i298":2,"i299":8,"i300":32,"i301":2,"i302":2,"i303":2,"i304":2,"i305":2,"i306":2,"i307":2,"i308":2,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":2,"i315":2,"i316":2,"i317":2,"i318":8,"i319":32,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":2,"i335":2,"i336":2,"i337":2,"i338":2,"i339":1,"i340":2,"i341":2,"i342":32,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":2,"i354":2,"i355":2,"i356":2,"i357":2,"i358":32,"i359":2,"i360":2,"i361":32,"i362":1,"i363":2,"i364":2,"i365":32,"i366":32,"i367":2,"i368":1,"i369":1,"i370":1,"i371":1,"i372":8,"i373":2,"i374":1,"i375":8,"i376":1,"i377":2,"i378":1,"i379":2,"i380":2,"i381":2,"i382":2,"i383":8,"i384":2,"i385":2,"i386":2,"i387":1,"i388":8,"i389":32,"i390":1,"i391":2,"i392":1,"i393":1,"i394":1,"i395":2,"i396":32,"i397":2,"i398":2,"i399":2,"i400":2,"i401":2,"i402":2,"i403":1,"i404":2,"i405":2,"i406":2,"i407":2,"i408":1,"i409":2,"i410":2,"i411":2,"i412":1,"i413":32,"i414":2,"i415":8,"i416":32,"i417":1,"i418":1,"i419":2,"i420":1,"i421":2,"i422":2,"i423":2,"i424":2,"i425":2,"i426":2,"i427":2,"i428":2,"i429":1,"i430":1,"i431":2,"i432":2,"i433":32,"i434":2,"i435":1,"i436":1,"i437":1,"i438":1,"i439":2,"i440":8,"i441":32,"i442":1,"i443":1,"i444":1,"i445":2,"i446":1,"i447":1,"i448":1,"i449":1,"i450":2,"i451":2,"i452":2,"i453":8,"i454":32,"i455":1,"i456":2,"i457":1,"i458":1,"i459":32,"i460":2,"i461":2,"i462":2,"i463":1,"i464":2,"i465":1,"i466":1,"i467":1,"i468":2,"i469":2,"i470":2,"i471":2,"i472":2,"i473":2,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":2,"i484":2,"i485":2,"i486":2,"i487":2,"i488":2,"i489":2,"i490":8,"i491":2,"i492":2,"i493":2,"i494":2,"i495":2,"i496":1,"i497":2,"i498":2,"i499":2,"i500":2,"i501":2,"i502":2,"i503":2,"i504":2,"i505":2,"i506":1,"i507":2,"i508":2,"i509":2,"i510":2,"i511":8,"i512":2,"i513":2,"i514":2,"i515":8,"i516":2,"i517":2,"i518":32,"i519":1,"i520":2,"i521":2,"i522":2,"i523":2,"i524":2,"i525":8,"i526":2,"i527":2,"i528":32,"i529":32,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":2,"i540":2,"i541":2,"i542":2,"i543":2,"i544":2,"i545":2,"i546":2,"i547":2,"i548":2,"i549":32,"i550":2,"i551":2,"i552":2,"i553":2,"i554":8,"i555":2,"i556":2,"i557":2,"i558":2,"i559":2,"i560":2,"i561":2,"i562":2,"i563":2,"i564":2,"i565":1,"i566":1,"i567":2,"i568":2,"i569":1,"i570":2,"i571":1,"i572":2,"i573":2,"i574":2,"i575":2,"i576":1,"i577":2,"i578":2,"i579":2,"i580":32,"i581":2,"i582":2,"i583":2,"i584":2,"i585":2,"i586":2,"i587":32,"i588":2,"i589":2,"i590":8,"i591":1,"i592":1,"i593":1,"i594":1,"i595":8,"i596":8,"i597":1,"i598":2,"i599":2,"i600":2,"i601":2,"i602":1,"i603":1,"i604":2,"i605":8,"i606":1,"i607":8,"i608":32,"i609":8,"i610":8,"i611":2,"i612":2,"i613":2,"i614":2,"i615":2,"i616":2,"i617":2,"i618":2,"i619":1,"i620":2,"i621":2,"i622":2,"i623":8,"i624":2,"i625":2,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":2,"i632":8,"i633":1,"i634":2,"i635":2,"i636":2,"i637":2,"i638":2,"i639":2,"i640":2,"i641":2,"i642":2,"i643":1,"i644":1,"i645":1,"i646":1,"i647":2,"i648":1,"i649":1,"i650":2,"i651":1,"i652":8,"i653":1,"i654":2,"i655":1,"i656":2,"i657":2,"i658":32,"i659":2,"i660":2,"i661":2,"i662":2,"i663":2,"i664":2,"i665":2,"i666":2,"i667":2,"i668":1,"i669":2,"i670":2,"i671":2,"i672":32,"i673":2,"i674":2,"i675":1,"i676":1,"i677":1,"i678":2,"i679":1,"i680":1,"i681":2,"i682":8,"i683":2,"i684":2,"i685":8,"i686":1,"i687":2,"i688":8,"i689":8,"i690":2,"i691":2,"i692":1,"i693":8,"i694":2,"i695":2,"i696":2,"i697":2,"i698":2,"i699":2,"i700":2,"i701":2,"i702":2,"i703":1,"i704":1,"i705":2,"i706":2,"i707":2,"i708":32,"i709":32,"i710":2,"i711":2,"i712":2,"i713":2,"i714":1,"i715":1,"i716":2,"i717":1,"i718":2,"i719":2,"i720":1,"i721":1,"i722":1,"i723":2,"i724":1,"i725":1,"i726":32,"i727":1,"i728":1,"i729":1,"i730":1,"i731":1,"i732":2,"i733":1,"i734":1,"i735":2,"i736":1,"i737":2,"i738":2,"i739":8,"i740":32,"i741":2,"i742":1,"i743":1,"i744":1,"i745":2,"i746":1,"i747":2,"i748":2,"i749":2,"i750":2,"i751":2,"i752":2,"i753":32,"i754":2,"i755":32,"i756":2,"i757":2,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":1,"i766":32,"i767":2,"i768":2,"i769":2,"i770":32,"i771":2,"i772":2,"i773":2,"i774":2,"i775":2,"i776":2,"i777":2,"i778":8,"i779":2,"i780":2,"i781":2,"i782":1,"i783":2,"i784":2,"i785":2,"i786":2,"i787":8,"i788":2,"i789":1,"i790":2,"i791":2,"i792":2,"i793":2,"i794":2,"i795":2,"i796":2,"i797":2,"i798":8,"i799":32,"i800":32,"i801":2,"i802":2,"i803":1,"i804":1,"i805":2,"i806":2,"i807":2,"i808":2,"i809":2,"i810":1,"i811":1,"i812":32,"i813":2,"i814":2,"i815":32,"i816":32,"i817":1,"i818":2,"i819":1,"i820":32,"i821":32,"i822":32,"i823":2,"i824":32,"i825":32,"i826":32,"i827":2,"i828":1,"i829":1,"i830":2,"i831":1,"i832":2,"i833":1,"i834":1,"i835":2,"i836":2,"i837":1,"i838":1,"i839":1,"i840":32,"i841":32,"i842":2,"i843":32,"i844":2,"i845":2,"i846":2,"i847":2,"i848":8,"i849":2,"i850":2,"i851":2,"i852":2,"i853":2,"i854":1,"i855":1,"i856":2,"i857":2,"i858":2,"i859":2,"i860":2,"i861":2,"i862":2,"i863":2,"i864":2,"i865":2,"i866":2,"i867":8,"i868":1,"i869":32,"i870":32,"i871":1,"i872":1,"i873":32,"i874":32,"i875":32,"i876":32,"i877":2,"i878":1,"i879":2,"i880":2,"i881":32,"i882":2,"i883":2,"i884":2,"i885":2,"i886":32,"i887":2,"i888":1,"i889":2,"i890":2,"i891":1,"i892":2,"i893":2,"i894":2,"i895":2,"i896":2,"i897":2,"i898":2,"i899":2,"i900":2,"i901":1,"i902":1,"i903":2,"i904":2,"i905":2,"i906":8,"i907":2,"i908":2,"i909":2,"i910":1,"i911":8,"i912":1,"i913":32,"i914":32,"i915":1,"i916":1,"i917":2,"i918":1,"i919":2,"i920":2,"i921":2,"i922":2,"i923":2,"i924":2,"i925":2,"i926":2,"i927":2,"i928":2,"i929":2,"i930":2,"i931":2,"i932":1,"i933":1,"i934":2,"i935":2,"i936":2,"i937":1,"i938":2,"i939":1,"i940":1,"i941":2,"i942":1,"i943":2,"i944":1,"i945":1,"i946":1,"i947":1,"i948":2,"i949":2,"i950":1,"i951":2,"i952":2,"i953":2,"i954":2,"i955":2,"i956":2,"i957":2,"i958":2,"i959":2,"i960":2,"i961":2,"i962":2,"i963":2,"i964":2,"i965":2,"i966":2,"i967":2,"i968":2,"i969":2,"i970":2,"i971":2,"i972":2,"i973":1,"i974":2,"i975":2,"i976":1,"i977":1,"i978":1,"i979":1,"i980":1,"i981":1,"i982":1,"i983":1,"i984":1,"i985":2,"i986":2,"i987":1,"i988":2,"i989":2,"i990":2,"i991":2,"i992":2,"i993":2,"i994":2,"i995":2,"i996":2,"i997":1,"i998":1,"i999":2,"i1000":2,"i1001":2,"i1002":2,"i1003":2,"i1004":8,"i1005":2,"i1006":2,"i1007":2,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":2,"i1013":2,"i1014":1,"i1015":1,"i1016":1,"i1017":2,"i1018":32,"i1019":2,"i1020":1,"i1021":1,"i1022":8,"i1023":1,"i1024":2,"i1025":2,"i1026":2,"i1027":32,"i1028":2,"i1029":2,"i1030":2,"i1031":2,"i1032":1,"i1033":2,"i1034":2,"i1035":2,"i1036":2,"i1037":2,"i1038":2,"i1039":2,"i1040":32,"i1041":2,"i1042":32,"i1043":32,"i1044":2,"i1045":1,"i1046":2,"i1047":2,"i1048":1,"i1049":1,"i1050":2,"i1051":2,"i1052":2,"i1053":2,"i1054":2,"i1055":2,"i1056":2,"i1057":1,"i1058":2,"i1059":1,"i1060":2,"i1061":2,"i1062":2,"i1063":2,"i1064":1,"i1065":2,"i1066":2,"i1067":32,"i1068":2,"i1069":2,"i1070":2,"i1071":1,"i1072":1,"i1073":2,"i1074":32,"i1075":1,"i1076":2,"i1077":2,"i1078":1,"i1079":2,"i1080":2,"i1081":2,"i1082":1,"i1083":2,"i1084":1,"i1085":2,"i1086":1,"i1087":2,"i1088":1,"i1089":2,"i1090":2,"i1091":1,"i1092":32,"i1093":2,"i1094":32,"i1095":1,"i1096":2,"i1097":2,"i1098":1,"i1099":32,"i1100":2,"i1101":2,"i1102":2,"i1103":2,"i1104":2,"i1105":8,"i1106":32,"i1107":8,"i1108":8,"i1109":32,"i1110":2,"i1111":2,"i1112":2,"i1113":2,"i1114":2,"i1115":2,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":1,"i1121":1,"i1122":2,"i1123":1,"i1124":1,"i1125":2,"i1126":2,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":8,"i1135":2,"i1136":2,"i1137":2,"i1138":2,"i1139":2,"i1140":2,"i1141":2,"i1142":32,"i1143":32,"i1144":2,"i1145":2,"i1146":2,"i1147":2,"i1148":2,"i1149":2,"i1150":2,"i1151":2,"i1152":1,"i1153":2}; var tabs = {65535:["t0","All Classes"],1:["t1","Interface Summary"],2:["t2","Class Summary"],8:["t4","Exception Summary"],32:["t6","Annotation Types Summary"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -871,69 +871,81 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +BaseUrl + +

    A base URL, as defined by ISO 23009-1, 2nd edition, 5.6.
    + + + +BaseUrlExclusionList + +
    Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
    + + + BehindLiveWindowException
    Thrown when a live playback falls behind the available media window.
    - + BinaryFrame
    Binary ID3 frame.
    - + BinarySearchSeeker
    A seeker that supports seeking within a stream by searching for the target frame using binary search.
    - + BinarySearchSeeker.BinarySearchSeekMap - + BinarySearchSeeker.DefaultSeekTimestampConverter
    A BinarySearchSeeker.SeekTimestampConverter implementation that returns the seek time itself as the timestamp for a seek time position.
    - + BinarySearchSeeker.SeekOperationParams
    Contains parameters for a pending seek operation by BinarySearchSeeker.
    - + BinarySearchSeeker.SeekTimestampConverter
    A converter that converts seek time in stream time into target timestamp for the BinarySearchSeeker.
    - + BinarySearchSeeker.TimestampSearchResult - + BinarySearchSeeker.TimestampSeeker
    A seeker that looks for a given timestamp from an input.
    - + Buffer
    Base class for buffers with flags.
    - + Bundleable
    Interface for classes whose instance can be stored in a Bundle by Bundleable.toBundle() and @@ -941,1116 +953,1128 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Bundleable.Creator.
    - + Bundleable.Creator<T extends Bundleable>
    Interface for the static CREATOR field of Bundleable classes.
    - + +BundleableUtils + +
    Utilities for Bundleable.
    + + + BundledChunkExtractor
    ChunkExtractor implementation that uses ExoPlayer app-bundled Extractors.
    - + BundledExtractorsAdapter
    ProgressiveMediaExtractor built on top of Extractor instances, whose implementation classes are bundled in the app.
    - + BundledHlsMediaChunkExtractor
    HlsMediaChunkExtractor implementation that uses ExoPlayer app-bundled Extractors.
    - + BundleListRetriever
    A Binder to transfer a list of Bundles across processes by splitting the list into multiple transactions.
    - + BundleUtil
    Utilities for Bundle.
    - + ByteArrayDataSink
    A DataSink for writing to a byte array.
    - + ByteArrayDataSource
    A DataSource for reading from a byte array.
    - + C
    Defines constants used by the library.
    - + C.AudioAllowedCapturePolicy
    Capture policies for audio attributes.
    - + C.AudioContentType
    Content types for audio attributes.
    - + C.AudioFlags
    Flags for audio attributes.
    - + C.AudioFocusGain
    Audio focus types.
    - + C.AudioUsage
    Usage types for audio attributes.
    - + C.BufferFlags
    Flags which can apply to a buffer containing a media sample.
    - + C.ColorRange
    Video color range.
    - + C.ColorSpace
    Video colorspaces.
    - + C.ColorTransfer
    Video color transfer characteristics.
    - + C.ContentType
    Represents a streaming or other media type.
    - + C.CryptoMode
    Crypto modes for a codec.
    - + +C.DataType + +
    Represents a type of data.
    + + + C.Encoding
    Represents an audio encoding, or an invalid or unset value.
    - + C.FormatSupport
    Level of renderer support for a format.
    - + C.NetworkType
    Network connection type.
    - + C.PcmEncoding
    Represents a PCM audio encoding, or an invalid or unset value.
    - + C.Projection
    Video projection types.
    - + C.RoleFlags
    Track role flags.
    - + C.SelectionFlags
    Track selection flags.
    - + C.StereoMode
    The stereo mode for 360/3D/VR videos.
    - + C.StreamType
    Stream types for an AudioTrack.
    - + C.VideoOutputMode
    Video decoder output modes.
    - + C.VideoScalingMode
    Video scaling modes for MediaCodec-based renderers.
    - + C.WakeMode
    Mode specifying whether the player should hold a WakeLock and a WifiLock.
    - + Cache
    A cache that supports partial caching of resources.
    - + Cache.CacheException
    Thrown when an error is encountered when writing data.
    - + Cache.Listener
    Listener of Cache events.
    - + CacheAsserts
    Assertion methods for Cache.
    - + CacheAsserts.RequestSet
    Defines a set of data requests.
    - + CacheDataSink
    Writes data into a cache.
    - + CacheDataSink.CacheDataSinkException
    Thrown when an IOException is encountered when writing data to the sink.
    - + CacheDataSink.Factory - + CacheDataSinkFactory Deprecated. - + CacheDataSource
    A DataSource that reads and writes a Cache.
    - + CacheDataSource.CacheIgnoredReason
    Reasons the cache may be ignored.
    - + CacheDataSource.EventListener
    Listener of CacheDataSource events.
    - + CacheDataSource.Factory - + CacheDataSource.Flags
    Flags controlling the CacheDataSource's behavior.
    - + CacheDataSourceFactory Deprecated. - + CachedRegionTracker
    Utility class for efficiently tracking regions of data that are stored in a Cache for a given cache key.
    - + CacheEvictor
    Evicts data from a Cache.
    - + CacheKeyFactory
    Factory for cache keys.
    - + CacheSpan
    Defines a span of data that may or may not be cached (as indicated by CacheSpan.isCached).
    - + CacheWriter
    Caching related utility methods.
    - + CacheWriter.ProgressListener
    Receives progress updates during cache operations.
    - + CameraMotionListener
    Listens camera motion.
    - + CameraMotionRenderer
    A Renderer that parses the camera motion track.
    - + CaptionStyleCompat
    A compatibility wrapper for CaptioningManager.CaptionStyle.
    - + CaptionStyleCompat.EdgeType
    The type of edge, which may be none.
    - + CapturingAudioSink
    A ForwardingAudioSink that captures configuration, discontinuity and buffer events.
    - + CapturingRenderersFactory
    A RenderersFactory that captures interactions with the audio and video MediaCodecAdapter instances.
    - + CastPlayer
    Player implementation that communicates with a Cast receiver app.
    - + Cea608Decoder
    A SubtitleDecoder for CEA-608 (also known as "line 21 captions" and "EIA-608").
    - + Cea708Decoder
    A SubtitleDecoder for CEA-708 (also known as "EIA-708").
    - + CeaUtil
    Utility methods for handling CEA-608/708 messages.
    - + ChapterFrame
    Chapter information ID3 frame.
    - + ChapterTocFrame
    Chapter table of contents ID3 frame.
    - + Chunk
    An abstract base class for Loader.Loadable implementations that load chunks of data required for the playback of streams.
    - + ChunkExtractor
    Extracts samples and track Formats from chunks.
    - + ChunkExtractor.Factory
    Creates ChunkExtractor instances.
    - + ChunkExtractor.TrackOutputProvider
    Provides TrackOutput instances to be written to during extraction.
    - + ChunkHolder
    Holds a chunk or an indication that the end of the stream has been reached.
    - + ChunkIndex
    Defines chunks of samples within a media stream.
    - + ChunkSampleStream<T extends ChunkSource>
    A SampleStream that loads media in Chunks, obtained from a ChunkSource.
    - + ChunkSampleStream.ReleaseCallback<T extends ChunkSource>
    A callback to be notified when a sample stream has finished being released.
    - + ChunkSource
    A provider of Chunks for a ChunkSampleStream to load.
    - + ClippingMediaPeriod
    Wraps a MediaPeriod and clips its SampleStreams to provide a subsequence of their samples.
    - + ClippingMediaSource
    MediaSource that wraps a source and clips its timeline based on specified start/end positions.
    - + ClippingMediaSource.IllegalClippingException
    Thrown when a ClippingMediaSource cannot clip its wrapped source.
    - + ClippingMediaSource.IllegalClippingException.Reason
    The reason clipping failed.
    - + Clock
    An interface through which system clocks can be read and HandlerWrappers created.
    - + CodecSpecificDataUtil
    Provides utilities for handling various types of codec-specific data.
    - + ColorInfo
    Stores color info.
    - + ColorParser
    Parser for color expressions found in styling formats, e.g.
    - + CommentFrame
    Comment ID3 frame.
    - + CompositeMediaSource<T>
    Composite MediaSource consisting of multiple child sources.
    - + CompositeSequenceableLoader
    A SequenceableLoader that encapsulates multiple other SequenceableLoaders.
    - + CompositeSequenceableLoaderFactory
    A factory to create composite SequenceableLoaders.
    - + ConcatenatingMediaSource
    Concatenates multiple MediaSources.
    - + ConditionVariable
    An interruptible condition variable.
    - + ConstantBitrateSeekMap
    A SeekMap implementation that assumes the stream has a constant bitrate and consists of multiple independent frames of the same size.
    - + Consumer<T>
    Represents an operation that accepts a single input argument and returns no result.
    - + ContainerMediaChunk
    A BaseMediaChunk that uses an Extractor to decode sample data.
    - + ContentDataSource
    A DataSource for reading from a content URI.
    - + ContentDataSource.ContentDataSourceException
    Thrown when an IOException is encountered reading from a content URI.
    - + ContentMetadata
    Interface for an immutable snapshot of keyed metadata.
    - + ContentMetadataMutations
    Defines multiple mutations on metadata value which are applied atomically.
    - + ControlDispatcher - -
    Dispatches operations to the Player.
    +Deprecated. +
    Use a ForwardingPlayer or configure the player to customize operations.
    - + CopyOnWriteMultiset<E>
    An unordered collection of elements that allows duplicates, but also allows access to a set of unique elements.
    - + CronetDataSource
    DataSource without intermediate buffer based on Cronet API set using UrlRequest.
    - + CronetDataSource.Factory - + CronetDataSource.OpenException
    Thrown when an error is encountered when trying to open a CronetDataSource.
    - + CronetDataSourceFactory Deprecated. - + CronetEngineWrapper - -
    A wrapper class for a CronetEngine.
    +Deprecated. +
    Use CronetEngine directly.
    - -CronetEngineWrapper.CronetEngineSource + +CronetUtil -
    Source of CronetEngine.
    +
    Cronet utility methods.
    - + CryptoInfo
    Compatibility wrapper for MediaCodec.CryptoInfo.
    - + Cue
    Contains information about a specific cue, including textual content and formatting data.
    - + Cue.AnchorType
    The type of anchor, which may be unset.
    - + Cue.Builder
    A builder for Cue objects.
    - + Cue.LineType
    The type of line, which may be unset.
    - + Cue.TextSizeType
    The type of default text size for this cue, which may be unset.
    - + Cue.VerticalType
    The type of vertical layout for this cue, which may be unset (i.e.
    - + DashChunkSource
    A ChunkSource for DASH streams.
    - + DashChunkSource.Factory
    Factory for DashChunkSources.
    - + DashDownloader
    A downloader for DASH streams.
    - + DashManifest
    Represents a DASH media presentation description (mpd), as defined by ISO/IEC 23009-1:2014 Section 5.3.1.2.
    - + DashManifestParser
    A parser of media presentation description files.
    - + DashManifestParser.RepresentationInfo
    A parsed Representation element.
    - + DashManifestStaleException
    Thrown when a live playback's manifest is stale and a new manifest could not be loaded.
    - + DashMediaSource
    A DASH MediaSource.
    - + DashMediaSource.Factory
    Factory for DashMediaSources.
    - + DashSegmentIndex
    Indexes the segments within a media stream.
    - + DashUtil
    Utility methods for DASH streams.
    - + DashWrappingSegmentIndex
    An implementation of DashSegmentIndex that wraps a ChunkIndex parsed from a media stream.
    - + DatabaseIOException
    An IOException whose cause is an SQLException.
    - + DatabaseProvider
    Provides SQLiteDatabase instances to ExoPlayer components, which may read and write tables prefixed with DatabaseProvider.TABLE_PREFIX.
    - + DataChunk
    A base class for Chunk implementations where the data should be loaded into a byte[] before being consumed.
    - + DataReader
    Reads bytes from a data stream.
    - + DataSchemeDataSource
    A DataSource for reading data URLs, as defined by RFC 2397.
    - + DataSink
    A component to which streams of data can be written.
    - + DataSink.Factory
    A factory for DataSink instances.
    - + DataSource
    Reads data from URI-identified resources.
    - + DataSource.Factory
    A factory for DataSource instances.
    - + DataSourceContractTest
    A collection of contract tests for DataSource implementations.
    - + DataSourceContractTest.FakeTransferListener
    A TransferListener that only keeps track of the transferred bytes.
    - + DataSourceContractTest.TestResource
    Information about a resource that can be used to test the DataSource instance.
    - + DataSourceContractTest.TestResource.Builder - + DataSourceException
    Used to specify reason of a DataSource error.
    - + DataSourceInputStream
    Allows data corresponding to a given DataSpec to be read from a DataSource and consumed through an InputStream.
    - + DataSpec
    Defines a region of data in a resource.
    - + DataSpec.Builder
    Builds DataSpec instances.
    - + DataSpec.Flags
    The flags that apply to any request for data.
    - + DataSpec.HttpMethod
    HTTP methods supported by ExoPlayer HttpDataSources.
    - + DebugTextViewHelper
    A helper class for periodically updating a TextView with debug information obtained from a SimpleExoPlayer.
    - + Decoder<I,​O,​E extends DecoderException>
    A media decoder.
    - + DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleOutputBuffer,​? extends DecoderException>>
    Decodes and renders audio using a Decoder.
    - + DecoderCounters
    Maintains decoder event counts, for debugging purposes only.
    - + DecoderCountersUtil
    Assertions for DecoderCounters.
    - + DecoderException
    Thrown when a Decoder error occurs.
    - + DecoderInputBuffer
    Holds input for a decoder.
    - + DecoderInputBuffer.BufferReplacementMode
    The buffer replacement mode.
    - + DecoderInputBuffer.InsufficientCapacityException
    Thrown when an attempt is made to write into a DecoderInputBuffer whose DecoderInputBuffer.bufferReplacementMode is DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED and who DecoderInputBuffer.data capacity is smaller than required.
    - + DecoderReuseEvaluation
    The result of an evaluation to determine whether a decoder can be reused for a new input format.
    - + DecoderReuseEvaluation.DecoderDiscardReasons
    Possible reasons why reuse is not possible.
    - + DecoderReuseEvaluation.DecoderReuseResult
    Possible outcomes of the evaluation.
    - + DecoderVideoRenderer
    Decodes and renders video using a Decoder.
    - + DecryptionException
    Thrown when a non-platform component fails to decrypt data.
    - + DefaultAllocator
    Default implementation of Allocator.
    - + DefaultAudioSink
    Plays audio data.
    - + DefaultAudioSink.AudioProcessorChain
    Provides a chain of audio processors, which are used for any user-defined processing and applying playback parameters (if supported).
    - + DefaultAudioSink.DefaultAudioProcessorChain
    The default audio processor chain, which applies a (possibly empty) chain of user-defined audio processors followed by SilenceSkippingAudioProcessor and SonicAudioProcessor.
    - + DefaultAudioSink.InvalidAudioTrackTimestampException
    Thrown when the audio track has provided a spurious timestamp, if DefaultAudioSink.failOnSpuriousAudioTimestamp is set.
    - + DefaultAudioSink.OffloadMode
    Audio offload mode configuration.
    - + DefaultBandwidthMeter
    Estimates bandwidth by listening to data transfers.
    - + DefaultBandwidthMeter.Builder
    Builder for a bandwidth meter.
    - + DefaultCastOptionsProvider
    A convenience OptionsProvider to target the default cast receiver app.
    - + DefaultCompositeSequenceableLoaderFactory
    Default implementation of CompositeSequenceableLoaderFactory.
    - + DefaultContentMetadata
    Default implementation of ContentMetadata.
    - + DefaultControlDispatcher - - +Deprecated. +
    Use a ForwardingPlayer or configure the player to customize operations.
    - + DefaultDashChunkSource
    A default DashChunkSource implementation.
    - + DefaultDashChunkSource.Factory   - + DefaultDashChunkSource.RepresentationHolder
    Holds information about a snapshot of a single Representation.
    - + DefaultDashChunkSource.RepresentationSegmentIterator - + DefaultDatabaseProvider
    A DatabaseProvider that provides instances obtained from a SQLiteOpenHelper.
    - + DefaultDataSource
    A DataSource that supports multiple URI schemes.
    - + DefaultDataSourceFactory
    A DataSource.Factory that produces DefaultDataSource instances that delegate to DefaultHttpDataSources for non-file/asset/content URIs.
    - + DefaultDownloaderFactory
    Default DownloaderFactory, supporting creation of progressive, DASH, HLS and SmoothStreaming downloaders.
    - + DefaultDownloadIndex
    A DownloadIndex that uses SQLite to persist Downloads.
    - + DefaultDrmSessionManager
    A DrmSessionManager that supports playbacks using ExoMediaDrm.
    - + DefaultDrmSessionManager.Builder
    Builder for DefaultDrmSessionManager instances.
    - + DefaultDrmSessionManager.MissingSchemeDataException - + DefaultDrmSessionManager.Mode
    Determines the action to be done after a session acquired.
    - + DefaultDrmSessionManagerProvider
    Default implementation of DrmSessionManagerProvider.
    - + DefaultExtractorInput
    An ExtractorInput that wraps a DataReader.
    - + DefaultExtractorsFactory
    An ExtractorsFactory that provides an array of extractors for the following formats: @@ -2075,2032 +2099,2076 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); com.google.android.exoplayer2.ext.flac.FlacExtractor is used.
    - + DefaultHlsDataSourceFactory
    Default implementation of HlsDataSourceFactory.
    - + DefaultHlsExtractorFactory
    Default HlsExtractorFactory implementation.
    - + DefaultHlsPlaylistParserFactory
    Default implementation for HlsPlaylistParserFactory.
    - + DefaultHlsPlaylistTracker
    Default implementation for HlsPlaylistTracker.
    - + DefaultHttpDataSource
    An HttpDataSource that uses Android's HttpURLConnection.
    - + DefaultHttpDataSource.Factory - + DefaultHttpDataSourceFactory Deprecated. - + DefaultLivePlaybackSpeedControl
    A LivePlaybackSpeedControl that adjusts the playback speed using a proportional controller.
    - + DefaultLivePlaybackSpeedControl.Builder - + DefaultLoadControl
    The default LoadControl implementation.
    - + DefaultLoadControl.Builder
    Builder for DefaultLoadControl.
    - + DefaultLoadErrorHandlingPolicy
    Default implementation of LoadErrorHandlingPolicy.
    - + +DefaultMediaDescriptionAdapter + + + + + DefaultMediaItemConverter
    Default MediaItemConverter implementation.
    - + DefaultMediaItemConverter
    Default implementation of MediaItemConverter.
    - + DefaultMediaSourceFactory
    The default MediaSourceFactory implementation.
    - + DefaultMediaSourceFactory.AdsLoaderProvider
    Provides AdsLoader instances for media items that have ad tag URIs.
    - + DefaultPlaybackSessionManager
    Default PlaybackSessionManager which instantiates a new session for each window in the timeline and also for each ad within the windows.
    - + DefaultRenderersFactory
    Default RenderersFactory implementation.
    - + DefaultRenderersFactory.ExtensionRendererMode
    Modes for using extension renderers.
    - + DefaultRenderersFactoryAsserts
    Assertions for DefaultRenderersFactory.
    - + DefaultRtpPayloadReaderFactory
    Default RtpPayloadReader.Factory implementation.
    - + DefaultSsChunkSource
    A default SsChunkSource implementation.
    - + DefaultSsChunkSource.Factory   - + DefaultTimeBar
    A time bar that shows a current position, buffered position, duration and ad markers.
    - + DefaultTrackNameProvider - + DefaultTrackSelector
    A default TrackSelector suitable for most use cases.
    - + DefaultTrackSelector.AudioTrackScore
    Represents how well an audio track matches the selection DefaultTrackSelector.Parameters.
    - + DefaultTrackSelector.OtherTrackScore
    Represents how well any other track (non video, audio or text) matches the selection DefaultTrackSelector.Parameters.
    - + DefaultTrackSelector.Parameters -
    Extends TrackSelectionParameters by adding fields that are specific to DefaultTrackSelector.
    +
    Extends DefaultTrackSelector.Parameters by adding fields that are specific to DefaultTrackSelector.
    - + DefaultTrackSelector.ParametersBuilder - + DefaultTrackSelector.SelectionOverride
    A track selection override.
    - + DefaultTrackSelector.TextTrackScore
    Represents how well a text track matches the selection DefaultTrackSelector.Parameters.
    - + DefaultTrackSelector.VideoTrackScore
    Represents how well a video track matches the selection DefaultTrackSelector.Parameters.
    - + DefaultTsPayloadReaderFactory
    Default TsPayloadReader.Factory implementation.
    - + DefaultTsPayloadReaderFactory.Flags
    Flags controlling elementary stream readers' behavior.
    - + Descriptor
    A descriptor, as defined by ISO 23009-1, 2nd edition, 5.8.2.
    - + DeviceInfo
    Information about the playback device.
    - + DeviceInfo.PlaybackType
    Types of playback.
    - + DeviceListener Deprecated. - + DolbyVisionConfig
    Dolby Vision configuration data.
    - + Download
    Represents state of a download.
    - + Download.FailureReason
    Failure reasons.
    - + Download.State
    Download states.
    - + DownloadBuilder
    Builder for Download.
    - + DownloadCursor
    Provides random read-write access to the result set returned by a database query.
    - + Downloader
    Downloads and removes a piece of content.
    - + Downloader.ProgressListener
    Receives progress updates during download operations.
    - + DownloaderFactory
    Creates Downloaders for given DownloadRequests.
    - + DownloadException
    Thrown on an error during downloading.
    - + DownloadHelper
    A helper for initializing and removing downloads.
    - + DownloadHelper.Callback
    A callback to be notified when the DownloadHelper is prepared.
    - + DownloadHelper.LiveContentUnsupportedException
    Thrown at an attempt to download live content.
    - + DownloadIndex
    An index of Downloads.
    - + DownloadManager
    Manages downloads.
    - + DownloadManager.Listener
    Listener for DownloadManager events.
    - + DownloadNotificationHelper
    Helper for creating download notifications.
    - + DownloadProgress
    Mutable Download progress.
    - + DownloadRequest
    Defines content to be downloaded.
    - + DownloadRequest.Builder
    A builder for download requests.
    - + DownloadRequest.UnsupportedRequestException
    Thrown when the encoded request data belongs to an unsupported request type.
    - + DownloadService
    A Service for downloading media.
    - + DrmInitData
    Initialization data for one or more DRM schemes.
    - + DrmInitData.SchemeData
    Scheme initialization data.
    - + DrmSession
    A DRM session.
    - + DrmSession.DrmSessionException
    Wraps the throwable which is the cause of the error state.
    - + DrmSession.State
    The state of the DRM session.
    - + DrmSessionEventListener
    Listener of DrmSessionManager events.
    - + DrmSessionEventListener.EventDispatcher
    Dispatches events to DrmSessionEventListeners.
    - + DrmSessionManager
    Manages a DRM session.
    - + DrmSessionManager.DrmSessionReference
    Represents a single reference count of a DrmSession, while deliberately not giving access to the underlying session.
    - + DrmSessionManagerProvider
    A provider to obtain a DrmSessionManager suitable for playing the content described by a MediaItem.
    - + +DrmUtil + +
    DRM-related utility methods.
    + + + +DrmUtil.ErrorSource + +
    Identifies the operation which caused a DRM-related error.
    + + + DtsReader
    Parses a continuous DTS byte stream and extracts individual samples.
    - + DtsUtil
    Utility methods for parsing DTS frames.
    - + DummyDataSource
    A DataSource which provides no data.
    - + DummyExoMediaDrm
    An ExoMediaDrm that does not support any protection schemes.
    - + DummyExtractorOutput
    A fake ExtractorOutput implementation.
    - + DummyMainThread
    Helper class to simulate main/UI thread in tests.
    - + DummyMainThread.TestRunnable
    Runnable variant which can throw a checked exception.
    - + DummySurface
    A dummy Surface.
    - + DummyTrackOutput
    A fake TrackOutput implementation.
    - + DumpableFormat
    Wraps a Format to allow dumping it.
    - + Dumper
    Helper utility to dump field values.
    - + Dumper.Dumpable
    Provides custom dump method.
    - + DumpFileAsserts
    Helper class to enable assertions based on golden-data dump files.
    - + DvbDecoder
    A SimpleSubtitleDecoder for DVB subtitles.
    - + DvbSubtitleReader
    Parses DVB subtitle data and extracts individual frames.
    - + EbmlProcessor
    Defines EBML element IDs/types and processes events.
    - + EbmlProcessor.ElementType
    EBML element types.
    - + EGLSurfaceTexture
    Generates a SurfaceTexture using EGL/GLES functions.
    - + EGLSurfaceTexture.GlException
    A runtime exception to be thrown if some EGL operations failed.
    - + EGLSurfaceTexture.SecureMode
    Secure mode to be used by the EGL surface and context.
    - + EGLSurfaceTexture.TextureImageListener
    Listener to be called when the texture image on SurfaceTexture has been updated.
    - + ElementaryStreamReader
    Extracts individual samples from an elementary media stream, preserving original order.
    - + EmptySampleStream
    An empty SampleStream.
    - + ErrorMessageProvider<T extends Throwable>
    Converts throwables into error codes and user readable error messages.
    - + ErrorStateDrmSession
    A DrmSession that's in a terminal error state.
    - + EventLogger
    Logs events from Player and other core components using Log.
    - + EventMessage
    An Event Message (emsg) as defined in ISO 23009-1.
    - + EventMessageDecoder
    Decodes data encoded by EventMessageEncoder.
    - + EventMessageEncoder
    Encodes data that can be decoded by EventMessageDecoder.
    - + EventStream
    A DASH in-MPD EventStream element, as defined by ISO/IEC 23009-1, 2nd edition, section 5.10.
    - + ExoDatabaseProvider
    An SQLiteOpenHelper that provides instances of a standalone ExoPlayer database.
    - -ExoFlags - -
    A set of integer flags.
    - - - -ExoFlags.Builder - -
    A builder for ExoFlags instances.
    - - - + ExoHostedTest
    A HostActivity.HostedTest for ExoPlayer playback tests.
    - + ExoMediaCrypto
    Enables decoding of encrypted data using keys in a DRM session.
    - + ExoMediaDrm
    Used to obtain keys for decrypting protected media streams.
    - + ExoMediaDrm.AppManagedProvider
    Provides an ExoMediaDrm instance owned by the app.
    - + ExoMediaDrm.KeyRequest
    Contains data used to request keys from a license server.
    - + ExoMediaDrm.KeyRequest.RequestType
    Key request types.
    - + ExoMediaDrm.KeyStatus
    Defines the status of a key.
    - + ExoMediaDrm.OnEventListener
    Called when a DRM event occurs.
    - + ExoMediaDrm.OnExpirationUpdateListener
    Called when a session expiration update occurs.
    - + ExoMediaDrm.OnKeyStatusChangeListener
    Called when the keys in a DRM session change state.
    - + ExoMediaDrm.Provider
    Provider for ExoMediaDrm instances.
    - + ExoMediaDrm.ProvisionRequest
    Contains data to request a certificate from a provisioning server.
    - + ExoPlaybackException
    Thrown when a non locally recoverable playback failure occurs.
    - + ExoPlaybackException.Type
    The type of source that produced the error.
    - + ExoPlayer
    An extensible media player that plays MediaSources.
    - + ExoPlayer.AudioComponent
    The audio component of an ExoPlayer.
    - + ExoPlayer.AudioOffloadListener
    A listener for audio offload events.
    - + ExoPlayer.Builder Deprecated. - + ExoPlayer.DeviceComponent
    The device component of an ExoPlayer.
    - + ExoPlayer.MetadataComponent
    The metadata component of an ExoPlayer.
    - + ExoPlayer.TextComponent
    The text component of an ExoPlayer.
    - + ExoPlayer.VideoComponent
    The video component of an ExoPlayer.
    - + ExoPlayerLibraryInfo
    Information about the ExoPlayer library.
    - + ExoPlayerTestRunner
    Helper class to run an ExoPlayer test.
    - + ExoPlayerTestRunner.Builder
    Builder to set-up a ExoPlayerTestRunner.
    - + ExoTimeoutException
    A timeout of an operation on the ExoPlayer playback thread.
    - + ExoTimeoutException.TimeoutOperation
    The operation which produced the timeout error.
    - + ExoTrackSelection - + ExoTrackSelection.Definition
    Contains of a subset of selected tracks belonging to a TrackGroup.
    - + ExoTrackSelection.Factory
    Factory for ExoTrackSelection instances.
    - + Extractor
    Extracts media data from a container format.
    - + Extractor.ReadResult
    Result values that can be returned by Extractor.read(ExtractorInput, PositionHolder).
    - + ExtractorAsserts
    Assertion methods for Extractor.
    - + ExtractorAsserts.AssertionConfig
    A config for the assertions made (e.g.
    - + ExtractorAsserts.AssertionConfig.Builder
    Builder for ExtractorAsserts.AssertionConfig instances.
    - + ExtractorAsserts.ExtractorFactory
    A factory for Extractor instances.
    - + ExtractorAsserts.SimulationConfig
    A config of different environments to simulate and extractor behaviours to test.
    - + ExtractorInput
    Provides data to be consumed by an Extractor.
    - + ExtractorOutput
    Receives stream level data extracted by an Extractor.
    - + ExtractorsFactory
    Factory for arrays of Extractor instances.
    - + ExtractorUtil
    Extractor related utility methods.
    - + FailOnCloseDataSink
    A DataSink that can simulate caching the bytes being written to it, and then failing to persist them when FailOnCloseDataSink.close() is called.
    - + FailOnCloseDataSink.Factory
    Factory to create a FailOnCloseDataSink.
    - + FakeAdaptiveDataSet
    Fake data set emulating the data of an adaptive media source.
    - + FakeAdaptiveDataSet.Factory
    Factory for FakeAdaptiveDataSets.
    - + FakeAdaptiveDataSet.Iterator
    MediaChunkIterator for the chunks defined by a fake adaptive data set.
    - + FakeAdaptiveMediaPeriod
    Fake MediaPeriod that provides tracks from the given TrackGroupArray.
    - + FakeAdaptiveMediaSource
    Fake MediaSource that provides a given timeline.
    - + FakeAudioRenderer - + FakeChunkSource
    Fake ChunkSource with adaptive media chunks of a given duration.
    - + FakeChunkSource.Factory
    Factory for a FakeChunkSource.
    - + FakeClock
    Fake Clock implementation that allows to advance the time manually to trigger pending timed messages.
    - + FakeDataSet
    Collection of FakeDataSet.FakeData to be served by a FakeDataSource.
    - + FakeDataSet.FakeData
    Container of fake data to be served by a FakeDataSource.
    - + FakeDataSet.FakeData.Segment
    A segment of FakeDataSet.FakeData.
    - + FakeDataSource
    A fake DataSource capable of simulating various scenarios.
    - + FakeDataSource.Factory
    Factory to create a FakeDataSource.
    - + FakeExoMediaDrm
    A fake implementation of ExoMediaDrm for use in tests.
    - + FakeExoMediaDrm.Builder
    Builder for FakeExoMediaDrm instances.
    - + FakeExoMediaDrm.LicenseServer
    An license server implementation to interact with FakeExoMediaDrm.
    - + FakeExtractorInput
    A fake ExtractorInput capable of simulating various scenarios.
    - + FakeExtractorInput.Builder
    Builder of FakeExtractorInput instances.
    - + FakeExtractorInput.SimulatedIOException
    Thrown when simulating an IOException.
    - + FakeExtractorOutput - + FakeMediaChunk - + FakeMediaChunkIterator - + FakeMediaClockRenderer
    Fake abstract Renderer which is also a MediaClock.
    - + FakeMediaPeriod
    Fake MediaPeriod that provides tracks from the given TrackGroupArray.
    - + FakeMediaPeriod.TrackDataFactory
    A factory to create the test data for a particular track.
    - + FakeMediaSource
    Fake MediaSource that provides a given timeline.
    - + FakeMediaSource.InitialTimeline
    A forwarding timeline to provide an initial timeline for fake multi window sources.
    - + FakeRenderer
    Fake Renderer that supports any format with the matching track type.
    - + FakeSampleStream
    Fake SampleStream that outputs a given Format and any amount of items.
    - + FakeSampleStream.FakeSampleStreamItem - + FakeShuffleOrder
    Fake ShuffleOrder which returns a reverse order.
    - + FakeTimeline
    Fake Timeline which can be setup to return custom FakeTimeline.TimelineWindowDefinitions.
    - + FakeTimeline.TimelineWindowDefinition
    Definition used to define a FakeTimeline.
    - + FakeTrackOutput
    A fake TrackOutput.
    - + FakeTrackOutput.Factory
    Factory for FakeTrackOutput instances.
    - + FakeTrackSelection
    A fake ExoTrackSelection that only returns 1 fixed track, and allows querying the number of calls to its methods.
    - + FakeTrackSelector - + FakeVideoRenderer - + FfmpegAudioRenderer
    Decodes and renders audio using FFmpeg.
    - + FfmpegDecoderException
    Thrown when an FFmpeg decoder error occurs.
    - + FfmpegLibrary
    Configures and queries the underlying native library.
    - + FileDataSource
    A DataSource for reading local files.
    - + FileDataSource.Factory - + FileDataSource.FileDataSourceException
    Thrown when a FileDataSource encounters an error reading a file.
    - + FileDataSourceFactory Deprecated. - + FileTypes
    Defines common file type constants and helper methods.
    - + FileTypes.Type
    File types.
    - + FilterableManifest<T>
    A manifest that can generate copies of itself including only the streams specified by the given keys.
    - + FilteringHlsPlaylistParserFactory
    A HlsPlaylistParserFactory that includes only the streams identified by the given stream keys.
    - + FilteringManifestParser<T extends FilterableManifest<T>>
    A manifest parser that includes only the streams identified by the given stream keys.
    - + FixedTrackSelection
    A TrackSelection consisting of a single track.
    - + FlacConstants
    Defines constants used by the FLAC extractor.
    - + FlacDecoder
    Flac decoder.
    - + FlacDecoderException
    Thrown when an Flac decoder error occurs.
    - + FlacExtractor
    Facilitates the extraction of data from the FLAC container format.
    - + FlacExtractor
    Extracts data from FLAC container format.
    - + FlacExtractor.Flags
    Flags controlling the behavior of the extractor.
    - + FlacExtractor.Flags
    Flags controlling the behavior of the extractor.
    - + FlacFrameReader
    Reads and peeks FLAC frame elements according to the FLAC format specification.
    - + FlacFrameReader.SampleNumberHolder
    Holds a sample number.
    - + FlacLibrary
    Configures and queries the underlying native library.
    - + FlacMetadataReader
    Reads and peeks FLAC stream metadata elements according to the FLAC format specification.
    - + FlacMetadataReader.FlacStreamMetadataHolder - + FlacSeekTableSeekMap
    A SeekMap implementation for FLAC streams that contain a seek table.
    - + FlacStreamMetadata
    Holder for FLAC metadata.
    - + FlacStreamMetadata.SeekTable
    A FLAC seek table.
    - + +FlagSet + +
    A set of integer flags.
    + + + +FlagSet.Builder + +
    A builder for FlagSet instances.
    + + + FlvExtractor
    Extracts data from the FLV container format.
    - + Format
    Represents a media format.
    - + Format.Builder
    Builds Format instances.
    - + FormatHolder
    Holds a Format.
    - + ForwardingAudioSink
    An overridable AudioSink implementation forwarding all methods to another sink.
    - + ForwardingExtractorInput
    An overridable ExtractorInput implementation forwarding all methods to another input.
    - + +ForwardingPlayer + +
    A Player that forwards operations to another Player.
    + + + ForwardingTimeline
    An overridable Timeline implementation forwarding all methods to another timeline.
    - + FragmentedMp4Extractor
    Extracts data from the FMP4 container format.
    - + FragmentedMp4Extractor.Flags
    Flags controlling the behavior of the extractor.
    - + FrameworkMediaCrypto
    An ExoMediaCrypto implementation that contains the necessary information to build or update a framework MediaCrypto.
    - + FrameworkMediaDrm
    An ExoMediaDrm implementation that wraps the framework MediaDrm.
    - + GaplessInfoHolder
    Holder for gapless playback information.
    - + Gav1Decoder
    Gav1 decoder.
    - + Gav1DecoderException
    Thrown when a libgav1 decoder error occurs.
    - + Gav1Library
    Configures and queries the underlying native library.
    - + GeobFrame
    GEOB (General Encapsulated Object) ID3 frame.
    - + GlUtil
    GL utilities.
    - + GlUtil.Attribute
    GL attribute, which can be attached to a buffer with GlUtil.Attribute.setBuffer(float[], int).
    - + GlUtil.Uniform
    GL uniform, which can be attached to a sampler using GlUtil.Uniform.setSamplerTexId(int, int).
    - + GvrAudioProcessor Deprecated.
    If you still need this component, please contact us by filing an issue on our issue tracker.
    - + H262Reader
    Parses a continuous H262 byte stream and extracts individual frames.
    - + H263Reader
    Parses an ISO/IEC 14496-2 (MPEG-4 Part 2) or ITU-T Recommendation H.263 byte stream and extracts individual frames.
    - + H264Reader
    Parses a continuous H264 byte stream and extracts individual frames.
    - + H265Reader
    Parses a continuous H.265 byte stream and extracts individual frames.
    - + HandlerWrapper
    An interface to call through to a Handler.
    - + HandlerWrapper.Message
    A message obtained from the handler.
    - + HeartRating
    A rating expressed as "heart" or "no heart".
    - + HevcConfig
    HEVC configuration data.
    - + HlsDataSourceFactory
    Creates DataSources for HLS playlists, encryption and media chunks.
    - + HlsDownloader
    A downloader for HLS streams.
    - + HlsExtractorFactory
    Factory for HLS media chunk extractors.
    - + HlsManifest
    Holds a master playlist along with a snapshot of one of its media playlists.
    - + HlsMasterPlaylist
    Represents an HLS master playlist.
    - + HlsMasterPlaylist.Rendition
    A rendition (i.e.
    - + HlsMasterPlaylist.Variant
    A variant (i.e.
    - + HlsMediaChunkExtractor
    Extracts samples and track Formats from HlsMediaChunks.
    - + HlsMediaPeriod
    A MediaPeriod that loads an HLS stream.
    - + HlsMediaPlaylist
    Represents an HLS media playlist.
    - + HlsMediaPlaylist.Part
    A media part.
    - + HlsMediaPlaylist.PlaylistType
    Type of the playlist, as defined by #EXT-X-PLAYLIST-TYPE.
    - + HlsMediaPlaylist.RenditionReport
    A rendition report for an alternative rendition defined in another media playlist.
    - + HlsMediaPlaylist.Segment
    Media segment reference.
    - + HlsMediaPlaylist.SegmentBase
    The base for a HlsMediaPlaylist.Segment or a HlsMediaPlaylist.Part required for playback.
    - + HlsMediaPlaylist.ServerControl
    Server control attributes.
    - + HlsMediaSource
    An HLS MediaSource.
    - + HlsMediaSource.Factory
    Factory for HlsMediaSources.
    - + HlsMediaSource.MetadataType
    The types of metadata that can be extracted from HLS streams.
    - + HlsPlaylist
    Represents an HLS playlist.
    - + HlsPlaylistParser
    HLS playlists parsing logic.
    - + HlsPlaylistParser.DeltaUpdateException
    Exception thrown when merging a delta update fails.
    - + HlsPlaylistParserFactory
    Factory for HlsPlaylist parsers.
    - + HlsPlaylistTracker
    Tracks playlists associated to an HLS stream and provides snapshots.
    - + HlsPlaylistTracker.Factory
    Factory for HlsPlaylistTracker instances.
    - + HlsPlaylistTracker.PlaylistEventListener
    Called on playlist loading events.
    - + HlsPlaylistTracker.PlaylistResetException
    Thrown when the media sequence of a new snapshot indicates the server has reset.
    - + HlsPlaylistTracker.PlaylistStuckException
    Thrown when a playlist is considered to be stuck due to a server side error.
    - + HlsPlaylistTracker.PrimaryPlaylistListener
    Listener for primary playlist changes.
    - + HlsTrackMetadataEntry
    Holds metadata associated to an HLS media track.
    - + HlsTrackMetadataEntry.VariantInfo
    Holds attributes defined in an EXT-X-STREAM-INF tag.
    - + HorizontalTextInVerticalContextSpan
    A styling span for horizontal text in a vertical context.
    - + HostActivity
    A host activity for performing playback tests.
    - + HostActivity.HostedTest
    Interface for tests that run inside of a HostActivity.
    - + HttpDataSource
    An HTTP DataSource.
    - + HttpDataSource.BaseFactory
    Base implementation of HttpDataSource.Factory that sets default request properties.
    - + HttpDataSource.CleartextNotPermittedException
    Thrown when cleartext HTTP traffic is not permitted.
    - + HttpDataSource.Factory
    A factory for HttpDataSource instances.
    - + HttpDataSource.HttpDataSourceException
    Thrown when an error is encountered when trying to read from a HttpDataSource.
    - + HttpDataSource.HttpDataSourceException.Type -  + +
    The type of operation that produced the error.
    + - + HttpDataSource.InvalidContentTypeException
    Thrown when the content type is invalid.
    - + HttpDataSource.InvalidResponseCodeException
    Thrown when an attempt to open a connection results in a response code not in the 2xx range.
    - + HttpDataSource.RequestProperties -
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers - in a thread safe way to avoid the potential of creating snapshots of an inconsistent or - unintended state.
    +
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers in + a thread safe way to avoid the potential of creating snapshots of an inconsistent or unintended + state.
    - + HttpDataSourceTestEnv
    A JUnit Rule that creates test resources for HttpDataSource contract tests.
    - + HttpMediaDrmCallback
    A MediaDrmCallback that makes requests using HttpDataSource instances.
    - + HttpUtil
    Utility methods for HTTP.
    - + IcyDecoder
    Decodes ICY stream information.
    - + IcyHeaders
    ICY headers.
    - + IcyInfo
    ICY in-stream information.
    - + Id3Decoder
    Decodes ID3 tags.
    - + Id3Decoder.FramePredicate
    A predicate for determining whether individual frames should be decoded.
    - + Id3Frame
    Base class for ID3 frames.
    - + Id3Peeker
    Peeks data from the beginning of an ExtractorInput to determine if there is any ID3 tag.
    - + Id3Reader
    Parses ID3 data and extracts individual text information frames.
    - + IllegalSeekPositionException
    Thrown when an attempt is made to seek to a position that does not exist in the player's Timeline.
    - + ImaAdsLoader
    AdsLoader using the IMA SDK.
    - + ImaAdsLoader.Builder
    Builder for ImaAdsLoader.
    - + IndexSeekMap
    A SeekMap implementation based on a mapping between times and positions in the input stream.
    - + InitializationChunk
    A Chunk that uses an Extractor to decode initialization data for single track.
    - + InputReaderAdapterV30
    MediaParser.SeekableInputReader implementation wrapping a DataReader.
    - + IntArrayQueue
    Array-based unbounded queue for int primitives with amortized O(1) add and remove.
    - + InternalFrame
    Internal ID3 frame that is intended for use by the player.
    - + JpegExtractor
    Extracts JPEG image using the Exif format.
    - + KeysExpiredException
    Thrown when the drm keys loaded into an open session expire.
    - + LanguageFeatureSpan
    Marker interface for span classes that carry language features rather than style information.
    - + LatmReader
    Parses and extracts samples from an AAC/LATM elementary stream.
    - + LeanbackPlayerAdapter
    Leanback PlayerAdapter implementation for Player.
    - + LeastRecentlyUsedCacheEvictor
    Evicts least recently used cache files first.
    - + LibflacAudioRenderer
    Decodes and renders audio using the native Flac decoder.
    - + Libgav1VideoRenderer
    Decodes and renders video using libgav1 decoder.
    - + LibopusAudioRenderer
    Decodes and renders audio using the native Opus decoder.
    - + LibraryLoader
    Configurable loader for native libraries.
    - + LibvpxVideoRenderer
    Decodes and renders video using the native VP9 decoder.
    - + ListenerSet<T>
    A set of listeners.
    - + ListenerSet.Event<T>
    An event sent to a listener.
    - + ListenerSet.IterationFinishedEvent<T>
    An event sent to a listener when all other events sent during one Looper message queue iteration were handled by the listener.
    - + LivePlaybackSpeedControl
    Controls the playback speed while playing live content in order to maintain a steady target live offset.
    - + LoadControl
    Controls buffering of media.
    - + Loader
    Manages the background loading of Loader.Loadables.
    - + Loader.Callback<T extends Loader.Loadable>
    A callback to be notified of Loader events.
    - + Loader.Loadable
    An object that can be loaded using a Loader.
    - + Loader.LoadErrorAction - + Loader.ReleaseCallback
    A callback to be notified when a Loader has finished being released.
    - + Loader.UnexpectedLoaderException
    Thrown when an unexpected exception or error is encountered during loading.
    - + LoaderErrorThrower
    Conditionally throws errors affecting a Loader.
    - + LoaderErrorThrower.Dummy
    A LoaderErrorThrower that never throws.
    - + LoadErrorHandlingPolicy -
    Defines how errors encountered by loaders are handled.
    +
    A policy that defines how load errors are handled.
    - + +LoadErrorHandlingPolicy.FallbackOptions + +
    Holds information about the available fallback options.
    + + + +LoadErrorHandlingPolicy.FallbackSelection + +
    A selected fallback option.
    + + + +LoadErrorHandlingPolicy.FallbackType + +
    Fallback type.
    + + + LoadErrorHandlingPolicy.LoadErrorInfo
    Holds information about a load task error.
    - + LoadEventInfo
    MediaSource load event information.
    - + LocalMediaDrmCallback
    A MediaDrmCallback that provides a fixed response to key requests.
    - + Log
    Wrapper around Log which allows to set the log level.
    - + LongArray
    An append-only, auto-growing long[].
    - + LoopingMediaSource Deprecated.
    To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class.
    - + MappingTrackSelector
    Base class for TrackSelectors that first establish a mapping between TrackGroups @@ -4108,1625 +4176,1667 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); renderer.
    - + MappingTrackSelector.MappedTrackInfo
    Provides mapped track information for each renderer.
    - + MaskingMediaPeriod
    Media period that defers calling MediaSource.createPeriod(MediaPeriodId, Allocator, long) on a given source until MaskingMediaPeriod.createPeriod(MediaPeriodId) has been called.
    - + MaskingMediaPeriod.PrepareListener
    Listener for preparation events.
    - + MaskingMediaSource
    A MediaSource that masks the Timeline with a placeholder until the actual media structure is known.
    - + MaskingMediaSource.PlaceholderTimeline
    A timeline with one dynamic window with a period of indeterminate duration.
    - + MatroskaExtractor
    Extracts data from the Matroska and WebM container formats.
    - + MatroskaExtractor.Flags
    Flags controlling the behavior of the extractor.
    - + MdtaMetadataEntry
    Stores extensible metadata with handler type 'mdta'.
    - + MediaChunk
    An abstract base class for Chunks that contain media samples.
    - + MediaChunkIterator
    Iterator for media chunk sequences.
    - + MediaClock
    Tracks the progression of media time.
    - + MediaCodecAdapter
    Abstracts MediaCodec operations.
    - + MediaCodecAdapter.Configuration
    Configuration parameters for a MediaCodecAdapter.
    - + MediaCodecAdapter.Factory
    A factory for MediaCodecAdapter instances.
    - + MediaCodecAdapter.OnFrameRenderedListener
    Listener to be called when an output frame has rendered on the output surface.
    - + MediaCodecAudioRenderer
    Decodes and renders audio using MediaCodec and an AudioSink.
    - + MediaCodecDecoderException
    Thrown when a failure occurs in a MediaCodec decoder.
    - + MediaCodecInfo
    Information about a MediaCodec for a given mime type.
    - + MediaCodecRenderer
    An abstract renderer that uses MediaCodec to decode samples for rendering.
    - + MediaCodecRenderer.DecoderInitializationException
    Thrown when a failure occurs instantiating a decoder.
    - + MediaCodecSelector
    Selector of MediaCodec instances.
    - + MediaCodecUtil
    A utility class for querying the available codecs.
    - + MediaCodecUtil.DecoderQueryException
    Thrown when an error occurs querying the device for its underlying media capabilities.
    - + MediaCodecVideoDecoderException
    Thrown when a failure occurs in a MediaCodec video decoder.
    - + MediaCodecVideoRenderer
    Decodes and renders video using MediaCodec.
    - + MediaCodecVideoRenderer.CodecMaxValues   - + MediaDrmCallback
    Performs ExoMediaDrm key and provisioning requests.
    - + MediaDrmCallbackException
    Thrown when an error occurs while executing a DRM key or provisioning request.
    - + MediaFormatUtil
    Helper class containing utility methods for managing MediaFormat instances.
    - + MediaItem
    Representation of a media item.
    - + MediaItem.AdsConfiguration
    Configuration for playing back linear ads with a media item.
    - + MediaItem.Builder
    A builder for MediaItem instances.
    - + MediaItem.ClippingProperties
    Optionally clips the media item to a custom start and end position.
    - + MediaItem.DrmConfiguration
    DRM configuration for a media item.
    - + MediaItem.LiveConfiguration
    Live playback configuration.
    - + MediaItem.PlaybackProperties
    Properties for local playback.
    - + MediaItem.Subtitle
    Properties for a text track.
    - + MediaItemConverter
    Converts between MediaItem and the Cast SDK's MediaQueueItem.
    - + MediaItemConverter
    Converts between Media2 MediaItem and ExoPlayer MediaItem.
    - + MediaLoadData
    Descriptor for data being loaded or selected by a MediaSource.
    - + MediaMetadata
    Metadata of a MediaItem, playlist, or a combination of multiple sources of Metadata.
    - + MediaMetadata.Builder
    A builder for MediaMetadata instances.
    - + MediaMetadata.FolderType
    The folder type of the media item.
    - + +MediaMetadata.PictureType + +
    The picture type of the artwork.
    + + + MediaParserChunkExtractor
    ChunkExtractor implemented on top of the platform's MediaParser.
    - + MediaParserExtractorAdapter
    ProgressiveMediaExtractor implemented on top of the platform's MediaParser.
    - + MediaParserHlsMediaChunkExtractor
    HlsMediaChunkExtractor implemented on top of the platform's MediaParser.
    - + MediaParserUtil
    Miscellaneous constants and utility methods related to the MediaParser integration.
    - + MediaPeriod
    Loads media corresponding to a Timeline.Period, and allows that media to be read.
    - + MediaPeriod.Callback
    A callback to be notified of MediaPeriod events.
    - + MediaPeriodAsserts
    Assertion methods for MediaPeriod.
    - + MediaPeriodAsserts.FilterableManifestMediaPeriodFactory<T extends FilterableManifest<T>>
    Interface to create media periods for testing based on a FilterableManifest.
    - + MediaPeriodId
    Identifies a specific playback of a Timeline.Period.
    - + MediaSessionConnector
    Connects a MediaSessionCompat to a Player.
    - + MediaSessionConnector.CaptionCallback
    Handles requests for enabling or disabling captions.
    - + MediaSessionConnector.CommandReceiver
    Receiver of media commands sent by a media controller.
    - + MediaSessionConnector.CustomActionProvider
    Provides a PlaybackStateCompat.CustomAction to be published and handles the action when sent by a media controller.
    - + MediaSessionConnector.DefaultMediaMetadataProvider
    Provides a default MediaMetadataCompat with properties and extras taken from the MediaDescriptionCompat of the MediaSessionCompat.QueueItem of the active queue item.
    - + MediaSessionConnector.MediaButtonEventHandler
    Handles a media button event.
    - + MediaSessionConnector.MediaMetadataProvider
    Provides a MediaMetadataCompat for a given player state.
    - + MediaSessionConnector.PlaybackActions
    Playback actions supported by the connector.
    - + MediaSessionConnector.PlaybackPreparer
    Interface to which playback preparation and play actions are delegated.
    - + MediaSessionConnector.QueueEditor
    Handles media session queue edits.
    - + MediaSessionConnector.QueueNavigator
    Handles queue navigation actions, and updates the media session queue by calling MediaSessionCompat.setQueue().
    - + MediaSessionConnector.RatingCallback
    Callback receiving a user rating for the active media item.
    - + MediaSource
    Defines and provides media to be played by an ExoPlayer.
    - + MediaSource.MediaPeriodId
    Identifier for a MediaPeriod.
    - + MediaSource.MediaSourceCaller
    A caller of media sources, which will be notified of source events.
    - + MediaSourceEventListener
    Interface for callbacks to be notified of MediaSource events.
    - + MediaSourceEventListener.EventDispatcher
    Dispatches events to MediaSourceEventListeners.
    - + MediaSourceFactory
    Factory for creating MediaSources from MediaItems.
    - + MediaSourceTestRunner
    A runner for MediaSource tests.
    - + MergingMediaSource
    Merges multiple MediaSources.
    - + MergingMediaSource.IllegalMergeException
    Thrown when a MergingMediaSource cannot merge its sources.
    - + MergingMediaSource.IllegalMergeException.Reason
    The reason the merge failed.
    - + Metadata
    A collection of metadata entries.
    - + Metadata.Entry
    A metadata entry.
    - + MetadataDecoder
    Decodes metadata from binary data.
    - + MetadataDecoderFactory
    A factory for MetadataDecoder instances.
    - + MetadataInputBuffer - + MetadataOutput
    Receives metadata output.
    - + MetadataRenderer
    A renderer for metadata.
    - + MetadataRetriever
    Retrieves the static metadata of MediaItems.
    - + MimeTypes
    Defines common MIME types and helper methods.
    - + MlltFrame
    MPEG location lookup table frame.
    - + MotionPhotoMetadata
    Metadata of a motion photo file.
    - + Mp3Extractor
    Extracts data from the MP3 container format.
    - + Mp3Extractor.Flags
    Flags controlling the behavior of the extractor.
    - + Mp4Extractor
    Extracts data from the MP4 container format.
    - + Mp4Extractor.Flags
    Flags controlling the behavior of the extractor.
    - + Mp4WebvttDecoder
    A SimpleSubtitleDecoder for Webvtt embedded in a Mp4 container file.
    - + MpegAudioReader
    Parses a continuous MPEG Audio byte stream and extracts individual frames.
    - + MpegAudioUtil
    Utility methods for handling MPEG audio streams.
    - + MpegAudioUtil.Header
    Stores the metadata for an MPEG audio frame.
    - + NalUnitUtil
    Utility methods for handling H.264/AVC and H.265/HEVC NAL units.
    - + NalUnitUtil.PpsData
    Holds data parsed from a picture parameter set NAL unit.
    - + NalUnitUtil.SpsData
    Holds data parsed from a sequence parameter set NAL unit.
    - + NetworkTypeObserver
    Observer for network type changes.
    - + +NetworkTypeObserver.Config + +
    Configuration for NetworkTypeObserver.
    + + + NetworkTypeObserver.Listener
    A listener for network type changes.
    - + NonNullApi
    Annotation to declare all type usages in the annotated instance as Nonnull, unless explicitly marked with a nullable annotation.
    - + NoOpCacheEvictor
    Evictor that doesn't ever evict cache files.
    - + NoSampleRenderer
    A Renderer implementation whose track type is C.TRACK_TYPE_NONE and does not consume data from its SampleStream.
    - + NotificationUtil
    Utility methods for displaying Notifications.
    - + NotificationUtil.Importance
    Notification channel importance levels.
    - + NoUidTimeline
    A timeline which wraps another timeline and overrides all window and period uids to 0.
    - + OfflineLicenseHelper
    Helper class to download, renew and release offline licenses.
    - + OggExtractor
    Extracts data from the Ogg container format.
    - + OkHttpDataSource
    An HttpDataSource that delegates to Square's Call.Factory.
    - + OkHttpDataSource.Factory - + OkHttpDataSourceFactory Deprecated. - + OpusDecoder
    Opus decoder.
    - + OpusDecoderException
    Thrown when an Opus decoder error occurs.
    - + OpusLibrary
    Configures and queries the underlying native library.
    - + OpusUtil
    Utility methods for handling Opus audio streams.
    - + OutputBuffer
    Output buffer decoded by a Decoder.
    - + OutputBuffer.Owner<S extends OutputBuffer>
    Buffer owner.
    - + OutputConsumerAdapterV30
    MediaParser.OutputConsumer implementation that redirects output to an ExtractorOutput.
    - + ParsableBitArray
    Wraps a byte array, providing methods that allow it to be read as a bitstream.
    - + ParsableByteArray
    Wraps a byte array, providing a set of methods for parsing data from it.
    - + ParsableNalUnitBitArray
    Wraps a byte array, providing methods that allow it to be read as a NAL unit bitstream.
    - + ParserException
    Thrown when an error occurs parsing media data and metadata.
    - + ParsingLoadable<T>
    A Loader.Loadable for objects that can be parsed from binary data using a ParsingLoadable.Parser.
    - + ParsingLoadable.Parser<T>
    Parses an object from loaded data.
    - + PassthroughSectionPayloadReader
    A SectionPayloadReader that directly outputs the section bytes as sample data.
    - + PercentageRating
    A rating expressed as a percentage.
    - + Period
    Encapsulates media content components over a contiguous period of time.
    - + PesReader
    Parses PES packet data and extracts samples.
    - + PgsDecoder
    A SimpleSubtitleDecoder for PGS subtitles.
    - + PictureFrame
    A picture parsed from a FLAC file.
    - + PlatformScheduler
    A Scheduler that uses JobScheduler.
    - + PlatformScheduler.PlatformSchedulerService
    A JobService that starts the target service if the requirements are met.
    - + +PlaybackException + +
    Thrown when a non locally recoverable playback failure occurs.
    + + + +PlaybackException.ErrorCode + +
    Codes that identify causes of player errors.
    + + + +PlaybackException.FieldNumber + +
    Identifiers for fields in a Bundle which represents a playback exception.
    + + + PlaybackOutput
    Class to capture output from a playback test.
    - + PlaybackParameters
    Parameters that apply to playback, including speed setting.
    - -PlaybackPreparer -Deprecated. -
    Use ControlDispatcher instead.
    - - - + PlaybackSessionManager
    Manager for active playback sessions.
    - + PlaybackSessionManager.Listener
    A listener for session updates.
    - + PlaybackStats
    Statistics about playbacks.
    - + PlaybackStats.EventTimeAndException
    Stores an exception with the event time at which it occurred.
    - + PlaybackStats.EventTimeAndFormat
    Stores a format with the event time at which it started being used, or null to indicate that no format was used.
    - + PlaybackStats.EventTimeAndPlaybackState
    Stores a playback state with the event time at which it became active.
    - + PlaybackStatsListener
    AnalyticsListener to gather PlaybackStats from the player.
    - + PlaybackStatsListener.Callback
    A listener for PlaybackStats updates.
    - + Player
    A media player interface defining traditional high-level functionality, such as the ability to play, pause, seek and query properties of the currently playing media.
    - + Player.Command
    Commands that can be executed on a Player.
    - + Player.Commands
    A set of commands.
    - + Player.Commands.Builder
    A builder for Player.Commands instances.
    - + Player.DiscontinuityReason
    Reasons for position discontinuities.
    - -Player.EventFlags + +Player.Event
    Events that can be reported via Player.Listener.onEvents(Player, Events).
    - + Player.EventListener Deprecated. - + Player.Events - +
    A set of events.
    - + Player.Listener
    Listener of all changes in the Player.
    - + Player.MediaItemTransitionReason
    Reasons for media item transitions.
    - + Player.PlaybackSuppressionReason
    Reason why playback is suppressed even though Player.getPlayWhenReady() is true.
    - + Player.PlayWhenReadyChangeReason
    Reasons for playWhenReady changes.
    - + Player.PositionInfo
    Position info describing a playback position involved in a discontinuity.
    - + Player.RepeatMode
    Repeat modes for playback.
    - + Player.State
    Playback state.
    - + Player.TimelineChangeReason
    Reasons for timeline changes.
    - + PlayerControlView
    A view for controlling Player instances.
    - + PlayerControlView.ProgressUpdateListener
    Listener to be notified when progress has been updated.
    - + PlayerControlView.VisibilityListener
    Listener to be notified about changes of the visibility of the UI control.
    - + PlayerEmsgHandler
    Handles all emsg messages from all media tracks for the player.
    - + PlayerEmsgHandler.PlayerEmsgCallback
    Callbacks for player emsg events encountered during DASH live stream.
    - + PlayerMessage
    Defines a player message which can be sent with a PlayerMessage.Sender and received by a PlayerMessage.Target.
    - + PlayerMessage.Sender
    A sender for messages.
    - + PlayerMessage.Target
    A target for messages.
    - + PlayerNotificationManager
    Starts, updates and cancels a media style notification reflecting the player state.
    - + PlayerNotificationManager.Builder
    A builder for PlayerNotificationManager instances.
    - + PlayerNotificationManager.CustomActionReceiver
    Defines and handles custom actions.
    - + PlayerNotificationManager.MediaDescriptionAdapter
    An adapter to provide content assets of the media currently playing.
    - + PlayerNotificationManager.NotificationListener
    A listener for changes to the notification.
    - + PlayerNotificationManager.Priority
    Priority of the notification (required for API 25 and lower).
    - + PlayerNotificationManager.Visibility
    Visibility of notification on the lock screen.
    - + PlayerView
    A high level view for Player media playbacks.
    - + PlayerView.ShowBuffering
    Determines when the buffering view is shown.
    - + PositionHolder
    Holds a position in the stream.
    - + PriorityDataSource
    A DataSource that can be used as part of a task registered with a PriorityTaskManager.
    - + PriorityDataSourceFactory
    A DataSource.Factory that produces PriorityDataSource instances.
    - + PriorityTaskManager
    Allows tasks with associated priorities to control how they proceed relative to one another.
    - + PriorityTaskManager.PriorityTooLowException
    Thrown when task attempts to proceed when another registered task has a higher priority.
    - + PrivateCommand
    Represents a private command as defined in SCTE35, Section 9.3.6.
    - + PrivFrame
    PRIV (Private) ID3 frame.
    - + ProgramInformation
    A parsed program information element.
    - + ProgressHolder
    Holds a progress percentage.
    - + ProgressiveDownloader
    A downloader for progressive media streams.
    - + ProgressiveMediaExtractor
    Extracts the contents of a container file from a progressive media stream.
    - + ProgressiveMediaExtractor.Factory
    Creates ProgressiveMediaExtractor instances.
    - + ProgressiveMediaSource
    Provides one period that loads data from a Uri and extracted using an Extractor.
    - + ProgressiveMediaSource.Factory - + PsExtractor
    Extracts data from the MPEG-2 PS container format.
    - + PsshAtomUtil
    Utility methods for handling PSSH atoms.
    - + RandomizedMp3Decoder
    Generates randomized, but correct amount of data on MP3 audio input.
    - + RandomTrackSelection
    An ExoTrackSelection whose selected track is updated randomly.
    - + RandomTrackSelection.Factory
    Factory for RandomTrackSelection instances.
    - + RangedUri
    Defines a range of data located at a reference uri.
    - + Rating
    A rating for media content.
    - + RawCcExtractor
    Extracts data from the RawCC container format.
    - + RawResourceDataSource
    A DataSource for reading a raw resource inside the APK.
    - + RawResourceDataSource.RawResourceDataSourceException
    Thrown when an IOException is encountered reading from a raw resource.
    - + Renderer
    Renders media read from a SampleStream.
    - + Renderer.State
    The renderer states.
    - + Renderer.VideoScalingMode Deprecated. - + Renderer.WakeupListener
    Some renderers can signal when Renderer.render(long, long) should be called.
    - + RendererCapabilities
    Defines the capabilities of a Renderer.
    - + RendererCapabilities.AdaptiveSupport
    Level of renderer support for adaptive format switches.
    - + RendererCapabilities.Capabilities
    Combined renderer capabilities.
    - + RendererCapabilities.FormatSupport Deprecated.
    Use C.FormatSupport instead.
    - + RendererCapabilities.TunnelingSupport
    Level of renderer support for tunneling.
    - + RendererConfiguration
    The configuration of a Renderer.
    - + RenderersFactory
    Builds Renderer instances for use by a SimpleExoPlayer.
    - + RepeatModeActionProvider
    Provides a custom action for toggling repeat modes.
    - + RepeatModeUtil
    Util class for repeat mode handling.
    - + RepeatModeUtil.RepeatToggleModes
    Set of repeat toggle modes.
    - + Representation
    A DASH representation.
    - + Representation.MultiSegmentRepresentation
    A DASH representation consisting of multiple segments.
    - + Representation.SingleSegmentRepresentation
    A DASH representation consisting of a single segment.
    - + Requirements
    Defines a set of device state requirements.
    - + Requirements.RequirementFlags
    Requirement flags.
    - + RequirementsWatcher
    Watches whether the Requirements are met and notifies the RequirementsWatcher.Listener on changes.
    - + RequirementsWatcher.Listener
    Notified when RequirementsWatcher instance first created and on changes whether the Requirements are met.
    - + ResolvingDataSource
    DataSource wrapper allowing just-in-time resolution of DataSpecs.
    - + ResolvingDataSource.Factory - + ResolvingDataSource.Resolver
    Resolves DataSpecs.
    - + ReusableBufferedOutputStream
    This is a subclass of BufferedOutputStream with a ReusableBufferedOutputStream.reset(OutputStream) method that allows an instance to be re-used with another underlying output stream.
    - + RobolectricUtil
    Utility methods for Robolectric-based tests.
    - + RtmpDataSource
    A Real-Time Messaging Protocol (RTMP) DataSource.
    - -RtmpDataSourceFactory + +RtmpDataSource.Factory - + - + +RtmpDataSourceFactory +Deprecated. + + + + RtpAc3Reader
    Parses an AC3 byte stream carried on RTP packets, and extracts AC3 frames.
    - + RtpPacket
    Represents the header and the payload of an RTP packet.
    - + RtpPacket.Builder
    Builder class for an RtpPacket
    - + RtpPayloadFormat
    Represents the payload format used in RTP.
    - + RtpPayloadReader
    Extracts media samples from the payload of received RTP packets.
    - + RtpPayloadReader.Factory
    Factory of RtpPayloadReader instances.
    - + RtpUtils
    Utility methods for RTP.
    - + RtspMediaSource
    An Rtsp MediaSource
    - + RtspMediaSource.Factory
    Factory for RtspMediaSource
    - + RtspMediaSource.RtspPlaybackException
    Thrown when an exception or error is encountered during loading an RTSP stream.
    - + RubySpan
    A styling span for ruby text.
    - + RunnableFutureTask<R,​E extends Exception>
    A RunnableFuture that supports additional uninterruptible operations to query whether execution has started and finished.
    - + SampleQueue
    A queue of media samples.
    - + SampleQueue.UpstreamFormatChangedListener
    A listener for changes to the upstream format.
    - + SampleQueueMappingException
    Thrown when it is not possible to map a TrackGroup to a SampleQueue.
    - + SampleStream
    A stream of media samples (and associated format information).
    - + SampleStream.ReadDataResult - + SampleStream.ReadFlags - + Scheduler
    Schedules a service to be started in the foreground when some Requirements are met.
    - + SectionPayloadReader
    Reads section data.
    - + SectionReader
    Reads section data packets and feeds the whole sections to a given SectionPayloadReader.
    - + SeekMap
    Maps seek positions (in microseconds) to corresponding positions (byte offsets) in the stream.
    - + SeekMap.SeekPoints
    Contains one or two SeekPoints.
    - + SeekMap.Unseekable
    A SeekMap that does not support seeking.
    - + SeekParameters
    Parameters that apply to seeking.
    - + SeekPoint
    Defines a seek point in a media stream.
    - + SegmentBase
    An approximate representation of a SegmentBase manifest element.
    - + SegmentBase.MultiSegmentBase
    A SegmentBase that consists of multiple segments.
    - + SegmentBase.SegmentList
    A SegmentBase.MultiSegmentBase that uses a SegmentList to define its segments.
    - + SegmentBase.SegmentTemplate
    A SegmentBase.MultiSegmentBase that uses a SegmentTemplate to define its segments.
    - + SegmentBase.SegmentTimelineElement
    Represents a timeline segment from the MPD's SegmentTimeline list.
    - + SegmentBase.SingleSegmentBase
    A SegmentBase that defines a single segment.
    - + SegmentDownloader<M extends FilterableManifest<M>>
    Base class for multi segment stream downloaders.
    - + SegmentDownloader.Segment
    Smallest unit of content to be downloaded.
    - + SeiReader
    Consumes SEI buffers, outputting contained CEA-608/708 messages to a TrackOutput.
    - + SequenceableLoader
    A loader that can proceed in approximate synchronization with other loaders.
    - + SequenceableLoader.Callback<T extends SequenceableLoader>
    A callback to be notified of SequenceableLoader events.
    - + +ServerSideInsertedAdsMediaSource + +
    A MediaSource for server-side inserted ad breaks.
    + + + +ServerSideInsertedAdsUtil + +
    A static utility class with methods to work with server-side inserted ads.
    + + + ServiceDescriptionElement
    Represents a service description element.
    - + SessionAvailabilityListener
    Listener of changes in the cast session availability.
    - + SessionCallbackBuilder
    Builds a MediaSession.SessionCallback with various collaborators.
    - + SessionCallbackBuilder.AllowedCommandProvider
    Provides allowed commands for MediaController.
    - + SessionCallbackBuilder.CustomCommandProvider
    Callbacks for querying what custom commands are supported, and for handling a custom command when a controller sends it.
    - + SessionCallbackBuilder.DefaultAllowedCommandProvider
    Default implementation of SessionCallbackBuilder.AllowedCommandProvider that behaves as follows: @@ -5737,1289 +5847,1288 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Controller is in the same package as the session.
    - + SessionCallbackBuilder.DisconnectedCallback
    Callback for handling controller disconnection.
    - + SessionCallbackBuilder.MediaIdMediaItemProvider
    A SessionCallbackBuilder.MediaItemProvider that creates media items containing only a media ID.
    - + SessionCallbackBuilder.MediaItemProvider
    Provides the MediaItem.
    - + SessionCallbackBuilder.PostConnectCallback
    Callback for handling extra initialization after the connection.
    - + SessionCallbackBuilder.RatingCallback
    Callback receiving a user rating for a specified media id.
    - + SessionCallbackBuilder.SkipCallback
    Callback receiving skip backward and skip forward.
    - + SessionPlayerConnector
    An implementation of SessionPlayer that wraps a given ExoPlayer Player instance.
    - + ShadowMediaCodecConfig
    A JUnit @Rule to configure Roboelectric's ShadowMediaCodec.
    - + ShuffleOrder
    Shuffled order of indices.
    - + ShuffleOrder.DefaultShuffleOrder
    The default ShuffleOrder implementation for random shuffle order.
    - + ShuffleOrder.UnshuffledShuffleOrder
    A ShuffleOrder implementation which does not shuffle.
    - + SilenceMediaSource
    Media source with a single period consisting of silent raw audio of a given duration.
    - + SilenceMediaSource.Factory
    Factory for SilenceMediaSources.
    - + SilenceSkippingAudioProcessor
    An AudioProcessor that skips silence in the input stream.
    - + SimpleCache
    A Cache implementation that maintains an in-memory representation.
    - + SimpleDecoder<I extends DecoderInputBuffer,​O extends OutputBuffer,​E extends DecoderException>
    Base class for Decoders that use their own decode thread and decode each input buffer immediately into a corresponding output buffer.
    - + SimpleExoPlayer
    An ExoPlayer implementation that uses default Renderer components.
    - + SimpleExoPlayer.Builder
    A builder for SimpleExoPlayer instances.
    - + SimpleMetadataDecoder
    A MetadataDecoder base class that validates input buffers and discards any for which Buffer.isDecodeOnly() is true.
    - + SimpleOutputBuffer
    Buffer for SimpleDecoder output.
    - + SimpleSubtitleDecoder
    Base class for subtitle parsers that use their own decode thread.
    - + SinglePeriodAdTimeline
    A Timeline for sources that have ads.
    - + SinglePeriodTimeline
    A Timeline consisting of a single period and static window.
    - + SingleSampleMediaChunk
    A BaseMediaChunk for chunks consisting of a single raw sample.
    - + SingleSampleMediaSource
    Loads data at a given Uri as a single sample belonging to a single MediaPeriod.
    - + SingleSampleMediaSource.Factory - + SlidingPercentile
    Calculate any percentile over a sliding window of weighted values.
    - + SlowMotionData
    Holds information about the segments of slow motion playback within a track.
    - + SlowMotionData.Segment
    Holds information about a single segment of slow motion playback within a track.
    - + SmtaMetadataEntry
    Stores metadata from the Samsung smta box.
    - + SntpClient
    Static utility to retrieve the device time offset using SNTP.
    - + SntpClient.InitializationCallback - + SonicAudioProcessor
    An AudioProcessor that uses the Sonic library to modify audio speed/pitch/sample rate.
    - + SpannedSubject
    A Truth Subject for assertions on Spanned instances containing text styling.
    - + SpannedSubject.AbsoluteSized
    Allows assertions about the absolute size of a span.
    - + SpannedSubject.Aligned
    Allows assertions about the alignment of a span.
    - + SpannedSubject.AndSpanFlags
    Allows additional assertions to be made on the flags of matching spans.
    - + SpannedSubject.Colored
    Allows assertions about the color of a span.
    - + SpannedSubject.EmphasizedText
    Allows assertions about a span's text emphasis mark and its position.
    - + SpannedSubject.RelativeSized
    Allows assertions about the relative size of a span.
    - + SpannedSubject.RubyText
    Allows assertions about a span's ruby text and its position.
    - + SpannedSubject.Typefaced
    Allows assertions about the typeface of a span.
    - + SpannedSubject.WithSpanFlags
    Allows additional assertions to be made on the flags of matching spans.
    - + SpanUtil
    Utility methods for Android span styling.
    - + SphericalGLSurfaceView
    Renders a GL scene in a non-VR Activity that is affected by phone orientation and touch input.
    - + SphericalGLSurfaceView.VideoSurfaceListener
    Listener for the Surface to which video frames should be rendered.
    - + SpliceCommand
    Superclass for SCTE35 splice commands.
    - + SpliceInfoDecoder
    Decodes splice info sections and produces splice commands.
    - + SpliceInsertCommand
    Represents a splice insert command defined in SCTE35, Section 9.3.3.
    - + SpliceInsertCommand.ComponentSplice
    Holds splicing information for specific splice insert command components.
    - + SpliceNullCommand
    Represents a splice null command as defined in SCTE35, Section 9.3.1.
    - + SpliceScheduleCommand
    Represents a splice schedule command as defined in SCTE35, Section 9.3.2.
    - + SpliceScheduleCommand.ComponentSplice
    Holds splicing information for specific splice schedule command components.
    - + SpliceScheduleCommand.Event
    Represents a splice event as contained in a SpliceScheduleCommand.
    - + SsaDecoder
    A SimpleSubtitleDecoder for SSA/ASS.
    - + SsChunkSource
    A ChunkSource for SmoothStreaming.
    - + SsChunkSource.Factory
    Factory for SsChunkSources.
    - + SsDownloader
    A downloader for SmoothStreaming streams.
    - + SsManifest
    Represents a SmoothStreaming manifest.
    - + SsManifest.ProtectionElement
    Represents a protection element containing a single header.
    - + SsManifest.StreamElement
    Represents a StreamIndex element.
    - + SsManifestParser
    Parses SmoothStreaming client manifests.
    - + SsManifestParser.MissingFieldException
    Thrown if a required field is missing.
    - + SsMediaSource
    A SmoothStreaming MediaSource.
    - + SsMediaSource.Factory
    Factory for SsMediaSource.
    - + StandaloneMediaClock
    A MediaClock whose position advances with real time based on the playback parameters when started.
    - + StarRating
    A rating expressed as a fractional number of stars.
    - + StartOffsetExtractorOutput
    An extractor output that wraps another extractor output and applies a give start byte offset to seek positions.
    - + StatsDataSource
    DataSource wrapper which keeps track of bytes transferred, redirected uris, and response headers.
    - + StreamKey
    A key for a subset of media which can be separately loaded (a "stream").
    - + StubExoPlayer
    An abstract ExoPlayer implementation that throws UnsupportedOperationException from every method.
    - + StyledPlayerControlView
    A view for controlling Player instances.
    - + StyledPlayerControlView.OnFullScreenModeChangedListener
    Listener to be invoked to inform the fullscreen mode is changed.
    - + StyledPlayerControlView.ProgressUpdateListener
    Listener to be notified when progress has been updated.
    - + StyledPlayerControlView.VisibilityListener
    Listener to be notified about changes of the visibility of the UI control.
    - + StyledPlayerView
    A high level view for Player media playbacks.
    - + StyledPlayerView.ShowBuffering
    Determines when the buffering view is shown.
    - + SubripDecoder
    A SimpleSubtitleDecoder for SubRip.
    - + Subtitle
    A subtitle consisting of timed Cues.
    - + SubtitleDecoder - + SubtitleDecoderException
    Thrown when an error occurs decoding subtitle data.
    - + SubtitleDecoderFactory
    A factory for SubtitleDecoder instances.
    - + SubtitleInputBuffer - + SubtitleOutputBuffer
    Base class for SubtitleDecoder output buffers.
    - + SubtitleView
    A view for displaying subtitle Cues.
    - + SubtitleView.ViewType
    The type of View to use to display subtitles.
    - + SynchronousMediaCodecAdapter
    A MediaCodecAdapter that operates the underlying MediaCodec in synchronous mode.
    - + SynchronousMediaCodecAdapter.Factory
    A factory for SynchronousMediaCodecAdapter instances.
    - + SystemClock
    The standard implementation of Clock, an instance of which is available via Clock.DEFAULT.
    - + TeeAudioProcessor
    Audio processor that outputs its input unmodified and also outputs its input to a given sink.
    - + TeeAudioProcessor.AudioBufferSink
    A sink for audio buffers handled by the audio processor.
    - + TeeAudioProcessor.WavFileAudioBufferSink
    A sink for audio buffers that writes output audio as .wav files with a given path prefix.
    - + TeeDataSource
    Tees data into a DataSink as the data is read.
    - + TestDownloadManagerListener
    Allows tests to block for, and assert properties of, calls from a DownloadManager to its DownloadManager.Listener.
    - + TestExoPlayerBuilder
    A builder of SimpleExoPlayer instances for testing.
    - + TestPlayerRunHelper
    Helper methods to block the calling thread until the provided SimpleExoPlayer instance reaches a particular state.
    - + TestUtil
    Utility methods for tests.
    - + TextAnnotation
    Properties of a text annotation (i.e.
    - + TextAnnotation.Position
    The possible positions of the annotation text relative to the base text.
    - + TextEmphasisSpan
    A styling span for text emphasis marks.
    - + TextEmphasisSpan.MarkFill
    The possible mark fills that can be used.
    - + TextEmphasisSpan.MarkShape
    The possible mark shapes that can be used.
    - + TextInformationFrame
    Text information ID3 frame.
    - + TextOutput
    Receives text output.
    - + TextRenderer
    A renderer for text.
    - + ThumbRating
    A rating expressed as "thumbs up" or "thumbs down".
    - + TimeBar
    Interface for time bar views that can display a playback position, buffered position, duration and ad markers, and that have a listener for scrubbing (seeking) events.
    - + TimeBar.OnScrubListener
    Listener for scrubbing events.
    - + TimedValueQueue<V>
    A utility class to keep a queue of values with timestamps.
    - + Timeline
    A flexible representation of the structure of media.
    - + Timeline.Period
    Holds information about a period in a Timeline.
    - + +Timeline.RemotableTimeline + +
    A concrete class of Timeline to restore a Timeline instance from a Bundle sent by another process via IBinder.
    + + + Timeline.Window
    Holds information about a window in a Timeline.
    - + TimelineAsserts
    Assertion methods for Timeline.
    - + TimelineQueueEditor - + TimelineQueueEditor.MediaDescriptionConverter
    Converts a MediaDescriptionCompat to a MediaItem.
    - + TimelineQueueEditor.MediaIdEqualityChecker
    Media description comparator comparing the media IDs.
    - + TimelineQueueEditor.QueueDataAdapter
    Adapter to get MediaDescriptionCompat of items in the queue and to notify the - application about changes in the queue to sync the data structure backing the - MediaSessionConnector.
    + application about changes in the queue to sync the data structure backing the MediaSessionConnector. - + TimelineQueueNavigator
    An abstract implementation of the MediaSessionConnector.QueueNavigator that maps the windows of a Player's Timeline to the media session queue.
    - + TimeSignalCommand
    Represents a time signal command as defined in SCTE35, Section 9.3.4.
    - + TimestampAdjuster -
    Offsets timestamps according to an initial sample timestamp offset.
    +
    Adjusts and offsets sample timestamps.
    - + TimestampAdjusterProvider
    Provides TimestampAdjuster instances for use during HLS playbacks.
    - + TimeToFirstByteEstimator
    Provides an estimate of the time to first byte of a transfer.
    - + TraceUtil
    Calls through to Trace methods on supported API levels.
    - + Track
    Encapsulates information describing an MP4 track.
    - + Track.Transformation
    The transformation to apply to samples in the track, if any.
    - + TrackEncryptionBox
    Encapsulates information parsed from a track encryption (tenc) box or sample group description (sgpd) box in an MP4 stream.
    - + TrackGroup
    Defines an immutable group of tracks identified by their format identity.
    - + TrackGroupArray
    An immutable array of TrackGroups.
    - + TrackNameProvider
    Converts Formats to user readable track names.
    - + TrackOutput
    Receives track level data extracted by an Extractor.
    - + TrackOutput.CryptoData
    Holds data required to decrypt a sample.
    - + TrackOutput.SampleDataPart
    Defines the part of the sample data to which a call to TrackOutput.sampleData(com.google.android.exoplayer2.upstream.DataReader, int, boolean) corresponds.
    - + TrackSelection
    A track selection consisting of a static subset of selected tracks belonging to a TrackGroup.
    - + TrackSelectionArray
    An array of TrackSelections.
    - + TrackSelectionDialogBuilder
    Builder for a dialog with a TrackSelectionView.
    - + TrackSelectionDialogBuilder.DialogCallback
    Callback which is invoked when a track selection has been made.
    - + TrackSelectionParameters
    Constraint parameters for track selection.
    - + TrackSelectionParameters.Builder - + TrackSelectionUtil
    Track selection related utility methods.
    - + TrackSelectionUtil.AdaptiveTrackSelectionFactory
    Functional interface to create a single adaptive track selection.
    - + TrackSelectionView
    A view for making track selections.
    - + TrackSelectionView.TrackSelectionListener
    Listener for changes to the selected tracks.
    - + TrackSelector
    The component of an ExoPlayer responsible for selecting tracks to be consumed by each of the player's Renderers.
    - + TrackSelector.InvalidationListener
    Notified when selections previously made by a TrackSelector are no longer valid.
    - + TrackSelectorResult
    The result of a TrackSelector operation.
    - + TransferListener
    A listener of data transfer events.
    - + Transformer
    A transformer to transform media inputs.
    - + Transformer.Builder
    A builder for Transformer instances.
    - + Transformer.Listener
    A listener for the transformation events.
    - + Transformer.ProgressState
    Progress state.
    - + TsExtractor
    Extracts data from the MPEG-2 TS container format.
    - + TsExtractor.Mode
    Modes for the extractor.
    - + TsPayloadReader
    Parses TS packet payload data.
    - + TsPayloadReader.DvbSubtitleInfo
    Holds information about a DVB subtitle, as defined in ETSI EN 300 468 V1.11.1 section 6.2.41.
    - + TsPayloadReader.EsInfo
    Holds information associated with a PMT entry.
    - + TsPayloadReader.Factory
    Factory of TsPayloadReader instances.
    - + TsPayloadReader.Flags
    Contextual flags indicating the presence of indicators in the TS packet or PES packet headers.
    - + TsPayloadReader.TrackIdGenerator
    Generates track ids for initializing TsPayloadReaders' TrackOutputs.
    - + TsUtil
    Utilities method for extracting MPEG-TS streams.
    - + TtmlDecoder
    A SimpleSubtitleDecoder for TTML supporting the DFXP presentation profile.
    - + Tx3gDecoder - + UdpDataSource
    A UDP DataSource.
    - + UdpDataSource.UdpDataSourceException
    Thrown when an error is encountered when trying to read from a UdpDataSource.
    - + UnknownNull
    Annotation for specifying unknown nullness.
    - + UnrecognizedInputFormatException
    Thrown if the input format was not recognized.
    - + UnsupportedDrmException
    Thrown when the requested DRM scheme is not supported.
    - + UnsupportedDrmException.Reason
    The reason for the exception.
    - + UnsupportedMediaCrypto
    ExoMediaCrypto type that cannot be used to handle any type of protected content.
    - + UriUtil
    Utility methods for manipulating URIs.
    - + UrlLinkFrame
    Url link ID3 frame.
    - + UrlTemplate
    A template from which URLs can be built.
    - + UtcTimingElement
    Represents a UTCTiming element.
    - + Util
    Miscellaneous utility methods.
    - + VersionTable
    Utility methods for accessing versions of ExoPlayer database components.
    - + VideoDecoderGLSurfaceView
    GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
    - + VideoDecoderInputBuffer
    Input buffer to a video decoder.
    - + VideoDecoderOutputBuffer
    Video decoder output buffer containing video frame data.
    - + VideoDecoderOutputBufferRenderer - + VideoFrameMetadataListener
    A listener for metadata corresponding to video frames being rendered.
    - + VideoFrameReleaseHelper
    Helps a video Renderer release frames to a Surface.
    - + VideoListener Deprecated. - + VideoRendererEventListener
    Listener of video Renderer events.
    - + VideoRendererEventListener.EventDispatcher
    Dispatches events to a VideoRendererEventListener.
    - + VideoSize
    Represents the video size.
    - + VorbisBitArray
    Wraps a byte array, providing methods that allow it to be read as a Vorbis bitstream.
    - + VorbisComment
    A vorbis comment.
    - + VorbisUtil
    Utility methods for parsing Vorbis streams.
    - + VorbisUtil.CommentHeader
    Vorbis comment header.
    - + VorbisUtil.Mode
    Vorbis setup header modes.
    - + VorbisUtil.VorbisIdHeader
    Vorbis identification header.
    - + VpxDecoder
    Vpx decoder.
    - + VpxDecoderException
    Thrown when a libvpx decoder error occurs.
    - + VpxLibrary
    Configures and queries the underlying native library.
    - -VpxOutputBuffer -Deprecated. - - - - + WavExtractor
    Extracts data from WAV byte streams.
    - + WavUtil
    Utilities for handling WAVE files.
    - + WebServerDispatcher
    A Dispatcher for MockWebServer that allows per-path customisation of the static data served.
    - + WebServerDispatcher.Resource
    A resource served by WebServerDispatcher.
    - + WebServerDispatcher.Resource.Builder - + WebvttCssStyle
    Style object of a Css style block in a Webvtt file.
    - + WebvttCssStyle.FontSizeUnit
    Font size unit enum.
    - + WebvttCssStyle.StyleFlags
    Style flag enum.
    - + WebvttCueInfo
    A representation of a WebVTT cue.
    - + WebvttCueParser
    Parser for WebVTT cues.
    - + WebvttDecoder
    A SimpleSubtitleDecoder for WebVTT.
    - + WebvttExtractor
    A special purpose extractor for WebVTT content in HLS.
    - + WebvttParserUtil
    Utility methods for parsing WebVTT data.
    - + WidevineUtil
    Utility methods for Widevine.
    - + WorkManagerScheduler
    A Scheduler that uses WorkManager.
    - + WorkManagerScheduler.SchedulerWorker
    A Worker that starts the target service if the requirements are met.
    - + WritableDownloadIndex
    A writable index of Downloads.
    - + XmlPullParserUtil
    XmlPullParser utility methods.
    diff --git a/docs/doc/reference/allclasses.html b/docs/doc/reference/allclasses.html index b5bc931fd6..288afe5bcf 100644 --- a/docs/doc/reference/allclasses.html +++ b/docs/doc/reference/allclasses.html @@ -144,6 +144,8 @@
  • BasePlayer
  • BaseRenderer
  • BaseTrackSelection
  • +
  • BaseUrl
  • +
  • BaseUrlExclusionList
  • BehindLiveWindowException
  • BinaryFrame
  • BinarySearchSeeker
  • @@ -156,6 +158,7 @@
  • Buffer
  • Bundleable
  • Bundleable.Creator
  • +
  • BundleableUtils
  • BundledChunkExtractor
  • BundledExtractorsAdapter
  • BundledHlsMediaChunkExtractor
  • @@ -175,6 +178,7 @@
  • C.ColorTransfer
  • C.ContentType
  • C.CryptoMode
  • +
  • C.DataType
  • C.Encoding
  • C.FormatSupport
  • C.NetworkType
  • @@ -257,7 +261,7 @@
  • CronetDataSource.OpenException
  • CronetDataSourceFactory
  • CronetEngineWrapper
  • -
  • CronetEngineWrapper.CronetEngineSource
  • +
  • CronetUtil
  • CryptoInfo
  • Cue
  • Cue.AnchorType
  • @@ -350,6 +354,7 @@
  • DefaultLoadControl
  • DefaultLoadControl.Builder
  • DefaultLoadErrorHandlingPolicy
  • +
  • DefaultMediaDescriptionAdapter
  • DefaultMediaItemConverter
  • DefaultMediaItemConverter
  • DefaultMediaSourceFactory
  • @@ -409,6 +414,8 @@
  • DrmSessionManager
  • DrmSessionManager.DrmSessionReference
  • DrmSessionManagerProvider
  • +
  • DrmUtil
  • +
  • DrmUtil.ErrorSource
  • DtsReader
  • DtsUtil
  • DummyDataSource
  • @@ -440,8 +447,6 @@
  • EventMessageEncoder
  • EventStream
  • ExoDatabaseProvider
  • -
  • ExoFlags
  • -
  • ExoFlags.Builder
  • ExoHostedTest
  • ExoMediaCrypto
  • ExoMediaDrm
  • @@ -552,12 +557,15 @@
  • FlacSeekTableSeekMap
  • FlacStreamMetadata
  • FlacStreamMetadata.SeekTable
  • +
  • FlagSet
  • +
  • FlagSet.Builder
  • FlvExtractor
  • Format
  • Format.Builder
  • FormatHolder
  • ForwardingAudioSink
  • ForwardingExtractorInput
  • +
  • ForwardingPlayer
  • ForwardingTimeline
  • FragmentedMp4Extractor
  • FragmentedMp4Extractor.Flags
  • @@ -667,6 +675,9 @@
  • LoaderErrorThrower
  • LoaderErrorThrower.Dummy
  • LoadErrorHandlingPolicy
  • +
  • LoadErrorHandlingPolicy.FallbackOptions
  • +
  • LoadErrorHandlingPolicy.FallbackSelection
  • +
  • LoadErrorHandlingPolicy.FallbackType
  • LoadErrorHandlingPolicy.LoadErrorInfo
  • LoadEventInfo
  • LocalMediaDrmCallback
  • @@ -717,6 +728,7 @@
  • MediaMetadata
  • MediaMetadata.Builder
  • MediaMetadata.FolderType
  • +
  • MediaMetadata.PictureType
  • MediaParserChunkExtractor
  • MediaParserExtractorAdapter
  • MediaParserHlsMediaChunkExtractor
  • @@ -771,6 +783,7 @@
  • NalUnitUtil.PpsData
  • NalUnitUtil.SpsData
  • NetworkTypeObserver
  • +
  • NetworkTypeObserver.Config
  • NetworkTypeObserver.Listener
  • NonNullApi
  • NoOpCacheEvictor
  • @@ -804,9 +817,11 @@
  • PictureFrame
  • PlatformScheduler
  • PlatformScheduler.PlatformSchedulerService
  • +
  • PlaybackException
  • +
  • PlaybackException.ErrorCode
  • +
  • PlaybackException.FieldNumber
  • PlaybackOutput
  • PlaybackParameters
  • -
  • PlaybackPreparer
  • PlaybackSessionManager
  • PlaybackSessionManager.Listener
  • PlaybackStats
  • @@ -820,7 +835,7 @@
  • Player.Commands
  • Player.Commands.Builder
  • Player.DiscontinuityReason
  • -
  • Player.EventFlags
  • +
  • Player.Event
  • Player.EventListener
  • Player.Events
  • Player.Listener
  • @@ -899,6 +914,7 @@
  • ReusableBufferedOutputStream
  • RobolectricUtil
  • RtmpDataSource
  • +
  • RtmpDataSource.Factory
  • RtmpDataSourceFactory
  • RtpAc3Reader
  • RtpPacket
  • @@ -937,6 +953,8 @@
  • SeiReader
  • SequenceableLoader
  • SequenceableLoader.Callback
  • +
  • ServerSideInsertedAdsMediaSource
  • +
  • ServerSideInsertedAdsUtil
  • ServiceDescriptionElement
  • SessionAvailabilityListener
  • SessionCallbackBuilder
  • @@ -1054,6 +1072,7 @@
  • TimedValueQueue
  • Timeline
  • Timeline.Period
  • +
  • Timeline.RemotableTimeline
  • Timeline.Window
  • TimelineAsserts
  • TimelineQueueEditor
  • @@ -1136,7 +1155,6 @@
  • VpxDecoder
  • VpxDecoderException
  • VpxLibrary
  • -
  • VpxOutputBuffer
  • WavExtractor
  • WavUtil
  • WebServerDispatcher
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html index f953bef48f..460a936697 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html @@ -159,7 +159,7 @@ extends T

    Nested classes/interfaces inherited from class com.google.android.exoplayer2.Timeline

    -Timeline.Period, Timeline.Window +Timeline.Period, Timeline.RemotableTimeline, Timeline.Window
@@ -189,7 +189,7 @@ implements Player -COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_VOLUME, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE +COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE @@ -204,10 +204,12 @@ implements Constructors  -Constructor +Modifier +Constructor Description +protected BasePlayer
()   @@ -261,7 +263,9 @@ implements protected Player.Commands getAvailableCommands​(Player.Commands permanentAvailableCommands) -  + +
Returns the Player.Commands available in the player.
+ int @@ -303,66 +307,61 @@ implements -Object -getCurrentTag() - - - - - MediaItem getMediaItemAt​(int index)
Returns the MediaItem at the given index.
- + int getMediaItemCount()
Returns the number of media items in the playlist.
- + int getNextWindowIndex() -
Returns the index of the window that will be played if Player.next() is called, which may - depend on the current repeat mode and whether shuffle mode is enabled.
+
Returns the index of the window that will be played if Player.seekToNextWindow() is called, + which may depend on the current repeat mode and whether shuffle mode is enabled.
- -ExoPlaybackException -getPlaybackError() - -
Deprecated. - -
- - - + int getPreviousWindowIndex() -
Returns the index of the window that will be played if Player.previous() is called, which may - depend on the current repeat mode and whether shuffle mode is enabled.
+
Returns the index of the window that will be played if Player.seekToPreviousWindow() is + called, which may depend on the current repeat mode and whether shuffle mode is enabled.
- + boolean hasNext() +
Deprecated.
+ + + +boolean +hasNextWindow() +
Returns whether a next window exists, which may depend on the current repeat mode and whether shuffle mode is enabled.
- + boolean hasPrevious() +
Deprecated.
+ + + +boolean +hasPreviousWindow() +
Returns whether a previous window exists, which may depend on the current repeat mode and whether shuffle mode is enabled.
@@ -416,8 +415,7 @@ implements void next
() -
Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled.
+
Deprecated.
@@ -438,8 +436,7 @@ implements void previous() -
Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled.
+
Deprecated.
@@ -451,26 +448,70 @@ implements void +seekBack() + +
Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
+ + + +void +seekForward() + +
Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
+ + + +void seekTo​(long positionMs)
Seeks to a position specified in milliseconds in the current window.
- + void seekToDefaultPosition()
Seeks to the default position associated with the current window.
- + void seekToDefaultPosition​(int windowIndex)
Seeks to the default position associated with the specified window.
- + +void +seekToNext() + +
Seeks to a later position in the current or next window (if available).
+ + + +void +seekToNextWindow() + +
Seeks to the default position of the next window, which may depend on the current repeat mode + and whether shuffle mode is enabled.
+ + + +void +seekToPrevious() + +
Seeks to an earlier position in the current or previous window (if available).
+ + + +void +seekToPreviousWindow() + +
Seeks to the default position of the previous window, which may depend on the current repeat + mode and whether shuffle mode is enabled.
+ + + void setMediaItem​(MediaItem mediaItem) @@ -478,7 +519,7 @@ implements + void setMediaItem​(MediaItem mediaItem, boolean resetPosition) @@ -486,7 +527,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItem​(MediaItem mediaItem, long startPositionMs) @@ -494,7 +535,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItems​(List<MediaItem> mediaItems) @@ -502,14 +543,14 @@ implements + void setPlaybackSpeed​(float speed)
Changes the rate at which playback occurs.
- + void stop() @@ -529,7 +570,7 @@ implements Player -addListener, addListener, addMediaItems, clearVideoSurface, clearVideoSurface, clearVideoSurfaceHolder, clearVideoSurfaceView, clearVideoTextureView, decreaseDeviceVolume, getApplicationLooper, getAudioAttributes, getAvailableCommands, getBufferedPosition, getContentBufferedPosition, getContentPosition, getCurrentAdGroupIndex, getCurrentAdIndexInAdGroup, getCurrentCues, getCurrentPeriodIndex, getCurrentPosition, getCurrentStaticMetadata, getCurrentTimeline, getCurrentTrackGroups, getCurrentTrackSelections, getCurrentWindowIndex, getDeviceInfo, getDeviceVolume, getDuration, getMediaMetadata, getPlaybackParameters, getPlaybackState, getPlaybackSuppressionReason, getPlayerError, getPlayWhenReady, getRepeatMode, getShuffleModeEnabled, getTotalBufferedDuration, getVideoSize, getVolume, increaseDeviceVolume, isDeviceMuted, isLoading, isPlayingAd, moveMediaItems, prepare, release, removeListener, removeListener, removeMediaItems, seekTo, setDeviceMuted, setDeviceVolume, setMediaItems, setMediaItems, setPlaybackParameters, setPlayWhenReady, setRepeatMode, setShuffleModeEnabled, setVideoSurface, setVideoSurfaceHolder, setVideoSurfaceView, setVideoTextureView, setVolume, stop +addListener, addListener, addMediaItems, clearVideoSurface, clearVideoSurface, clearVideoSurfaceHolder, clearVideoSurfaceView, clearVideoTextureView, decreaseDeviceVolume, getApplicationLooper, getAudioAttributes, getAvailableCommands, getBufferedPosition, getContentBufferedPosition, getContentPosition, getCurrentAdGroupIndex, getCurrentAdIndexInAdGroup, getCurrentCues, getCurrentPeriodIndex, getCurrentPosition, getCurrentStaticMetadata, getCurrentTimeline, getCurrentTrackGroups, getCurrentTrackSelections, getCurrentWindowIndex, getDeviceInfo, getDeviceVolume, getDuration, getMaxSeekToPreviousPosition, getMediaMetadata, getPlaybackParameters, getPlaybackState, getPlaybackSuppressionReason, getPlayerError, getPlaylistMetadata, getPlayWhenReady, getRepeatMode, getSeekBackIncrement, getSeekForwardIncrement, getShuffleModeEnabled, getTotalBufferedDuration, getVideoSize, getVolume, increaseDeviceVolume, isDeviceMuted, isLoading, isPlayingAd, moveMediaItems, prepare, release, removeListener, removeListener, removeMediaItems, seekTo, setDeviceMuted, setDeviceVolume, setMediaItems, setMediaItems, setPlaybackParameters, setPlaylistMetadata, setPlayWhenReady, setRepeatMode, setShuffleModeEnabled, setVideoSurface, setVideoSurfaceHolder, setVideoSurfaceView, setVideoTextureView, setVolume, stop @@ -572,7 +613,7 @@ implements
  • BasePlayer

    -
    public BasePlayer()
    +
    protected BasePlayer()
  • @@ -780,11 +821,12 @@ implements
    Player.next() if Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM is unavailable) will neither throw an exception nor generate - a Player.getPlayerError() player error}. +

    Executing a command that is not available (for example, calling Player.seekToNextWindow() + if Player.COMMAND_SEEK_TO_NEXT_WINDOW is unavailable) will neither throw an exception nor + generate a Player.getPlayerError() player error}. -

    Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM and Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM - are unavailable if there is no such MediaItem. +

    Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW and Player.COMMAND_SEEK_TO_NEXT_WINDOW are + unavailable if there is no such MediaItem.

    Specified by:
    isCommandAvailable in interface Player
    @@ -797,24 +839,6 @@ implements - - - @@ -928,14 +952,59 @@ public final  + + + + + + +
    • hasPrevious

      -
      public final boolean hasPrevious()
      -
      Description copied from interface: Player
      +
      @Deprecated
      +public final boolean hasPrevious()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      hasPrevious in interface Player
      +
      +
    • +
    + + + +
      +
    • +

      hasPreviousWindow

      +
      public final boolean hasPreviousWindow()
      +
      Description copied from interface: Player
      Returns whether a previous window exists, which may depend on the current repeat mode and whether shuffle mode is enabled. @@ -944,7 +1013,7 @@ public final Specified by: -
      hasPrevious in interface Player
      +
      hasPreviousWindow in interface Player
    @@ -954,18 +1023,60 @@ public final 
  • previous

    -
    public final void previous()
    -
    +
    @Deprecated
    +public final void previous()
    +
    Deprecated.
    +
    +
    Specified by:
    +
    previous in interface Player
    +
    +
  • + + + + + + + + +
      +
    • +

      seekToPrevious

      +
      public final void seekToPrevious()
      +
      Description copied from interface: Player
      +
      Seeks to an earlier position in the current or previous window (if available). More precisely: + +
      +
      +
      Specified by:
      +
      seekToPrevious in interface Player
    @@ -975,8 +1086,23 @@ public final 
  • hasNext

    -
    public final boolean hasNext()
    -
    +
    @Deprecated
    +public final boolean hasNext()
    +
    Deprecated.
    +
    +
    Specified by:
    +
    hasNext in interface Player
    +
    +
  • + + + + +
      +
    • +

      hasNextWindow

      +
      public final boolean hasNextWindow()
      +
      Description copied from interface: Player
      Returns whether a next window exists, which may depend on the current repeat mode and whether shuffle mode is enabled. @@ -985,7 +1111,7 @@ public final Specified by: -
      hasNext in interface Player
      +
      hasNextWindow in interface Player
    @@ -995,17 +1121,56 @@ public final 
  • next

    -
    public final void next()
    -
    +
    @Deprecated
    +public final void next()
    +
    Deprecated.
    +
    +
    Specified by:
    +
    next in interface Player
    +
    +
  • + + + + + + + + +
      +
    • +

      seekToNext

      +
      public final void seekToNext()
      +
      Description copied from interface: Player
      +
      Seeks to a later position in the current or next window (if available). More precisely: + +
        +
      • If the timeline is empty or seeking is not possible, does nothing. +
      • Otherwise, if a next window exists, seeks to the default + position of the next window. +
      • Otherwise, if the current window is live and has not + ended, seeks to the live edge of the current window. +
      • Otherwise, does nothing. +
      +
      +
      Specified by:
      +
      seekToNext in interface Player
    @@ -1061,8 +1226,8 @@ public final public final int getNextWindowIndex() -
    Returns the index of the window that will be played if Player.next() is called, which may - depend on the current repeat mode and whether shuffle mode is enabled. Returns C.INDEX_UNSET if Player.hasNext() is false. +
    Returns the index of the window that will be played if Player.seekToNextWindow() is called, + which may depend on the current repeat mode and whether shuffle mode is enabled. Returns C.INDEX_UNSET if Player.hasNextWindow() is false.

    Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when the current repeat mode is Player.REPEAT_MODE_OFF. See Player.REPEAT_MODE_ONE for more @@ -1081,8 +1246,9 @@ public final public final int getPreviousWindowIndex()

    -
    Returns the index of the window that will be played if Player.previous() is called, which may - depend on the current repeat mode and whether shuffle mode is enabled. Returns C.INDEX_UNSET if Player.hasPrevious() is false. +
    Returns the index of the window that will be played if Player.seekToPreviousWindow() is + called, which may depend on the current repeat mode and whether shuffle mode is enabled. + Returns C.INDEX_UNSET if Player.hasPreviousWindow() is false.

    Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when the current repeat mode is Player.REPEAT_MODE_OFF. See Player.REPEAT_MODE_ONE for more @@ -1093,25 +1259,6 @@ public final  - - -

    @@ -1293,6 +1440,13 @@ public final 

    getAvailableCommands

    protected Player.Commands getAvailableCommands​(Player.Commands permanentAvailableCommands)
    +
    Returns the Player.Commands available in the player.
    +
    +
    Parameters:
    +
    permanentAvailableCommands - The commands permanently available in the player.
    +
    Returns:
    +
    The available Player.Commands.
    +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/BaseRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/BaseRenderer.html index 15fd370cd3..98a6bf450f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/BaseRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/BaseRenderer.html @@ -232,8 +232,10 @@ implements protected ExoPlaybackException -createRendererException​(Throwable cause, - Format format) +createRendererException​(Throwable cause, + Format format, + boolean isRecoverable, + int errorCode)
    Creates an ExoPlaybackException of type ExoPlaybackException.TYPE_RENDERER for this renderer.
    @@ -241,9 +243,9 @@ implements protected ExoPlaybackException -createRendererException​(Throwable cause, +createRendererException​(Throwable cause, Format format, - boolean isRecoverable) + int errorCode)
    Creates an ExoPlaybackException of type ExoPlaybackException.TYPE_RENDERER for this renderer.
    @@ -317,8 +319,7 @@ implements long getReadingPositionUs() -
    Returns the renderer time up to which the renderer has read samples from the current SampleStream, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the - current SampleStream to the end.
    +
    Returns the renderer time up to which the renderer has read samples, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the current SampleStream to the end.
    @@ -352,7 +353,7 @@ implements void handleMessage​(int messageType, - Object payload) + Object message)
    Handles a message delivered to the target.
    @@ -565,8 +566,8 @@ implements Parameters: -
    trackType - The track type that the renderer handles. One of the C - TRACK_TYPE_* constants.
    +
    trackType - The track type that the renderer handles. One of the C + TRACK_TYPE_* constants.
    @@ -721,9 +722,8 @@ public Description copied from interface: Renderer
    Starts the renderer, meaning that calls to Renderer.render(long, long) will cause media to be rendered. -

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

    + +

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

    Specified by:
    start in interface Renderer
    @@ -786,9 +786,8 @@ public final public final boolean hasReadStreamToEnd()
    Returns whether the renderer has read the current SampleStream to the end. -

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

    + +

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

    Specified by:
    hasReadStreamToEnd in interface Renderer
    @@ -803,8 +802,7 @@ public final public final long getReadingPositionUs() -
    Returns the renderer time up to which the renderer has read samples from the current SampleStream, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the - current SampleStream to the end. +
    Returns the renderer time up to which the renderer has read samples, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the current SampleStream to the end.

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

    @@ -823,9 +821,8 @@ public final Description copied from interface: Renderer
    Signals to the renderer that the current SampleStream will be the final one supplied before it is next disabled or reset. -

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

    + +

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

    Specified by:
    setCurrentStreamFinal in interface Renderer
    @@ -859,9 +856,8 @@ public final Description copied from interface: Renderer
    Throws an error that's preventing the renderer from reading from its SampleStream. Does nothing if no such error exists. -

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

    + +

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

    Specified by:
    maybeThrowStreamError in interface Renderer
    @@ -881,12 +877,11 @@ public final ExoPlaybackException
    Description copied from interface: Renderer
    Signals to the renderer that a position discontinuity has occurred. -

    - After a position discontinuity, the renderer's SampleStream is guaranteed to provide + +

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

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

    + +

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

    Specified by:
    resetPosition in interface Renderer
    @@ -923,9 +918,8 @@ public final public final void disable()
    Disable the renderer, transitioning it to the Renderer.STATE_DISABLED state. -

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

    + +

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

    Specified by:
    disable in interface Renderer
    @@ -981,7 +975,7 @@ public int supportsMixedMimeTypeAdaptation()

    handleMessage

    public void handleMessage​(int messageType,
                               @Nullable
    -                          Object payload)
    +                          Object message)
                        throws ExoPlaybackException
    Description copied from interface: PlayerMessage.Target
    Handles a message delivered to the target.
    @@ -990,7 +984,7 @@ public int supportsMixedMimeTypeAdaptation()
    handleMessage in interface PlayerMessage.Target
    Parameters:
    messageType - The message type.
    -
    payload - The message payload.
    +
    message - The message payload.
    Throws:
    ExoPlaybackException - If an error occurred whilst handling the message. Should only be thrown by targets that handle messages on the playback thread.
    @@ -1078,8 +1072,8 @@ public int supportsMixedMimeTypeAdaptation()
    protected void onStarted()
                       throws ExoPlaybackException
    Called when the renderer is started. -

    - The default implementation is a no-op.

    + +

    The default implementation is a no-op.

    Throws:
    ExoPlaybackException - If an error occurs.
    @@ -1106,8 +1100,8 @@ public int supportsMixedMimeTypeAdaptation()

    onDisabled

    protected void onDisabled()
    Called when the renderer is disabled. -

    - The default implementation is a no-op.

    + +

    The default implementation is a no-op. @@ -1176,25 +1170,7 @@ public int supportsMixedMimeTypeAdaptation()

    - - - - - + + + + +
      +
    • +

      createRendererException

      +
      protected final ExoPlaybackException createRendererException​(Throwable cause,
      +                                                             @Nullable
      +                                                             Format format,
      +                                                             boolean isRecoverable,
      +                                                             @ErrorCode
      +                                                             int errorCode)
      Creates an ExoPlaybackException of type ExoPlaybackException.TYPE_RENDERER for this renderer.
      @@ -1211,6 +1214,10 @@ public int supportsMixedMimeTypeAdaptation()
      cause - The cause of the exception.
      format - The current format used by the renderer. May be null.
      isRecoverable - If the error is recoverable by disabling and re-enabling the renderer.
      +
      errorCode - A PlaybackException.ErrorCode to identify the cause of the playback + failure.
      +
      Returns:
      +
      The created instance.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Bundleable.html b/docs/doc/reference/com/google/android/exoplayer2/Bundleable.html index 9958edb4f2..604d17d291 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Bundleable.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Bundleable.html @@ -122,7 +122,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Known Implementing Classes:
    -
    AbstractConcatenatedTimeline, AdPlaybackState, AdPlaybackState.AdGroup, AudioAttributes, DeviceInfo, ExoPlaybackException, FakeMediaSource.InitialTimeline, FakeTimeline, ForwardingTimeline, HeartRating, MaskingMediaSource.PlaceholderTimeline, MediaItem, MediaItem.ClippingProperties, MediaItem.LiveConfiguration, MediaMetadata, NoUidTimeline, PercentageRating, PlaybackParameters, Player.PositionInfo, Rating, SinglePeriodAdTimeline, SinglePeriodTimeline, StarRating, ThumbRating, Timeline, Timeline.Period, Timeline.Window, VideoSize
    +
    AbstractConcatenatedTimeline, AdPlaybackState, AdPlaybackState.AdGroup, AudioAttributes, Cue, DeviceInfo, ExoPlaybackException, FakeMediaSource.InitialTimeline, FakeTimeline, ForwardingTimeline, HeartRating, MaskingMediaSource.PlaceholderTimeline, MediaItem, MediaItem.ClippingProperties, MediaItem.LiveConfiguration, MediaMetadata, NoUidTimeline, PercentageRating, PlaybackException, PlaybackParameters, Player.Commands, Player.PositionInfo, Rating, SinglePeriodAdTimeline, SinglePeriodTimeline, StarRating, ThumbRating, Timeline, Timeline.Period, Timeline.RemotableTimeline, Timeline.Window, VideoSize

    public interface Bundleable
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.CronetEngineSource.html b/docs/doc/reference/com/google/android/exoplayer2/C.DataType.html similarity index 67% rename from docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.CronetEngineSource.html rename to docs/doc/reference/com/google/android/exoplayer2/C.DataType.html index ac5f3b8df9..cf3775891d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.CronetEngineSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/C.DataType.html @@ -2,30 +2,30 @@ -CronetEngineWrapper.CronetEngineSource (ExoPlayer library) +C.DataType (ExoPlayer library) - - - - - + + + + + - - + +

  • -
    public class DefaultControlDispatcher
    +
    @Deprecated
    +public class DefaultControlDispatcher
     extends Object
     implements ControlDispatcher
    - +
    Deprecated. +
    Use a ForwardingPlayer or configure the player to customize operations.
    +
    Creates an instance with the given increments.
    Parameters:
    @@ -456,6 +390,7 @@ implements

    dispatchPrepare

    public boolean dispatchPrepare​(Player player)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a Player.prepare() operation.
    @@ -476,6 +411,7 @@ implements public boolean dispatchSetPlayWhenReady​(Player player, boolean playWhenReady)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a Player.setPlayWhenReady(boolean) operation.
    @@ -498,6 +434,7 @@ implements public boolean dispatchSeekTo​(Player player, int windowIndex, long positionMs) +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a Player.seekTo(int, long) operation.
    @@ -520,8 +457,9 @@ implements

    dispatchPrevious

    public boolean dispatchPrevious​(Player player)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    -
    Dispatches a Player.previous() operation.
    +
    Dispatches a Player.seekToPreviousWindow() operation.
    Specified by:
    dispatchPrevious in interface ControlDispatcher
    @@ -539,8 +477,9 @@ implements

    dispatchNext

    public boolean dispatchNext​(Player player)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    -
    Dispatches a Player.next() operation.
    +
    Dispatches a Player.seekToNextWindow() operation.
    Specified by:
    dispatchNext in interface ControlDispatcher
    @@ -558,6 +497,7 @@ implements

    dispatchRewind

    public boolean dispatchRewind​(Player player)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a rewind operation.
    @@ -577,6 +517,7 @@ implements

    dispatchFastForward

    public boolean dispatchFastForward​(Player player)
    +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a fast forward operation.
    @@ -598,6 +539,7 @@ implements public boolean dispatchSetRepeatMode​(Player player, @RepeatMode int repeatMode) +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a Player.setRepeatMode(int) operation.
    @@ -619,6 +561,7 @@ implements public boolean dispatchSetShuffleModeEnabled​(Player player, boolean shuffleModeEnabled) +
    Deprecated.
    Description copied from interface: ControlDispatcher
    @@ -640,6 +583,7 @@ implements public boolean dispatchStop​(Player player, boolean reset) +
    Deprecated.
    Description copied from interface: ControlDispatcher
    Dispatches a Player.stop() operation.
    @@ -661,6 +605,7 @@ implements public boolean dispatchSetPlaybackParameters​(Player player, PlaybackParameters playbackParameters) +
    Deprecated.
    Description copied from interface: ControlDispatcher
    @@ -681,6 +626,7 @@ implements

    isRewindEnabled

    public boolean isRewindEnabled()
    +
    Deprecated.
    Returns true if rewind is enabled, false otherwise.
    @@ -696,6 +642,7 @@ implements

    isFastForwardEnabled

    public boolean isFastForwardEnabled()
    +
    Deprecated.
    Returns true if fast forward is enabled, false otherwise.
    @@ -704,52 +651,26 @@ implements +
    • getRewindIncrementMs

      -
      public long getRewindIncrementMs()
      +
      public long getRewindIncrementMs​(Player player)
      +
      Deprecated.
      Returns the rewind increment in milliseconds.
    - - - -
      -
    • -

      getFastForwardIncrementMs

      -
      public long getFastForwardIncrementMs()
      -
      Returns the fast forward increment in milliseconds.
      -
    • -
    - - - -
      -
    • -

      setRewindIncrementMs

      -
      @Deprecated
      -public void setRewindIncrementMs​(long rewindMs)
      -
      Deprecated. -
      Create a new instance instead and pass the new instance to the UI component. This - makes sure the UI gets updated and is in sync with the new values.
      -
      -
    • -
    - +
    • -

      setFastForwardIncrementMs

      -
      @Deprecated
      -public void setFastForwardIncrementMs​(long fastForwardMs)
      -
      Deprecated. -
      Create a new instance instead and pass the new instance to the UI component. This - makes sure the UI gets updated and is in sync with the new values.
      -
      +

      getFastForwardIncrementMs

      +
      public long getFastForwardIncrementMs​(Player player)
      +
      Deprecated.
      +
      Returns the fast forward increment in milliseconds.
    @@ -804,13 +725,13 @@ public void setFastForwardIncrementMs​(long fastForwardMs)< diff --git a/docs/doc/reference/com/google/android/exoplayer2/DefaultRenderersFactory.html b/docs/doc/reference/com/google/android/exoplayer2/DefaultRenderersFactory.html index 14ddddb3e9..26c599093b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/DefaultRenderersFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/DefaultRenderersFactory.html @@ -501,8 +501,8 @@ implements Allow use of extension renderers. Extension renderers are indexed after core renderers of the same type. A TrackSelector that prefers the first suitable renderer will therefore - prefer to use a core renderer to an extension renderer in the case that both are able to play - a given track. + prefer to use a core renderer to an extension renderer in the case that both are able to play a + given track.
    See Also:
    Constant Field Values
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html index 8ce46ed0d6..574f40cefb 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlaybackException.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10}; -var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":9,"i1":9,"i2":9,"i3":41,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10}; +var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -127,6 +127,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.lang.Exception
  • + +
    • @@ -144,8 +149,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public final class ExoPlaybackException
    -extends Exception
    -implements Bundleable
    +extends PlaybackException
    Thrown when a non locally recoverable playback failure occurs.
    See Also:
    @@ -180,6 +184,13 @@ implements +
  • + + +

    Nested classes/interfaces inherited from class com.google.android.exoplayer2.PlaybackException

    +PlaybackException.ErrorCode, PlaybackException.FieldNumber
  • + + @@ -302,7 +312,7 @@ implements -All Methods Static Methods Instance Methods Concrete Methods  +All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods  Modifier and Type Method @@ -317,48 +327,50 @@ implements static ExoPlaybackException -createForRenderer​(Exception cause) - -
    Creates an instance of type TYPE_RENDERER for an unknown renderer.
    - - - -static ExoPlaybackException -createForRenderer​(Throwable cause, - String rendererName, - int rendererIndex, - Format rendererFormat, - int rendererFormatSupport) - -
    Creates an instance of type TYPE_RENDERER.
    - - - -static ExoPlaybackException -createForRenderer​(Throwable cause, +createForRenderer​(Throwable cause, String rendererName, int rendererIndex, Format rendererFormat, int rendererFormatSupport, - boolean isRecoverable) + boolean isRecoverable, + int errorCode)
    Creates an instance of type TYPE_RENDERER.
    - + static ExoPlaybackException -createForSource​(IOException cause) +createForSource​(IOException cause, + int errorCode)
    Creates an instance of type TYPE_SOURCE.
    - + static ExoPlaybackException createForUnexpected​(RuntimeException cause) + + + + +static ExoPlaybackException +createForUnexpected​(RuntimeException cause, + int errorCode) +
    Creates an instance of type TYPE_UNEXPECTED.
    + +boolean +errorInfoEquals​(PlaybackException that) + +
    Returns whether the error data associated to this exception equals the error data associated to + other.
    + + Exception getRendererException() @@ -389,6 +401,13 @@ implements +
  • + + +

    Methods inherited from class com.google.android.exoplayer2.PlaybackException

    +getErrorCodeName, getErrorCodeName, keyForField
  • + + @@ -512,7 +530,7 @@ public final 

    rendererIndex

    public final int rendererIndex
    -
    If type is TYPE_RENDERER, this is the index of the renderer, or C.INDEX_UNSET if unknown.
    +
    If type is TYPE_RENDERER, this is the index of the renderer.
    @@ -539,16 +557,6 @@ public final int rendererFormatSupport renderer for rendererFormat. If rendererFormat is null, this is C.FORMAT_HANDLED. - - - - @@ -580,66 +588,25 @@ public final  + - - - -
      -
    • -

      createForRenderer

      -
      public static ExoPlaybackException createForRenderer​(Exception cause)
      -
      Creates an instance of type TYPE_RENDERER for an unknown renderer.
      -
      -
      Parameters:
      -
      cause - The cause of the failure.
      -
      Returns:
      -
      The created instance.
      -
      -
    • -
    - - - -
      -
    • -

      createForRenderer

      -
      public static ExoPlaybackException createForRenderer​(Throwable cause,
      -                                                     String rendererName,
      -                                                     int rendererIndex,
      -                                                     @Nullable
      -                                                     Format rendererFormat,
      -                                                     @FormatSupport
      -                                                     int rendererFormatSupport)
      -
      Creates an instance of type TYPE_RENDERER.
      -
      -
      Parameters:
      -
      cause - The cause of the failure.
      -
      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.
      -
      rendererFormatSupport - The C.FormatSupport of the renderer for - rendererFormat. Ignored if rendererFormat is null.
      -
      Returns:
      -
      The created instance.
      -
      -
    • -
    - + + + + +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.Builder.html index 5939295229..f305d7cffe 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.Builder.html @@ -416,7 +416,7 @@ extends Deprecated.
    Set a limit on the time a call to ExoPlayer.setForegroundMode(boolean) can spend. If a call to ExoPlayer.setForegroundMode(boolean) takes more than timeoutMs milliseconds to - complete, the player will raise an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException). + complete, the player will raise an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException).

    This method is experimental, and will be renamed or removed in a future release.

    @@ -593,7 +593,7 @@ extends Sets a timeout for calls to Player.release() and ExoPlayer.setForegroundMode(boolean).

    If a call to Player.release() or ExoPlayer.setForegroundMode(boolean) takes more than - timeoutMs to complete, the player will report an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException). + timeoutMs to complete, the player will report an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException).

    Parameters:
    releaseTimeoutMs - The release timeout, in milliseconds.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html index 27f9e8c34f..e8a5fbd7ea 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":38,"i21":38,"i22":6,"i23":38,"i24":6,"i25":6,"i26":6,"i27":6,"i28":6,"i29":6,"i30":6,"i31":6,"i32":6,"i33":6}; +var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":6,"i21":38,"i22":38,"i23":6,"i24":38,"i25":6,"i26":6,"i27":6,"i28":6,"i29":6,"i30":6,"i31":6,"i32":6,"i33":6,"i34":6}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -133,7 +133,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); extends Player
    An extensible media player that plays MediaSources. Instances can be obtained from SimpleExoPlayer.Builder. -

    Player components

    +

    Player components

    ExoPlayer is designed to make few assumptions about (and hence impose few restrictions on) the type of the media being played, how and where it is stored, and how it is rendered. Rather than @@ -173,7 +173,7 @@ extends DataSource factories to be injected via their constructors. By providing a custom factory it's possible to load data from a non-standard source, or through a different network stack. -

    Threading model

    +

    Threading model

    The figure below shows ExoPlayer's threading model. @@ -282,7 +282,7 @@ extends

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Player

    -Player.Command, Player.Commands, Player.DiscontinuityReason, Player.EventFlags, Player.EventListener, Player.Events, Player.Listener, Player.MediaItemTransitionReason, Player.PlaybackSuppressionReason, Player.PlayWhenReadyChangeReason, Player.PositionInfo, Player.RepeatMode, Player.State, Player.TimelineChangeReason +Player.Command, Player.Commands, Player.DiscontinuityReason, Player.Event, Player.EventListener, Player.Events, Player.Listener, Player.MediaItemTransitionReason, Player.PlaybackSuppressionReason, Player.PlayWhenReadyChangeReason, Player.PositionInfo, Player.RepeatMode, Player.State, Player.TimelineChangeReason @@ -315,7 +315,7 @@ extends

    Fields inherited from interface com.google.android.exoplayer2.Player

    -COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_VOLUME, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE +COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE @@ -435,48 +435,56 @@ extends +ExoPlaybackException +getPlayerError() + +
    Equivalent to Player.getPlayerError(), except the exception is guaranteed to be an + ExoPlaybackException.
    + + + int getRendererCount()
    Returns the number of renderers.
    - + int getRendererType​(int index)
    Returns the track type that the renderer at a given index handles.
    - + SeekParameters getSeekParameters()
    Returns the currently active SeekParameters of the player.
    - + ExoPlayer.TextComponent getTextComponent()
    Returns the component of this player for text output, or null if text is not supported.
    - + TrackSelector getTrackSelector()
    Returns the track selector that this player uses, or null if track selection is not supported.
    - + ExoPlayer.VideoComponent getVideoComponent()
    Returns the component of this player for video output, or null if video is not supported.
    - + void prepare​(MediaSource mediaSource) @@ -485,7 +493,7 @@ extends - + void prepare​(MediaSource mediaSource, boolean resetPosition, @@ -496,14 +504,14 @@ extends - + void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    Removes a listener of audio offload events.
    - + void retry() @@ -512,7 +520,7 @@ extends - + void setForegroundMode​(boolean foregroundMode) @@ -520,7 +528,7 @@ extends - + void setMediaSource​(MediaSource mediaSource) @@ -528,7 +536,7 @@ extends - + void setMediaSource​(MediaSource mediaSource, boolean resetPosition) @@ -536,7 +544,7 @@ extends Clears the playlist and adds the specified MediaSource.
    - + void setMediaSource​(MediaSource mediaSource, long startPositionMs) @@ -544,7 +552,7 @@ extends Clears the playlist and adds the specified MediaSource. - + void setMediaSources​(List<MediaSource> mediaSources) @@ -552,7 +560,7 @@ extends - + void setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition) @@ -560,7 +568,7 @@ extends Clears the playlist and adds the specified MediaSources. - + void setMediaSources​(List<MediaSource> mediaSources, int startWindowIndex, @@ -569,21 +577,21 @@ extends Clears the playlist and adds the specified MediaSources. - + void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    Sets whether to pause playback at the end of each media item.
    - + void setSeekParameters​(SeekParameters seekParameters)
    Sets the parameters that control how seek operations are performed.
    - + void setShuffleOrder​(ShuffleOrder shuffleOrder) @@ -596,7 +604,7 @@ extends

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

    -addListener, addListener, addMediaItem, addMediaItem, addMediaItems, addMediaItems, clearMediaItems, clearVideoSurface, clearVideoSurface, clearVideoSurfaceHolder, clearVideoSurfaceView, clearVideoTextureView, decreaseDeviceVolume, getApplicationLooper, getAudioAttributes, getAvailableCommands, getBufferedPercentage, getBufferedPosition, getContentBufferedPosition, getContentDuration, getContentPosition, getCurrentAdGroupIndex, getCurrentAdIndexInAdGroup, getCurrentCues, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getCurrentPeriodIndex, getCurrentPosition, getCurrentStaticMetadata, getCurrentTag, getCurrentTimeline, getCurrentTrackGroups, getCurrentTrackSelections, getCurrentWindowIndex, getDeviceInfo, getDeviceVolume, getDuration, getMediaItemAt, getMediaItemCount, getMediaMetadata, getNextWindowIndex, getPlaybackError, getPlaybackParameters, getPlaybackState, getPlaybackSuppressionReason, getPlayerError, getPlayWhenReady, getPreviousWindowIndex, getRepeatMode, getShuffleModeEnabled, getTotalBufferedDuration, getVideoSize, getVolume, hasNext, hasPrevious, increaseDeviceVolume, isCommandAvailable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isDeviceMuted, isLoading, isPlaying, isPlayingAd, moveMediaItem, moveMediaItems, next, pause, play, prepare, previous, release, removeListener, removeListener, removeMediaItem, removeMediaItems, seekTo, seekTo, seekToDefaultPosition, seekToDefaultPosition, setDeviceMuted, setDeviceVolume, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setMediaItems, setMediaItems, setPlaybackParameters, setPlaybackSpeed, setPlayWhenReady, setRepeatMode, setShuffleModeEnabled, setVideoSurface, setVideoSurfaceHolder, setVideoSurfaceView, setVideoTextureView, setVolume, stop, stop +addListener, addListener, addMediaItem, addMediaItem, addMediaItems, addMediaItems, clearMediaItems, clearVideoSurface, clearVideoSurface, clearVideoSurfaceHolder, clearVideoSurfaceView, clearVideoTextureView, decreaseDeviceVolume, getApplicationLooper, getAudioAttributes, getAvailableCommands, getBufferedPercentage, getBufferedPosition, getContentBufferedPosition, getContentDuration, getContentPosition, getCurrentAdGroupIndex, getCurrentAdIndexInAdGroup, getCurrentCues, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getCurrentPeriodIndex, getCurrentPosition, getCurrentStaticMetadata, getCurrentTimeline, getCurrentTrackGroups, getCurrentTrackSelections, getCurrentWindowIndex, getDeviceInfo, getDeviceVolume, getDuration, getMaxSeekToPreviousPosition, getMediaItemAt, getMediaItemCount, getMediaMetadata, getNextWindowIndex, getPlaybackParameters, getPlaybackState, getPlaybackSuppressionReason, getPlaylistMetadata, getPlayWhenReady, getPreviousWindowIndex, getRepeatMode, getSeekBackIncrement, getSeekForwardIncrement, getShuffleModeEnabled, getTotalBufferedDuration, getVideoSize, getVolume, hasNext, hasNextWindow, hasPrevious, hasPreviousWindow, increaseDeviceVolume, isCommandAvailable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isDeviceMuted, isLoading, isPlaying, isPlayingAd, moveMediaItem, moveMediaItems, next, pause, play, prepare, previous, release, removeListener, removeListener, removeMediaItem, removeMediaItems, seekBack, seekForward, seekTo, seekTo, seekToDefaultPosition, seekToDefaultPosition, seekToNext, seekToNextWindow, seekToPrevious, seekToPreviousWindow, setDeviceMuted, setDeviceVolume, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setMediaItems, setMediaItems, setPlaybackParameters, setPlaybackSpeed, setPlaylistMetadata, setPlayWhenReady, setRepeatMode, setShuffleModeEnabled, setVideoSurface, setVideoSurfaceHolder, setVideoSurfaceView, setVideoTextureView, setVolume, stop, stop @@ -639,6 +647,25 @@ extends

    Method Detail

    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoTimeoutException.html b/docs/doc/reference/com/google/android/exoplayer2/ExoTimeoutException.html index 0c9ff8457e..a0269f4863 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoTimeoutException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoTimeoutException.html @@ -121,6 +121,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.lang.Exception
    • +
    • java.lang.RuntimeException
    • +
    • +
      • com.google.android.exoplayer2.ExoTimeoutException
    • @@ -129,6 +132,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • + +
    • @@ -138,7 +143,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public final class ExoTimeoutException
    -extends Exception
    +extends RuntimeException
    A timeout of an operation on the ExoPlayer playback thread.
    See Also:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Format.html b/docs/doc/reference/com/google/android/exoplayer2/Format.html index e3e740d261..9e78b8eb59 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Format.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Format.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":42,"i2":42,"i3":10,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":41,"i13":41,"i14":41,"i15":41,"i16":41,"i17":41,"i18":41,"i19":41,"i20":41,"i21":41,"i22":41,"i23":41,"i24":41,"i25":41,"i26":41,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":9,"i33":10,"i34":10,"i35":10}; +var data = {"i0":10,"i1":42,"i2":42,"i3":10,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":41,"i13":41,"i14":41,"i15":41,"i16":41,"i17":41,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":9,"i24":10,"i25":10,"i26":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -141,7 +141,7 @@ implements Supported formats page. -

    Fields commonly relevant to all formats

    +

    Fields commonly relevant to all formats

    -

    Fields relevant to container formats

    +

    Fields relevant to container formats

    -

    Fields relevant to sample formats

    +

    Fields relevant to sample formats

    -

    Fields relevant to video formats

    +

    Fields relevant to video formats

    -

    Fields relevant to audio formats

    +

    Fields relevant to audio formats

    -

    Fields relevant to text formats

    +

    Fields relevant to text formats

    @@ -1391,40 +1228,6 @@ public final  - - -
      -
    • -

      createVideoContainerFormat

      -
      @Deprecated
      -public static Format createVideoContainerFormat​(@Nullable
      -                                                String id,
      -                                                @Nullable
      -                                                String label,
      -                                                @Nullable
      -                                                String containerMimeType,
      -                                                @Nullable
      -                                                String sampleMimeType,
      -                                                @Nullable
      -                                                String codecs,
      -                                                @Nullable
      -                                                Metadata metadata,
      -                                                int bitrate,
      -                                                int width,
      -                                                int height,
      -                                                float frameRate,
      -                                                @Nullable
      -                                                List<byte[]> initializationData,
      -                                                @SelectionFlags
      -                                                int selectionFlags,
      -                                                @RoleFlags
      -                                                int roleFlags)
      -
      Deprecated. - -
      -
    • -
    @@ -1481,76 +1284,6 @@ public static  - - -
      -
    • -

      createVideoSampleFormat

      -
      @Deprecated
      -public static Format createVideoSampleFormat​(@Nullable
      -                                             String id,
      -                                             @Nullable
      -                                             String sampleMimeType,
      -                                             @Nullable
      -                                             String codecs,
      -                                             int bitrate,
      -                                             int maxInputSize,
      -                                             int width,
      -                                             int height,
      -                                             float frameRate,
      -                                             @Nullable
      -                                             List<byte[]> initializationData,
      -                                             int rotationDegrees,
      -                                             float pixelWidthHeightRatio,
      -                                             @Nullable
      -                                             byte[] projectionData,
      -                                             @StereoMode
      -                                             int stereoMode,
      -                                             @Nullable
      -                                             ColorInfo colorInfo,
      -                                             @Nullable
      -                                             DrmInitData drmInitData)
      -
      Deprecated. - -
      -
    • -
    - - - -
      -
    • -

      createAudioContainerFormat

      -
      @Deprecated
      -public static Format createAudioContainerFormat​(@Nullable
      -                                                String id,
      -                                                @Nullable
      -                                                String label,
      -                                                @Nullable
      -                                                String containerMimeType,
      -                                                @Nullable
      -                                                String sampleMimeType,
      -                                                @Nullable
      -                                                String codecs,
      -                                                @Nullable
      -                                                Metadata metadata,
      -                                                int bitrate,
      -                                                int channelCount,
      -                                                int sampleRate,
      -                                                @Nullable
      -                                                List<byte[]> initializationData,
      -                                                @SelectionFlags
      -                                                int selectionFlags,
      -                                                @RoleFlags
      -                                                int roleFlags,
      -                                                @Nullable
      -                                                String language)
      -
      Deprecated. - -
      -
    • -
    @@ -1613,167 +1346,6 @@ public static  - - -
      -
    • -

      createAudioSampleFormat

      -
      @Deprecated
      -public static Format createAudioSampleFormat​(@Nullable
      -                                             String id,
      -                                             @Nullable
      -                                             String sampleMimeType,
      -                                             @Nullable
      -                                             String codecs,
      -                                             int bitrate,
      -                                             int maxInputSize,
      -                                             int channelCount,
      -                                             int sampleRate,
      -                                             @PcmEncoding
      -                                             int pcmEncoding,
      -                                             int encoderDelay,
      -                                             int encoderPadding,
      -                                             @Nullable
      -                                             List<byte[]> initializationData,
      -                                             @Nullable
      -                                             DrmInitData drmInitData,
      -                                             @SelectionFlags
      -                                             int selectionFlags,
      -                                             @Nullable
      -                                             String language,
      -                                             @Nullable
      -                                             Metadata metadata)
      -
      Deprecated. - -
      -
    • -
    - - - - - - - - - - - - - - - -
      -
    • -

      createTextSampleFormat

      -
      @Deprecated
      -public static Format createTextSampleFormat​(@Nullable
      -                                            String id,
      -                                            @Nullable
      -                                            String sampleMimeType,
      -                                            @SelectionFlags
      -                                            int selectionFlags,
      -                                            @Nullable
      -                                            String language,
      -                                            int accessibilityChannel,
      -                                            long subsampleOffsetUs,
      -                                            @Nullable
      -                                            List<byte[]> initializationData)
      -
      Deprecated. - -
      -
    • -
    - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html new file mode 100644 index 0000000000..ec8d4c572d --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html @@ -0,0 +1,3219 @@ + + + + +ForwardingPlayer (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ForwardingPlayer

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      Player
      +
      +
      +
      public class ForwardingPlayer
      +extends Object
      +implements Player
      +
      A Player that forwards operations to another Player. Applications can use this + class to suppress or modify specific operations, by overriding the respective methods.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ForwardingPlayer

          +
          public ForwardingPlayer​(Player player)
          +
          Creates a new instance that forwards all operations to player.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getApplicationLooper

          +
          public Looper getApplicationLooper()
          +
          Description copied from interface: Player
          +
          Returns the Looper associated with the application thread that's used to access the + player and on which player events are received.
          +
          +
          Specified by:
          +
          getApplicationLooper in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          addListener

          +
          public void addListener​(Player.EventListener listener)
          +
          Description copied from interface: Player
          +
          Registers a listener to receive events from the player. + +

          The listener's methods will be called on the thread that was used to construct the player. + However, if the thread used to construct the player does not have a Looper, then the + listener will be called on the main thread.

          +
          +
          Specified by:
          +
          addListener in interface Player
          +
          Parameters:
          +
          listener - The listener to register.
          +
          +
        • +
        + + + +
          +
        • +

          addListener

          +
          public void addListener​(Player.Listener listener)
          +
          Description copied from interface: Player
          +
          Registers a listener to receive all events from the player. + +

          The listener's methods will be called on the thread that was used to construct the player. + However, if the thread used to construct the player does not have a Looper, then the + listener will be called on the main thread.

          +
          +
          Specified by:
          +
          addListener in interface Player
          +
          Parameters:
          +
          listener - The listener to register.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          removeListener

          +
          public void removeListener​(Player.Listener listener)
          +
          Description copied from interface: Player
          +
          Unregister a listener registered through Player.addListener(Listener). The listener will no + longer receive events.
          +
          +
          Specified by:
          +
          removeListener in interface Player
          +
          Parameters:
          +
          listener - The listener to unregister.
          +
          +
        • +
        + + + +
          +
        • +

          setMediaItems

          +
          public void setMediaItems​(List<MediaItem> mediaItems)
          +
          Description copied from interface: Player
          +
          Clears the playlist, adds the specified MediaItems and resets the position to + the default position.
          +
          +
          Specified by:
          +
          setMediaItems in interface Player
          +
          Parameters:
          +
          mediaItems - The new MediaItems.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setMediaItems

          +
          public void setMediaItems​(List<MediaItem> mediaItems,
          +                          int startWindowIndex,
          +                          long startPositionMs)
          +
          Description copied from interface: Player
          +
          Clears the playlist and adds the specified MediaItems.
          +
          +
          Specified by:
          +
          setMediaItems in interface Player
          +
          Parameters:
          +
          mediaItems - The new MediaItems.
          +
          startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is + passed, the current position is not reset.
          +
          startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if + startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the + position is not reset at all.
          +
          +
        • +
        + + + +
          +
        • +

          setMediaItem

          +
          public void setMediaItem​(MediaItem mediaItem)
          +
          Description copied from interface: Player
          +
          Clears the playlist, adds the specified MediaItem and resets the position to the + default position.
          +
          +
          Specified by:
          +
          setMediaItem in interface Player
          +
          Parameters:
          +
          mediaItem - The new MediaItem.
          +
          +
        • +
        + + + +
          +
        • +

          setMediaItem

          +
          public void setMediaItem​(MediaItem mediaItem,
          +                         long startPositionMs)
          +
          Description copied from interface: Player
          +
          Clears the playlist and adds the specified MediaItem.
          +
          +
          Specified by:
          +
          setMediaItem in interface Player
          +
          Parameters:
          +
          mediaItem - The new MediaItem.
          +
          startPositionMs - The position in milliseconds to start playback from.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          addMediaItem

          +
          public void addMediaItem​(MediaItem mediaItem)
          +
          Description copied from interface: Player
          +
          Adds a media item to the end of the playlist.
          +
          +
          Specified by:
          +
          addMediaItem in interface Player
          +
          Parameters:
          +
          mediaItem - The MediaItem to add.
          +
          +
        • +
        + + + +
          +
        • +

          addMediaItem

          +
          public void addMediaItem​(int index,
          +                         MediaItem mediaItem)
          +
          Description copied from interface: Player
          +
          Adds a media item at the given index of the playlist.
          +
          +
          Specified by:
          +
          addMediaItem in interface Player
          +
          Parameters:
          +
          index - The index at which to add the media item. If the index is larger than the size of + the playlist, the media item is added to the end of the playlist.
          +
          mediaItem - The MediaItem to add.
          +
          +
        • +
        + + + +
          +
        • +

          addMediaItems

          +
          public void addMediaItems​(List<MediaItem> mediaItems)
          +
          Description copied from interface: Player
          +
          Adds a list of media items to the end of the playlist.
          +
          +
          Specified by:
          +
          addMediaItems in interface Player
          +
          Parameters:
          +
          mediaItems - The MediaItems to add.
          +
          +
        • +
        + + + +
          +
        • +

          addMediaItems

          +
          public void addMediaItems​(int index,
          +                          List<MediaItem> mediaItems)
          +
          Description copied from interface: Player
          +
          Adds a list of media items at the given index of the playlist.
          +
          +
          Specified by:
          +
          addMediaItems in interface Player
          +
          Parameters:
          +
          index - The index at which to add the media items. If the index is larger than the size of + the playlist, the media items are added to the end of the playlist.
          +
          mediaItems - The MediaItems to add.
          +
          +
        • +
        + + + +
          +
        • +

          moveMediaItem

          +
          public void moveMediaItem​(int currentIndex,
          +                          int newIndex)
          +
          Description copied from interface: Player
          +
          Moves the media item at the current index to the new index.
          +
          +
          Specified by:
          +
          moveMediaItem in interface Player
          +
          Parameters:
          +
          currentIndex - The current index of the media item to move.
          +
          newIndex - The new index of the media item. If the new index is larger than the size of + the playlist the item is moved to the end of the playlist.
          +
          +
        • +
        + + + +
          +
        • +

          moveMediaItems

          +
          public void moveMediaItems​(int fromIndex,
          +                           int toIndex,
          +                           int newIndex)
          +
          Description copied from interface: Player
          +
          Moves the media item range to the new index.
          +
          +
          Specified by:
          +
          moveMediaItems in interface Player
          +
          Parameters:
          +
          fromIndex - The start of the range to move.
          +
          toIndex - The first item not to be included in the range (exclusive).
          +
          newIndex - The new index of the first media item of the range. If the new index is larger + than the size of the remaining playlist after removing the range, the range is moved to the + end of the playlist.
          +
          +
        • +
        + + + +
          +
        • +

          removeMediaItem

          +
          public void removeMediaItem​(int index)
          +
          Description copied from interface: Player
          +
          Removes the media item at the given index of the playlist.
          +
          +
          Specified by:
          +
          removeMediaItem in interface Player
          +
          Parameters:
          +
          index - The index at which to remove the media item.
          +
          +
        • +
        + + + +
          +
        • +

          removeMediaItems

          +
          public void removeMediaItems​(int fromIndex,
          +                             int toIndex)
          +
          Description copied from interface: Player
          +
          Removes a range of media items from the playlist.
          +
          +
          Specified by:
          +
          removeMediaItems in interface Player
          +
          Parameters:
          +
          fromIndex - The index at which to start removing media items.
          +
          toIndex - The index of the first item to be kept (exclusive). If the index is larger than + the size of the playlist, media items to the end of the playlist are removed.
          +
          +
        • +
        + + + +
          +
        • +

          clearMediaItems

          +
          public void clearMediaItems()
          +
          Description copied from interface: Player
          +
          Clears the playlist.
          +
          +
          Specified by:
          +
          clearMediaItems in interface Player
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          prepare

          +
          public void prepare()
          +
          Description copied from interface: Player
          +
          Prepares the player.
          +
          +
          Specified by:
          +
          prepare in interface Player
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          pause

          +
          public void pause()
          +
          Description copied from interface: Player
          +
          Pauses playback. Equivalent to setPlayWhenReady(false).
          +
          +
          Specified by:
          +
          pause in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          setPlayWhenReady

          +
          public void setPlayWhenReady​(boolean playWhenReady)
          +
          Description copied from interface: Player
          +
          Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY. + +

          If the player is already in the ready state then this method pauses and resumes playback.

          +
          +
          Specified by:
          +
          setPlayWhenReady in interface Player
          +
          Parameters:
          +
          playWhenReady - Whether playback should proceed when ready.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setRepeatMode

          +
          public void setRepeatMode​(@RepeatMode
          +                          int repeatMode)
          +
          Description copied from interface: Player
          +
          Sets the Player.RepeatMode to be used for playback.
          +
          +
          Specified by:
          +
          setRepeatMode in interface Player
          +
          Parameters:
          +
          repeatMode - The repeat mode.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setShuffleModeEnabled

          +
          public void setShuffleModeEnabled​(boolean shuffleModeEnabled)
          +
          Description copied from interface: Player
          +
          Sets whether shuffling of windows is enabled.
          +
          +
          Specified by:
          +
          setShuffleModeEnabled in interface Player
          +
          Parameters:
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          seekToDefaultPosition

          +
          public void seekToDefaultPosition()
          +
          Description copied from interface: Player
          +
          Seeks to the default position associated with the current window. The position can depend on + the type of media being played. For live streams it will typically be the live edge of the + window. For other streams it will typically be the start of the window.
          +
          +
          Specified by:
          +
          seekToDefaultPosition in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          seekToDefaultPosition

          +
          public void seekToDefaultPosition​(int windowIndex)
          +
          Description copied from interface: Player
          +
          Seeks to the default position associated with the specified window. The position can depend on + the type of media being played. For live streams it will typically be the live edge of the + window. For other streams it will typically be the start of the window.
          +
          +
          Specified by:
          +
          seekToDefaultPosition in interface Player
          +
          Parameters:
          +
          windowIndex - The index of the window whose associated default position should be seeked + to.
          +
          +
        • +
        + + + +
          +
        • +

          seekTo

          +
          public void seekTo​(long positionMs)
          +
          Description copied from interface: Player
          +
          Seeks to a position specified in milliseconds in the current window.
          +
          +
          Specified by:
          +
          seekTo in interface Player
          +
          Parameters:
          +
          positionMs - The seek position in the current window, or C.TIME_UNSET to seek to + the window's default position.
          +
          +
        • +
        + + + +
          +
        • +

          seekTo

          +
          public void seekTo​(int windowIndex,
          +                   long positionMs)
          +
          Description copied from interface: Player
          +
          Seeks to a position specified in milliseconds in the specified window.
          +
          +
          Specified by:
          +
          seekTo in interface Player
          +
          Parameters:
          +
          windowIndex - The index of the window.
          +
          positionMs - The seek position in the specified window, or C.TIME_UNSET to seek to + the window's default position.
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          hasPreviousWindow

          +
          public boolean hasPreviousWindow()
          +
          Description copied from interface: Player
          +
          Returns whether a previous window exists, which may depend on the current repeat mode and + whether shuffle mode is enabled. + +

          Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when + the current repeat mode is Player.REPEAT_MODE_OFF. See Player.REPEAT_MODE_ONE for more + details.

          +
          +
          Specified by:
          +
          hasPreviousWindow in interface Player
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          seekToPrevious

          +
          public void seekToPrevious()
          +
          Description copied from interface: Player
          +
          Seeks to an earlier position in the current or previous window (if available). More precisely: + +
          +
          +
          Specified by:
          +
          seekToPrevious in interface Player
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          hasNextWindow

          +
          public boolean hasNextWindow()
          +
          Description copied from interface: Player
          +
          Returns whether a next window exists, which may depend on the current repeat mode and whether + shuffle mode is enabled. + +

          Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when + the current repeat mode is Player.REPEAT_MODE_OFF. See Player.REPEAT_MODE_ONE for more + details.

          +
          +
          Specified by:
          +
          hasNextWindow in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          next

          +
          @Deprecated
          +public void next()
          +
          Deprecated.
          +
          +
          Specified by:
          +
          next in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          seekToNext

          +
          public void seekToNext()
          +
          Description copied from interface: Player
          +
          Seeks to a later position in the current or next window (if available). More precisely: + +
            +
          • If the timeline is empty or seeking is not possible, does nothing. +
          • Otherwise, if a next window exists, seeks to the default + position of the next window. +
          • Otherwise, if the current window is live and has not + ended, seeks to the live edge of the current window. +
          • Otherwise, does nothing. +
          +
          +
          Specified by:
          +
          seekToNext in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setPlaybackSpeed

          +
          public void setPlaybackSpeed​(float speed)
          +
          Description copied from interface: Player
          +
          Changes the rate at which playback occurs. The pitch is not changed. + +

          This is equivalent to + setPlaybackParameters(getPlaybackParameters().withSpeed(speed)).

          +
          +
          Specified by:
          +
          setPlaybackSpeed in interface Player
          +
          Parameters:
          +
          speed - The linear factor by which playback will be sped up. Must be higher than 0. 1 is + normal speed, 2 is twice as fast, 0.5 is half normal speed...
          +
          +
        • +
        + + + + + + + +
          +
        • +

          stop

          +
          public void stop()
          +
          Description copied from interface: Player
          +
          Stops playback without resetting the player. Use Player.pause() rather than this method if + the intention is to pause playback. + +

          Calling this method will cause the playback state to transition to Player.STATE_IDLE. The + player instance can still be used, and Player.release() must still be called on the player if + it's no longer required. + +

          Calling this method does not clear the playlist, reset the playback position or the playback + error.

          +
          +
          Specified by:
          +
          stop in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          stop

          +
          public void stop​(boolean reset)
          +
          +
          Specified by:
          +
          stop in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          release

          +
          public void release()
          +
          Description copied from interface: Player
          +
          Releases the player. This method must be called when the player is no longer required. The + player must not be used after calling this method.
          +
          +
          Specified by:
          +
          release in interface Player
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getCurrentManifest

          +
          @Nullable
          +public Object getCurrentManifest()
          +
          Description copied from interface: Player
          +
          Returns the current manifest. The type depends on the type of media being played. May be null.
          +
          +
          Specified by:
          +
          getCurrentManifest in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getCurrentPeriodIndex

          +
          public int getCurrentPeriodIndex()
          +
          Description copied from interface: Player
          +
          Returns the index of the period currently being played.
          +
          +
          Specified by:
          +
          getCurrentPeriodIndex in interface Player
          +
          +
        • +
        + + + + + + + + + + + + + + + + + + + +
          +
        • +

          getMediaItemCount

          +
          public int getMediaItemCount()
          +
          Description copied from interface: Player
          +
          Returns the number of media items in the playlist.
          +
          +
          Specified by:
          +
          getMediaItemCount in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getDuration

          +
          public long getDuration()
          +
          Description copied from interface: Player
          +
          Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
          +
          +
          Specified by:
          +
          getDuration in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getCurrentPosition

          +
          public long getCurrentPosition()
          +
          Description copied from interface: Player
          +
          Returns the playback position in the current content window or ad, in milliseconds, or the + prospective position in milliseconds if the current timeline is + empty.
          +
          +
          Specified by:
          +
          getCurrentPosition in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getBufferedPosition

          +
          public long getBufferedPosition()
          +
          Description copied from interface: Player
          +
          Returns an estimate of the position in the current content window or ad up to which data is + buffered, in milliseconds.
          +
          +
          Specified by:
          +
          getBufferedPosition in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getBufferedPercentage

          +
          public int getBufferedPercentage()
          +
          Description copied from interface: Player
          +
          Returns an estimate of the percentage in the current content window or ad up to which data is + buffered, or 0 if no estimate is available.
          +
          +
          Specified by:
          +
          getBufferedPercentage in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getTotalBufferedDuration

          +
          public long getTotalBufferedDuration()
          +
          Description copied from interface: Player
          +
          Returns an estimate of the total buffered duration from the current position, in milliseconds. + This includes pre-buffered data for subsequent ads and windows.
          +
          +
          Specified by:
          +
          getTotalBufferedDuration in interface Player
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getCurrentLiveOffset

          +
          public long getCurrentLiveOffset()
          +
          Description copied from interface: Player
          +
          Returns the offset of the current playback position from the live edge in milliseconds, or + C.TIME_UNSET if the current window isn't live or the + offset is unknown. + +

          The offset is calculated as currentTime - playbackPosition, so should usually be + positive. + +

          Note that this offset may rely on an accurate local time, so this method may return an + incorrect value if the difference between system clock and server clock is unknown.

          +
          +
          Specified by:
          +
          getCurrentLiveOffset in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          isPlayingAd

          +
          public boolean isPlayingAd()
          +
          Description copied from interface: Player
          +
          Returns whether the player is currently playing an ad.
          +
          +
          Specified by:
          +
          isPlayingAd in interface Player
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getContentDuration

          +
          public long getContentDuration()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns the duration of the current content + window in milliseconds, or C.TIME_UNSET if the duration is not known. If there is no ad + playing, the returned duration is the same as that returned by Player.getDuration().
          +
          +
          Specified by:
          +
          getContentDuration in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getContentPosition

          +
          public long getContentPosition()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns the content position that will be + played once all ads in the ad group have finished playing, in milliseconds. If there is no ad + playing, the returned position is the same as that returned by Player.getCurrentPosition().
          +
          +
          Specified by:
          +
          getContentPosition in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getContentBufferedPosition

          +
          public long getContentBufferedPosition()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns an estimate of the content position in + the current content window up to which data is buffered, in milliseconds. If there is no ad + playing, the returned position is the same as that returned by Player.getBufferedPosition().
          +
          +
          Specified by:
          +
          getContentBufferedPosition in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setVolume

          +
          public void setVolume​(float audioVolume)
          +
          Description copied from interface: Player
          +
          Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
          +
          +
          Specified by:
          +
          setVolume in interface Player
          +
          Parameters:
          +
          audioVolume - Linear output gain to apply to all audio channels.
          +
          +
        • +
        + + + +
          +
        • +

          getVolume

          +
          public float getVolume()
          +
          Description copied from interface: Player
          +
          Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
          +
          +
          Specified by:
          +
          getVolume in interface Player
          +
          Returns:
          +
          The linear gain applied to all audio channels.
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          clearVideoSurface

          +
          public void clearVideoSurface​(@Nullable
          +                              Surface surface)
          +
          Description copied from interface: Player
          +
          Clears the Surface onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Specified by:
          +
          clearVideoSurface in interface Player
          +
          Parameters:
          +
          surface - The surface to clear.
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          clearVideoSurfaceHolder

          +
          public void clearVideoSurfaceHolder​(@Nullable
          +                                    SurfaceHolder surfaceHolder)
          +
          Description copied from interface: Player
          +
          Clears the SurfaceHolder that holds the Surface onto which video is being + rendered if it matches the one passed. Else does nothing.
          +
          +
          Specified by:
          +
          clearVideoSurfaceHolder in interface Player
          +
          Parameters:
          +
          surfaceHolder - The surface holder to clear.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          clearVideoSurfaceView

          +
          public void clearVideoSurfaceView​(@Nullable
          +                                  SurfaceView surfaceView)
          +
          Description copied from interface: Player
          +
          Clears the SurfaceView onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Specified by:
          +
          clearVideoSurfaceView in interface Player
          +
          Parameters:
          +
          surfaceView - The texture view to clear.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          clearVideoTextureView

          +
          public void clearVideoTextureView​(@Nullable
          +                                  TextureView textureView)
          +
          Description copied from interface: Player
          +
          Clears the TextureView onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Specified by:
          +
          clearVideoTextureView in interface Player
          +
          Parameters:
          +
          textureView - The texture view to clear.
          +
          +
        • +
        + + + +
          +
        • +

          getCurrentCues

          +
          public List<Cue> getCurrentCues()
          +
          Description copied from interface: Player
          +
          Returns the current Cues. This list may be empty.
          +
          +
          Specified by:
          +
          getCurrentCues in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          getDeviceInfo

          +
          public DeviceInfo getDeviceInfo()
          +
          Description copied from interface: Player
          +
          Gets the device information.
          +
          +
          Specified by:
          +
          getDeviceInfo in interface Player
          +
          +
        • +
        + + + + + + + +
          +
        • +

          isDeviceMuted

          +
          public boolean isDeviceMuted()
          +
          Description copied from interface: Player
          +
          Gets whether the device is muted or not.
          +
          +
          Specified by:
          +
          isDeviceMuted in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          setDeviceVolume

          +
          public void setDeviceVolume​(int volume)
          +
          Description copied from interface: Player
          +
          Sets the volume of the device.
          +
          +
          Specified by:
          +
          setDeviceVolume in interface Player
          +
          Parameters:
          +
          volume - The volume to set.
          +
          +
        • +
        + + + +
          +
        • +

          increaseDeviceVolume

          +
          public void increaseDeviceVolume()
          +
          Description copied from interface: Player
          +
          Increases the volume of the device.
          +
          +
          Specified by:
          +
          increaseDeviceVolume in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          decreaseDeviceVolume

          +
          public void decreaseDeviceVolume()
          +
          Description copied from interface: Player
          +
          Decreases the volume of the device.
          +
          +
          Specified by:
          +
          decreaseDeviceVolume in interface Player
          +
          +
        • +
        + + + +
          +
        • +

          setDeviceMuted

          +
          public void setDeviceMuted​(boolean muted)
          +
          Description copied from interface: Player
          +
          Sets the mute state of the device.
          +
          +
          Specified by:
          +
          setDeviceMuted in interface Player
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html index 06057b42ff..9e476679f9 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html @@ -253,27 +253,34 @@ implements +static MediaItem +EMPTY + +
    Empty MediaItem.
    + + + MediaItem.LiveConfiguration liveConfiguration
    The live playback configuration.
    - + String mediaId
    Identifies the media item.
    - + MediaMetadata mediaMetadata
    The media metadata.
    - + MediaItem.PlaybackProperties playbackProperties @@ -374,6 +381,16 @@ implements + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html index a081e3e4ee..cceffedcbf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":42,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":42}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -171,7 +171,7 @@ extends

    Method Summary

    - + @@ -186,142 +186,254 @@ extends + + + + + - + - + - + - + - + - + + + + + + - + + + + + + + + + + + + + + + + - + + + + + + - + - + - + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + - + - + - + + + + + +
    All Methods Instance Methods Concrete Methods All Methods Instance Methods Concrete Methods Deprecated Methods 
    Modifier and Type Method
    MediaMetadata.BuildermaybeSetArtworkData​(byte[] artworkData, + int artworkDataType) +
    Sets the artwork data as a compressed byte array in the event that the associated MediaMetadata.PictureType is MediaMetadata.PICTURE_TYPE_FRONT_COVER, the existing MediaMetadata.PictureType is not + MediaMetadata.PICTURE_TYPE_FRONT_COVER, or the current artworkData is not set.
    +
    MediaMetadata.Builder populateFromMetadata​(Metadata metadata)
    Sets all fields supported by the entries within the Metadata.
    MediaMetadata.Builder populateFromMetadata​(List<Metadata> metadataList)
    Sets all fields supported by the entries within the list of Metadata.
    MediaMetadata.Builder setAlbumArtist​(CharSequence albumArtist)
    Sets the album artist.
    MediaMetadata.Builder setAlbumTitle​(CharSequence albumTitle)
    Sets the album title.
    MediaMetadata.Builder setArtist​(CharSequence artist)
    Sets the artist.
    MediaMetadata.Builder setArtworkData​(byte[] artworkData) -
    Sets the artwork data as a compressed byte array.
    +
    MediaMetadata.BuildersetArtworkData​(byte[] artworkData, + Integer artworkDataType) +
    Sets the artwork data as a compressed byte array with an associated artworkDataType.
    +
    MediaMetadata.Builder setArtworkUri​(Uri artworkUri)
    Sets the artwork Uri.
    MediaMetadata.BuildersetCompilation​(CharSequence compilation) +
    Sets the compilation.
    +
    MediaMetadata.BuildersetComposer​(CharSequence composer) +
    Sets the composer.
    +
    MediaMetadata.BuildersetConductor​(CharSequence conductor) +
    Sets the conductor.
    +
    MediaMetadata.Builder setDescription​(CharSequence description)
    Sets the description.
    MediaMetadata.BuildersetDiscNumber​(Integer discNumber) +
    Sets the disc number.
    +
    MediaMetadata.Builder setDisplayTitle​(CharSequence displayTitle)
    Sets the display title.
    MediaMetadata.Builder setExtras​(Bundle extras)
    Sets the extras Bundle.
    MediaMetadata.Builder setFolderType​(Integer folderType)
    MediaMetadata.BuildersetGenre​(CharSequence genre) +
    Sets the genre.
    +
    MediaMetadata.Builder setIsPlayable​(Boolean isPlayable)
    Sets whether the media is playable.
    MediaMetadata.Builder setMediaUri​(Uri mediaUri)
    Sets the media Uri.
    MediaMetadata.Builder setOverallRating​(Rating overallRating)
    Sets the overall Rating.
    MediaMetadata.BuildersetRecordingDay​(Integer recordingDay) +
    Sets the day of the recording date.
    +
    MediaMetadata.BuildersetRecordingMonth​(Integer recordingMonth) +
    Sets the month of the recording date.
    +
    MediaMetadata.BuildersetRecordingYear​(Integer recordingYear) +
    Sets the year of the recording date.
    +
    MediaMetadata.BuildersetReleaseDay​(Integer releaseDay) +
    Sets the day of the release date.
    +
    MediaMetadata.BuildersetReleaseMonth​(Integer releaseMonth) +
    Sets the month of the release date.
    +
    MediaMetadata.BuildersetReleaseYear​(Integer releaseYear) +
    Sets the year of the release date.
    +
    MediaMetadata.Builder setSubtitle​(CharSequence subtitle)
    Sets the subtitle.
    MediaMetadata.Builder setTitle​(CharSequence title)
    Sets the title.
    MediaMetadata.BuildersetTotalDiscCount​(Integer totalDiscCount) +
    Sets the total number of discs.
    +
    MediaMetadata.Builder setTotalTrackCount​(Integer totalTrackCount)
    Sets the total number of tracks.
    MediaMetadata.Builder setTrackNumber​(Integer trackNumber)
    Sets the track number.
    MediaMetadata.Builder setUserRating​(Rating userRating)
    Sets the user Rating.
    MediaMetadata.BuildersetWriter​(CharSequence writer) +
    Sets the writer.
    +
    MediaMetadata.Builder setYear​(Integer year) -
    Sets the year.
    +
    Deprecated. + +
    @@ -485,9 +597,41 @@ extends
  • setArtworkData

    -
    public MediaMetadata.Builder setArtworkData​(@Nullable
    +
    @Deprecated
    +public MediaMetadata.Builder setArtworkData​(@Nullable
                                                 byte[] artworkData)
    -
    Sets the artwork data as a compressed byte array.
    + +
  • + + + + + + + + + @@ -551,9 +695,163 @@ extends
  • setYear

    -
    public MediaMetadata.Builder setYear​(@Nullable
    +
    @Deprecated
    +public MediaMetadata.Builder setYear​(@Nullable
                                          Integer year)
    -
    Sets the year.
    +
    Deprecated. + +
    +
  • + + + + +
      +
    • +

      setRecordingYear

      +
      public MediaMetadata.Builder setRecordingYear​(@Nullable
      +                                              Integer recordingYear)
      +
      Sets the year of the recording date.
      +
    • +
    + + + +
      +
    • +

      setRecordingMonth

      +
      public MediaMetadata.Builder setRecordingMonth​(@Nullable @IntRange(from=1L,to=12L)
      +                                               Integer recordingMonth)
      +
      Sets the month of the recording date. + +

      Value should be between 1 and 12.

      +
    • +
    + + + +
      +
    • +

      setRecordingDay

      +
      public MediaMetadata.Builder setRecordingDay​(@Nullable @IntRange(from=1L,to=31L)
      +                                             Integer recordingDay)
      +
      Sets the day of the recording date. + +

      Value should be between 1 and 31.

      +
    • +
    + + + +
      +
    • +

      setReleaseYear

      +
      public MediaMetadata.Builder setReleaseYear​(@Nullable
      +                                            Integer releaseYear)
      +
      Sets the year of the release date.
      +
    • +
    + + + +
      +
    • +

      setReleaseMonth

      +
      public MediaMetadata.Builder setReleaseMonth​(@Nullable @IntRange(from=1L,to=12L)
      +                                             Integer releaseMonth)
      +
      Sets the month of the release date. + +

      Value should be between 1 and 12.

      +
    • +
    + + + +
      +
    • +

      setReleaseDay

      +
      public MediaMetadata.Builder setReleaseDay​(@Nullable @IntRange(from=1L,to=31L)
      +                                           Integer releaseDay)
      +
      Sets the day of the release date. + +

      Value should be between 1 and 31.

      +
    • +
    + + + + + + + + + + + + + + + + + + + +
      +
    • +

      setTotalDiscCount

      +
      public MediaMetadata.Builder setTotalDiscCount​(@Nullable
      +                                               Integer totalDiscCount)
      +
      Sets the total number of discs.
      +
    • +
    + + + + + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/PlaybackPreparer.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html similarity index 60% rename from docs/doc/reference/com/google/android/exoplayer2/PlaybackPreparer.html rename to docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html index 5e34c93ac3..8aa35d1a6e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/PlaybackPreparer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html @@ -2,7 +2,7 @@ -PlaybackPreparer (ExoPlayer library) +MediaMetadata.PictureType (ExoPlayer library) @@ -19,18 +19,12 @@ @@ -86,16 +80,14 @@ loadScripts(document, 'script');
    @@ -114,80 +106,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    -

    Interface PlaybackPreparer

    +

    Annotation Type MediaMetadata.PictureType

    -
    -
    - -
    -
    -
    @@ -236,16 +168,14 @@ void preparePlayback()
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html index 050176afb4..a8ce3ba8e0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html @@ -171,6 +171,13 @@ implements The folder type of the media item.
    + +static interface  +MediaMetadata.PictureType + +
    The picture type of the artwork.
    + + + + + + @@ -744,9 +1262,163 @@ public final 
  • year

    -
    @Nullable
    +
    @Deprecated
    +@Nullable
     public final Integer year
    -
    Optional year.
    +
    Deprecated. +
    Use recordingYear instead.
    +
    +
  • + + + + +
      +
    • +

      recordingYear

      +
      @Nullable
      +public final Integer recordingYear
      +
      Optional year of the recording date.
      +
    • +
    + + + +
      +
    • +

      recordingMonth

      +
      @Nullable
      +public final Integer recordingMonth
      +
      Optional month of the recording date. + +

      Note that there is no guarantee that the month and day are a valid combination.

      +
    • +
    + + + +
      +
    • +

      recordingDay

      +
      @Nullable
      +public final Integer recordingDay
      +
      Optional day of the recording date. + +

      Note that there is no guarantee that the month and day are a valid combination.

      +
    • +
    + + + +
      +
    • +

      releaseYear

      +
      @Nullable
      +public final Integer releaseYear
      +
      Optional year of the release date.
      +
    • +
    + + + +
      +
    • +

      releaseMonth

      +
      @Nullable
      +public final Integer releaseMonth
      +
      Optional month of the release date. + +

      Note that there is no guarantee that the month and day are a valid combination.

      +
    • +
    + + + +
      +
    • +

      releaseDay

      +
      @Nullable
      +public final Integer releaseDay
      +
      Optional day of the release date. + +

      Note that there is no guarantee that the month and day are a valid combination.

      +
    • +
    + + + +
      +
    • +

      writer

      +
      @Nullable
      +public final CharSequence writer
      +
      Optional writer.
      +
    • +
    + + + +
      +
    • +

      composer

      +
      @Nullable
      +public final CharSequence composer
      +
      Optional composer.
      +
    • +
    + + + +
      +
    • +

      conductor

      +
      @Nullable
      +public final CharSequence conductor
      +
      Optional conductor.
      +
    • +
    + + + +
      +
    • +

      discNumber

      +
      @Nullable
      +public final Integer discNumber
      +
      Optional disc number.
      +
    • +
    + + + +
      +
    • +

      totalDiscCount

      +
      @Nullable
      +public final Integer totalDiscCount
      +
      Optional total number of discs.
      +
    • +
    + + + +
      +
    • +

      genre

      +
      @Nullable
      +public final CharSequence genre
      +
      Optional genre.
      +
    • +
    + + + +
      +
    • +

      compilation

      +
      @Nullable
      +public final CharSequence compilation
      +
      Optional compilation.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html index 2155cf2b7d..36998fa580 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html @@ -282,8 +282,7 @@ implements long getReadingPositionUs() -
    Returns the renderer time up to which the renderer has read samples from the current SampleStream, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the - current SampleStream to the end.
    +
    Returns the renderer time up to which the renderer has read samples, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the current SampleStream to the end.
    @@ -309,8 +308,8 @@ implements void -handleMessage​(int what, - Object object) +handleMessage​(int messageType, + Object message)
    Handles a message delivered to the target.
    @@ -668,9 +667,8 @@ public Description copied from interface: Renderer
    Starts the renderer, meaning that calls to Renderer.render(long, long) will cause media to be rendered. -

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

    + +

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

    Specified by:
    start in interface Renderer
    @@ -733,9 +731,8 @@ public final public final boolean hasReadStreamToEnd()
    Returns whether the renderer has read the current SampleStream to the end. -

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

    + +

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

    Specified by:
    hasReadStreamToEnd in interface Renderer
    @@ -750,8 +747,7 @@ public final public long getReadingPositionUs() -
    Returns the renderer time up to which the renderer has read samples from the current SampleStream, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the - current SampleStream to the end. +
    Returns the renderer time up to which the renderer has read samples, in microseconds, or C.TIME_END_OF_SOURCE if the renderer has read the current SampleStream to the end.

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

    @@ -770,9 +766,8 @@ public final Description copied from interface: Renderer
    Signals to the renderer that the current SampleStream will be the final one supplied before it is next disabled or reset. -

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

    + +

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

    Specified by:
    setCurrentStreamFinal in interface Renderer
    @@ -806,9 +801,8 @@ public final Description copied from interface: Renderer
    Throws an error that's preventing the renderer from reading from its SampleStream. Does nothing if no such error exists. -

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

    + +

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

    Specified by:
    maybeThrowStreamError in interface Renderer
    @@ -828,12 +822,11 @@ public final ExoPlaybackException
    Description copied from interface: Renderer
    Signals to the renderer that a position discontinuity has occurred. -

    - After a position discontinuity, the renderer's SampleStream is guaranteed to provide + +

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

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

    + +

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

    Specified by:
    resetPosition in interface Renderer
    @@ -870,9 +863,8 @@ public final public final void disable()
    Disable the renderer, transitioning it to the Renderer.STATE_DISABLED state. -

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

    + +

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

    Specified by:
    disable in interface Renderer
    @@ -906,16 +898,15 @@ public final public boolean isReady()
    Whether the renderer is able to immediately render media from the current position. -

    - If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that the - renderer has everything that it needs to continue playback. Returning false indicates that + +

    If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that + the renderer has everything that it needs to continue playback. Returning false indicates that the player should pause until the renderer is ready. -

    - If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that the - renderer is ready for playback to be started. Returning false indicates that it is not. -

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

    + +

    If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that + the renderer is ready for playback to be started. Returning false indicates that it is not. + +

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

    Specified by:
    isReady in interface Renderer
    @@ -996,9 +987,9 @@ public int supportsMixedMimeTypeAdaptation()
    • handleMessage

      -
      public void handleMessage​(int what,
      +
      public void handleMessage​(int messageType,
                                 @Nullable
      -                          Object object)
      +                          Object message)
                          throws ExoPlaybackException
      Description copied from interface: PlayerMessage.Target
      Handles a message delivered to the target.
      @@ -1006,8 +997,8 @@ public int supportsMixedMimeTypeAdaptation()
      Specified by:
      handleMessage in interface PlayerMessage.Target
      Parameters:
      -
      what - The message type.
      -
      object - The message payload.
      +
      messageType - The message type.
      +
      message - The message payload.
      Throws:
      ExoPlaybackException - If an error occurred whilst handling the message. Should only be thrown by targets that handle messages on the playback thread.
      @@ -1023,8 +1014,8 @@ public int supportsMixedMimeTypeAdaptation()
      protected void onEnabled​(boolean joining)
                         throws ExoPlaybackException
      Called when the renderer is enabled. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Parameters:
      joining - Whether this renderer is being enabled to join an ongoing playback.
      @@ -1042,12 +1033,11 @@ public int supportsMixedMimeTypeAdaptation()
      protected void onRendererOffsetChanged​(long offsetUs)
                                       throws ExoPlaybackException
      Called when the renderer's offset has been changed. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Parameters:
      -
      offsetUs - The offset that should be subtracted from positionUs in - Renderer.render(long, long) to get the playback position with respect to the media.
      +
      offsetUs - The offset that should be subtracted from positionUs in Renderer.render(long, long) to get the playback position with respect to the media.
      Throws:
      ExoPlaybackException - If an error occurs.
      @@ -1062,11 +1052,10 @@ public int supportsMixedMimeTypeAdaptation()
      protected void onPositionReset​(long positionUs,
                                      boolean joining)
                               throws ExoPlaybackException
      -
      Called when the position is reset. This occurs when the renderer is enabled after - onRendererOffsetChanged(long) has been called, and also when a position - discontinuity is encountered. -

      - The default implementation is a no-op.

      +
      Called when the position is reset. This occurs when the renderer is enabled after onRendererOffsetChanged(long) has been called, and also when a position discontinuity is + encountered. + +

      The default implementation is a no-op.

      Parameters:
      positionUs - The new playback position in microseconds.
      @@ -1085,8 +1074,8 @@ public int supportsMixedMimeTypeAdaptation()
      protected void onStarted()
                         throws ExoPlaybackException
      Called when the renderer is started. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Throws:
      ExoPlaybackException - If an error occurs.
      @@ -1113,8 +1102,8 @@ public int supportsMixedMimeTypeAdaptation()

      onDisabled

      protected void onDisabled()
      Called when the renderer is disabled. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ParserException.html b/docs/doc/reference/com/google/android/exoplayer2/ParserException.html index 76298e016a..32fab39457 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ParserException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ParserException.html @@ -25,6 +25,12 @@ catch(err) { } //--> +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9}; +var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; +var altColor = "altColor"; +var rowColor = "rowColor"; +var tableTab = "tableTab"; +var activeTableTab = "activeTableTab"; var pathtoroot = "../../../../"; var useModuleDirectories = false; loadScripts(document, 'script'); @@ -81,15 +87,15 @@ loadScripts(document, 'script'); @@ -159,6 +165,38 @@ extends
    + + + +
      +
    • +

      toBundle

      +
      public Bundle toBundle()
      +
      Description copied from interface: Bundleable
      +
      Returns a Bundle representing the information stored in this object.
      +
      +
      Specified by:
      +
      toBundle in interface Bundleable
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.EventFlags.html b/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html similarity index 96% rename from docs/doc/reference/com/google/android/exoplayer2/Player.EventFlags.html rename to docs/doc/reference/com/google/android/exoplayer2/Player.Event.html index 4163538cb5..51e7f50293 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.EventFlags.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html @@ -2,7 +2,7 @@ -Player.EventFlags (ExoPlayer library) +Player.Event (ExoPlayer library) @@ -19,7 +19,7 @@ + + + + + + + + + +
    + +
    + +
    +
    + +

    Class Timeline.RemotableTimeline

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      + +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getWindowCount

          +
          public int getWindowCount()
          +
          Description copied from class: Timeline
          +
          Returns the number of windows in the timeline.
          +
          +
          Specified by:
          +
          getWindowCount in class Timeline
          +
          +
        • +
        + + + +
          +
        • +

          getWindow

          +
          public Timeline.Window getWindow​(int windowIndex,
          +                                 Timeline.Window window,
          +                                 long defaultPositionProjectionUs)
          +
          Description copied from class: Timeline
          +
          Populates a Timeline.Window with data for the window at the specified index.
          +
          +
          Specified by:
          +
          getWindow in class Timeline
          +
          Parameters:
          +
          windowIndex - The index of the window.
          +
          window - The Timeline.Window to populate. Must not be null.
          +
          defaultPositionProjectionUs - A duration into the future that the populated window's + default start position should be projected.
          +
          Returns:
          +
          The populated Timeline.Window, for convenience.
          +
          +
        • +
        + + + +
          +
        • +

          getNextWindowIndex

          +
          public int getNextWindowIndex​(int windowIndex,
          +                              @RepeatMode
          +                              int repeatMode,
          +                              boolean shuffleModeEnabled)
          +
          Description copied from class: Timeline
          +
          Returns the index of the window after the window at index windowIndex depending on the + repeatMode and whether shuffling is enabled.
          +
          +
          Overrides:
          +
          getNextWindowIndex in class Timeline
          +
          Parameters:
          +
          windowIndex - Index of a window in the timeline.
          +
          repeatMode - A repeat mode.
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          Returns:
          +
          The index of the next window, or C.INDEX_UNSET if this is the last window.
          +
          +
        • +
        + + + +
          +
        • +

          getPreviousWindowIndex

          +
          public int getPreviousWindowIndex​(int windowIndex,
          +                                  @RepeatMode
          +                                  int repeatMode,
          +                                  boolean shuffleModeEnabled)
          +
          Description copied from class: Timeline
          +
          Returns the index of the window before the window at index windowIndex depending on the + repeatMode and whether shuffling is enabled.
          +
          +
          Overrides:
          +
          getPreviousWindowIndex in class Timeline
          +
          Parameters:
          +
          windowIndex - Index of a window in the timeline.
          +
          repeatMode - A repeat mode.
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          Returns:
          +
          The index of the previous window, or C.INDEX_UNSET if this is the first window.
          +
          +
        • +
        + + + +
          +
        • +

          getLastWindowIndex

          +
          public int getLastWindowIndex​(boolean shuffleModeEnabled)
          +
          Description copied from class: Timeline
          +
          Returns the index of the last window in the playback order depending on whether shuffling is + enabled.
          +
          +
          Overrides:
          +
          getLastWindowIndex in class Timeline
          +
          Parameters:
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          Returns:
          +
          The index of the last window in the playback order, or C.INDEX_UNSET if the + timeline is empty.
          +
          +
        • +
        + + + +
          +
        • +

          getFirstWindowIndex

          +
          public int getFirstWindowIndex​(boolean shuffleModeEnabled)
          +
          Description copied from class: Timeline
          +
          Returns the index of the first window in the playback order depending on whether shuffling is + enabled.
          +
          +
          Overrides:
          +
          getFirstWindowIndex in class Timeline
          +
          Parameters:
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          Returns:
          +
          The index of the first window in the playback order, or C.INDEX_UNSET if the + timeline is empty.
          +
          +
        • +
        + + + +
          +
        • +

          getPeriodCount

          +
          public int getPeriodCount()
          +
          Description copied from class: Timeline
          +
          Returns the number of periods in the timeline.
          +
          +
          Specified by:
          +
          getPeriodCount in class Timeline
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getIndexOfPeriod

          +
          public int getIndexOfPeriod​(Object uid)
          +
          Description copied from class: Timeline
          +
          Returns the index of the period identified by its unique Timeline.Period.uid, or C.INDEX_UNSET if the period is not in the timeline.
          +
          +
          Specified by:
          +
          getIndexOfPeriod in class Timeline
          +
          Parameters:
          +
          uid - A unique identifier for a period.
          +
          Returns:
          +
          The index of the period, or C.INDEX_UNSET if the period was not found.
          +
          +
        • +
        + + + +
          +
        • +

          getUidOfPeriod

          +
          public Object getUidOfPeriod​(int periodIndex)
          +
          Description copied from class: Timeline
          +
          Returns the unique id of the period identified by its index in the timeline.
          +
          +
          Specified by:
          +
          getUidOfPeriod in class Timeline
          +
          Parameters:
          +
          periodIndex - The index of the period.
          +
          Returns:
          +
          The unique id of the period.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/Timeline.html b/docs/doc/reference/com/google/android/exoplayer2/Timeline.html index 3b920c7f43..45d4c5a057 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Timeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Timeline.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":6,"i3":10,"i4":10,"i5":10,"i6":10,"i7":6,"i8":10,"i9":6,"i10":10,"i11":10,"i12":10,"i13":6,"i14":10,"i15":42,"i16":6,"i17":6,"i18":10,"i19":10,"i20":10,"i21":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":6,"i3":10,"i4":10,"i5":10,"i6":10,"i7":6,"i8":10,"i9":6,"i10":10,"i11":10,"i12":10,"i13":6,"i14":10,"i15":6,"i16":6,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -134,7 +134,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Direct Known Subclasses:
    -
    AbstractConcatenatedTimeline, FakeTimeline, ForwardingTimeline, MaskingMediaSource.PlaceholderTimeline, SinglePeriodTimeline
    +
    AbstractConcatenatedTimeline, FakeTimeline, ForwardingTimeline, MaskingMediaSource.PlaceholderTimeline, SinglePeriodTimeline, Timeline.RemotableTimeline

    public abstract class Timeline
    @@ -161,7 +161,7 @@ implements Single media file or on-demand stream
    + 

    Single media file or on-demand stream

    Example timeline for a
  single file @@ -171,7 +171,7 @@ implements Example timeline for a
  playlist of files @@ -182,7 +182,7 @@ implements Live stream with limited availability +

    Live stream with limited availability

    Example timeline for
  a live stream with limited availability @@ -195,7 +195,7 @@ implements Example timeline
  for a live stream with indefinite availability @@ -204,7 +204,7 @@ implements Live stream with multiple periods +

    Live stream with multiple periods

    Example timeline
  for a live stream with multiple periods @@ -214,7 +214,7 @@ implements Example timeline for an
  on-demand stream followed by a live stream @@ -224,7 +224,7 @@ implements On-demand stream with mid-roll ads +

    On-demand stream with mid-roll ads

    Example
  timeline for an on-demand stream with mid-roll ad groups @@ -260,6 +260,13 @@ implements static class  +Timeline.RemotableTimeline + +

    A concrete class of Timeline to restore a Timeline instance from a Bundle sent by another process via IBinder.
    + + + +static class  Timeline.Window
    Holds information about a window in a Timeline.
    @@ -337,7 +344,7 @@ implements -All Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods  +All Methods Instance Methods Abstract Methods Concrete Methods  Modifier and Type Method @@ -473,17 +480,6 @@ implements -Timeline.Window -getWindow​(int windowIndex, - Timeline.Window window, - boolean setTag) - -
    Deprecated. - -
    - - - abstract Timeline.Window getWindow​(int windowIndex, Timeline.Window window, @@ -492,26 +488,26 @@ implements Populates a Timeline.Window with data for the window at the specified index. - + abstract int getWindowCount()
    Returns the number of windows in the timeline.
    - + int hashCode()   - + boolean isEmpty()
    Returns whether the timeline is empty.
    - + boolean isLastPeriod​(int periodIndex, Timeline.Period period, @@ -523,13 +519,17 @@ implements + Bundle toBundle()
    Returns a Bundle representing the information stored in this object.
    + +Bundle +toBundle​(boolean excludeMediaItems) +
    adjusts its state and position to the seek. - - - -
      -
    • -

      onMetadata

      -
      public final void onMetadata​(Metadata metadata)
      -
      Called when there is metadata associated with current playback time.
      -
      -
      Specified by:
      -
      onMetadata in interface MetadataOutput
      -
      Specified by:
      -
      onMetadata in interface Player.Listener
      -
      Parameters:
      -
      metadata - The metadata.
      -
      -
    • -
    @@ -1100,7 +1118,7 @@ public void release()

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    @@ -1124,7 +1142,7 @@ public void release()

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    @@ -1395,7 +1413,7 @@ public void release()

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    @@ -1532,7 +1550,7 @@ public void release()

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    @@ -1688,28 +1706,12 @@ public void release()
    • onStaticMetadataChanged

      -
      public final void onStaticMetadataChanged​(List<Metadata> metadataList)
      -
      Description copied from interface: Player.EventListener
      -
      Called when the static metadata changes. - -

      The provided metadataList is an immutable list of Metadata instances, - where the elements correspond to the current track - selections, or an empty list if there are no track selections or the selected tracks contain - no static metadata. - -

      The metadata is considered static in the sense that it comes from the tracks' declared - Formats, rather than being timed (or dynamic) metadata, which is represented within a - metadata track. - -

      Player.EventListener.onEvents(Player, Events) will also be called to report this event along with - other events that happen in the same Looper message queue iteration.

      +
      @Deprecated
      +public final void onStaticMetadataChanged​(List<Metadata> metadataList)
      +
      Deprecated.
      Specified by:
      onStaticMetadataChanged in interface Player.EventListener
      -
      Specified by:
      -
      onStaticMetadataChanged in interface Player.Listener
      -
      Parameters:
      -
      metadataList - The static metadata.
    @@ -1735,6 +1737,29 @@ public void release()
    + + + + @@ -1757,7 +1782,7 @@ public void release()
  • onPlaybackStateChanged

    public final void onPlaybackStateChanged​(@State
    -                                         int state)
    + int playbackState)
    Description copied from interface: Player.EventListener
    Called when the value returned from Player.getPlaybackState() changes. @@ -1769,7 +1794,7 @@ public void release()
    Specified by:
    onPlaybackStateChanged in interface Player.Listener
    Parameters:
    -
    state - The new playback state.
    +
    playbackState - The new playback state.
  • @@ -1888,24 +1913,27 @@ public void release()
    - +
    + + + + + + + + + + + + @@ -1978,8 +2071,8 @@ public void release()
    Called when the combined MediaMetadata changes.

    The provided MediaMetadata is a combination of the MediaItem.mediaMetadata - and the static and dynamic metadata sourced from Player.EventListener.onStaticMetadataChanged(List) and - MetadataOutput.onMetadata(Metadata). + and the static and dynamic metadata from the track + selections' formats and MetadataOutput.onMetadata(Metadata).

    Player.EventListener.onEvents(Player, Events) will also be called to report this event along with other events that happen in the same Looper message queue iteration.

    @@ -1993,6 +2086,42 @@ public void release()
    + + + + + + + + @@ -2013,8 +2142,8 @@ public void release()
  • onBandwidthSample

    public final void onBandwidthSample​(int elapsedMs,
    -                                    long bytes,
    -                                    long bitrate)
    + long bytesTransferred, + long bitrateEstimate)
    Description copied from interface: BandwidthMeter.EventListener
    Called periodically to indicate that bytes have been transferred or the estimated bitrate has changed. @@ -2028,8 +2157,8 @@ public void release()
    elapsedMs - The time taken to transfer bytesTransferred, in milliseconds. This is at most the elapsed time since the last callback, but may be less if there were periods during which data was not being transferred.
    -
    bytes - The number of bytes transferred since the last callback.
    -
    bitrate - The estimated bitrate in bits/sec.
    +
    bytesTransferred - The number of bytes transferred since the last callback.
    +
    bitrateEstimate - The estimated bitrate in bits/sec.
  • @@ -2092,7 +2221,7 @@ public void release()

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error and continue. Hence applications should not implement this method to display a user visible error or initiate an application - level retry (Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such + level retry (Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior). This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/analytics/AnalyticsListener.Events.html b/docs/doc/reference/com/google/android/exoplayer2/analytics/AnalyticsListener.Events.html index ba491abe23..1dc95dc465 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/analytics/AnalyticsListener.Events.html +++ b/docs/doc/reference/com/google/android/exoplayer2/analytics/AnalyticsListener.Events.html @@ -156,7 +156,7 @@ extends Description -Events​(ExoFlags flags, +Events​(FlagSet flags, SparseArray<AnalyticsListener.EventTime> eventTimes)
    Creates an instance.
    @@ -239,18 +239,18 @@ extends

    Constructor Detail

    - +
    + + + + + + + + + + + + + + + + @@ -2205,6 +2360,55 @@ default void onSeekProcessed​( + + +
      +
    • +

      onSeekBackIncrementChanged

      +
      default void onSeekBackIncrementChanged​(AnalyticsListener.EventTime eventTime,
      +                                        long seekBackIncrementMs)
      +
      Called when the seek back increment changed.
      +
      +
      Parameters:
      +
      eventTime - The event time.
      +
      seekBackIncrementMs - The seek back increment, in milliseconds.
      +
      +
    • +
    + + + +
      +
    • +

      onSeekForwardIncrementChanged

      +
      default void onSeekForwardIncrementChanged​(AnalyticsListener.EventTime eventTime,
      +                                           long seekForwardIncrementMs)
      +
      Called when the seek forward increment changed.
      +
      +
      Parameters:
      +
      eventTime - The event time.
      +
      seekForwardIncrementMs - The seek forward increment, in milliseconds.
      +
      +
    • +
    + + + +
      +
    • +

      onMaxSeekToPreviousPositionChanged

      +
      default void onMaxSeekToPreviousPositionChanged​(AnalyticsListener.EventTime eventTime,
      +                                                int maxSeekToPreviousPositionMs)
      +
      Called when the maximum position for which Player.seekToPrevious() seeks to the + previous window changes.
      +
      +
      Parameters:
      +
      eventTime - The event time.
      +
      maxSeekToPreviousPositionMs - The maximum seek to previous position, in milliseconds.
      +
      +
    • +
    @@ -2268,15 +2472,33 @@ default void onLoadingChanged​( + + + +
      +
    • +

      onAvailableCommandsChanged

      +
      default void onAvailableCommandsChanged​(AnalyticsListener.EventTime eventTime,
      +                                        Player.Commands availableCommands)
      +
      Called when the player's available commands changed.
      +
      +
      Parameters:
      +
      eventTime - The event time.
      +
      availableCommands - The available commands.
      +
      +
    • +
    + @@ -2337,7 +2551,8 @@ default void onLoadingChanged​(Called when the combined MediaMetadata changes.

    The provided MediaMetadata is a combination of the MediaItem.mediaMetadata - and the static and dynamic metadata sourced from Player.Listener.onStaticMetadataChanged(List) and MetadataOutput.onMetadata(Metadata). + and the static and dynamic metadata from the track + selections' formats and MetadataOutput.onMetadata(Metadata).

    Parameters:
    eventTime - The event time.
    @@ -2345,6 +2560,22 @@ default void onLoadingChanged​( + + + @@ -2415,7 +2646,7 @@ default void onLoadingChanged​(Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -2567,13 +2798,13 @@ default void onDecoderDisabled​(

    onAudioEnabled

    default void onAudioEnabled​(AnalyticsListener.EventTime eventTime,
    -                            DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Called when an audio renderer is enabled.
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that will be updated by the renderer for as long as it - remains enabled.
    +
    decoderCounters - DecoderCounters that will be updated by the renderer for as long + as it remains enabled.
    @@ -2710,12 +2941,12 @@ default void onAudioInputFormatChanged​(

    onAudioDisabled

    default void onAudioDisabled​(AnalyticsListener.EventTime eventTime,
    -                             DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Called when an audio renderer is disabled.
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that were updated by the renderer.
    +
    decoderCounters - DecoderCounters that were updated by the renderer.
    @@ -2780,7 +3011,7 @@ default void onAudioInputFormatChanged​(Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -2803,7 +3034,7 @@ default void onAudioInputFormatChanged​(Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -2837,13 +3068,13 @@ default void onAudioInputFormatChanged​(

    onVideoEnabled

    default void onVideoEnabled​(AnalyticsListener.EventTime eventTime,
    -                            DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Called when a video renderer is enabled.
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that will be updated by the renderer for as long as it - remains enabled.
    +
    decoderCounters - DecoderCounters that will be updated by the renderer for as long + as it remains enabled.
    @@ -2961,12 +3192,12 @@ default void onVideoInputFormatChanged​(

    onVideoDisabled

    default void onVideoDisabled​(AnalyticsListener.EventTime eventTime,
    -                             DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Called when a video renderer is disabled.
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that were updated by the renderer.
    +
    decoderCounters - DecoderCounters that were updated by the renderer.
    @@ -3009,7 +3240,7 @@ default void onVideoInputFormatChanged​(Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -3151,7 +3382,7 @@ default void onDrmSessionAcquired​(Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/analytics/PlaybackStatsListener.html b/docs/doc/reference/com/google/android/exoplayer2/analytics/PlaybackStatsListener.html index 037acf1a8c..f2a47b0391 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/analytics/PlaybackStatsListener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/analytics/PlaybackStatsListener.html @@ -193,7 +193,7 @@ implements AnalyticsListener -EVENT_AUDIO_ATTRIBUTES_CHANGED, EVENT_AUDIO_CODEC_ERROR, EVENT_AUDIO_DECODER_INITIALIZED, EVENT_AUDIO_DECODER_RELEASED, EVENT_AUDIO_DISABLED, EVENT_AUDIO_ENABLED, EVENT_AUDIO_INPUT_FORMAT_CHANGED, EVENT_AUDIO_POSITION_ADVANCING, EVENT_AUDIO_SESSION_ID, EVENT_AUDIO_SINK_ERROR, EVENT_AUDIO_UNDERRUN, EVENT_BANDWIDTH_ESTIMATE, EVENT_DOWNSTREAM_FORMAT_CHANGED, EVENT_DRM_KEYS_LOADED, EVENT_DRM_KEYS_REMOVED, EVENT_DRM_KEYS_RESTORED, EVENT_DRM_SESSION_ACQUIRED, EVENT_DRM_SESSION_MANAGER_ERROR, EVENT_DRM_SESSION_RELEASED, EVENT_DROPPED_VIDEO_FRAMES, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_LOAD_CANCELED, EVENT_LOAD_COMPLETED, EVENT_LOAD_ERROR, EVENT_LOAD_STARTED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_METADATA, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYER_RELEASED, EVENT_POSITION_DISCONTINUITY, EVENT_RENDERED_FIRST_FRAME, EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_SKIP_SILENCE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_SURFACE_SIZE_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, EVENT_UPSTREAM_DISCARDED, EVENT_VIDEO_CODEC_ERROR, EVENT_VIDEO_DECODER_INITIALIZED, EVENT_VIDEO_DECODER_RELEASED, EVENT_VIDEO_DISABLED, EVENT_VIDEO_ENABLED, EVENT_VIDEO_FRAME_PROCESSING_OFFSET, EVENT_VIDEO_INPUT_FORMAT_CHANGED, EVENT_VIDEO_SIZE_CHANGED, EVENT_VOLUME_CHANGED +EVENT_AUDIO_ATTRIBUTES_CHANGED, EVENT_AUDIO_CODEC_ERROR, EVENT_AUDIO_DECODER_INITIALIZED, EVENT_AUDIO_DECODER_RELEASED, EVENT_AUDIO_DISABLED, EVENT_AUDIO_ENABLED, EVENT_AUDIO_INPUT_FORMAT_CHANGED, EVENT_AUDIO_POSITION_ADVANCING, EVENT_AUDIO_SESSION_ID, EVENT_AUDIO_SINK_ERROR, EVENT_AUDIO_UNDERRUN, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_BANDWIDTH_ESTIMATE, EVENT_DOWNSTREAM_FORMAT_CHANGED, EVENT_DRM_KEYS_LOADED, EVENT_DRM_KEYS_REMOVED, EVENT_DRM_KEYS_RESTORED, EVENT_DRM_SESSION_ACQUIRED, EVENT_DRM_SESSION_MANAGER_ERROR, EVENT_DRM_SESSION_RELEASED, EVENT_DROPPED_VIDEO_FRAMES, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_LOAD_CANCELED, EVENT_LOAD_COMPLETED, EVENT_LOAD_ERROR, EVENT_LOAD_STARTED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_METADATA, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYER_RELEASED, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_RENDERED_FIRST_FRAME, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_SKIP_SILENCE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_SURFACE_SIZE_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, EVENT_UPSTREAM_DISCARDED, EVENT_VIDEO_CODEC_ERROR, EVENT_VIDEO_DECODER_INITIALIZED, EVENT_VIDEO_DECODER_RELEASED, EVENT_VIDEO_DISABLED, EVENT_VIDEO_ENABLED, EVENT_VIDEO_FRAME_PROCESSING_OFFSET, EVENT_VIDEO_INPUT_FORMAT_CHANGED, EVENT_VIDEO_SIZE_CHANGED, EVENT_VOLUME_CHANGED @@ -255,8 +255,8 @@ implements void onAdPlaybackStarted​(AnalyticsListener.EventTime eventTime, - String contentSession, - String adSession) + String contentSessionId, + String adSessionId)
    Called when a session is interrupted by ad playback.
    @@ -318,8 +318,8 @@ implements void onPositionDiscontinuity​(AnalyticsListener.EventTime eventTime, - Player.PositionInfo oldPositionInfo, - Player.PositionInfo newPositionInfo, + Player.PositionInfo oldPosition, + Player.PositionInfo newPosition, int reason)
    Called when a position discontinuity occurred.
    @@ -328,7 +328,7 @@ implements void onSessionActive​(AnalyticsListener.EventTime eventTime, - String session) + String sessionId)
    Called when a session becomes active, i.e.
    @@ -336,7 +336,7 @@ implements void onSessionCreated​(AnalyticsListener.EventTime eventTime, - String session) + String sessionId)
    Called when a new session is created as a result of PlaybackSessionManager.updateSessions(EventTime).
    @@ -344,8 +344,8 @@ implements void onSessionFinished​(AnalyticsListener.EventTime eventTime, - String session, - boolean automaticTransition) + String sessionId, + boolean automaticTransitionToNextPlayback)
    Called when a session is permanently finished.
    @@ -372,7 +372,7 @@ implements AnalyticsListener -onAudioAttributesChanged, onAudioCodecError, onAudioDecoderInitialized, onAudioDecoderInitialized, onAudioDecoderReleased, onAudioDisabled, onAudioEnabled, onAudioInputFormatChanged, onAudioInputFormatChanged, onAudioPositionAdvancing, onAudioSessionIdChanged, onAudioSinkError, onAudioUnderrun, onDecoderDisabled, onDecoderEnabled, onDecoderInitialized, onDecoderInputFormatChanged, onDrmKeysLoaded, onDrmKeysRemoved, onDrmKeysRestored, onDrmSessionAcquired, onDrmSessionAcquired, onDrmSessionReleased, onIsLoadingChanged, onIsPlayingChanged, onLoadCanceled, onLoadCompleted, onLoadingChanged, onLoadStarted, onMediaItemTransition, onMediaMetadataChanged, onMetadata, onPlaybackParametersChanged, onPlaybackStateChanged, onPlaybackSuppressionReasonChanged, onPlayerError, onPlayerReleased, onPlayerStateChanged, onPlayWhenReadyChanged, onPositionDiscontinuity, onRenderedFirstFrame, onRepeatModeChanged, onSeekProcessed, onSeekStarted, onShuffleModeChanged, onSkipSilenceEnabledChanged, onStaticMetadataChanged, onSurfaceSizeChanged, onTimelineChanged, onTracksChanged, onUpstreamDiscarded, onVideoCodecError, onVideoDecoderInitialized, onVideoDecoderInitialized, onVideoDecoderReleased, onVideoDisabled, onVideoEnabled, onVideoFrameProcessingOffset, onVideoInputFormatChanged, onVideoInputFormatChanged, onVideoSizeChanged, onVolumeChanged +onAudioAttributesChanged, onAudioCodecError, onAudioDecoderInitialized, onAudioDecoderInitialized, onAudioDecoderReleased, onAudioDisabled, onAudioEnabled, onAudioInputFormatChanged, onAudioInputFormatChanged, onAudioPositionAdvancing, onAudioSessionIdChanged, onAudioSinkError, onAudioUnderrun, onAvailableCommandsChanged, onDecoderDisabled, onDecoderEnabled, onDecoderInitialized, onDecoderInputFormatChanged, onDrmKeysLoaded, onDrmKeysRemoved, onDrmKeysRestored, onDrmSessionAcquired, onDrmSessionAcquired, onDrmSessionReleased, onIsLoadingChanged, onIsPlayingChanged, onLoadCanceled, onLoadCompleted, onLoadingChanged, onLoadStarted, onMaxSeekToPreviousPositionChanged, onMediaItemTransition, onMediaMetadataChanged, onMetadata, onPlaybackParametersChanged, onPlaybackStateChanged, onPlaybackSuppressionReasonChanged, onPlayerError, onPlayerReleased, onPlayerStateChanged, onPlaylistMetadataChanged, onPlayWhenReadyChanged, onPositionDiscontinuity, onRenderedFirstFrame, onRepeatModeChanged, onSeekBackIncrementChanged, onSeekForwardIncrementChanged, onSeekProcessed, onSeekStarted, onShuffleModeChanged, onSkipSilenceEnabledChanged, onStaticMetadataChanged, onSurfaceSizeChanged, onTimelineChanged, onTracksChanged, onUpstreamDiscarded, onVideoCodecError, onVideoDecoderInitialized, onVideoDecoderInitialized, onVideoDecoderReleased, onVideoDisabled, onVideoEnabled, onVideoFrameProcessingOffset, onVideoInputFormatChanged, onVideoInputFormatChanged, onVideoSizeChanged, onVolumeChanged @@ -458,7 +458,7 @@ public 

    onSessionCreated

    public void onSessionCreated​(AnalyticsListener.EventTime eventTime,
    -                             String session)
    + String sessionId)
    Description copied from interface: PlaybackSessionManager.Listener
    Called when a new session is created as a result of PlaybackSessionManager.updateSessions(EventTime).
    @@ -466,7 +466,7 @@ public onSessionCreated in interface PlaybackSessionManager.Listener
    Parameters:
    eventTime - The AnalyticsListener.EventTime at which the session is created.
    -
    session - The identifier of the new session.
    +
    sessionId - The identifier of the new session.
    @@ -477,7 +477,7 @@ public 

    onSessionActive

    public void onSessionActive​(AnalyticsListener.EventTime eventTime,
    -                            String session)
    + String sessionId)
    Description copied from interface: PlaybackSessionManager.Listener
    Called when a session becomes active, i.e. playing in the foreground.
    @@ -485,7 +485,7 @@ public onSessionActive in interface PlaybackSessionManager.Listener
    Parameters:
    eventTime - The AnalyticsListener.EventTime at which the session becomes active.
    -
    session - The identifier of the session.
    +
    sessionId - The identifier of the session.
    @@ -496,8 +496,8 @@ public 

    onAdPlaybackStarted

    public void onAdPlaybackStarted​(AnalyticsListener.EventTime eventTime,
    -                                String contentSession,
    -                                String adSession)
    + String contentSessionId, + String adSessionId)
    Description copied from interface: PlaybackSessionManager.Listener
    Called when a session is interrupted by ad playback.
    @@ -505,8 +505,8 @@ public onAdPlaybackStarted in interface PlaybackSessionManager.Listener
    Parameters:
    eventTime - The AnalyticsListener.EventTime at which the ad playback starts.
    -
    contentSession - The session identifier of the content session.
    -
    adSession - The identifier of the ad session.
    +
    contentSessionId - The session identifier of the content session.
    +
    adSessionId - The identifier of the ad session.
    @@ -517,8 +517,8 @@ public 

    onSessionFinished

    public void onSessionFinished​(AnalyticsListener.EventTime eventTime,
    -                              String session,
    -                              boolean automaticTransition)
    + String sessionId, + boolean automaticTransitionToNextPlayback)
    Description copied from interface: PlaybackSessionManager.Listener
    Called when a session is permanently finished.
    @@ -526,8 +526,8 @@ public onSessionFinished in interface PlaybackSessionManager.Listener
    Parameters:
    eventTime - The AnalyticsListener.EventTime at which the session finished.
    -
    session - The identifier of the finished session.
    -
    automaticTransition - Whether the session finished because of an automatic +
    sessionId - The identifier of the finished session.
    +
    automaticTransitionToNextPlayback - Whether the session finished because of an automatic transition to the next playback item.
    @@ -539,8 +539,8 @@ public 

    onPositionDiscontinuity

    public void onPositionDiscontinuity​(AnalyticsListener.EventTime eventTime,
    -                                    Player.PositionInfo oldPositionInfo,
    -                                    Player.PositionInfo newPositionInfo,
    +                                    Player.PositionInfo oldPosition,
    +                                    Player.PositionInfo newPosition,
                                         @DiscontinuityReason
                                         int reason)
    Description copied from interface: AnalyticsListener
    @@ -550,8 +550,8 @@ public onPositionDiscontinuity in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    oldPositionInfo - The position before the discontinuity.
    -
    newPositionInfo - The position after the discontinuity.
    +
    oldPosition - The position before the discontinuity.
    +
    newPosition - The position after the discontinuity.
    reason - The reason for the position discontinuity.
    @@ -596,7 +596,7 @@ public Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -625,7 +625,7 @@ public Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/Ac3Util.html b/docs/doc/reference/com/google/android/exoplayer2/audio/Ac3Util.html index 59f23c34a5..02a56bf85c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/Ac3Util.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/Ac3Util.html @@ -187,9 +187,9 @@ extends static String -E_AC_3_CODEC_STRING +E_AC3_JOC_CODEC_STRING -
    A non-standard codec string for E-AC-3.
    +
    A non-standard codec string for E-AC3-JOC.
    @@ -328,20 +328,20 @@ extends

    Field Detail

    - +
    • -

      E_AC_3_CODEC_STRING

      -
      public static final String E_AC_3_CODEC_STRING
      -
      A non-standard codec string for E-AC-3. Use of this constant allows for disambiguation between - regular AC-3 ("ec-3") and E-AC-3 ("ec+3") streams from the codec string alone. The standard is - to use "ec-3" for both, as per the MP4RA registered codec - types.
      +

      E_AC3_JOC_CODEC_STRING

      +
      public static final String E_AC3_JOC_CODEC_STRING
      +
      A non-standard codec string for E-AC3-JOC. Use of this constant allows for disambiguation + between regular E-AC3 ("ec-3") and E-AC3-JOC ("ec+3") streams from the codec string alone. The + standard is to use "ec-3" for both, as per the MP4RA + registered codec types.
      See Also:
      -
      Constant Field Values
      +
      Constant Field Values
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.html index cfc52d28dc..9e70641448 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioCapabilitiesReceiver.html @@ -273,8 +273,7 @@ extends register
    public AudioCapabilities register()
    Registers the receiver, meaning it will notify the listener when audio capability changes - occur. The current audio capabilities will be returned. It is important to call - unregister() when the receiver is no longer required.
    + occur. The current audio capabilities will be returned. It is important to call unregister() when the receiver is no longer required.
    Returns:
    The current audio capabilities for the device.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html index 68cdfdb6f1..eecefafcb3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html @@ -253,7 +253,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); void -queueInput​(ByteBuffer buffer) +queueInput​(ByteBuffer inputBuffer)
    Queues audio data between the position and limit of the input buffer for processing.
    @@ -344,7 +344,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • queueInput

      -
      void queueInput​(ByteBuffer buffer)
      +
      void queueInput​(ByteBuffer inputBuffer)
      Queues audio data between the position and limit of the input buffer for processing. buffer must be a direct byte buffer with native byte order. Its contents are treated as read-only. Its position will be advanced by the number of bytes consumed (which may be zero). @@ -352,7 +352,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); previous buffer returned by getOutput().
      Parameters:
      -
      buffer - The input buffer to process.
      +
      inputBuffer - The input buffer to process.
    @@ -363,11 +363,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • queueEndOfStream

    void queueEndOfStream()
    -
    Queues an end of stream signal. After this method has been called, - queueInput(ByteBuffer) may not be called until after the next call to - flush(). Calling getOutput() will return any remaining output data. Multiple - calls may be required to read all of the remaining output data. isEnded() will return - true once all remaining output data has been read.
    +
    Queues an end of stream signal. After this method has been called, queueInput(ByteBuffer) may not be called until after the next call to flush(). + Calling getOutput() will return any remaining output data. Multiple calls may be + required to read all of the remaining output data. isEnded() will return true + once all remaining output data has been read.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioRendererEventListener.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioRendererEventListener.html index 8b7454693e..ac7f66f0c9 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioRendererEventListener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioRendererEventListener.html @@ -430,7 +430,7 @@ default void onAudioInputFormatChanged​(This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -454,7 +454,7 @@ default void onAudioInputFormatChanged​(This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.Listener.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.Listener.html index a48843218b..fcd9bbc413 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.Listener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.Listener.html @@ -320,11 +320,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); The player may be able to recover from the error (for example by recreating the AudioTrack, possibly with different settings) and continue. Hence applications should not implement this method to display a user visible error or initiate an application level retry - (Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior). + (Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior). This method is called to provide the application with an opportunity to log the error if it wishes to do so. -

    Fatal errors that cannot be recovered will be reported wrapped in a ExoPlaybackException by Player.Listener.onPlayerError(ExoPlaybackException). +

    Fatal errors that cannot be recovered will be reported wrapped in a ExoPlaybackException by Player.Listener.onPlayerError(PlaybackException).

    Parameters:
    audioSinkError - The error that occurred. Typically an AudioSink.InitializationException, diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.WriteException.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.WriteException.html index b31f611ddd..75df441db5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.WriteException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.WriteException.html @@ -263,8 +263,7 @@ extends The error value returned from the sink implementation. If the sink writes to a platform - AudioTrack, this will be the error value returned from - AudioTrack.write(byte[], int, int) or AudioTrack.write(ByteBuffer, int, int). + AudioTrack, this will be the error value returned from AudioTrack.write(byte[], int, int) or AudioTrack.write(ByteBuffer, int, int). Otherwise, the meaning of the error code depends on the sink implementation. diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.html index dc2f7c59f1..049db6402d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioSink.html @@ -770,8 +770,8 @@ int getFormatSupport​(void setAudioAttributes​(AudioAttributes audioAttributes)
    Sets attributes for audio playback. If the attributes have changed and if the sink is not configured for use with tunneling, then it is reset and the audio session id is cleared. -

    - If the sink is configured for use with tunneling then the audio attributes are ignored. The + +

    If the sink is configured for use with tunneling then the audio attributes are ignored. The sink is not reset and the audio session id is not cleared. The passed attributes will be used if the sink is later re-configured into non-tunneled mode.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/BaseAudioProcessor.html b/docs/doc/reference/com/google/android/exoplayer2/audio/BaseAudioProcessor.html index faeb9f0f4a..75c47e1b31 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/BaseAudioProcessor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/BaseAudioProcessor.html @@ -465,11 +465,10 @@ implements public final void queueEndOfStream() -
    Queues an end of stream signal. After this method has been called, - AudioProcessor.queueInput(ByteBuffer) may not be called until after the next call to - AudioProcessor.flush(). Calling AudioProcessor.getOutput() will return any remaining output data. Multiple - calls may be required to read all of the remaining output data. AudioProcessor.isEnded() will return - true once all remaining output data has been read.
    +
    Queues an end of stream signal. After this method has been called, AudioProcessor.queueInput(ByteBuffer) may not be called until after the next call to AudioProcessor.flush(). + Calling AudioProcessor.getOutput() will return any remaining output data. Multiple calls may be + required to read all of the remaining output data. AudioProcessor.isEnded() will return true + once all remaining output data has been read.
    Specified by:
    queueEndOfStream in interface AudioProcessor
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html index ec55870677..88fb36940c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html @@ -446,7 +446,7 @@ implements BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation
    • @@ -815,16 +815,15 @@ protected void onPositionDiscontinuity()
      public boolean isReady()
      Whether the renderer is able to immediately render media from the current position. -

      - If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that the - renderer has everything that it needs to continue playback. Returning false indicates that + +

      If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that + the renderer has everything that it needs to continue playback. Returning false indicates that the player should pause until the renderer is ready. -

      - If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that the - renderer is ready for playback to be started. Returning false indicates that it is not. -

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

      + +

      If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that + the renderer is ready for playback to be started. Returning false indicates that it is not. + +

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

      Specified by:
      isReady in interface Renderer
      @@ -943,8 +942,8 @@ protected void onPositionDiscontinuity()
      protected void onStarted()
      Description copied from class: BaseRenderer
      Called when the renderer is started. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Overrides:
      onStarted in class BaseRenderer
      @@ -977,8 +976,8 @@ protected void onPositionDiscontinuity()
      protected void onDisabled()
      Description copied from class: BaseRenderer
      Called when the renderer is disabled. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Overrides:
      onDisabled in class BaseRenderer
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioSink.html b/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioSink.html index 438f495204..536ea3dffe 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioSink.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioSink.html @@ -270,13 +270,20 @@ implements static int +OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED + +
      The audio sink will prefer offload playback, disabling gapless offload support.
      + + + +static int OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED
      The audio sink will prefer offload playback even if this might result in silence gaps between tracks.
      - + static int OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED @@ -676,6 +683,23 @@ implements + + +
        +
      • +

        OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED

        +
        public static final int OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
        +
        The audio sink will prefer offload playback, disabling gapless offload support. + +

        Use this option if gapless has undesirable side effects. For example if it introduces + hardware issues.

        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
      @@ -685,8 +709,8 @@ implements Whether to throw an DefaultAudioSink.InvalidAudioTrackTimestampException when a spurious timestamp is reported from AudioTrack.getTimestamp(android.media.AudioTimestamp). -

      - The flag must be set before creating a player. Should be set to true for testing and + +

      The flag must be set before creating a player. Should be set to true for testing and debugging purposes only.

    @@ -1082,8 +1106,8 @@ public int getFormatSupport​(Description copied from interface: AudioSink
    Sets attributes for audio playback. If the attributes have changed and if the sink is not configured for use with tunneling, then it is reset and the audio session id is cleared. -

    - If the sink is configured for use with tunneling then the audio attributes are ignored. The + +

    If the sink is configured for use with tunneling then the audio attributes are ignored. The sink is not reset and the audio session id is not cleared. The passed attributes will be used if the sink is later re-configured into non-tunneled mode.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/ForwardingAudioSink.html b/docs/doc/reference/com/google/android/exoplayer2/audio/ForwardingAudioSink.html index ad81dc23be..b4e9d3044a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/ForwardingAudioSink.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/ForwardingAudioSink.html @@ -733,8 +733,8 @@ public int getFormatSupport​(Description copied from interface: AudioSink
    Sets attributes for audio playback. If the attributes have changed and if the sink is not configured for use with tunneling, then it is reset and the audio session id is cleared. -

    - If the sink is configured for use with tunneling then the audio attributes are ignored. The + +

    If the sink is configured for use with tunneling then the audio attributes are ignored. The sink is not reset and the audio session id is not cleared. The passed attributes will be used if the sink is later re-configured into non-tunneled mode.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.html index 487dba630d..e05758282c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.html @@ -589,14 +589,14 @@ implements MediaCodecRenderer -createDecoderException, experimentalSetAsynchronousBufferQueueingEnabled, experimentalSetForceAsyncQueueingSynchronizationWorkaround, experimentalSetSkipAndContinueIfSampleTooLarge, experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled, flushOrReinitializeCodec, flushOrReleaseCodec, getCodec, getCodecInfo, getCodecNeedsEosPropagation, getCodecOperatingRate, getCodecOutputMediaFormat, getOutputStreamOffsetUs, getPlaybackSpeed, handleInputBufferSupplementalData, legacyKeepAvailableCodecInfosWithoutCodec, maybeInitCodecOrBypass, onProcessedOutputBuffer, onStreamChanged, releaseCodec, render, resetCodecStateForFlush, resetCodecStateForRelease, setPendingOutputEndOfStream, setPendingPlaybackException, setPlaybackSpeed, setRenderTimeLimitMs, shouldInitCodec, supportsFormat, supportsFormatDrm, supportsMixedMimeTypeAdaptation, updateCodecOperatingRate, updateOutputFormatForTime +createDecoderException, experimentalSetAsynchronousBufferQueueingEnabled, experimentalSetForceAsyncQueueingSynchronizationWorkaround, experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled, flushOrReinitializeCodec, flushOrReleaseCodec, getCodec, getCodecInfo, getCodecNeedsEosPropagation, getCodecOperatingRate, getCodecOutputMediaFormat, getOutputStreamOffsetUs, getPlaybackSpeed, handleInputBufferSupplementalData, maybeInitCodecOrBypass, onProcessedOutputBuffer, onStreamChanged, releaseCodec, render, resetCodecStateForFlush, resetCodecStateForRelease, setPendingOutputEndOfStream, setPendingPlaybackException, setPlaybackSpeed, setRenderTimeLimitMs, shouldInitCodec, supportsFormat, supportsFormatDrm, supportsMixedMimeTypeAdaptation, updateCodecOperatingRate, updateOutputFormatForTime diff --git a/docs/doc/reference/com/google/android/exoplayer2/decoder/DecoderCounters.html b/docs/doc/reference/com/google/android/exoplayer2/decoder/DecoderCounters.html index f5f09e949b..5141097f13 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/decoder/DecoderCounters.html +++ b/docs/doc/reference/com/google/android/exoplayer2/decoder/DecoderCounters.html @@ -356,8 +356,8 @@ extends skippedInputBufferCount
    public int skippedInputBufferCount
    The number of skipped input buffers. -

    - A skipped input buffer is an input buffer that was deliberately not sent to the decoder.

    + +

    A skipped input buffer is an input buffer that was deliberately not sent to the decoder. @@ -378,8 +378,8 @@ extends skippedOutputBufferCount

    public int skippedOutputBufferCount
    The number of skipped output buffers. -

    - A skipped output buffer is an output buffer that was deliberately not rendered.

    + +

    A skipped output buffer is an output buffer that was deliberately not rendered. @@ -390,8 +390,8 @@ extends droppedBufferCount

    public int droppedBufferCount
    The number of dropped buffers. -

    - A dropped buffer is an buffer that was supposed to be decoded/rendered, but was instead + +

    A dropped buffer is an buffer that was supposed to be decoded/rendered, but was instead dropped because it could not be rendered in time.

    @@ -403,8 +403,8 @@ extends
    maxConsecutiveDroppedBufferCount
    public int maxConsecutiveDroppedBufferCount
    The maximum number of dropped buffers without an interleaving rendered output buffer. -

    - Skipped output buffers are ignored for the purposes of calculating this value.

    + +

    Skipped output buffers are ignored for the purposes of calculating this value. @@ -415,10 +415,10 @@ extends droppedToKeyframeCount

    public int droppedToKeyframeCount
    The number of times all buffers to a keyframe were dropped. -

    - Each time buffers to a keyframe are dropped, this counter is increased by one, and the dropped - buffer counters are increased by one (for the current output buffer) plus the number of buffers - dropped from the source to advance to the keyframe.

    + +

    Each time buffers to a keyframe are dropped, this counter is increased by one, and the + dropped buffer counters are increased by one (for the current output buffer) plus the number of + buffers dropped from the source to advance to the keyframe. diff --git a/docs/doc/reference/com/google/android/exoplayer2/decoder/SimpleDecoder.html b/docs/doc/reference/com/google/android/exoplayer2/decoder/SimpleDecoder.html index 007f2922a0..2426417422 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/decoder/SimpleDecoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/decoder/SimpleDecoder.html @@ -331,8 +331,8 @@ implements protected final void setInitialInputBufferSize​(int size)

    Parameters:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/drm/DrmSession.DrmSessionException.html b/docs/doc/reference/com/google/android/exoplayer2/drm/DrmSession.DrmSessionException.html index b096b30cd1..5378524f58 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/drm/DrmSession.DrmSessionException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/drm/DrmSession.DrmSessionException.html @@ -81,13 +81,13 @@ loadScripts(document, 'script'); @@ -159,6 +159,31 @@ extends @@ -193,7 +193,7 @@ extends Player -COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_VOLUME, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE +COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE @@ -214,7 +214,7 @@ extends CastPlayer​(com.google.android.gms.cast.framework.CastContext castContext) -
    Creates a new cast player that uses a DefaultMediaItemConverter.
    +
    Creates a new cast player.
    @@ -224,6 +224,15 @@ extends Creates a new cast player. + +CastPlayer​(com.google.android.gms.cast.framework.CastContext castContext, + MediaItemConverter mediaItemConverter, + long seekBackIncrementMs, + long seekForwardIncrementMs) + +
    Creates a new cast player.
    + + @@ -243,39 +252,20 @@ extends Description -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -addItems​(int periodId, - com.google.android.gms.cast.MediaQueueItem... items) - -
    Deprecated. - -
    - - - -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -addItems​(com.google.android.gms.cast.MediaQueueItem... items) - -
    Deprecated. - -
    - - - void addListener​(Player.EventListener listener)
    Registers a listener to receive events from the player.
    - + void addListener​(Player.Listener listener)
    Registers a listener to receive all events from the player.
    - + void addMediaItems​(int index, List<MediaItem> mediaItems) @@ -283,49 +273,49 @@ extends Adds a list of media items at the given index of the playlist. - + void clearVideoSurface()
    This method is not supported and does nothing.
    - + void clearVideoSurface​(Surface surface)
    This method is not supported and does nothing.
    - + void clearVideoSurfaceHolder​(SurfaceHolder surfaceHolder)
    This method is not supported and does nothing.
    - + void clearVideoSurfaceView​(SurfaceView surfaceView)
    This method is not supported and does nothing.
    - + void clearVideoTextureView​(TextureView textureView)
    This method is not supported and does nothing.
    - + void decreaseDeviceVolume()
    This method is not supported and does nothing.
    - + Looper getApplicationLooper() @@ -333,21 +323,21 @@ extends + AudioAttributes getAudioAttributes()
    This method is not supported and returns AudioAttributes.DEFAULT.
    - + Player.Commands getAvailableCommands()
    Returns the player's currently available Player.Commands.
    - + long getBufferedPosition() @@ -355,7 +345,7 @@ extends + long getContentBufferedPosition() @@ -363,7 +353,7 @@ extends + long getContentPosition() @@ -371,7 +361,7 @@ extends + int getCurrentAdGroupIndex() @@ -379,28 +369,28 @@ extends + int getCurrentAdIndexInAdGroup()
    If Player.isPlayingAd() returns true, returns the index of the ad in its ad group.
    - + ImmutableList<Cue> getCurrentCues()
    This method is not supported and returns an empty list.
    - + int getCurrentPeriodIndex()
    Returns the index of the period currently being played.
    - + long getCurrentPosition() @@ -409,63 +399,63 @@ extends + ImmutableList<Metadata> getCurrentStaticMetadata() -
    Returns the current static metadata for the track selections.
    +
    Deprecated.
    - + Timeline getCurrentTimeline()
    Returns the current Timeline.
    - + TrackGroupArray getCurrentTrackGroups()
    Returns the available track groups.
    - + TrackSelectionArray getCurrentTrackSelections()
    Returns the current track selections.
    - + int getCurrentWindowIndex()
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    - + DeviceInfo getDeviceInfo()
    This method is not supported and always returns DeviceInfo.UNKNOWN.
    - + int getDeviceVolume()
    This method is not supported and always returns 0.
    - + long getDuration()
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    - + com.google.android.gms.cast.MediaQueueItem getItem​(int periodId) @@ -473,7 +463,15 @@ extends + +int +getMaxSeekToPreviousPosition() + +
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous window, + in milliseconds.
    + + + MediaMetadata getMediaMetadata() @@ -481,21 +479,21 @@ extends + PlaybackParameters getPlaybackParameters()
    Returns the currently active playback parameters.
    - + int getPlaybackState()
    Returns the current playback state of the player.
    - + int getPlaybackSuppressionReason() @@ -503,13 +501,20 @@ extends Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed. - -ExoPlaybackException + +PlaybackException getPlayerError()
    Returns the error that caused playback to fail.
    + +MediaMetadata +getPlaylistMetadata() + +
    Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    + + boolean getPlayWhenReady() @@ -525,102 +530,83 @@ extends +long +getSeekBackIncrement() + +
    Returns the Player.seekBack() increment.
    + + + +long +getSeekForwardIncrement() + +
    Returns the Player.seekForward() increment.
    + + + boolean getShuffleModeEnabled()
    Returns whether shuffling of windows is enabled.
    - + long getTotalBufferedDuration()
    Returns an estimate of the total buffered duration from the current position, in milliseconds.
    - + VideoSize getVideoSize()
    This method is not supported and returns VideoSize.UNKNOWN.
    - + float getVolume()
    This method is not supported and returns 1.
    - + void increaseDeviceVolume()
    This method is not supported and does nothing.
    - + boolean isCastSessionAvailable()
    Returns whether a cast session is available.
    - + boolean isDeviceMuted()
    This method is not supported and always returns false.
    - + boolean isLoading()
    Whether the player is currently loading the source.
    - + boolean isPlayingAd()
    Returns whether the player is currently playing an ad.
    - -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -loadItem​(com.google.android.gms.cast.MediaQueueItem item, - long positionMs) - -
    Deprecated. - -
    - - - -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -loadItems​(com.google.android.gms.cast.MediaQueueItem[] items, - int startIndex, - long positionMs, - int repeatMode) - -
    Deprecated. - -
    - - -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -moveItem​(int periodId, - int newIndex) - -
    Deprecated. - -
    - - - void moveMediaItems​(int fromIndex, int toIndex, @@ -629,44 +615,35 @@ extends Moves the media item range to the new index. - + void prepare()
    Prepares the player.
    - + void release()
    Releases the player.
    - -com.google.android.gms.common.api.PendingResult<com.google.android.gms.cast.framework.media.RemoteMediaClient.MediaChannelResult> -removeItem​(int periodId) - -
    Deprecated. - -
    - - - + void removeListener​(Player.EventListener listener)
    Unregister a listener registered through Player.addListener(EventListener).
    - + void removeListener​(Player.Listener listener)
    Unregister a listener registered through Player.addListener(Listener).
    - + void removeMediaItems​(int fromIndex, int toIndex) @@ -674,7 +651,7 @@ extends Removes a range of media items from the playlist. - + void seekTo​(int windowIndex, long positionMs) @@ -682,21 +659,21 @@ extends Seeks to a position specified in milliseconds in the specified window. - + void setDeviceMuted​(boolean muted)
    This method is not supported and does nothing.
    - + void setDeviceVolume​(int volume)
    This method is not supported and does nothing.
    - + void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) @@ -704,7 +681,7 @@ extends Clears the playlist and adds the specified MediaItems. - + void setMediaItems​(List<MediaItem> mediaItems, int startWindowIndex, @@ -713,77 +690,84 @@ extends Clears the playlist and adds the specified MediaItems. - + void setPlaybackParameters​(PlaybackParameters playbackParameters)
    Attempts to set the playback parameters.
    - + +void +setPlaylistMetadata​(MediaMetadata mediaMetadata) + +
    This method is not supported and does nothing.
    + + + void setPlayWhenReady​(boolean playWhenReady)
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    - + void setRepeatMode​(int repeatMode)
    Sets the Player.RepeatMode to be used for playback.
    - + void setSessionAvailabilityListener​(SessionAvailabilityListener listener)
    Sets a listener for updates on the cast session availability.
    - + void setShuffleModeEnabled​(boolean shuffleModeEnabled)
    Sets whether shuffling of windows is enabled.
    - + void setVideoSurface​(Surface surface)
    This method is not supported and does nothing.
    - + void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder)
    This method is not supported and does nothing.
    - + void setVideoSurfaceView​(SurfaceView surfaceView)
    This method is not supported and does nothing.
    - + void setVideoTextureView​(TextureView textureView)
    This method is not supported and does nothing.
    - + void setVolume​(float audioVolume)
    This method is not supported and does nothing.
    - + void stop​(boolean reset)   @@ -794,7 +778,7 @@ extends BasePlayer -addMediaItem, addMediaItem, addMediaItems, clearMediaItems, getAvailableCommands, getBufferedPercentage, getContentDuration, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getCurrentTag, getMediaItemAt, getMediaItemCount, getNextWindowIndex, getPlaybackError, getPreviousWindowIndex, hasNext, hasPrevious, isCommandAvailable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isPlaying, moveMediaItem, next, pause, play, previous, removeMediaItem, seekTo, seekToDefaultPosition, seekToDefaultPosition, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setPlaybackSpeed, stop +addMediaItem, addMediaItem, addMediaItems, clearMediaItems, getAvailableCommands, getBufferedPercentage, getContentDuration, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getMediaItemAt, getMediaItemCount, getNextWindowIndex, getPreviousWindowIndex, hasNext, hasNextWindow, hasPrevious, hasPreviousWindow, isCommandAvailable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isPlaying, moveMediaItem, next, pause, play, previous, removeMediaItem, seekBack, seekForward, seekTo, seekToDefaultPosition, seekToDefaultPosition, seekToNext, seekToNextWindow, seekToPrevious, seekToPreviousWindow, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setPlaybackSpeed, stop + + + + + + + +
      +
    • +

      setPlaylistMetadata

      +
      public void setPlaylistMetadata​(MediaMetadata mediaMetadata)
      +
      This method is not supported and does nothing.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.html index 3cc3860c38..ed353aae8c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.html @@ -180,14 +180,14 @@ implements MediaItem -toMediaItem​(com.google.android.gms.cast.MediaQueueItem item) +toMediaItem​(com.google.android.gms.cast.MediaQueueItem mediaQueueItem)
    Converts a MediaQueueItem to a MediaItem.
    com.google.android.gms.cast.MediaQueueItem -toMediaQueueItem​(MediaItem item) +toMediaQueueItem​(MediaItem mediaItem)
    Converts a MediaItem to a MediaQueueItem.
    @@ -241,14 +241,14 @@ implements
  • toMediaItem

    -
    public MediaItem toMediaItem​(com.google.android.gms.cast.MediaQueueItem item)
    +
    public MediaItem toMediaItem​(com.google.android.gms.cast.MediaQueueItem mediaQueueItem)
    Description copied from interface: MediaItemConverter
    Converts a MediaQueueItem to a MediaItem.
    Specified by:
    toMediaItem in interface MediaItemConverter
    Parameters:
    -
    item - The MediaQueueItem.
    +
    mediaQueueItem - The MediaQueueItem.
    Returns:
    The equivalent MediaItem.
    @@ -260,14 +260,14 @@ implements
  • toMediaQueueItem

    -
    public com.google.android.gms.cast.MediaQueueItem toMediaQueueItem​(MediaItem item)
    +
    public com.google.android.gms.cast.MediaQueueItem toMediaQueueItem​(MediaItem mediaItem)
    Description copied from interface: MediaItemConverter
    Converts a MediaItem to a MediaQueueItem.
    Specified by:
    toMediaQueueItem in interface MediaItemConverter
    Parameters:
    -
    item - The MediaItem.
    +
    mediaItem - The MediaItem.
    Returns:
    An equivalent MediaQueueItem.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.Factory.html index 84924d24b0..cd11401f07 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.Factory.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":42,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10}; +var data = {"i0":10,"i1":42,"i2":10,"i3":10,"i4":10,"i5":42,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -164,6 +164,15 @@ implements Factory​(CronetEngineWrapper cronetEngineWrapper, Executor executor) +
    Deprecated. +
    Use Factory(CronetEngine, Executor) with an instantiated CronetEngine, or DefaultHttpDataSource for cases where CronetEngineWrapper.getCronetEngine() would have returned null.
    +
    + + + +Factory​(org.chromium.net.CronetEngine cronetEngine, + Executor executor) +
    Creates an instance.
    @@ -226,7 +235,10 @@ implements CronetDataSource.Factory setFallbackFactory​(HttpDataSource.Factory fallbackFactory) -
    Sets the fallback HttpDataSource.Factory that is used as a fallback if the CronetEngineWrapper fails to provide a CronetEngine.
    +
    Deprecated. +
    Do not use CronetDataSource or its factory in cases where a suitable + CronetEngine is not available.
    +
    @@ -239,26 +251,42 @@ implements CronetDataSource.Factory +setKeepPostFor302Redirects​(boolean keepPostFor302Redirects) + +
    Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
    + + + +CronetDataSource.Factory setReadTimeoutMs​(int readTimeoutMs)
    Sets the read timeout, in milliseconds.
    - + +CronetDataSource.Factory +setRequestPriority​(int requestPriority) + +
    Sets the priority of requests made by CronetDataSource instances created by this + factory.
    + + + CronetDataSource.Factory setResetTimeoutOnRedirects​(boolean resetTimeoutOnRedirects)
    Sets whether the connect timeout is reset when a redirect occurs.
    - + CronetDataSource.Factory setTransferListener​(TransferListener transferListener)
    Sets the TransferListener that will be used.
    - + CronetDataSource.Factory setUserAgent​(String userAgent) @@ -289,14 +317,40 @@ implements + + +
      +
    • +

      Factory

      +
      public Factory​(org.chromium.net.CronetEngine cronetEngine,
      +               Executor executor)
      +
      Creates an instance.
      +
      +
      Parameters:
      +
      cronetEngine - A CronetEngine to make the requests. This should not be + a fallback instance obtained from JavaCronetProvider. It's more efficient to use + DefaultHttpDataSource instead in this case.
      +
      executor - The Executor that will handle responses. This + may be a direct executor (i.e. executes tasks on the calling thread) in order to avoid a + thread hop from Cronet's internal network thread to the response handling thread. + However, to avoid slowing down overall network performance, care must be taken to make + sure response handling is a fast operation when using a direct executor.
      +
      +
    • +
    + + + +
      +
    • +

      setRequestPriority

      +
      public CronetDataSource.Factory setRequestPriority​(int requestPriority)
      +
      Sets the priority of requests made by CronetDataSource instances created by this + factory. + +

      The default is UrlRequest.Builder.REQUEST_PRIORITY_MEDIUM.

      +
      +
      Parameters:
      +
      requestPriority - The request priority, which should be one of Cronet's + UrlRequest.Builder#REQUEST_PRIORITY_* constants.
      +
      Returns:
      +
      This factory.
      +
      +
    • +
    @@ -475,6 +549,17 @@ public final 
  • + + + +
      +
    • +

      setKeepPostFor302Redirects

      +
      public CronetDataSource.Factory setKeepPostFor302Redirects​(boolean keepPostFor302Redirects)
      +
      Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
      +
    • +
    @@ -502,8 +587,13 @@ public final 
  • setFallbackFactory

    -
    public CronetDataSource.Factory setFallbackFactory​(@Nullable
    +
    @Deprecated
    +public CronetDataSource.Factory setFallbackFactory​(@Nullable
                                                        HttpDataSource.Factory fallbackFactory)
    +
    Deprecated. +
    Do not use CronetDataSource or its factory in cases where a suitable + CronetEngine is not available. Use the fallback factory directly in such cases.
    +
    Sets the fallback HttpDataSource.Factory that is used as a fallback if the CronetEngineWrapper fails to provide a CronetEngine.

    By default a DefaultHttpDataSource is used as fallback factory.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.OpenException.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.OpenException.html index 936a8396fe..dfdba29ca0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.OpenException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetDataSource.OpenException.html @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • @@ -228,15 +240,43 @@ extends Description +OpenException​(DataSpec dataSpec, + int errorCode, + int cronetConnectionStatus) +  + + OpenException​(IOException cause, DataSpec dataSpec, int cronetConnectionStatus) + + + + + +OpenException​(IOException cause, + DataSpec dataSpec, + int errorCode, + int cronetConnectionStatus)   OpenException​(String errorMessage, DataSpec dataSpec, int cronetConnectionStatus) + + + + + +OpenException​(String errorMessage, + DataSpec dataSpec, + int errorCode, + int cronetConnectionStatus)   @@ -251,6 +291,20 @@ extends

    Method Summary

    + + + + + + -
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -824,7 +868,7 @@ public Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.html index 7f6c49cb20..b7187d77b8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.html @@ -25,12 +25,6 @@ catch(err) { } //--> -var data = {"i0":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; -var altColor = "altColor"; -var rowColor = "rowColor"; -var tableTab = "tableTab"; -var activeTableTab = "activeTableTab"; var pathtoroot = "../../../../../../"; var useModuleDirectories = false; loadScripts(document, 'script'); @@ -86,16 +80,16 @@ loadScripts(document, 'script');
    @@ -129,8 +123,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -138,84 +139,6 @@ extends
    • - -
      - -
      - -
      -
        -
      • - - -

        Field Summary

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Fields 
        Modifier and TypeFieldDescription
        static intSOURCE_GMS -
        Cronet implementation from GMSCore.
        -
        static intSOURCE_NATIVE -
        Natively bundled Cronet implementation.
        -
        static intSOURCE_UNAVAILABLE -
        No Cronet implementation available.
        -
        static intSOURCE_UNKNOWN -
        Other (unknown) Cronet implementation.
        -
        static intSOURCE_USER_PROVIDED -
        User-provided Cronet engine.
        -
        -
      • -
      -
        @@ -232,20 +155,23 @@ extends CronetEngineWrapper​(Context context) +
        Deprecated.
        Creates a wrapper for a CronetEngine built using the most suitable CronetProvider.
        CronetEngineWrapper​(Context context, String userAgent, - boolean preferGMSCoreCronet) + boolean preferGooglePlayServices)
        +
        Deprecated.
        Creates a wrapper for a CronetEngine built using the most suitable CronetProvider.
        CronetEngineWrapper​(org.chromium.net.CronetEngine cronetEngine) +
        Deprecated.
        Creates a wrapper for an existing CronetEngine.
        @@ -260,21 +186,6 @@ extends

        Method Summary

        - - - - - - - - - - - - -
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        intgetCronetEngineSource() -
        Returns the source of the wrapped CronetEngine.
        -
        • @@ -291,86 +202,6 @@ extends
          • - -
            -
              -
            • - - -

              Field Detail

              - - - -
                -
              • -

                SOURCE_NATIVE

                -
                public static final int SOURCE_NATIVE
                -
                Natively bundled Cronet implementation.
                -
                -
                See Also:
                -
                Constant Field Values
                -
                -
              • -
              - - - -
                -
              • -

                SOURCE_GMS

                -
                public static final int SOURCE_GMS
                -
                Cronet implementation from GMSCore.
                -
                -
                See Also:
                -
                Constant Field Values
                -
                -
              • -
              - - - -
                -
              • -

                SOURCE_UNKNOWN

                -
                public static final int SOURCE_UNKNOWN
                -
                Other (unknown) Cronet implementation.
                -
                -
                See Also:
                -
                Constant Field Values
                -
                -
              • -
              - - - -
                -
              • -

                SOURCE_USER_PROVIDED

                -
                public static final int SOURCE_USER_PROVIDED
                -
                User-provided Cronet engine.
                -
                -
                See Also:
                -
                Constant Field Values
                -
                -
              • -
              - - - -
                -
              • -

                SOURCE_UNAVAILABLE

                -
                public static final int SOURCE_UNAVAILABLE
                -
                No Cronet implementation available. Fallback Http provider is used if possible.
                -
                -
                See Also:
                -
                Constant Field Values
                -
                -
              • -
              -
            • -
            -
              @@ -385,6 +216,7 @@ extends

              CronetEngineWrapper

              public CronetEngineWrapper​(Context context)
              +
              Deprecated.
              Creates a wrapper for a CronetEngine built using the most suitable CronetProvider. When natively bundled Cronet and GMSCore Cronet are both available, the natively bundled provider is preferred.
              @@ -402,7 +234,8 @@ extends public CronetEngineWrapper​(Context context, @Nullable String userAgent, - boolean preferGMSCoreCronet) + boolean preferGooglePlayServices) +
              Deprecated.
              Creates a wrapper for a CronetEngine built using the most suitable CronetProvider. When natively bundled Cronet and GMSCore Cronet are both available, preferGMSCoreCronet determines which is preferred.
              @@ -410,8 +243,8 @@ extends context - A context.
    userAgent - A default user agent, or null to use a default user agent of the CronetEngine.
    -
    preferGMSCoreCronet - Whether Cronet from GMSCore should be preferred over natively - bundled Cronet if both are available.
    +
    preferGooglePlayServices - Whether Cronet from Google Play Services should be preferred + over Cronet Embedded, if both are available.
  • @@ -422,6 +255,7 @@ extends

    CronetEngineWrapper

    public CronetEngineWrapper​(org.chromium.net.CronetEngine cronetEngine)
    +
    Deprecated.
    Creates a wrapper for an existing CronetEngine.
    Parameters:
    @@ -432,31 +266,6 @@ extends
    - -
    - -
    @@ -505,16 +314,16 @@ public int getCronetEngineSource()
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetUtil.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetUtil.html new file mode 100644 index 0000000000..ae3a8ee830 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/CronetUtil.html @@ -0,0 +1,287 @@ + + + + +CronetUtil (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class CronetUtil

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.ext.cronet.CronetUtil
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public final class CronetUtil
      +extends Object
      +
      Cronet utility methods.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          buildCronetEngine

          +
          @Nullable
          +public static org.chromium.net.CronetEngine buildCronetEngine​(Context context,
          +                                                              @Nullable
          +                                                              String userAgent,
          +                                                              boolean preferGooglePlayServices)
          +
          Builds a CronetEngine suitable for use with ExoPlayer. When choosing a Cronet provider to build the CronetEngine, disabled providers are not + considered. Neither are fallback providers, since it's more efficient to use DefaultHttpDataSource than it is to use CronetDataSource with a fallback CronetEngine. + +

          Note that it's recommended for applications to create only one instance of CronetEngine, so if your application already has an instance for performing other networking, + then that instance should be used and calling this method is unnecessary. See the Android developer + guide to learn more about using Cronet for network operations.

          +
          +
          Parameters:
          +
          context - A context.
          +
          userAgent - A default user agent, or null to use a default user agent of the + CronetEngine.
          +
          preferGooglePlayServices - Whether Cronet from Google Play Services should be preferred + over Cronet Embedded, if both are available.
          +
          Returns:
          +
          The CronetEngine, or null if no suitable engine could be built.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-summary.html index cf9f6dd956..dd92b5129f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-summary.html @@ -123,8 +123,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); CronetEngineWrapper +Deprecated. +
    Use CronetEngine directly.
    + + + +CronetUtil -
    A wrapper class for a CronetEngine.
    +
    Cronet utility methods.
    @@ -147,23 +153,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -
  • - - - - - - - - - - - - -
    Annotation Types Summary 
    Annotation TypeDescription
    CronetEngineWrapper.CronetEngineSource -
    Source of CronetEngine.
    -
    -
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-tree.html index 73483b20ca..d038641cdb 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-tree.html @@ -110,6 +110,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory (implements com.google.android.exoplayer2.upstream.HttpDataSource.Factory)
  • com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
  • +
  • com.google.android.exoplayer2.ext.cronet.CronetUtil
  • com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory (implements com.google.android.exoplayer2.upstream.HttpDataSource.Factory)
  • + + + +
      +
    • +

      sameAs

      +
      default boolean sameAs​(android.support.v4.media.MediaMetadataCompat oldMetadata,
      +                       android.support.v4.media.MediaMetadataCompat newMetadata)
      +
      Returns whether the old and the new metadata are considered the same.
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html index bcfd4d900a..907cfdb50d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html @@ -352,13 +352,16 @@ extends

    onSkipToPrevious

    void onSkipToPrevious​(Player player,
    +                      @Deprecated
                           ControlDispatcher controlDispatcher)
    See MediaSessionCompat.Callback.onSkipToPrevious().
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    @@ -369,14 +372,17 @@ extends

    onSkipToQueueItem

    void onSkipToQueueItem​(Player player,
    +                       @Deprecated
                            ControlDispatcher controlDispatcher,
                            long id)
    See MediaSessionCompat.Callback.onSkipToQueueItem(long).
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    @@ -387,13 +393,16 @@ extends

    onSkipToNext

    void onSkipToNext​(Player player,
    +                  @Deprecated
                       ControlDispatcher controlDispatcher)
    See MediaSessionCompat.Callback.onSkipToNext().
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html index 240ff9e156..2fbe4eb63f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":42,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":42,"i21":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":42,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -278,24 +278,17 @@ extends static long -ACTION_SET_PLAYBACK_SPEED - -
    Indicates this session supports the set playback speed command.
    - - - -static long ALL_PLAYBACK_ACTIONS   - + static long DEFAULT_PLAYBACK_ACTIONS
    The default playback actions.
    - + static String EXTRAS_SPEED @@ -303,7 +296,7 @@ extends . - + android.support.v4.media.session.MediaSessionCompat mediaSession @@ -390,7 +383,9 @@ extends void setControlDispatcher​(ControlDispatcher controlDispatcher) - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to setPlayer(Player) instead.
    +
    @@ -426,25 +421,24 @@ extends void +setDispatchUnsupportedActionsEnabled​(boolean dispatchUnsupportedActionsEnabled) + +
    Sets whether actions that are not advertised to the MediaSessionCompat will be + dispatched either way.
    + + + +void setEnabledPlaybackActions​(long enabledPlaybackActions)
    Sets the enabled playback actions.
    - -void -setErrorMessageProvider​(ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider) - -
    Sets the optional ErrorMessageProvider.
    - - void -setFastForwardIncrementMs​(int fastForwardMs) +setErrorMessageProvider​(ErrorMessageProvider<? super PlaybackException> errorMessageProvider) - +
    Sets the optional ErrorMessageProvider.
    @@ -463,26 +457,34 @@ extends void +setMetadataDeduplicationEnabled​(boolean metadataDeduplicationEnabled) + +
    Sets whether MediaSessionConnector.MediaMetadataProvider.sameAs(MediaMetadataCompat, MediaMetadataCompat) + should be consulted before calling MediaSessionCompat.setMetadata(MediaMetadataCompat).
    + + + +void setPlaybackPreparer​(MediaSessionConnector.PlaybackPreparer playbackPreparer) - + void setPlayer​(Player player)
    Sets the player to be connected to the media session.
    - + void setQueueEditor​(MediaSessionConnector.QueueEditor queueEditor)
    Sets the MediaSessionConnector.QueueEditor to handle queue edits sent by the media controller.
    - + void setQueueNavigator​(MediaSessionConnector.QueueNavigator queueNavigator) @@ -490,22 +492,13 @@ extends ACTION_SKIP_TO_PREVIOUS and ACTION_SKIP_TO_QUEUE_ITEM. - + void setRatingCallback​(MediaSessionConnector.RatingCallback ratingCallback)
    Sets the MediaSessionConnector.RatingCallback to handle user ratings.
    - -void -setRewindIncrementMs​(int rewindMs) - - - - void unregisterCustomCommandReceiver​(MediaSessionConnector.CommandReceiver commandReceiver) @@ -537,20 +530,6 @@ extends

    Field Detail

    - - - -
      -
    • -

      ACTION_SET_PLAYBACK_SPEED

      -
      public static final long ACTION_SET_PLAYBACK_SPEED
      -
      Indicates this session supports the set playback speed command.
      -
      -
      See Also:
      -
      Constant Field Values
      -
      -
    • -
    @@ -675,12 +654,13 @@ extends
  • setControlDispatcher

    -
    public void setControlDispatcher​(ControlDispatcher controlDispatcher)
    - -
    -
    Parameters:
    -
    controlDispatcher - The ControlDispatcher.
    -
    +
    @Deprecated
    +public void setControlDispatcher​(ControlDispatcher controlDispatcher)
    +
    Deprecated. +
    Use a ForwardingPlayer and pass it to setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    +
  • @@ -722,32 +702,6 @@ extends - - - - - - - - @@ -755,7 +709,7 @@ public void setFastForwardIncrementMs​(int fastForwardMs)

    setErrorMessageProvider

    public void setErrorMessageProvider​(@Nullable
    -                                    ErrorMessageProvider<? super ExoPlaybackException> errorMessageProvider)
    + ErrorMessageProvider<? super PlaybackException> errorMessageProvider)
    Sets the optional ErrorMessageProvider.
    Parameters:
    @@ -913,6 +867,35 @@ public void setFastForwardIncrementMs​(int fastForwardMs) + + + +
      +
    • +

      setDispatchUnsupportedActionsEnabled

      +
      public void setDispatchUnsupportedActionsEnabled​(boolean dispatchUnsupportedActionsEnabled)
      +
      Sets whether actions that are not advertised to the MediaSessionCompat will be + dispatched either way. Default value is false.
      +
    • +
    + + + +
      +
    • +

      setMetadataDeduplicationEnabled

      +
      public void setMetadataDeduplicationEnabled​(boolean metadataDeduplicationEnabled)
      +
      Sets whether MediaSessionConnector.MediaMetadataProvider.sameAs(MediaMetadataCompat, MediaMetadataCompat) + should be consulted before calling MediaSessionCompat.setMetadata(MediaMetadataCompat). + +

      Note that this comparison is normally only required when you are using media sources that + may introduce duplicate updates of the metadata for the same media item (e.g. live streams).

      +
      +
      Parameters:
      +
      metadataDeduplicationEnabled - Whether to deduplicate metadata objects on invalidation.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html index 3f4cd71c3a..32ee306748 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html @@ -330,6 +330,7 @@ public static final int DEFAULT_REPEAT_TOGGLE_MODES
  • onCustomAction

    public void onCustomAction​(Player player,
    +                           @Deprecated
                                ControlDispatcher controlDispatcher,
                                String action,
                                @Nullable
    @@ -341,8 +342,10 @@ public static final int DEFAULT_REPEAT_TOGGLE_MODES
    onCustomAction in interface MediaSessionConnector.CustomActionProvider
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    action - The name of the action which was sent by a media controller.
    extras - Optional extras sent by a media controller, may be null.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.QueueDataAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.QueueDataAdapter.html index b77a67cacb..8eeecc7ba5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.QueueDataAdapter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.QueueDataAdapter.html @@ -127,8 +127,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public static interface TimelineQueueEditor.QueueDataAdapter
    Adapter to get MediaDescriptionCompat of items in the queue and to notify the - application about changes in the queue to sync the data structure backing the - MediaSessionConnector.
    + application about changes in the queue to sync the data structure backing the MediaSessionConnector. diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html index e7e899f10d..d7e91f838e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html @@ -180,8 +180,7 @@ implements TimelineQueueEditor.QueueDataAdapter
    Adapter to get MediaDescriptionCompat of items in the queue and to notify the - application about changes in the queue to sync the data structure backing the - MediaSessionConnector.
    + application about changes in the queue to sync the data structure backing the MediaSessionConnector. @@ -488,6 +487,7 @@ implements

    onCommand

    public boolean onCommand​(Player player,
    +                         @Deprecated
                              ControlDispatcher controlDispatcher,
                              String command,
                              @Nullable
    @@ -496,15 +496,16 @@ implements ResultReceiver cb)
    Description copied from interface: MediaSessionConnector.CommandReceiver
    See MediaSessionCompat.Callback.onCommand(String, Bundle, ResultReceiver). The - receiver may handle the command, but is not required to do so. Changes to the player should - be made via the ControlDispatcher.
    + receiver may handle the command, but is not required to do so.
    Specified by:
    onCommand in interface MediaSessionConnector.CommandReceiver
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    command - The command name.
    extras - Optional parameters for the command, may be null.
    cb - A result receiver to which a result may be sent by the command, may be null.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html index 930f99d023..35b6029880 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html @@ -345,8 +345,8 @@ implements Creates an instance for a given MediaSessionCompat. -

    - Equivalent to TimelineQueueNavigator(mediaSession, DEFAULT_MAX_QUEUE_SIZE). + +

    Equivalent to TimelineQueueNavigator(mediaSession, DEFAULT_MAX_QUEUE_SIZE).

    Parameters:
    mediaSession - The MediaSessionCompat.
    @@ -362,10 +362,10 @@ implements
    Creates an instance for a given MediaSessionCompat and maximum queue size. -

    - If the number of windows in the Player's Timeline exceeds maxQueueSize, - the media session queue will correspond to maxQueueSize windows centered on the one - currently being played. + +

    If the number of windows in the Player's Timeline exceeds + maxQueueSize, the media session queue will correspond to maxQueueSize windows centered + on the one currently being played.

    Parameters:
    mediaSession - The MediaSessionCompat.
    @@ -489,6 +489,7 @@ implements

    onSkipToPrevious

    public void onSkipToPrevious​(Player player,
    +                             @Deprecated
                                  ControlDispatcher controlDispatcher)
    Description copied from interface: MediaSessionConnector.QueueNavigator
    See MediaSessionCompat.Callback.onSkipToPrevious().
    @@ -497,8 +498,10 @@ implements onSkipToPrevious in interface MediaSessionConnector.QueueNavigator
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    @@ -509,6 +512,7 @@ implements

    onSkipToQueueItem

    public void onSkipToQueueItem​(Player player,
    +                              @Deprecated
                                   ControlDispatcher controlDispatcher,
                                   long id)
    Description copied from interface: MediaSessionConnector.QueueNavigator
    @@ -518,8 +522,10 @@ implements onSkipToQueueItem in interface MediaSessionConnector.QueueNavigator
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    @@ -530,6 +536,7 @@ implements

    onSkipToNext

    public void onSkipToNext​(Player player,
    +                         @Deprecated
                              ControlDispatcher controlDispatcher)
    Description copied from interface: MediaSessionConnector.QueueNavigator
    See MediaSessionCompat.Callback.onSkipToNext().
    @@ -538,8 +545,10 @@ implements onSkipToNext in interface MediaSessionConnector.QueueNavigator
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    @@ -550,6 +559,7 @@ implements

    onCommand

    public boolean onCommand​(Player player,
    +                         @Deprecated
                              ControlDispatcher controlDispatcher,
                              String command,
                              @Nullable
    @@ -558,15 +568,16 @@ implements ResultReceiver cb)
    Description copied from interface: MediaSessionConnector.CommandReceiver
    See MediaSessionCompat.Callback.onCommand(String, Bundle, ResultReceiver). The - receiver may handle the command, but is not required to do so. Changes to the player should - be made via the ControlDispatcher.
    + receiver may handle the command, but is not required to do so.
    Specified by:
    onCommand in interface MediaSessionConnector.CommandReceiver
    Parameters:
    player - The player connected to the media session.
    -
    controlDispatcher - A ControlDispatcher that should be used for dispatching - changes to the player.
    +
    controlDispatcher - This parameter is deprecated. Use player instead. Operations + can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or + when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    command - The command name.
    extras - Optional parameters for the command, may be null.
    cb - A result receiver to which a result may be sent by the command, may be null.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/package-summary.html index bb92c438df..2b43dd966c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/package-summary.html @@ -169,8 +169,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); TimelineQueueEditor.QueueDataAdapter
    Adapter to get MediaDescriptionCompat of items in the queue and to notify the - application about changes in the queue to sync the data structure backing the - MediaSessionConnector.
    + application about changes in the queue to sync the data structure backing the MediaSessionConnector. diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.html index 5537fcc790..68fd3ed58c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.html @@ -314,7 +314,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -598,7 +598,7 @@ public public int read​(byte[] buffer, int offset, - int readLength) + int length) throws HttpDataSource.HttpDataSourceException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -615,7 +615,7 @@ public Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was @@ -631,8 +631,7 @@ public 
  • close

    -
    public void close()
    -           throws HttpDataSource.HttpDataSourceException
    +
    public void close()
    Description copied from interface: DataSource
    Closes the source. This method must be called even if the corresponding call to DataSource.open(DataSpec) threw an IOException.
    @@ -640,8 +639,6 @@ public close in interface DataSource
  • Specified by:
    close in interface HttpDataSource
    -
    Throws:
    -
    HttpDataSource.HttpDataSourceException
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.html index becbb9c861..3f3066eeab 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.html @@ -293,7 +293,7 @@ extends BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation @@ -107,91 +113,40 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    - -

    Class VpxOutputBuffer

    + +

    Class RtmpDataSource.Factory

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.html index 57fe4bf285..86edd52298 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.html @@ -154,13 +154,21 @@ extends -
  • - - -

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.upstream.DataSource

    -DataSource.Factory
  • - + + + + + + + + + + + + +
    Nested Classes 
    Modifier and TypeClassDescription
    static class RtmpDataSource.Factory + +
    @@ -224,7 +232,7 @@ extends int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -334,7 +342,7 @@ extends public int read​(byte[] buffer, int offset, - int readLength) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -347,7 +355,7 @@ extends Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSourceFactory.html b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSourceFactory.html index 5b12c976a6..1372689cfd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSourceFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/RtmpDataSourceFactory.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":42}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -133,10 +133,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    DataSource.Factory

    -
    public final class RtmpDataSourceFactory
    +
    @Deprecated
    +public final class RtmpDataSourceFactory
     extends Object
     implements DataSource.Factory
    - +
    Deprecated. + +
    @@ -158,11 +161,15 @@ implements RtmpDataSourceFactory() -  + +
    Deprecated.
    RtmpDataSourceFactory​(TransferListener listener) -  + +
    Deprecated.
    +  @@ -176,7 +183,7 @@ implements -All Methods Instance Methods Concrete Methods  +All Methods Instance Methods Concrete Methods Deprecated Methods  Modifier and Type Method @@ -186,6 +193,7 @@ implements RtmpDataSource createDataSource() +
    Deprecated.
    Creates a DataSource instance.
    @@ -220,6 +228,7 @@ implements

    RtmpDataSourceFactory

    public RtmpDataSourceFactory()
    +
    Deprecated.
    @@ -230,6 +239,7 @@ implements TransferListener listener)
    +
    Deprecated.
    Parameters:
    listener - An optional listener.
    @@ -253,6 +263,7 @@ implements

    createDataSource

    public RtmpDataSource createDataSource()
    +
    Deprecated.
    Description copied from interface: DataSource.Factory
    Creates a DataSource instance.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-summary.html index 0df22e84d5..5fbf1b1b81 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-summary.html @@ -110,9 +110,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -RtmpDataSourceFactory +RtmpDataSource.Factory - + + + + +RtmpDataSourceFactory +Deprecated. + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-tree.html index 033c1f9dd1..32f83f6dc0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/rtmp/package-tree.html @@ -108,6 +108,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.ext.rtmp.RtmpDataSource
  • +
  • com.google.android.exoplayer2.ext.rtmp.RtmpDataSource.Factory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • com.google.android.exoplayer2.ext.rtmp.RtmpDataSourceFactory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • 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 dc5b6d5552..0ed5d79010 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 @@ -324,7 +324,7 @@ extends BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation -
  • com.google.android.exoplayer2.decoder.Buffer - -
  • com.google.android.exoplayer2.decoder.SimpleDecoder<I,​O,​E> (implements com.google.android.exoplayer2.decoder.Decoder<I,​O,​E>) @@ -272,8 +269,7 @@ extends

    encoderPadding

    public int encoderPadding
    -
    +
    The number of samples to trim from the end of the decoded audio stream, or Format.NO_VALUE if not set.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.CryptoData.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.CryptoData.html index 2da524d393..b91d7d0a20 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.CryptoData.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.CryptoData.html @@ -160,8 +160,7 @@ extends int clearBlocks -
    The number of clear blocks in the encryption pattern, 0 if pattern encryption does not - apply.
    +
    The number of clear blocks in the encryption pattern, 0 if pattern encryption does not apply.
    @@ -301,8 +300,7 @@ public final int cryptoMode
  • clearBlocks

    public final int clearBlocks
    -
    The number of clear blocks in the encryption pattern, 0 if pattern encryption does not - apply.
    +
    The number of clear blocks in the encryption pattern, 0 if pattern encryption does not apply.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.html index 01e885ca99..4d059a1a83 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/TrackOutput.html @@ -269,7 +269,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); int flags, int size, int offset, - TrackOutput.CryptoData encryptionData)
    + TrackOutput.CryptoData cryptoData)
    Called when metadata associated with a sample has been extracted from the stream.
    @@ -477,7 +477,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); int size, int offset, @Nullable - TrackOutput.CryptoData encryptionData) + TrackOutput.CryptoData cryptoData)
    Called when metadata associated with a sample has been extracted from the stream.

    The corresponding sample data will have already been passed to the output via calls to @@ -490,7 +490,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    offset - The number of bytes that have been passed to sampleData(DataReader, int, boolean) or sampleData(ParsableByteArray, int) since the last byte belonging to the sample whose metadata is being passed.
    -
    encryptionData - The encryption data required to decrypt the sample. May be null.
    +
    cryptoData - The encryption data required to decrypt the sample. May be null.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/VorbisUtil.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/VorbisUtil.html index 3156c09b10..3b577bb31a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/VorbisUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/VorbisUtil.html @@ -277,8 +277,8 @@ extends Returns:
    ilog(x)
    See Also:
    -
    - Vorbis spec
    +
    Vorbis + spec
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html index 5b494b4ec8..f288a7c4e8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html @@ -259,7 +259,7 @@ implements void -init​(ExtractorOutput extractorOutput) +init​(ExtractorOutput output)
    Initializes the extractor with an ExtractorOutput.
    @@ -419,14 +419,14 @@ implements
  • init

    -
    public void init​(ExtractorOutput extractorOutput)
    +
    public void init​(ExtractorOutput output)
    Description copied from interface: Extractor
    Initializes the extractor with an ExtractorOutput. Called at most once.
    Specified by:
    init in interface Extractor
    Parameters:
    -
    extractorOutput - An ExtractorOutput to receive extracted data.
    +
    output - An ExtractorOutput to receive extracted data.
  • @@ -478,8 +478,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/flac/FlacExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/flac/FlacExtractor.html index 916ac9db27..f3affabfd9 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/flac/FlacExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/flac/FlacExtractor.html @@ -483,8 +483,8 @@ public int read​(Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/flv/FlvExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/flv/FlvExtractor.html index 37ed14e6dc..45e72516a5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/flv/FlvExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/flv/FlvExtractor.html @@ -381,8 +381,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/jpeg/JpegExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/jpeg/JpegExtractor.html index 8dc5a79021..31bbfa20b4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/jpeg/JpegExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/jpeg/JpegExtractor.html @@ -385,8 +385,8 @@ public int read​(Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/EbmlProcessor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/EbmlProcessor.html index 3be56f7ce6..8ecb69e1e4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/EbmlProcessor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/EbmlProcessor.html @@ -450,12 +450,12 @@ int getElementType​(int id) long contentSize) throws ParserException
    Called when the start of a master element is encountered. -

    - Following events should be considered as taking place within this element until a matching call - to endMasterElement(int) is made. -

    - Note that it is possible for another master element of the same element ID to be nested within - itself.

    + +

    Following events should be considered as taking place within this element until a matching + call to endMasterElement(int) is made. + +

    Note that it is possible for another master element of the same element ID to be nested + within itself.

    Parameters:
    id - The element ID.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.html index 1c696bef1b..c2710b8d64 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.html @@ -411,8 +411,8 @@ implements Flag to disable seeking for cues. -

    - Normally (i.e. when this flag is not set) the extractor will seek to the cues element if its + +

    Normally (i.e. when this flag is not set) the extractor will seek to the cues element if its position is specified in the seek head and if it's after the first cluster. Setting this flag disables seeking to the cues element. If the cues element is after the first cluster then the media is treated as being unseekable. @@ -515,8 +515,8 @@ public void seek​(long position, long timeUs)

    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.html index c2f1f0f75d..d666de8860 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.html @@ -452,8 +452,7 @@ implements Parameters:
    flags - Flags that control the extractor's behavior.
    -
    forcedFirstSampleTimestampUs - A timestamp to force for the first sample, or - C.TIME_UNSET if forcing is not required.
    +
    forcedFirstSampleTimestampUs - A timestamp to force for the first sample, or C.TIME_UNSET if forcing is not required.
    @@ -520,8 +519,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.html index f3656ae342..82ecce5263 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.html @@ -387,8 +387,8 @@ implements Flag to work around an issue in some video streams where every frame is marked as a sync frame. The workaround overrides the sync frame flags in the stream, forcing them to false except for the first sample in each segment. -

    - This flag does nothing if the stream is not a video stream. + +

    This flag does nothing if the stream is not a video stream.

    See Also:
    Constant Field Values
    @@ -625,8 +625,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.html index 02a15a9a2b..1fcd5f502c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.html @@ -520,8 +520,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtil.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtil.html index 404a363bcc..cb056d2749 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/mp4/PsshAtomUtil.html @@ -307,8 +307,8 @@ public static public static int parseVersion​(byte[] atom)
    Parses the version from a PSSH atom. Version 0 and 1 PSSH atoms are supported. -

    - The version is only parsed if the data is a valid PSSH atom.

    + +

    The version is only parsed if the data is a valid PSSH atom.

    Parameters:
    atom - The atom to parse.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ogg/OggExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ogg/OggExtractor.html index 945dfd8908..7ce17f418b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ogg/OggExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ogg/OggExtractor.html @@ -381,8 +381,8 @@ implements
    Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractor.html index 3d44f0b914..5a902b3a46 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/rawcc/RawCcExtractor.html @@ -384,8 +384,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.html index 0a171ac125..97d0748fb5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.html @@ -384,8 +384,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Reader.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Reader.html index f144bdca37..c7ce01df5a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Reader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac3Reader.html @@ -196,7 +196,7 @@ implements void createTracks​(ExtractorOutput extractorOutput, - TsPayloadReader.TrackIdGenerator generator) + TsPayloadReader.TrackIdGenerator idGenerator)
    Initializes the reader by providing outputs and ids for the tracks.
    @@ -304,7 +304,7 @@ implements

    createTracks

    public void createTracks​(ExtractorOutput extractorOutput,
    -                         TsPayloadReader.TrackIdGenerator generator)
    + TsPayloadReader.TrackIdGenerator idGenerator)
    Description copied from interface: ElementaryStreamReader
    Initializes the reader by providing outputs and ids for the tracks.
    @@ -312,7 +312,7 @@ implements createTracks in interface ElementaryStreamReader
    Parameters:
    extractorOutput - The ExtractorOutput that receives the extracted data.
    -
    generator - A TsPayloadReader.TrackIdGenerator that generates unique track ids for the +
    idGenerator - A TsPayloadReader.TrackIdGenerator that generates unique track ids for the TrackOutputs.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.html index 4d7b50c62f..1c131e1269 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.html @@ -384,8 +384,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Reader.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Reader.html index 78d1ff221a..53bb6b6779 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Reader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/Ac4Reader.html @@ -196,7 +196,7 @@ implements void createTracks​(ExtractorOutput extractorOutput, - TsPayloadReader.TrackIdGenerator generator) + TsPayloadReader.TrackIdGenerator idGenerator)
    Initializes the reader by providing outputs and ids for the tracks.
    @@ -304,7 +304,7 @@ implements

    createTracks

    public void createTracks​(ExtractorOutput extractorOutput,
    -                         TsPayloadReader.TrackIdGenerator generator)
    + TsPayloadReader.TrackIdGenerator idGenerator)
    Description copied from interface: ElementaryStreamReader
    Initializes the reader by providing outputs and ids for the tracks.
    @@ -312,7 +312,7 @@ implements createTracks in interface ElementaryStreamReader
    Parameters:
    extractorOutput - The ExtractorOutput that receives the extracted data.
    -
    generator - A TsPayloadReader.TrackIdGenerator that generates unique track ids for the +
    idGenerator - A TsPayloadReader.TrackIdGenerator that generates unique track ids for the TrackOutputs.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.html index 98bd365c20..2fe8201fd4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.html @@ -446,8 +446,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.html index 89aa3c3e94..1641343070 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.html @@ -479,11 +479,10 @@ implements Formats to be exposed by payload readers for streams with - embedded closed captions when no caption service descriptors are provided. If - FLAG_OVERRIDE_CAPTION_DESCRIPTORS is set, closedCaptionFormats overrides - any descriptor information. If not set, and closedCaptionFormats is empty, a - closed caption track with Format.accessibilityChannel Format.NO_VALUE will - be exposed. + embedded closed captions when no caption service descriptors are provided. If FLAG_OVERRIDE_CAPTION_DESCRIPTORS is set, closedCaptionFormats overrides any + descriptor information. If not set, and closedCaptionFormats is empty, a closed + caption track with Format.accessibilityChannel Format.NO_VALUE will be + exposed.
    @@ -506,8 +505,8 @@ implements public SparseArray<TsPayloadReader> createInitialPayloadReaders()
    Description copied from interface: TsPayloadReader.Factory
    Returns the initial mapping from PIDs to payload readers. -

    - This method allows the injection of payload readers for reserved PIDs, excluding PID 0.

    + +

    This method allows the injection of payload readers for reserved PIDs, excluding PID 0.

    Specified by:
    createInitialPayloadReaders in interface TsPayloadReader.Factory
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/PsExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/PsExtractor.html index b34d6d87e5..f5d7d30304 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/PsExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/PsExtractor.html @@ -484,8 +484,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsExtractor.html index 2805e8dae1..237a09b1e3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsExtractor.html @@ -934,8 +934,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.Factory.html index 182366731a..693710f1f6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.Factory.html @@ -191,8 +191,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    createInitialPayloadReaders

    SparseArray<TsPayloadReader> createInitialPayloadReaders()
    Returns the initial mapping from PIDs to payload readers. -

    - This method allows the injection of payload readers for reserved PIDs, excluding PID 0.

    + +

    This method allows the injection of payload readers for reserved PIDs, excluding PID 0.

    Returns:
    A SparseArray that maps PIDs to payload readers.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.TrackIdGenerator.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.TrackIdGenerator.html index f61d0ad210..9c18aeae45 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.TrackIdGenerator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/ts/TsPayloadReader.TrackIdGenerator.html @@ -299,8 +299,7 @@ extends
    Returns:
    The last generated format id, with the format "programNumber/trackId". If no - programNumber was provided, the trackId alone is used as - format id.
    + programNumber was provided, the trackId alone is used as format id.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/wav/WavExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/wav/WavExtractor.html index 9ada74d22c..f20854b788 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/wav/WavExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/wav/WavExtractor.html @@ -381,8 +381,8 @@ implements Description copied from interface: Extractor
    Notifies the extractor that a seek has occurred. -

    - Following a call to this method, the ExtractorInput passed to the next invocation of + +

    Following a call to this method, the ExtractorInput passed to the next invocation of Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from position in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any SeekMap passed to the ExtractorOutput.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html index bc9babb905..0487ffd65e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6}; +var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -232,6 +232,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +boolean +needsReconfiguration() + +
    Whether the adapter needs to be reconfigured before it is used.
    + + + void queueInputBuffer​(int index, int offset, @@ -242,7 +249,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Submit an input buffer for decoding.
    - + void queueSecureInputBuffer​(int index, int offset, @@ -253,14 +260,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Submit an input buffer that is potentially encrypted for decoding.
    - + void release()
    Releases the adapter and the underlying MediaCodec.
    - + void releaseOutputBuffer​(int index, boolean render) @@ -268,7 +275,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns the buffer to the MediaCodec.
    - + void releaseOutputBuffer​(int index, long renderTimeStampNs) @@ -277,7 +284,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); it on the output surface. - + void setOnFrameRenderedListener​(MediaCodecAdapter.OnFrameRenderedListener listener, Handler handler) @@ -285,21 +292,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Registers a callback to be invoked when an output frame is rendered on the output surface.
    - + void setOutputSurface​(Surface surface)
    Dynamically sets the output surface of a MediaCodec.
    - + void setParameters​(Bundle params)
    Communicate additional parameter changes to the MediaCodec instance.
    - + void setVideoScalingMode​(int scalingMode) @@ -545,7 +552,7 @@ void setParameters​( -
    • @@ -871,21 +855,6 @@ extends - - -
        -
      • -

        experimentalSetSkipAndContinueIfSampleTooLarge

        -
        public void experimentalSetSkipAndContinueIfSampleTooLarge​(boolean enabled)
        -
        Enables skipping and continuing playback from the next key frame if a sample is encountered - that's too large to fit into one of the decoder's input buffers. When not enabled, playback - will fail in this case. - -

        This method is experimental, and will be renamed or removed in a future release. It should - only be called before the renderer is used.

        -
      • -
      @@ -1229,8 +1198,8 @@ protected final protected void onDisabled()
      Called when the renderer is disabled. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Overrides:
      onDisabled in class BaseRenderer
      @@ -1272,8 +1241,8 @@ protected final protected void onStarted()
      Called when the renderer is started. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Overrides:
      onStarted in class BaseRenderer
      @@ -1416,8 +1385,8 @@ protected void resetCodecStateForRelease() long initializedTimestampMs, long initializationDurationMs)
      Called when a MediaCodec has been created and configured. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Parameters:
      name - The name of the codec that was initialized.
      @@ -1481,17 +1450,6 @@ protected  - - -
        -
      • -

        legacyKeepAvailableCodecInfosWithoutCodec

        -
        protected boolean legacyKeepAvailableCodecInfosWithoutCodec()
        -
        Returns whether to keep available codec infos when the codec hasn't been initialized, which is - the behavior before a bug fix. See also [Internal: b/162837741].
        -
      • -
      @@ -1629,16 +1587,15 @@ protected void onProcessedOutputBuffer​(long presentationTi
      public boolean isReady()
      Description copied from interface: Renderer
      Whether the renderer is able to immediately render media from the current position. -

      - If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that the - renderer has everything that it needs to continue playback. Returning false indicates that + +

      If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that + the renderer has everything that it needs to continue playback. Returning false indicates that the player should pause until the renderer is ready. -

      - If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that the - renderer is ready for playback to be started. Returning false indicates that it is not. -

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

      + +

      If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that + the renderer is ready for playback to be started. Returning false indicates that it is not. + +

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

      Returns:
      Whether the renderer is ready to render media.
      @@ -1778,8 +1735,8 @@ protected void onProcessedOutputBuffer​(long presentationTi
      protected void renderToEndOfStream()
                                   throws ExoPlaybackException
      Incrementally renders any remaining output. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Throws:
      ExoPlaybackException - Thrown if an error occurs rendering remaining output.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.DecoderQueryException.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.DecoderQueryException.html index 6093ba6652..964293772d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.DecoderQueryException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.DecoderQueryException.html @@ -144,8 +144,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      public static class MediaCodecUtil.DecoderQueryException
       extends Exception
      Thrown when an error occurs querying the device for its underlying media capabilities. -

      - Such failures are not expected in normal operation and are normally temporary (e.g. if the + +

      Such failures are not expected in normal operation and are normally temporary (e.g. if the mediaserver process has crashed and is yet to restart).

      See Also:
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.html index fd33f3e768..f967d4999e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -232,6 +232,13 @@ implements +boolean +needsReconfiguration() + +
      Whether the adapter needs to be reconfigured before it is used.
      + + + void queueInputBuffer​(int index, int offset, @@ -242,7 +249,7 @@ implements Submit an input buffer for decoding. - + void queueSecureInputBuffer​(int index, int offset, @@ -253,14 +260,14 @@ implements Submit an input buffer that is potentially encrypted for decoding. - + void release()
      Releases the adapter and the underlying MediaCodec.
      - + void releaseOutputBuffer​(int index, boolean render) @@ -268,7 +275,7 @@ implements Returns the buffer to the MediaCodec. - + void releaseOutputBuffer​(int index, long renderTimeStampNs) @@ -277,7 +284,7 @@ implements + void setOnFrameRenderedListener​(MediaCodecAdapter.OnFrameRenderedListener listener, Handler handler) @@ -285,21 +292,21 @@ implements Registers a callback to be invoked when an output frame is rendered on the output surface. - + void setOutputSurface​(Surface surface)
      Dynamically sets the output surface of a MediaCodec.
      - + void setParameters​(Bundle params)
      Communicate additional parameter changes to the MediaCodec instance.
      - + void setVideoScalingMode​(int scalingMode) @@ -330,6 +337,21 @@ implements + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html index 65cc1d75bf..af7bb84d43 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html @@ -177,8 +177,7 @@ extends long subsampleOffsetUs -
      An offset that must be added to the metadata's timestamps after it's been decoded, or - Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
      +
      An offset that must be added to the metadata's timestamps after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
      @@ -264,8 +263,7 @@ extends

      subsampleOffsetUs

      public long subsampleOffsetUs
      -
      +
      An offset that must be added to the metadata's timestamps after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataRenderer.html index 81a214399f..35e653f10f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataRenderer.html @@ -309,7 +309,7 @@ implements BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, handleMessage, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onEnabled, onReset, onStarted, onStopped, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, handleMessage, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onEnabled, onReset, onStarted, onStopped, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation @@ -470,6 +477,26 @@ implements + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/flac/VorbisComment.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/flac/VorbisComment.html index 21ae44893d..86d3cb8d33 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/flac/VorbisComment.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/flac/VorbisComment.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -256,11 +256,18 @@ implements   +void +populateMediaMetadata​(MediaMetadata.Builder builder) + +
    Updates the MediaMetadata.Builder with the type specific values stored in this Entry.
    + + + String toString()   - + void writeToParcel​(Parcel dest, int flags) @@ -279,7 +286,7 @@ implements Metadata.Entry -getWrappedMetadataBytes, getWrappedMetadataFormat, populateMediaMetadata +getWrappedMetadataBytes, getWrappedMetadataFormat @@ -361,6 +368,26 @@ implements + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.html index 0828707bee..85c4291301 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.html @@ -197,8 +197,7 @@ extends boolean autoReturn -
    If breakDurationUs is not C.TIME_UNSET, defines whether - breakDurationUs should be used to know when to return to the network feed.
    +
    If breakDurationUs is not C.TIME_UNSET, defines whether breakDurationUs should be used to know when to return to the network feed.
    @@ -226,8 +225,7 @@ extends List<SpliceInsertCommand.ComponentSplice> componentSpliceList -
    If programSpliceFlag is false, a non-empty list containing the - SpliceInsertCommand.ComponentSplices.
    +
    If programSpliceFlag is false, a non-empty list containing the SpliceInsertCommand.ComponentSplices.
    @@ -410,9 +408,7 @@ extends Whether splicing should be done at the nearest opportunity. If false, splicing should be done - at the moment indicated by programSplicePlaybackPositionUs or - SpliceInsertCommand.ComponentSplice.componentSplicePlaybackPositionUs, depending on - programSpliceFlag. + at the moment indicated by programSplicePlaybackPositionUs or SpliceInsertCommand.ComponentSplice.componentSplicePlaybackPositionUs, depending on programSpliceFlag. @@ -422,8 +418,7 @@ extends

    programSplicePts

    public final long programSplicePts
    -
    If programSpliceFlag is true, the PTS at which the program splice should occur. - C.TIME_UNSET otherwise.
    +
    If programSpliceFlag is true, the PTS at which the program splice should occur. C.TIME_UNSET otherwise.
    @@ -443,8 +438,7 @@ extends

    componentSpliceList

    public final List<SpliceInsertCommand.ComponentSplice> componentSpliceList
    -
    If programSpliceFlag is false, a non-empty list containing the - SpliceInsertCommand.ComponentSplices. Otherwise, an empty list.
    +
    If programSpliceFlag is false, a non-empty list containing the SpliceInsertCommand.ComponentSplices. Otherwise, an empty list.
    @@ -454,9 +448,7 @@ extends

    autoReturn

    public final boolean autoReturn
    -
    If breakDurationUs is not C.TIME_UNSET, defines whether - breakDurationUs should be used to know when to return to the network feed. If - breakDurationUs is C.TIME_UNSET, the value is undefined.
    +
    If breakDurationUs is not C.TIME_UNSET, defines whether breakDurationUs should be used to know when to return to the network feed. If breakDurationUs is C.TIME_UNSET, the value is undefined.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.Event.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.Event.html index 2f55f5c58c..d79e35774e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.Event.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.Event.html @@ -154,8 +154,7 @@ extends boolean autoReturn -
    If breakDurationUs is not C.TIME_UNSET, defines whether - breakDurationUs should be used to know when to return to the network feed.
    +
    If breakDurationUs is not C.TIME_UNSET, defines whether breakDurationUs should be used to know when to return to the network feed.
    @@ -184,8 +183,7 @@ extends List<SpliceScheduleCommand.ComponentSplice> componentSpliceList -
    If programSpliceFlag is false, a non-empty list containing the - SpliceScheduleCommand.ComponentSplices.
    +
    If programSpliceFlag is false, a non-empty list containing the SpliceScheduleCommand.ComponentSplices.
    @@ -326,8 +324,7 @@ extends

    componentSpliceList

    public final List<SpliceScheduleCommand.ComponentSplice> componentSpliceList
    -
    If programSpliceFlag is false, a non-empty list containing the - SpliceScheduleCommand.ComponentSplices. Otherwise, an empty list.
    +
    If programSpliceFlag is false, a non-empty list containing the SpliceScheduleCommand.ComponentSplices. Otherwise, an empty list.
    @@ -337,9 +334,7 @@ extends

    autoReturn

    public final boolean autoReturn
    -
    If breakDurationUs is not C.TIME_UNSET, defines whether - breakDurationUs should be used to know when to return to the network feed. If - breakDurationUs is C.TIME_UNSET, the value is undefined.
    +
    If breakDurationUs is not C.TIME_UNSET, defines whether breakDurationUs should be used to know when to return to the network feed. If breakDurationUs is C.TIME_UNSET, the value is undefined.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.html b/docs/doc/reference/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.html index fc91999988..c03a3ae252 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.html @@ -284,7 +284,7 @@ public DefaultDownloaderFactory​(Specified by:
    createDownloader in interface DownloaderFactory
    Parameters:
    -
    request - The action.
    +
    request - The download request.
    Returns:
    The downloader.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/offline/DownloaderFactory.html b/docs/doc/reference/com/google/android/exoplayer2/offline/DownloaderFactory.html index 8b6b187b21..ac86bc015f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/offline/DownloaderFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/offline/DownloaderFactory.html @@ -149,7 +149,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Downloader -createDownloader​(DownloadRequest action) +createDownloader​(DownloadRequest request)
    Creates a Downloader to perform the given DownloadRequest.
    @@ -177,11 +177,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ConcatenatingMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/ConcatenatingMediaSource.html index 0edd5421f8..0af0c9cc22 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ConcatenatingMediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ConcatenatingMediaSource.html @@ -508,13 +508,6 @@ extends Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait - @@ -540,8 +533,7 @@ extends MediaSource... mediaSources)
    Parameters:
    -
    mediaSources - The MediaSources to concatenate. It is valid for the same - MediaSource instance to be present more than once in the array.
    +
    mediaSources - The MediaSources to concatenate. It is valid for the same MediaSource instance to be present more than once in the array.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html index e117b74c3b..c88e4910f6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html @@ -158,7 +158,7 @@ implements ads configuration, setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider) and setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider) need to be called to diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html index 886560de3c..feb29f196e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html @@ -163,7 +163,7 @@ extends Timeline -Timeline.Period, Timeline.Window +Timeline.Period, Timeline.RemotableTimeline, Timeline.Window diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/MaskingMediaSource.PlaceholderTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/MaskingMediaSource.PlaceholderTimeline.html index 1cfdfc7191..c676653279 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/MaskingMediaSource.PlaceholderTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/MaskingMediaSource.PlaceholderTimeline.html @@ -163,7 +163,7 @@ extends Timeline -Timeline.Period, Timeline.Window +Timeline.Period, Timeline.RemotableTimeline, Timeline.Window @@ -361,7 +362,8 @@ public final 
  • MediaLoadData

    -
    public MediaLoadData​(int dataType)
    +
    public MediaLoadData​(@DataType
    +                     int dataType)
    Creates an instance with the given dataType.
  • @@ -371,7 +373,8 @@ public final 
  • MediaLoadData

    -
    public MediaLoadData​(int dataType,
    +
    public MediaLoadData​(@DataType
    +                     int dataType,
                          int trackType,
                          @Nullable
                          Format trackFormat,
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.MediaSourceCaller.html b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.MediaSourceCaller.html
    index a757cd8dc8..2067b4ff8b 100644
    --- a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.MediaSourceCaller.html
    +++ b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.MediaSourceCaller.html
    @@ -121,6 +121,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    The durations of each ad in the ad group, in microseconds.
  • + + + +
      +
    • +

      contentResumeOffsetUs

      +
      public final long contentResumeOffsetUs
      +
      The offset in microseconds which should be added to the content stream when resuming playback + after the ad group.
      +
    • +
    + + + +
      +
    • +

      isServerSideInserted

      +
      public final boolean isServerSideInserted
      +
      Whether this ad group is server-side inserted and part of the content stream.
      +
    • +
    @@ -420,14 +503,18 @@ public final int[] states

    Constructor Detail

    - +
    • AdGroup

      -
      public AdGroup()
      +
      public AdGroup​(long timeUs)
      Creates a new ad group with an unspecified number of ads.
      +
      +
      Parameters:
      +
      timeUs - The time of the ad group in the Timeline.Period, in microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
      +
    @@ -462,6 +549,16 @@ public final int[] states lastPlayedAdIndex
    , or count if no later ads should be played. + + + +
      +
    • +

      shouldPlayAdGroup

      +
      public boolean shouldPlayAdGroup()
      +
      Returns whether the ad group has at least one ad that should be played.
      +
    • +
    @@ -469,7 +566,7 @@ public final int[] states
  • hasUnplayedAds

    public boolean hasUnplayedAds()
    -
    Returns whether the ad group has at least one ad that still needs to be played.
    +
    Returns whether the ad group has at least one ad that is neither played, skipped, nor failed.
  • @@ -499,6 +596,17 @@ public final int[] states
    + + + +
      +
    • +

      withTimeUs

      +
      @CheckResult
      +public AdPlaybackState.AdGroup withTimeUs​(long timeUs)
      +
      Returns a new instance with the timeUs set to the specified value.
      +
    • +
    @@ -551,6 +659,28 @@ public Returns a new instance with the specified ad durations, in microseconds. + + + + + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html index 8e0a7bbdea..56acc34b48 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -242,20 +242,6 @@ implements -AdPlaybackState.AdGroup[] -adGroups - -
    The ad groups.
    - - - -long[] -adGroupTimesUs - -
    The times of ad groups, in microseconds, relative to the start of the Timeline.Period they belong to.
    - - - long adResumePositionUs @@ -290,6 +276,13 @@ implements Ad playback state with no ads. + +int +removedAdGroupCount + +
    The number of ad groups the have been removed.
    + + @@ -338,6 +331,13 @@ implements   +AdPlaybackState.AdGroup +getAdGroup​(int adGroupIndex) + +
    Returns the specified AdPlaybackState.AdGroup.
    + + + int getAdGroupIndexAfterPositionUs​(long positionUs, long periodDurationUs) @@ -345,7 +345,7 @@ implements Returns the index of the next ad group after positionUs that should be played. - + int getAdGroupIndexForPositionUs​(long positionUs, long periodDurationUs) @@ -354,12 +354,12 @@ implements + int hashCode()   - + boolean isAdInErrorState​(int adGroupIndex, int adIndexInAdGroup) @@ -367,19 +367,19 @@ implements Returns whether the specified ad has been marked as in AD_STATE_ERROR. - + Bundle toBundle()
    Returns a Bundle representing the information stored in this object.
    - + String toString()   - + AdPlaybackState withAdCount​(int adGroupIndex, int adCount) @@ -387,14 +387,31 @@ implements Returns an instance with the number of ads in adGroupIndex resolved to adCount. - + +AdPlaybackState +withAdDurationsUs​(int adGroupIndex, + long... adDurationsUs) + +
    Returns an instance with the specified ad durations, in microseconds, in the specified ad + group.
    + + + AdPlaybackState withAdDurationsUs​(long[][] adDurationUs)
    Returns an instance with the specified ad durations, in microseconds.
    - + +AdPlaybackState +withAdGroupTimeUs​(int adGroupIndex, + long adGroupTimeUs) + +
    Returns an instance with the specified ad group time.
    + + + AdPlaybackState withAdLoadError​(int adGroupIndex, int adIndexInAdGroup) @@ -402,7 +419,7 @@ implements Returns an instance with the specified ad marked as having a load error. - + AdPlaybackState withAdResumePositionUs​(long adResumePositionUs) @@ -410,7 +427,7 @@ implements + AdPlaybackState withAdUri​(int adGroupIndex, int adIndexInAdGroup, @@ -419,14 +436,40 @@ implements Returns an instance with the specified ad URI. - + AdPlaybackState withContentDurationUs​(long contentDurationUs)
    Returns an instance with the specified content duration, in microseconds.
    - + +AdPlaybackState +withContentResumeOffsetUs​(int adGroupIndex, + long contentResumeOffsetUs) + +
    Returns an instance with the specified AdPlaybackState.AdGroup.contentResumeOffsetUs, in microseconds, + for the specified ad group.
    + + + +AdPlaybackState +withIsServerSideInserted​(int adGroupIndex, + boolean isServerSideInserted) + +
    Returns an instance with the specified value for AdPlaybackState.AdGroup.isServerSideInserted in the + specified ad group.
    + + + +AdPlaybackState +withNewAdGroup​(int adGroupIndex, + long adGroupTimeUs) + +
    Returns an instance with a new ad group.
    + + + AdPlaybackState withPlayedAd​(int adGroupIndex, int adIndexInAdGroup) @@ -434,7 +477,15 @@ implements Returns an instance with the specified ad marked as played. - + +AdPlaybackState +withRemovedAdGroupCount​(int removedAdGroupCount) + +
    Returns an instance with the specified number of removed ad + groups.
    + + + AdPlaybackState withSkippedAd​(int adGroupIndex, int adIndexInAdGroup) @@ -442,7 +493,7 @@ implements Returns an instance with the specified ad marked as skipped. - + AdPlaybackState withSkippedAdGroup​(int adGroupIndex) @@ -575,27 +626,6 @@ public final The number of ad groups. - - - -
      -
    • -

      adGroupTimesUs

      -
      public final long[] adGroupTimesUs
      -
      The times of ad groups, in microseconds, relative to the start of the Timeline.Period they belong to. A final element with the value - C.TIME_END_OF_SOURCE indicates a postroll ad.
      -
    • -
    - - - - @@ -616,6 +646,18 @@ public final The duration of the content period in microseconds, if known. C.TIME_UNSET otherwise. + + + +
      +
    • +

      removedAdGroupCount

      +
      public final int removedAdGroupCount
      +
      The number of ad groups the have been removed. Ad groups with indices between 0 + (inclusive) and removedAdGroupCount (exclusive) will be empty and must not be modified + by any of the with* methods.
      +
    • +
    @@ -666,6 +708,16 @@ public final  + + + @@ -722,6 +774,46 @@ public final Returns whether the specified ad has been marked as in AD_STATE_ERROR. + + + +
      +
    • +

      withAdGroupTimeUs

      +
      @CheckResult
      +public AdPlaybackState withAdGroupTimeUs​(int adGroupIndex,
      +                                         long adGroupTimeUs)
      +
      Returns an instance with the specified ad group time.
      +
      +
      Parameters:
      +
      adGroupIndex - The index of the ad group.
      +
      adGroupTimeUs - The new ad group time, in microseconds, or C.TIME_END_OF_SOURCE to + indicate a postroll ad.
      +
      Returns:
      +
      The updated ad playback state.
      +
      +
    • +
    + + + +
      +
    • +

      withNewAdGroup

      +
      @CheckResult
      +public AdPlaybackState withNewAdGroup​(int adGroupIndex,
      +                                      long adGroupTimeUs)
      +
      Returns an instance with a new ad group.
      +
      +
      Parameters:
      +
      adGroupIndex - The insertion index of the new group.
      +
      adGroupTimeUs - The ad group time, in microseconds, or C.TIME_END_OF_SOURCE to + indicate a postroll ad.
      +
      Returns:
      +
      The updated ad playback state.
      +
      +
    • +
    @@ -804,7 +896,22 @@ public @CheckResult public AdPlaybackState withAdDurationsUs​(long[][] adDurationUs) -
    Returns an instance with the specified ad durations, in microseconds.
    +
    Returns an instance with the specified ad durations, in microseconds. + +

    Must only be used if removedAdGroupCount is 0.

    + + + + + +
      +
    • +

      withAdDurationsUs

      +
      @CheckResult
      +public AdPlaybackState withAdDurationsUs​(int adGroupIndex,
      +                                         long... adDurationsUs)
      +
      Returns an instance with the specified ad durations, in microseconds, in the specified ad + group.
    @@ -830,6 +937,47 @@ public Returns an instance with the specified content duration, in microseconds. + + + +
      +
    • +

      withRemovedAdGroupCount

      +
      @CheckResult
      +public AdPlaybackState withRemovedAdGroupCount​(int removedAdGroupCount)
      +
      Returns an instance with the specified number of removed ad + groups. + +

      Ad groups with indices between 0 (inclusive) and removedAdGroupCount + (exclusive) will be empty and must not be modified by any of the with* methods.

      +
    • +
    + + + + + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsLoader.EventListener.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsLoader.EventListener.html index c283eb8b37..ba0c9c78be 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsLoader.EventListener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsLoader.EventListener.html @@ -200,7 +200,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • onAdPlaybackState

    default void onAdPlaybackState​(AdPlaybackState adPlaybackState)
    -
    Called when the ad playback state has been updated. The number of ad groups may not change after the first call.
    +
    Called when the ad playback state has been updated. The number of ad groups may not change after the first call.
    Parameters:
    adPlaybackState - The new ad playback state.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsMediaSource.html index 8e1dd0807d..a302cc4ac4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsMediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdsMediaSource.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":42,"i4":10,"i5":10,"i6":10,"i7":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -224,7 +224,7 @@ extends -All Methods Instance Methods Concrete Methods Deprecated Methods  +All Methods Instance Methods Concrete Methods  Modifier and Type Method @@ -255,15 +255,6 @@ extends -Object -getTag() - -
    Deprecated. - -
    - - - protected void onChildSourceInfoRefreshed​(MediaSource.MediaPeriodId mediaPeriodId, MediaSource mediaSource, @@ -272,7 +263,7 @@ extends Called when the source info of a child source has been refreshed. - + protected void prepareSourceInternal​(TransferListener mediaTransferListener) @@ -280,14 +271,14 @@ extends + void releasePeriod​(MediaPeriod mediaPeriod)
    Releases the period.
    - + protected void releaseSourceInternal() @@ -377,20 +368,6 @@ extends - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.html new file mode 100644 index 0000000000..12953346d4 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.html @@ -0,0 +1,1041 @@ + + + + +ServerSideInsertedAdsMediaSource (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ServerSideInsertedAdsMediaSource

    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.html new file mode 100644 index 0000000000..a845dc81dd --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.html @@ -0,0 +1,568 @@ + + + + +ServerSideInsertedAdsUtil (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ServerSideInsertedAdsUtil

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsUtil
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public final class ServerSideInsertedAdsUtil
      +extends Object
      +
      A static utility class with methods to work with server-side inserted ads.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          addAdGroupToAdPlaybackState

          +
          @CheckResult
          +public static AdPlaybackState addAdGroupToAdPlaybackState​(AdPlaybackState adPlaybackState,
          +                                                          long fromPositionUs,
          +                                                          long toPositionUs,
          +                                                          long contentResumeOffsetUs)
          +
          Adds a new server-side inserted ad group to an AdPlaybackState.
          +
          +
          Parameters:
          +
          adPlaybackState - The existing AdPlaybackState.
          +
          fromPositionUs - The position in the underlying server-side inserted ads stream at which + the ad group starts, in microseconds.
          +
          toPositionUs - The position in the underlying server-side inserted ads stream at which the + ad group ends, in microseconds.
          +
          contentResumeOffsetUs - The timestamp offset which should be added to the content stream + when resuming playback after the ad group. An offset of 0 collapses the ad group to a + single insertion point, an offset of toPositionUs-fromPositionUs keeps the original + stream timestamps after the ad group.
          +
          Returns:
          +
          The updated AdPlaybackState.
          +
          +
        • +
        + + + +
          +
        • +

          getStreamDurationUs

          +
          public static long getStreamDurationUs​(Player player,
          +                                       AdPlaybackState adPlaybackState)
          +
          Returns the duration of the underlying server-side inserted ads stream for the current Timeline.Period in the Player.
          +
          +
          Parameters:
          +
          player - The Player.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The duration of the underlying server-side inserted ads stream, in microseconds, or + C.TIME_UNSET if it can't be determined.
          +
          +
        • +
        + + + +
          +
        • +

          getStreamPositionUs

          +
          public static long getStreamPositionUs​(Player player,
          +                                       AdPlaybackState adPlaybackState)
          +
          Returns the position in the underlying server-side inserted ads stream for the current playback + position in the Player.
          +
          +
          Parameters:
          +
          player - The Player.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the underlying server-side inserted ads stream, in microseconds, or + C.TIME_UNSET if it can't be determined.
          +
          +
        • +
        + + + +
          +
        • +

          getStreamPositionUs

          +
          public static long getStreamPositionUs​(long positionUs,
          +                                       MediaPeriodId mediaPeriodId,
          +                                       AdPlaybackState adPlaybackState)
          +
          Returns the position in the underlying server-side inserted ads stream for a position in a + MediaPeriod.
          +
          +
          Parameters:
          +
          positionUs - The position in the MediaPeriod, in microseconds.
          +
          mediaPeriodId - The MediaPeriodId of the MediaPeriod.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the underlying server-side inserted ads stream, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getMediaPeriodPositionUs

          +
          public static long getMediaPeriodPositionUs​(long positionUs,
          +                                            MediaPeriodId mediaPeriodId,
          +                                            AdPlaybackState adPlaybackState)
          +
          Returns the position in a MediaPeriod for a position in the underlying server-side + inserted ads stream.
          +
          +
          Parameters:
          +
          positionUs - The position in the underlying server-side inserted ads stream, in + microseconds.
          +
          mediaPeriodId - The MediaPeriodId of the MediaPeriod.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the MediaPeriod, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getStreamPositionUsForAd

          +
          public static long getStreamPositionUsForAd​(long positionUs,
          +                                            int adGroupIndex,
          +                                            int adIndexInAdGroup,
          +                                            AdPlaybackState adPlaybackState)
          +
          Returns the position in the underlying server-side inserted ads stream for a position in an ad + MediaPeriod.
          +
          +
          Parameters:
          +
          positionUs - The position in the ad MediaPeriod, in microseconds.
          +
          adGroupIndex - The ad group index of the ad.
          +
          adIndexInAdGroup - The index of the ad in the ad group.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the underlying server-side inserted ads stream, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getMediaPeriodPositionUsForAd

          +
          public static long getMediaPeriodPositionUsForAd​(long positionUs,
          +                                                 int adGroupIndex,
          +                                                 int adIndexInAdGroup,
          +                                                 AdPlaybackState adPlaybackState)
          +
          Returns the position in an ad MediaPeriod for a position in the underlying server-side + inserted ads stream.
          +
          +
          Parameters:
          +
          positionUs - The position in the underlying server-side inserted ads stream, in + microseconds.
          +
          adGroupIndex - The ad group index of the ad.
          +
          adIndexInAdGroup - The index of the ad in the ad group.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the ad MediaPeriod, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getStreamPositionUsForContent

          +
          public static long getStreamPositionUsForContent​(long positionUs,
          +                                                 int nextAdGroupIndex,
          +                                                 AdPlaybackState adPlaybackState)
          +
          Returns the position in the underlying server-side inserted ads stream for a position in a + content MediaPeriod.
          +
          +
          Parameters:
          +
          positionUs - The position in the content MediaPeriod, in microseconds.
          +
          nextAdGroupIndex - The next ad group index after the content, or C.INDEX_UNSET if + there is no following ad group. Ad groups from this index are not used to adjust the + position.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the underlying server-side inserted ads stream, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getMediaPeriodPositionUsForContent

          +
          public static long getMediaPeriodPositionUsForContent​(long positionUs,
          +                                                      int nextAdGroupIndex,
          +                                                      AdPlaybackState adPlaybackState)
          +
          Returns the position in a content MediaPeriod for a position in the underlying + server-side inserted ads stream.
          +
          +
          Parameters:
          +
          positionUs - The position in the underlying server-side inserted ads stream, in + microseconds.
          +
          nextAdGroupIndex - The next ad group index after the content, or C.INDEX_UNSET if + there is no following ad group. Ad groups from this index are not used to adjust the + position.
          +
          adPlaybackState - The AdPlaybackState defining the ad groups.
          +
          Returns:
          +
          The position in the content MediaPeriod, in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          getAdCountInGroup

          +
          public static int getAdCountInGroup​(AdPlaybackState adPlaybackState,
          +                                    int adGroupIndex)
          +
          Returns the number of ads in an ad group, treating an unknown number as zero ads.
          +
          +
          Parameters:
          +
          adPlaybackState - The AdPlaybackState.
          +
          adGroupIndex - The index of the ad group.
          +
          Returns:
          +
          The number of ads in the ad group.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html index b5754a70b4..7bc877dc8c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html @@ -164,7 +164,7 @@ extends Timeline -Timeline.Period, Timeline.Window
  • +Timeline.Period, Timeline.RemotableTimeline, Timeline.Window +
  • com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource (implements com.google.android.exoplayer2.drm.DrmSessionEventListener, com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller, com.google.android.exoplayer2.source.MediaSourceEventListener)
  • +
  • com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsUtil
  • java.lang.Throwable (implements java.io.Serializable)
    • java.lang.Exception diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html index dd3d034b3a..be9b9b9637 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html @@ -193,8 +193,8 @@ implements long startTimeUs -
      The start time of the media contained by the chunk, or C.TIME_UNSET if the data - being loaded does not contain media samples.
      +
      The start time of the media contained by the chunk, or C.TIME_UNSET if the data being + loaded does not contain media samples.
      @@ -222,7 +222,7 @@ implements int type -
      The type of the chunk.
      +
      The data type of the chunk.
      @@ -356,9 +356,9 @@ implements
    • type

      -
      public final int type
      -
      +
      @DataType
      +public final int type
      +
      The data type of the chunk. For reporting only.
    @@ -402,8 +402,8 @@ public final 

    startTimeUs

    public final long startTimeUs
    -
    The start time of the media contained by the chunk, or C.TIME_UNSET if the data - being loaded does not contain media samples.
    +
    The start time of the media contained by the chunk, or C.TIME_UNSET if the data being + loaded does not contain media samples.
  • @@ -444,6 +444,7 @@ public final DataSource dataSource, DataSpec dataSpec, + @DataType int type, Format trackFormat, int trackSelectionReason, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html index e914db66ba..70678ae3e4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html @@ -849,11 +849,11 @@ implements continueLoading
     in interface SequenceableLoader
    Parameters:
    positionUs - The current playback position in microseconds. If playback of the period to - which this loader belongs has not yet started, the value will be the starting position - in the period minus the duration of any media in previous periods still to be played.
    + which this loader belongs has not yet started, the value will be the starting position in + the period minus the duration of any media in previous periods still to be played.
    Returns:
    -
    True if progress was made, meaning that SequenceableLoader.getNextLoadPositionUs() will return - a different value than prior to the call. False otherwise.
    +
    True if progress was made, meaning that SequenceableLoader.getNextLoadPositionUs() will return a + different value than prior to the call. False otherwise.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSource.html index df663ff31c..d01923a659 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSource.html @@ -195,10 +195,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); boolean -onChunkLoadError​(Chunk chunk, +onChunkLoadError​(Chunk chunk, boolean cancelable, - Exception e, - long exclusionDurationMs) + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo, + LoadErrorHandlingPolicy loadErrorHandlingPolicy)
    Called when the ChunkSampleStream encounters an error loading a chunk obtained from this source.
    @@ -360,7 +360,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    - +
      @@ -368,17 +368,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      onChunkLoadError

      boolean onChunkLoadError​(Chunk chunk,
                                boolean cancelable,
      -                         Exception e,
      -                         long exclusionDurationMs)
      + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo, + LoadErrorHandlingPolicy loadErrorHandlingPolicy)
      Called when the ChunkSampleStream encounters an error loading a chunk obtained from this source.
      Parameters:
      chunk - The chunk whose load encountered the error.
      cancelable - Whether the load can be canceled.
      -
      e - The error.
      -
      exclusionDurationMs - The duration for which the associated track may be excluded, or - C.TIME_UNSET if the track may not be excluded.
      +
      loadErrorInfo - The load error info.
      +
      loadErrorHandlingPolicy - The load error handling policy to customize the behaviour of + handling the load error.
      Returns:
      Whether the load should be canceled so that a replacement chunk can be loaded instead. Must be false if cancelable is false. If true, getNextChunk(long, long, List, ChunkHolder) will be called to obtain the replacement diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html index 8e5babdfc8..38aacb6ca6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html @@ -274,6 +274,7 @@ extends DataSource dataSource, DataSpec dataSpec, + @DataType int type, Format trackFormat, int trackSelectionReason, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html index 0fec6c2aba..f16a756590 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html @@ -249,7 +249,7 @@ implements boolean -read​(ExtractorInput extractorInput) +read​(ExtractorInput input)
      Reads from the given ExtractorInput.
      @@ -379,7 +379,7 @@ implements
    • read

      -
      public boolean read​(ExtractorInput extractorInput)
      +
      public boolean read​(ExtractorInput input)
                    throws IOException
      Description copied from interface: ChunkExtractor
      Reads from the given ExtractorInput.
      @@ -387,7 +387,7 @@ implements Specified by:
      read in interface ChunkExtractor
      Parameters:
      -
      extractorInput - The input to read from.
      +
      input - The input to read from.
      Returns:
      Whether there is any data left to extract. Returns false if the end of input has been reached.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html new file mode 100644 index 0000000000..91eaaad68d --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html @@ -0,0 +1,407 @@ + + + + +BaseUrlExclusionList (ExoPlayer library) + + + + + + + + + + + + + +
      + +
      + +
      +
      + +

      Class BaseUrlExclusionList

      +
      +
      +
        +
      • java.lang.Object
      • +
      • +
          +
        • com.google.android.exoplayer2.source.dash.BaseUrlExclusionList
        • +
        +
      • +
      +
      +
        +
      • +
        +
        public final class BaseUrlExclusionList
        +extends Object
        +
        Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
        +
      • +
      +
      +
      + +
      +
      +
        +
      • + +
        +
          +
        • + + +

          Constructor Detail

          + + + +
            +
          • +

            BaseUrlExclusionList

            +
            public BaseUrlExclusionList()
            +
            Creates an instance.
            +
          • +
          +
        • +
        +
        + +
        +
          +
        • + + +

          Method Detail

          + + + +
            +
          • +

            exclude

            +
            public void exclude​(BaseUrl baseUrlToExclude,
            +                    long exclusionDurationMs)
            +
            Excludes the given base URL.
            +
            +
            Parameters:
            +
            baseUrlToExclude - The base URL to exclude.
            +
            exclusionDurationMs - The duration of exclusion, in milliseconds.
            +
            +
          • +
          + + + +
            +
          • +

            selectBaseUrl

            +
            @Nullable
            +public BaseUrl selectBaseUrl​(List<BaseUrl> baseUrls)
            +
            Selects the base URL to use from the given list. + +

            The list is reduced by service location and priority of base URLs that have been passed to + exclude(BaseUrl, long). The base URL to use is then selected from the remaining base + URLs by priority and weight.

            +
            +
            Parameters:
            +
            baseUrls - The list of base URLs to select from.
            +
            Returns:
            +
            The selected base URL after exclusion or null if all elements have been excluded.
            +
            +
          • +
          + + + +
            +
          • +

            getPriorityCountAfterExclusion

            +
            public int getPriorityCountAfterExclusion​(List<BaseUrl> baseUrls)
            +
            Returns the number of priority levels for the given list of base URLs after exclusion.
            +
            +
            Parameters:
            +
            baseUrls - The list of base URLs.
            +
            Returns:
            +
            The number of priority levels after exclusion.
            +
            +
          • +
          + + + +
            +
          • +

            getPriorityCount

            +
            public static int getPriorityCount​(List<BaseUrl> baseUrls)
            +
            Returns the number of priority levels of the given list of base URLs.
            +
            +
            Parameters:
            +
            baseUrls - The list of base URLs.
            +
            Returns:
            +
            The number of priority levels before exclusion.
            +
            +
          • +
          + + + +
            +
          • +

            reset

            +
            public void reset()
            +
            Resets the state.
            +
          • +
          +
        • +
        +
        +
      • +
      +
      +
      +
      + + + + 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 6fa5fc1206..4fb04686e4 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 @@ -153,8 +153,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); DashChunkSource -createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, +createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, + BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, @@ -183,7 +184,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      Method Detail

      - +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.html index 68d4cb1851..6e41c2dd5d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":42,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -229,7 +229,7 @@ extends -All Methods Instance Methods Concrete Methods Deprecated Methods  +All Methods Instance Methods Concrete Methods  Modifier and Type Method @@ -237,7 +237,7 @@ extends MediaPeriod -createPeriod​(MediaSource.MediaPeriodId periodId, +createPeriod​(MediaSource.MediaPeriodId id, Allocator allocator, long startPositionUs) @@ -252,22 +252,13 @@ extends -Object -getTag() - -
    Deprecated. - -
    - - - void maybeThrowSourceInfoRefreshError()
    Throws any pending error encountered while loading or refreshing source information.
    - + protected void prepareSourceInternal​(TransferListener mediaTransferListener) @@ -275,21 +266,21 @@ extends + void releasePeriod​(MediaPeriod mediaPeriod)
    Releases the period.
    - + protected void releaseSourceInternal() - + void replaceManifestUri​(Uri manifestUri) @@ -404,20 +395,6 @@ public static final long DEFAULT_LIVE_PRESENTATION_DELAY_MS
    - - - - @@ -477,7 +454,7 @@ public 
  • createPeriod

    -
    public MediaPeriod createPeriod​(MediaSource.MediaPeriodId periodId,
    +
    public MediaPeriod createPeriod​(MediaSource.MediaPeriodId id,
                                     Allocator allocator,
                                     long startPositionUs)
    Description copied from interface: MediaSource
    @@ -488,7 +465,7 @@ public Parameters: -
    periodId - The identifier of the period.
    +
    id - The identifier of the period.
    allocator - An Allocator from which to obtain media buffer allocations.
    startPositionUs - The expected start position, in microseconds.
    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html index 7d7ca9d48b..6ffa975c31 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -162,6 +162,16 @@ extends +static DataSpec +buildDataSpec​(String baseUrl, + RangedUri requestUri, + String cacheKey, + int flags) + +
    Builds a DataSpec for a given RangedUri belonging to Representation.
    + + + static ChunkIndex loadChunkIndex​(DataSource dataSource, int trackType, @@ -170,7 +180,17 @@ extends Loads initialization and index data for the representation and returns the ChunkIndex. - + +static ChunkIndex +loadChunkIndex​(DataSource dataSource, + int trackType, + Representation representation, + int baseUrlIndex) + +
    Loads initialization and index data for the representation and returns the ChunkIndex.
    + + + static Format loadFormatWithDrmInitData​(DataSource dataSource, Period period) @@ -178,7 +198,18 @@ extends Loads a Format for acquiring keys for a given period in a DASH manifest. - + +static void +loadInitializationData​(ChunkExtractor chunkExtractor, + DataSource dataSource, + Representation representation, + boolean loadIndex) + +
    Loads initialization data for the representation and optionally index data then returns + a BundledChunkExtractor which contains the output.
    + + + static DashManifest loadManifest​(DataSource dataSource, Uri uri) @@ -186,7 +217,7 @@ extends Loads a DASH manifest. - + static Format loadSampleFormat​(DataSource dataSource, int trackType, @@ -195,6 +226,16 @@ extends Loads initialization data for the representation and returns the sample Format. + +static Format +loadSampleFormat​(DataSource dataSource, + int trackType, + Representation representation, + int baseUrlIndex) + +
    Loads initialization data for the representation and returns the sample Format.
    + +
    -
    Builds a DataSpec for a given RangedUri belonging to Representation.
    +
    Builds a DataSpec for a given RangedUri belonging to Representation. + +

    Uses the first base URL of the representation to build the data spec.

    Parameters:
    representation - The Representation to which the request belongs.
    @@ -282,6 +348,32 @@ public static  + + +
      +
    • +

      loadSampleFormat

      +
      @Nullable
      +public static Format loadSampleFormat​(DataSource dataSource,
      +                                      int trackType,
      +                                      Representation representation,
      +                                      int baseUrlIndex)
      +                               throws IOException
      +
      Loads initialization data for the representation and returns the sample Format.
      +
      +
      Parameters:
      +
      dataSource - The source from which the data should be loaded.
      +
      trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
      +
      representation - The representation which initialization chunk belongs to.
      +
      baseUrlIndex - The index of the base URL to be picked from the list of base URLs.
      +
      Returns:
      +
      the sample Format of the given representation.
      +
      Throws:
      +
      IOException - Thrown when there is an error while loading.
      +
      +
    • +
    @@ -293,7 +385,9 @@ public static Representation representation) throws IOException -
    Loads initialization data for the representation and returns the sample Format.
    +
    Loads initialization data for the representation and returns the sample Format. + +

    Uses the first base URL for loading the format.

    Parameters:
    dataSource - The source from which the data should be loaded.
    @@ -306,10 +400,37 @@ public static  + + +
      +
    • +

      loadChunkIndex

      +
      @Nullable
      +public static ChunkIndex loadChunkIndex​(DataSource dataSource,
      +                                        int trackType,
      +                                        Representation representation,
      +                                        int baseUrlIndex)
      +                                 throws IOException
      +
      Loads initialization and index data for the representation and returns the ChunkIndex.
      +
      +
      Parameters:
      +
      dataSource - The source from which the data should be loaded.
      +
      trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
      +
      representation - The representation which initialization chunk belongs to.
      +
      baseUrlIndex - The index of the base URL with which to resolve the request URI.
      +
      Returns:
      +
      The ChunkIndex of the given representation, or null if no initialization or + index data exists.
      +
      Throws:
      +
      IOException - Thrown when there is an error while loading.
      +
      +
    • +
    -
  • @@ -291,7 +292,7 @@ implements +
      @@ -299,6 +300,7 @@ implements public DashChunkSource createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, + BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, @@ -312,10 +314,11 @@ implements TransferListener transferListener)
      Specified by:
      -
      createDashChunkSource in interface DashChunkSource.Factory
      +
      createDashChunkSource in interface DashChunkSource.Factory
      Parameters:
      manifestLoaderErrorThrower - Throws errors affecting loading of manifests.
      manifest - The initial manifest.
      +
      baseUrlExclusionList - The base URL exclusion list.
      periodIndex - The index of the corresponding period in the manifest.
      adaptationSetIndices - The indices of the corresponding adaptation sets in the period.
      trackSelection - The track selection.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.RepresentationHolder.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.RepresentationHolder.html index 9a5e3a51e9..185f226c15 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.RepresentationHolder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.RepresentationHolder.html @@ -166,6 +166,11 @@ extends segmentIndex   + +BaseUrl +selectedBaseUrl +  +
    @@ -263,6 +268,15 @@ extends public final Representation representation + + + +
      +
    • +

      selectedBaseUrl

      +
      public final BaseUrl selectedBaseUrl
      +
    • +
    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 d06c6cca44..f9f6b1e2bb 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 @@ -217,9 +217,10 @@ implements Description -DefaultDashChunkSource​(ChunkExtractor.Factory chunkExtractorFactory, +DefaultDashChunkSource​(ChunkExtractor.Factory chunkExtractorFactory, LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, + BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, @@ -319,10 +320,10 @@ implements boolean -onChunkLoadError​(Chunk chunk, +onChunkLoadError​(Chunk chunk, boolean cancelable, - Exception e, - long exclusionDurationMs) + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo, + LoadErrorHandlingPolicy loadErrorHandlingPolicy)
    Called when the ChunkSampleStream encounters an error loading a chunk obtained from this source.
    @@ -402,7 +403,7 @@ implements +
      @@ -411,6 +412,7 @@ implements ChunkExtractor.Factory chunkExtractorFactory, LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, + BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, @@ -428,6 +430,7 @@ implements +
        @@ -640,20 +643,20 @@ implements public boolean onChunkLoadError​(Chunk chunk, boolean cancelable, - Exception e, - long exclusionDurationMs) -
        Description copied from interface: ChunkSource
        + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo, + LoadErrorHandlingPolicy loadErrorHandlingPolicy) +
        Description copied from interface: ChunkSource
        Called when the ChunkSampleStream encounters an error loading a chunk obtained from this source.
        Specified by:
        -
        onChunkLoadError in interface ChunkSource
        +
        onChunkLoadError in interface ChunkSource
        Parameters:
        chunk - The chunk whose load encountered the error.
        cancelable - Whether the load can be canceled.
        -
        e - The error.
        -
        exclusionDurationMs - The duration for which the associated track may be excluded, or - C.TIME_UNSET if the track may not be excluded.
        +
        loadErrorInfo - The load error info.
        +
        loadErrorHandlingPolicy - The load error handling policy to customize the behaviour of + handling the load error.
        Returns:
        Whether the load should be canceled so that a replacement chunk can be loaded instead. Must be false if cancelable is false. If true, ChunkSource.getNextChunk(long, long, List, ChunkHolder) will be called to obtain the replacement @@ -687,6 +690,7 @@ implements Format trackFormat, int trackSelectionReason, Object trackSelectionData, + @Nullable RangedUri initializationUri, RangedUri indexUri) diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.PlayerTrackEmsgHandler.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.PlayerTrackEmsgHandler.html index f8ba12a0bb..c7ebfc03cf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.PlayerTrackEmsgHandler.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.PlayerTrackEmsgHandler.html @@ -255,7 +255,7 @@ implements TrackOutput.CryptoData encryptionData) + TrackOutput.CryptoData cryptoData)
        Called when metadata associated with a sample has been extracted from the stream.
        @@ -372,7 +372,7 @@ implements TrackOutput.CryptoData encryptionData) + TrackOutput.CryptoData cryptoData)
        Description copied from interface: TrackOutput
        Called when metadata associated with a sample has been extracted from the stream. @@ -388,7 +388,7 @@ implements TrackOutput.sampleData(DataReader, int, boolean) or TrackOutput.sampleData(ParsableByteArray, int) since the last byte belonging to the sample whose metadata is being passed.
        -
        encryptionData - The encryption data required to decrypt the sample. May be null.
        +
        cryptoData - The encryption data required to decrypt the sample. May be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html index c7fe078e01..45d6f90fde 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html @@ -288,8 +288,8 @@ extends

      type

      public final int type
      -
      +
      The type of the adaptation set. One of the C + TRACK_TYPE_* constants.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/BaseUrl.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/BaseUrl.html new file mode 100644 index 0000000000..4845528f95 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/BaseUrl.html @@ -0,0 +1,489 @@ + + + + +BaseUrl (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    + +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.source.dash.manifest.BaseUrl
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public final class BaseUrl
      +extends Object
      +
      A base URL, as defined by ISO 23009-1, 2nd edition, 5.6. and ETSI TS 103 285 V1.2.1, 10.8.2.1
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          DEFAULT_PRIORITY

          +
          public static final int DEFAULT_PRIORITY
          +
          The default priority.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          DEFAULT_WEIGHT

          +
          public static final int DEFAULT_WEIGHT
          +
          The default weight.
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        + + + +
          +
        • +

          url

          +
          public final String url
          +
          The URL.
          +
        • +
        + + + +
          +
        • +

          serviceLocation

          +
          public final String serviceLocation
          +
          The service location.
          +
        • +
        + + + +
          +
        • +

          priority

          +
          public final int priority
          +
          The priority.
          +
        • +
        + + + +
          +
        • +

          weight

          +
          public final int weight
          +
          The weight.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Detail

        + + + + + + + +
          +
        • +

          BaseUrl

          +
          public BaseUrl​(String url,
          +               String serviceLocation,
          +               int priority,
          +               int weight)
          +
          Creates an instance.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          equals

          +
          public boolean equals​(@Nullable
          +                      Object o)
          +
          +
          Overrides:
          +
          equals in class Object
          +
          +
        • +
        + + + +
          +
        • +

          hashCode

          +
          public int hashCode()
          +
          +
          Overrides:
          +
          hashCode in class Object
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifest.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifest.html index 03b57388fe..cca2123239 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifest.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifest.html @@ -213,8 +213,8 @@ implements long publishTimeMs -
    The publishTime value in milliseconds since epoch, or C.TIME_UNSET if - not present.
    +
    The publishTime value in milliseconds since epoch, or C.TIME_UNSET if not + present.
    @@ -236,8 +236,7 @@ implements long timeShiftBufferDepthMs -
    The timeShiftBufferDepth value in milliseconds, or C.TIME_UNSET if not - present.
    +
    The timeShiftBufferDepth value in milliseconds, or C.TIME_UNSET if not present.
    @@ -408,8 +407,7 @@ implements

    timeShiftBufferDepthMs

    public final long timeShiftBufferDepthMs
    -
    +
    The timeShiftBufferDepth value in milliseconds, or C.TIME_UNSET if not present.
    @@ -430,8 +428,8 @@ implements

    publishTimeMs

    public final long publishTimeMs
    -
    +
    The publishTime value in milliseconds since epoch, or C.TIME_UNSET if not + present.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html index f23c341acd..e9029a73e0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html @@ -151,8 +151,8 @@ extends Description -String -baseUrl +ImmutableList<BaseUrl> +baseUrls   @@ -203,8 +203,8 @@ extends Description -RepresentationInfo​(Format format, - String baseUrl, +RepresentationInfo​(Format format, + List<BaseUrl> baseUrls, SegmentBase segmentBase, String drmSchemeType, ArrayList<DrmInitData.SchemeData> drmSchemeDatas, @@ -255,13 +255,13 @@ extends public final Format format - + @@ -320,14 +320,14 @@ public final  + @@ -217,9 +217,9 @@ extends Description -SingleSegmentRepresentation​(long revisionId, +SingleSegmentRepresentation​(long revisionId, Format format, - String baseUrl, + List<BaseUrl> baseUrls, SegmentBase.SingleSegmentBase segmentBase, List<Descriptor> inbandEventStreams, String cacheKey, @@ -286,7 +286,7 @@ extends Representation -getInitializationUri, newInstance, newInstance, newInstance +getInitializationUri, newInstance, newInstance, newInstance diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html index 1d61b0c4f6..9adf827c7c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html @@ -191,8 +191,8 @@ extends void setPositionUs​(long positionUs)
    Informs the decoder of the current playback position. -

    - Must be called prior to each attempt to dequeue output buffers from the decoder.

    + +

    Must be called prior to each attempt to dequeue output buffers from the decoder.

    Parameters:
    positionUs - The current playback position in microseconds.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html index 6d42874e28..c1fc18ff01 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html @@ -177,8 +177,7 @@ extends
    long subsampleOffsetUs -
    An offset that must be added to the subtitle's event times after it's been decoded, or - Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    +
    An offset that must be added to the subtitle's event times after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    @@ -264,8 +263,7 @@ extends

    subsampleOffsetUs

    public long subsampleOffsetUs
    -
    +
    An offset that must be added to the subtitle's event times after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html index 09ebc334f6..41665a12c8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html @@ -340,8 +340,7 @@ implements Parameters:
    timeUs - The time of the start of the subtitle in microseconds.
    subtitle - The subtitle.
    -
    subsampleOffsetUs - An offset that must be added to the subtitle's event times, or - Format.OFFSET_SAMPLE_RELATIVE if timeUs should be added.
    +
    subsampleOffsetUs - An offset that must be added to the subtitle's event times, or Format.OFFSET_SAMPLE_RELATIVE if timeUs should be added.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/TextRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/text/TextRenderer.html index fd7f9850d2..e5e49705ff 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/TextRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/TextRenderer.html @@ -320,7 +320,7 @@ implements BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, handleMessage, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onEnabled, onReset, onStarted, onStopped, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getMediaClock, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, handleMessage, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onEnabled, onReset, onStarted, onStopped, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation
    • @@ -555,8 +555,8 @@ public int supportsFormat​(protected void onDisabled()
      Called when the renderer is disabled. -

      - The default implementation is a no-op.

      + +

      The default implementation is a no-op.

      Overrides:
      onDisabled in class BaseRenderer
      @@ -592,16 +592,15 @@ public int supportsFormat​(public boolean isReady()
      Whether the renderer is able to immediately render media from the current position. -

      - If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that the - renderer has everything that it needs to continue playback. Returning false indicates that + +

      If the renderer is in the Renderer.STATE_STARTED state then returning true indicates that + the renderer has everything that it needs to continue playback. Returning false indicates that the player should pause until the renderer is ready. -

      - If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that the - renderer is ready for playback to be started. Returning false indicates that it is not. -

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

      + +

      If the renderer is in the Renderer.STATE_ENABLED state then returning true indicates that + the renderer is ready for playback to be started. Returning false indicates that it is not. + +

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

      Specified by:
      isReady in interface Renderer
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea608Decoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea608Decoder.html index b8757e209c..3c27a1913c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea608Decoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea608Decoder.html @@ -482,8 +482,8 @@ public public void setPositionUs​(long positionUs)
      Informs the decoder of the current playback position. -

      - Must be called prior to each attempt to dequeue output buffers from the decoder.

      + +

      Must be called prior to each attempt to dequeue output buffers from the decoder.

      Specified by:
      setPositionUs in interface SubtitleDecoder
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea708Decoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea708Decoder.html index f378cf37f5..9fd5c0dbbe 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea708Decoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/cea/Cea708Decoder.html @@ -382,8 +382,8 @@ extends public void setPositionUs​(long positionUs)
      Informs the decoder of the current playback position. -

      - Must be called prior to each attempt to dequeue output buffers from the decoder.

      + +

      Must be called prior to each attempt to dequeue output buffers from the decoder.

      Specified by:
      setPositionUs in interface SubtitleDecoder
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/dvb/DvbDecoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/dvb/DvbDecoder.html index 205ec85f82..414596a985 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/dvb/DvbDecoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/dvb/DvbDecoder.html @@ -250,9 +250,9 @@ extends List<byte[]> initializationData)
      Parameters:
      -
      initializationData - The initialization data for the decoder. The initialization data - must consist of a single byte array containing 5 bytes: flag_pes_stripped (1), - composition_page (2), ancillary_page (2).
      +
      initializationData - The initialization data for the decoder. The initialization data must + consist of a single byte array containing 5 bytes: flag_pes_stripped (1), composition_page + (2), ancillary_page (2).
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/text/package-tree.html index e56d16c43d..a0b7249618 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/package-tree.html @@ -122,7 +122,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -
  • com.google.android.exoplayer2.text.Cue
  • +
  • com.google.android.exoplayer2.text.Cue (implements com.google.android.exoplayer2.Bundleable)
  • com.google.android.exoplayer2.text.Cue.Builder
  • com.google.android.exoplayer2.decoder.SimpleDecoder<I,​O,​E> (implements com.google.android.exoplayer2.decoder.Decoder<I,​O,​E>)
      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 2b734d10d4..2e4ca98d51 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 @@ -372,7 +372,7 @@ extends WebvttCssStyle -setFontSizeUnit​(short unit) +setFontSizeUnit​(int unit)   @@ -621,7 +621,16 @@ extends Set<String> classes, @Nullable String voice) -
      Returns a value in a score system compliant with the CSS Specificity rules.
      +
      Returns a value in a score system compliant with the CSS Specificity rules. + +

      The score works as follows: + +

        +
      • Id match adds 0x40000000 to the score. +
      • Each class and voice match adds 4 to the score. +
      • Tag matching adds 2 to the score. +
      • Universal selector matching scores 1. +
      Parameters:
      id - The id of the cue if present, null otherwise.
      @@ -631,14 +640,7 @@ extends Returns:
      The score of the match, zero if there is no match.
      See Also:
      -
      CSS Cascading -

      The score works as follows: -

        -
      • Id match adds 0x40000000 to the score. -
      • Each class and voice match adds 4 to the score. -
      • Tag matching adds 2 to the score. -
      • Universal selector matching scores 1. -
      +
      CSS Cascading
    @@ -795,13 +797,14 @@ public public WebvttCssStyle setFontSize​(float fontSize)
  • - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html index bfa08069b7..d02f0486da 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html @@ -143,8 +143,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static final class DefaultTrackSelector.Parameters
    -extends TrackSelectionParameters
    -
    Extends TrackSelectionParameters by adding fields that are specific to DefaultTrackSelector.
    +extends TrackSelectionParameters +implements Parcelable +
    Extends DefaultTrackSelector.Parameters by adding fields that are specific to DefaultTrackSelector.
    @@ -238,16 +239,32 @@ extends static DefaultTrackSelector.Parameters +DEFAULT + +
    Deprecated. +
    This instance is not configured using Context constraints.
    +
    + + + +static DefaultTrackSelector.Parameters DEFAULT_WITHOUT_CONTEXT
    An instance with default values, except those obtained from the Context.
    + +int +disabledTextTrackSelectionFlags + +
    Bitmask of selection flags that are disabled for text track selections.
    + + boolean exceedAudioConstraintsIfNecessary -
    Whether to exceed the maxAudioChannelCount and maxAudioBitrate constraints +
    Whether to exceed the TrackSelectionParameters.maxAudioChannelCount and TrackSelectionParameters.maxAudioBitrate constraints when no selection can be made otherwise.
    @@ -262,109 +279,7 @@ extends boolean exceedVideoConstraintsIfNecessary -
    Whether to exceed the maxVideoWidth, maxVideoHeight and maxVideoBitrate constraints when no selection can be made otherwise.
    - - - -boolean -forceHighestSupportedBitrate - -
    Whether to force selection of the highest bitrate audio and video tracks that comply with all - other constraints.
    - - - -boolean -forceLowestBitrate - -
    Whether to force selection of the single lowest bitrate audio and video tracks that comply - with all other constraints.
    - - - -int -maxAudioBitrate - -
    Maximum allowed audio bitrate in bits per second.
    - - - -int -maxAudioChannelCount - -
    Maximum allowed audio channel count.
    - - - -int -maxVideoBitrate - -
    Maximum allowed video bitrate in bits per second.
    - - - -int -maxVideoFrameRate - -
    Maximum allowed video frame rate in hertz.
    - - - -int -maxVideoHeight - -
    Maximum allowed video height in pixels.
    - - - -int -maxVideoWidth - -
    Maximum allowed video width in pixels.
    - - - -int -minVideoBitrate - -
    Minimum allowed video bitrate in bits per second.
    - - - -int -minVideoFrameRate - -
    Minimum allowed video frame rate in hertz.
    - - - -int -minVideoHeight - -
    Minimum allowed video height in pixels.
    - - - -int -minVideoWidth - -
    Minimum allowed video width in pixels.
    - - - -ImmutableList<String> -preferredAudioMimeTypes - -
    The preferred sample MIME types for audio tracks in order of preference, or an empty list for - no preference.
    - - - -ImmutableList<String> -preferredVideoMimeTypes - -
    The preferred sample MIME types for video tracks in order of preference, or an empty list for - no preference.
    +
    Whether to exceed the TrackSelectionParameters.maxVideoWidth, TrackSelectionParameters.maxVideoHeight and TrackSelectionParameters.maxVideoBitrate constraints when no selection can be made otherwise.
    @@ -374,34 +289,13 @@ extends Whether to enable tunneling if possible.
    - -int -viewportHeight - -
    Viewport height in pixels.
    - - - -boolean -viewportOrientationMayChange - -
    Whether the viewport orientation may change during playback.
    - - - -int -viewportWidth - -
    Viewport width in pixels.
    - - @@ -653,74 +490,6 @@ extends - - -
      -
    • -

      viewportWidth

      -
      public final int viewportWidth
      -
      Viewport width in pixels. Constrains video track selections for adaptive content so that only - tracks suitable for the viewport are selected. The default value is the physical width of the - primary display, in pixels.
      -
    • -
    - - - -
      -
    • -

      viewportHeight

      -
      public final int viewportHeight
      -
      Viewport height in pixels. Constrains video track selections for adaptive content so that - only tracks suitable for the viewport are selected. The default value is the physical height - of the primary display, in pixels.
      -
    • -
    - - - -
      -
    • -

      viewportOrientationMayChange

      -
      public final boolean viewportOrientationMayChange
      -
      Whether the viewport orientation may change during playback. Constrains video track - selections for adaptive content so that only tracks suitable for the viewport are selected. - The default value is true.
      -
    • -
    - - - -
      -
    • -

      preferredVideoMimeTypes

      -
      public final ImmutableList<String> preferredVideoMimeTypes
      -
      The preferred sample MIME types for video tracks in order of preference, or an empty list for - no preference. The default is an empty list.
      -
    • -
    - - - -
      -
    • -

      maxAudioChannelCount

      -
      public final int maxAudioChannelCount
      -
      Maximum allowed audio channel count. The default value is Integer.MAX_VALUE (i.e. no - constraint).
      -
    • -
    - - - -
      -
    • -

      maxAudioBitrate

      -
      public final int maxAudioBitrate
      -
      Maximum allowed audio bitrate in bits per second. The default value is Integer.MAX_VALUE (i.e. no constraint).
      -
    • -
    @@ -728,7 +497,7 @@ extends

    exceedAudioConstraintsIfNecessary

    public final boolean exceedAudioConstraintsIfNecessary
    -
    Whether to exceed the maxAudioChannelCount and maxAudioBitrate constraints +
    Whether to exceed the TrackSelectionParameters.maxAudioChannelCount and TrackSelectionParameters.maxAudioBitrate constraints when no selection can be made otherwise. The default value is true.
    @@ -766,39 +535,6 @@ extends - - -
      -
    • -

      preferredAudioMimeTypes

      -
      public final ImmutableList<String> preferredAudioMimeTypes
      -
      The preferred sample MIME types for audio tracks in order of preference, or an empty list for - no preference. The default is an empty list.
      -
    • -
    - - - -
      -
    • -

      forceLowestBitrate

      -
      public final boolean forceLowestBitrate
      -
      Whether to force selection of the single lowest bitrate audio and video tracks that comply - with all other constraints. The default value is false.
      -
    • -
    - - - -
      -
    • -

      forceHighestSupportedBitrate

      -
      public final boolean forceHighestSupportedBitrate
      -
      Whether to force selection of the highest bitrate audio and video tracks that comply with all - other constraints. The default value is false.
      -
    • -
    @@ -828,7 +564,7 @@ extends - diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html index 2361d274a0..cb94cbd21e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html @@ -235,7 +235,7 @@ extends TrackSelectorResult selectTracks​(RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, - MediaSource.MediaPeriodId mediaPeriodId, + MediaSource.MediaPeriodId periodId, Timeline timeline)
    Called by the player to perform a track selection.
    @@ -340,7 +340,7 @@ public final public final TrackSelectorResult selectTracks​(RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, - MediaSource.MediaPeriodId mediaPeriodId, + MediaSource.MediaPeriodId periodId, Timeline timeline) throws ExoPlaybackException
    Description copied from class: TrackSelector
    @@ -352,7 +352,7 @@ public final RendererCapabilities of the renderers for which tracks are to be selected.
    trackGroups - The available track groups.
    -
    mediaPeriodId - The MediaSource.MediaPeriodId of the period for which tracks are to be selected.
    +
    periodId - The MediaSource.MediaPeriodId of the period for which tracks are to be selected.
    timeline - The Timeline holding the period for which tracks are to be selected.
    Returns:
    A TrackSelectorResult describing the track selections.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html index 6220e9a8f9..be9e02a8d6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -157,23 +157,31 @@ extends Constructors  -Constructor +Modifier +Constructor Description +  Builder()
    Deprecated. -
    Context constraints will not be set when using this constructor.
    +
    Context constraints will not be set using this constructor.
    +  Builder​(Context context)
    Creates a builder with default initial values.
    + +protected +Builder​(TrackSelectionParameters initialValues) +  + @@ -201,40 +209,143 @@ extends TrackSelectionParameters.Builder -setDisabledTextTrackSelectionFlags​(int disabledTextTrackSelectionFlags) +clearVideoSizeConstraints() -
    Sets a bitmask of selection flags that are disabled for text track selections.
    + TrackSelectionParameters.Builder +clearViewportSizeConstraints() + + + + + +TrackSelectionParameters.Builder +setForceHighestSupportedBitrate​(boolean forceHighestSupportedBitrate) + +
    Sets whether to force selection of the highest bitrate audio and video tracks that comply + with all other constraints.
    + + + +TrackSelectionParameters.Builder +setForceLowestBitrate​(boolean forceLowestBitrate) + +
    Sets whether to force selection of the single lowest bitrate audio and video tracks that + comply with all other constraints.
    + + + +TrackSelectionParameters.Builder +setMaxAudioBitrate​(int maxAudioBitrate) + +
    Sets the maximum allowed audio bitrate.
    + + + +TrackSelectionParameters.Builder +setMaxAudioChannelCount​(int maxAudioChannelCount) + +
    Sets the maximum allowed audio channel count.
    + + + +TrackSelectionParameters.Builder +setMaxVideoBitrate​(int maxVideoBitrate) + +
    Sets the maximum allowed video bitrate.
    + + + +TrackSelectionParameters.Builder +setMaxVideoFrameRate​(int maxVideoFrameRate) + +
    Sets the maximum allowed video frame rate.
    + + + +TrackSelectionParameters.Builder +setMaxVideoSize​(int maxVideoWidth, + int maxVideoHeight) + +
    Sets the maximum allowed video width and height.
    + + + +TrackSelectionParameters.Builder +setMaxVideoSizeSd() + + + + + +TrackSelectionParameters.Builder +setMinVideoBitrate​(int minVideoBitrate) + +
    Sets the minimum allowed video bitrate.
    + + + +TrackSelectionParameters.Builder +setMinVideoFrameRate​(int minVideoFrameRate) + +
    Sets the minimum allowed video frame rate.
    + + + +TrackSelectionParameters.Builder +setMinVideoSize​(int minVideoWidth, + int minVideoHeight) + +
    Sets the minimum allowed video width and height.
    + + + +TrackSelectionParameters.Builder setPreferredAudioLanguage​(String preferredAudioLanguage)
    Sets the preferred language for audio and forced text tracks.
    - + TrackSelectionParameters.Builder setPreferredAudioLanguages​(String... preferredAudioLanguages)
    Sets the preferred languages for audio and forced text tracks.
    - + +TrackSelectionParameters.Builder +setPreferredAudioMimeType​(String mimeType) + +
    Sets the preferred sample MIME type for audio tracks.
    + + + +TrackSelectionParameters.Builder +setPreferredAudioMimeTypes​(String... mimeTypes) + +
    Sets the preferred sample MIME types for audio tracks.
    + + + TrackSelectionParameters.Builder setPreferredAudioRoleFlags​(int preferredAudioRoleFlags)
    Sets the preferred C.RoleFlags for audio tracks.
    - + TrackSelectionParameters.Builder setPreferredTextLanguage​(String preferredTextLanguage)
    Sets the preferred language for text tracks.
    - + TrackSelectionParameters.Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings​(Context context) @@ -242,21 +353,35 @@ extends CaptioningManager.
    - + TrackSelectionParameters.Builder setPreferredTextLanguages​(String... preferredTextLanguages)
    Sets the preferred languages for text tracks.
    - + TrackSelectionParameters.Builder setPreferredTextRoleFlags​(int preferredTextRoleFlags)
    Sets the preferred C.RoleFlags for text tracks.
    - + +TrackSelectionParameters.Builder +setPreferredVideoMimeType​(String mimeType) + +
    Sets the preferred sample MIME type for video tracks.
    + + + +TrackSelectionParameters.Builder +setPreferredVideoMimeTypes​(String... mimeTypes) + +
    Sets the preferred sample MIME types for video tracks.
    + + + TrackSelectionParameters.Builder setSelectUndeterminedTextLanguage​(boolean selectUndeterminedTextLanguage) @@ -265,6 +390,25 @@ extends + +TrackSelectionParameters.Builder +setViewportSize​(int viewportWidth, + int viewportHeight, + boolean viewportOrientationMayChange) + +
    Sets the viewport size to constrain adaptive video selections so that only tracks suitable + for the viewport are selected.
    + + + +TrackSelectionParameters.Builder +setViewportSizeToPhysicalDisplaySize​(Context context, + boolean viewportOrientationMayChange) + +
    Equivalent to calling setViewportSize(int, int, boolean) with the viewport size + obtained from Util.getCurrentDisplayModeSize(Context).
    + + - + @@ -327,6 +484,226 @@ public Builder()

    Method Detail

    + + + + + + + + + + + +
      +
    • +

      setMaxVideoSize

      +
      public TrackSelectionParameters.Builder setMaxVideoSize​(int maxVideoWidth,
      +                                                        int maxVideoHeight)
      +
      Sets the maximum allowed video width and height.
      +
      +
      Parameters:
      +
      maxVideoWidth - Maximum allowed video width in pixels.
      +
      maxVideoHeight - Maximum allowed video height in pixels.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMaxVideoFrameRate

      +
      public TrackSelectionParameters.Builder setMaxVideoFrameRate​(int maxVideoFrameRate)
      +
      Sets the maximum allowed video frame rate.
      +
      +
      Parameters:
      +
      maxVideoFrameRate - Maximum allowed video frame rate in hertz.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMaxVideoBitrate

      +
      public TrackSelectionParameters.Builder setMaxVideoBitrate​(int maxVideoBitrate)
      +
      Sets the maximum allowed video bitrate.
      +
      +
      Parameters:
      +
      maxVideoBitrate - Maximum allowed video bitrate in bits per second.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMinVideoSize

      +
      public TrackSelectionParameters.Builder setMinVideoSize​(int minVideoWidth,
      +                                                        int minVideoHeight)
      +
      Sets the minimum allowed video width and height.
      +
      +
      Parameters:
      +
      minVideoWidth - Minimum allowed video width in pixels.
      +
      minVideoHeight - Minimum allowed video height in pixels.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMinVideoFrameRate

      +
      public TrackSelectionParameters.Builder setMinVideoFrameRate​(int minVideoFrameRate)
      +
      Sets the minimum allowed video frame rate.
      +
      +
      Parameters:
      +
      minVideoFrameRate - Minimum allowed video frame rate in hertz.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMinVideoBitrate

      +
      public TrackSelectionParameters.Builder setMinVideoBitrate​(int minVideoBitrate)
      +
      Sets the minimum allowed video bitrate.
      +
      +
      Parameters:
      +
      minVideoBitrate - Minimum allowed video bitrate in bits per second.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + + + + + + + + + +
      +
    • +

      setViewportSize

      +
      public TrackSelectionParameters.Builder setViewportSize​(int viewportWidth,
      +                                                        int viewportHeight,
      +                                                        boolean viewportOrientationMayChange)
      +
      Sets the viewport size to constrain adaptive video selections so that only tracks suitable + for the viewport are selected.
      +
      +
      Parameters:
      +
      viewportWidth - Viewport width in pixels.
      +
      viewportHeight - Viewport height in pixels.
      +
      viewportOrientationMayChange - Whether the viewport orientation may change during + playback.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setPreferredVideoMimeType

      +
      public TrackSelectionParameters.Builder setPreferredVideoMimeType​(@Nullable
      +                                                                  String mimeType)
      +
      Sets the preferred sample MIME type for video tracks.
      +
      +
      Parameters:
      +
      mimeType - The preferred MIME type for video tracks, or null to clear a + previously set preference.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setPreferredVideoMimeTypes

      +
      public TrackSelectionParameters.Builder setPreferredVideoMimeTypes​(String... mimeTypes)
      +
      Sets the preferred sample MIME types for video tracks.
      +
      +
      Parameters:
      +
      mimeTypes - The preferred MIME types for video tracks in order of preference, or an + empty list for no preference.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    @@ -380,6 +757,73 @@ public Builder()
    + + + +
      +
    • +

      setMaxAudioChannelCount

      +
      public TrackSelectionParameters.Builder setMaxAudioChannelCount​(int maxAudioChannelCount)
      +
      Sets the maximum allowed audio channel count.
      +
      +
      Parameters:
      +
      maxAudioChannelCount - Maximum allowed audio channel count.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setMaxAudioBitrate

      +
      public TrackSelectionParameters.Builder setMaxAudioBitrate​(int maxAudioBitrate)
      +
      Sets the maximum allowed audio bitrate.
      +
      +
      Parameters:
      +
      maxAudioBitrate - Maximum allowed audio bitrate in bits per second.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setPreferredAudioMimeType

      +
      public TrackSelectionParameters.Builder setPreferredAudioMimeType​(@Nullable
      +                                                                  String mimeType)
      +
      Sets the preferred sample MIME type for audio tracks.
      +
      +
      Parameters:
      +
      mimeType - The preferred MIME type for audio tracks, or null to clear a + previously set preference.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setPreferredAudioMimeTypes

      +
      public TrackSelectionParameters.Builder setPreferredAudioMimeTypes​(String... mimeTypes)
      +
      Sets the preferred sample MIME types for audio tracks.
      +
      +
      Parameters:
      +
      mimeTypes - The preferred MIME types for audio tracks in order of preference, or an + empty list for no preference.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    @@ -471,19 +915,37 @@ public Builder()
    - +
    • -

      setDisabledTextTrackSelectionFlags

      -
      public TrackSelectionParameters.Builder setDisabledTextTrackSelectionFlags​(@SelectionFlags
      -                                                                           int disabledTextTrackSelectionFlags)
      -
      Sets a bitmask of selection flags that are disabled for text track selections.
      +

      setForceLowestBitrate

      +
      public TrackSelectionParameters.Builder setForceLowestBitrate​(boolean forceLowestBitrate)
      +
      Sets whether to force selection of the single lowest bitrate audio and video tracks that + comply with all other constraints.
      Parameters:
      -
      disabledTextTrackSelectionFlags - A bitmask of C.SelectionFlags that are - disabled for text track selections.
      +
      forceLowestBitrate - Whether to force selection of the single lowest bitrate audio and + video tracks.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setForceHighestSupportedBitrate

      +
      public TrackSelectionParameters.Builder setForceHighestSupportedBitrate​(boolean forceHighestSupportedBitrate)
      +
      Sets whether to force selection of the highest bitrate audio and video tracks that comply + with all other constraints.
      +
      +
      Parameters:
      +
      forceHighestSupportedBitrate - Whether to force selection of the highest bitrate audio + and video tracks.
      Returns:
      This builder.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html index b2918fb67c..fcfdea1465 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html @@ -88,13 +88,13 @@ loadScripts(document, 'script');
    • Summary: 
    • Nested | 
    • Field | 
    • -
    • Constr | 
    • +
    • Constr | 
    • Method
    @@ -215,13 +215,92 @@ implements -int -disabledTextTrackSelectionFlags +boolean +forceHighestSupportedBitrate -
    Bitmask of selection flags that are disabled for text track selections.
    +
    Whether to force selection of the highest bitrate audio and video tracks that comply with all + other constraints.
    +boolean +forceLowestBitrate + +
    Whether to force selection of the single lowest bitrate audio and video tracks that comply with + all other constraints.
    + + + +int +maxAudioBitrate + +
    Maximum allowed audio bitrate in bits per second.
    + + + +int +maxAudioChannelCount + +
    Maximum allowed audio channel count.
    + + + +int +maxVideoBitrate + +
    Maximum allowed video bitrate in bits per second.
    + + + +int +maxVideoFrameRate + +
    Maximum allowed video frame rate in hertz.
    + + + +int +maxVideoHeight + +
    Maximum allowed video height in pixels.
    + + + +int +maxVideoWidth + +
    Maximum allowed video width in pixels.
    + + + +int +minVideoBitrate + +
    Minimum allowed video bitrate in bits per second.
    + + + +int +minVideoFrameRate + +
    Minimum allowed video frame rate in hertz.
    + + + +int +minVideoHeight + +
    Minimum allowed video height in pixels.
    + + + +int +minVideoWidth + +
    Minimum allowed video width in pixels.
    + + + ImmutableList<String> preferredAudioLanguages @@ -229,6 +308,14 @@ implements +ImmutableList<String> +preferredAudioMimeTypes + +
    The preferred sample MIME types for audio tracks in order of preference, or an empty list for + no preference.
    + + int preferredAudioRoleFlags @@ -251,12 +338,41 @@ implements +ImmutableList<String> +preferredVideoMimeTypes + +
    The preferred sample MIME types for video tracks in order of preference, or an empty list for + no preference.
    + + + boolean selectUndeterminedTextLanguage
    Whether a text track with undetermined language should be selected if no track with preferredTextLanguages is available, or if preferredTextLanguages is unset.
    + +int +viewportHeight + +
    Viewport height in pixels.
    + + + +boolean +viewportOrientationMayChange + +
    Whether the viewport orientation may change during playback.
    + + + +int +viewportWidth + +
    Viewport width in pixels.
    + +
    • @@ -268,6 +384,29 @@ implements + +
      @@ -373,6 +514,151 @@ public static final  + + + + + + +
        +
      • +

        maxVideoWidth

        +
        public final int maxVideoWidth
        +
        Maximum allowed video width in pixels. The default value is Integer.MAX_VALUE (i.e. no + constraint). + +

        To constrain adaptive video track selections to be suitable for a given viewport (the region + of the display within which video will be played), use (viewportWidth, viewportHeight and viewportOrientationMayChange) instead.

        +
      • +
      + + + +
        +
      • +

        maxVideoHeight

        +
        public final int maxVideoHeight
        +
        Maximum allowed video height in pixels. The default value is Integer.MAX_VALUE (i.e. no + constraint). + +

        To constrain adaptive video track selections to be suitable for a given viewport (the region + of the display within which video will be played), use (viewportWidth, viewportHeight and viewportOrientationMayChange) instead.

        +
      • +
      + + + +
        +
      • +

        maxVideoFrameRate

        +
        public final int maxVideoFrameRate
        +
        Maximum allowed video frame rate in hertz. The default value is Integer.MAX_VALUE (i.e. + no constraint).
        +
      • +
      + + + +
        +
      • +

        maxVideoBitrate

        +
        public final int maxVideoBitrate
        +
        Maximum allowed video bitrate in bits per second. The default value is Integer.MAX_VALUE (i.e. no constraint).
        +
      • +
      + + + +
        +
      • +

        minVideoWidth

        +
        public final int minVideoWidth
        +
        Minimum allowed video width in pixels. The default value is 0 (i.e. no constraint).
        +
      • +
      + + + +
        +
      • +

        minVideoHeight

        +
        public final int minVideoHeight
        +
        Minimum allowed video height in pixels. The default value is 0 (i.e. no constraint).
        +
      • +
      + + + +
        +
      • +

        minVideoFrameRate

        +
        public final int minVideoFrameRate
        +
        Minimum allowed video frame rate in hertz. The default value is 0 (i.e. no constraint).
        +
      • +
      + + + +
        +
      • +

        minVideoBitrate

        +
        public final int minVideoBitrate
        +
        Minimum allowed video bitrate in bits per second. The default value is 0 (i.e. no constraint).
        +
      • +
      + + + +
        +
      • +

        viewportWidth

        +
        public final int viewportWidth
        +
        Viewport width in pixels. Constrains video track selections for adaptive content so that only + tracks suitable for the viewport are selected. The default value is the physical width of the + primary display, in pixels.
        +
      • +
      + + + +
        +
      • +

        viewportHeight

        +
        public final int viewportHeight
        +
        Viewport height in pixels. Constrains video track selections for adaptive content so that only + tracks suitable for the viewport are selected. The default value is the physical height of the + primary display, in pixels.
        +
      • +
      + + + +
        +
      • +

        viewportOrientationMayChange

        +
        public final boolean viewportOrientationMayChange
        +
        Whether the viewport orientation may change during playback. Constrains video track selections + for adaptive content so that only tracks suitable for the viewport are selected. The default + value is true.
        +
      • +
      + + + +
        +
      • +

        preferredVideoMimeTypes

        +
        public final ImmutableList<String> preferredVideoMimeTypes
        +
        The preferred sample MIME types for video tracks in order of preference, or an empty list for + no preference. The default is an empty list.
        +
      • +
      @@ -397,6 +683,38 @@ public final int preferredAudioRoleFlags there is one, or the first track if there's no default. The default value is 0.
    + + + +
      +
    • +

      maxAudioChannelCount

      +
      public final int maxAudioChannelCount
      +
      Maximum allowed audio channel count. The default value is Integer.MAX_VALUE (i.e. no + constraint).
      +
    • +
    + + + +
      +
    • +

      maxAudioBitrate

      +
      public final int maxAudioBitrate
      +
      Maximum allowed audio bitrate in bits per second. The default value is Integer.MAX_VALUE (i.e. no constraint).
      +
    • +
    + + + +
      +
    • +

      preferredAudioMimeTypes

      +
      public final ImmutableList<String> preferredAudioMimeTypes
      +
      The preferred sample MIME types for audio tracks in order of preference, or an empty list for + no preference. The default is an empty list.
      +
    • +
    @@ -435,24 +753,45 @@ public final int preferredTextRoleFlags default value is false. - +
    • -

      disabledTextTrackSelectionFlags

      -
      @SelectionFlags
      -public final int disabledTextTrackSelectionFlags
      -
      Bitmask of selection flags that are disabled for text track selections. See C.SelectionFlags. The default value is 0 (i.e. no flags).
      +

      forceLowestBitrate

      +
      public final boolean forceLowestBitrate
      +
      Whether to force selection of the single lowest bitrate audio and video tracks that comply with + all other constraints. The default value is false.
    - +
    • -

      CREATOR

      -
      public static final Parcelable.Creator<TrackSelectionParameters> CREATOR
      +

      forceHighestSupportedBitrate

      +
      public final boolean forceHighestSupportedBitrate
      +
      Whether to force selection of the highest bitrate audio and video tracks that comply with all + other constraints. The default value is false.
      +
    • +
    + + + + +
    + diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html index 26fa5d0f64..aa3d848324 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -178,6 +178,14 @@ extends Description +static LoadErrorHandlingPolicy.FallbackOptions +createFallbackOptions​(ExoTrackSelection trackSelection) + +
    Returns the LoadErrorHandlingPolicy.FallbackOptions with the tracks of the given ExoTrackSelection and with a single location option indicating that there are no alternative + locations available.
    + + + static @NullableType ExoTrackSelection[] createTrackSelectionsForDefinitions​(@NullableType ExoTrackSelection.Definition[] definitions, TrackSelectionUtil.AdaptiveTrackSelectionFactory adaptiveTrackSelectionFactory) @@ -186,7 +194,7 @@ extends - + static boolean hasTrackOfType​(TrackSelectionArray trackSelections, int trackType) @@ -194,7 +202,7 @@ extends Returns if a TrackSelectionArray has at least one track of the given type. - + static DefaultTrackSelector.Parameters updateParametersWithOverride​(DefaultTrackSelector.Parameters parameters, int rendererIndex, @@ -279,7 +287,7 @@ extends -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html index 2cd9c3ad25..78f23a7318 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html @@ -139,7 +139,7 @@ extends Renderers. The DefaultTrackSelector implementation should be suitable for most use cases. -

    Interactions with the player

    +

    Interactions with the player

    The following interactions occur between the player and its track selector during playback. @@ -168,7 +168,7 @@ extends TrackSelector.InvalidationListener.onTrackSelectionsInvalidated(). -

    Renderer configuration

    +

    Renderer configuration

    The TrackSelectorResult returned by selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId, Timeline) contains not only TrackSelections for each @@ -180,7 +180,7 @@ extends Threading model +

    Threading model

    All calls made by the player into the track selector are on the player's internal playback thread. The track selector may call
    TrackSelector.InvalidationListener.onTrackSelectionsInvalidated() diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-summary.html index 7064bd5762..3f67e9ba0f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-summary.html @@ -191,7 +191,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); DefaultTrackSelector.Parameters -
    Extends TrackSelectionParameters by adding fields that are specific to DefaultTrackSelector.
    +
    Extends DefaultTrackSelector.Parameters by adding fields that are specific to DefaultTrackSelector.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html index 0a9be52427..7464e1a1b0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html @@ -123,7 +123,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.trackselection.TrackSelectionArray
  • com.google.android.exoplayer2.trackselection.TrackSelectionParameters (implements android.os.Parcelable)
  • com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/CaptionStyleCompat.html b/docs/doc/reference/com/google/android/exoplayer2/ui/CaptionStyleCompat.html index adc3cb9589..88ecb8da1f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/CaptionStyleCompat.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/CaptionStyleCompat.html @@ -476,12 +476,13 @@ extends @EdgeType public final int edgeType
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultMediaDescriptionAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultMediaDescriptionAdapter.html new file mode 100644 index 0000000000..a3d13215ab --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultMediaDescriptionAdapter.html @@ -0,0 +1,437 @@ + + + + +DefaultMediaDescriptionAdapter (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DefaultMediaDescriptionAdapter

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.ui.DefaultMediaDescriptionAdapter
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultTimeBar.html b/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultTimeBar.html index fae4868026..1c7fbafebe 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultTimeBar.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/DefaultTimeBar.html @@ -145,7 +145,7 @@ implements public void setKeyTimeIncrement​(long time)
    Sets the position increment for key presses and accessibility actions, in milliseconds. -

    - Clears any increment specified in a preceding call to TimeBar.setKeyCountIncrement(int).

    + +

    Clears any increment specified in a preceding call to TimeBar.setKeyCountIncrement(int).

    Specified by:
    setKeyTimeIncrement in interface TimeBar
    @@ -1158,8 +1158,8 @@ implements Sets the position increment for key presses and accessibility actions, as a number of increments that divide the duration of the media. For example, passing 20 will cause key presses to increment/decrement the position by 1/20th of the duration (if known). -

    - Clears any increment specified in a preceding call to TimeBar.setKeyTimeIncrement(long). + +

    Clears any increment specified in a preceding call to TimeBar.setKeyTimeIncrement(long).

    Specified by:
    setKeyCountIncrement in interface TimeBar
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerControlView.html b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerControlView.html index 25670a93bb..587cdfab2b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerControlView.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerControlView.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":42,"i17":42,"i18":10,"i19":10,"i20":10,"i21":42,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":42,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -156,7 +156,7 @@ extends Corresponding method: setShowNextButton(boolean)
  • Default: true -
  • rewind_increment - The duration of the rewind applied when the user taps the - rewind button, in milliseconds. Use zero to disable the rewind button. - -
  • fastforward_increment - Like rewind_increment, but for fast forward. -
  • repeat_toggle_modes - A flagged enumeration value specifying which repeat mode toggle options are enabled. Valid values are: none, one, all, or one|all. @@ -228,7 +217,7 @@ extends exo_controls_vr - The VR icon. -

    Overriding the layout file

    +

    Overriding the layout file

    To customize the layout of PlayerControlView throughout your app, or just for certain configurations, you can define exo_player_control_view.xml layout files in your @@ -328,7 +317,7 @@ extends
    void setControlDispatcher​(ControlDispatcher controlDispatcher) - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to setPlayer(Player) instead.
    +
    @@ -616,123 +607,96 @@ extends void -setFastForwardIncrementMs​(int fastForwardMs) - - - - - -void -setPlaybackPreparer​(PlaybackPreparer playbackPreparer) - -
    Deprecated. - -
    - - - -void setPlayer​(Player player)
    Sets the Player to control.
    - + void setProgressUpdateListener​(PlayerControlView.ProgressUpdateListener listener) - + void setRepeatToggleModes​(int repeatToggleModes)
    Sets which repeat toggle modes are enabled.
    - -void -setRewindIncrementMs​(int rewindMs) - - - - - + void setShowFastForwardButton​(boolean showFastForwardButton)
    Sets whether the fast forward button is shown.
    - + void setShowMultiWindowTimeBar​(boolean showMultiWindowTimeBar)
    Sets whether the time bar should show all windows, as opposed to just the current one.
    - + void setShowNextButton​(boolean showNextButton)
    Sets whether the next button is shown.
    - + void setShowPreviousButton​(boolean showPreviousButton)
    Sets whether the previous button is shown.
    - + void setShowRewindButton​(boolean showRewindButton)
    Sets whether the rewind button is shown.
    - + void setShowShuffleButton​(boolean showShuffleButton)
    Sets whether the shuffle button is shown.
    - + void setShowTimeoutMs​(int showTimeoutMs)
    Sets the playback controls timeout.
    - + void setShowVrButton​(boolean showVrButton)
    Sets whether the VR button is shown.
    - + void setTimeBarMinUpdateInterval​(int minUpdateIntervalMs)
    Sets the minimum interval between time bar position updates.
    - + void setVrButtonListener​(View.OnClickListener onClickListener)
    Sets listener for the VR button.
    - + void show() @@ -1024,34 +988,19 @@ public  - - - @@ -1110,32 +1059,6 @@ public void setPlaybackPreparer​(@Nullable
  • - - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html index c1a757a175..6d068b82a2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -156,12 +156,22 @@ extends Description +Builder​(Context context, + int notificationId, + String channelId) + +
    Creates an instance.
    + + + Builder​(Context context, int notificationId, String channelId, PlayerNotificationManager.MediaDescriptionAdapter mediaDescriptionAdapter) -
    Creates an instance.
    + @@ -233,54 +243,61 @@ extends PlayerNotificationManager.Builder +setMediaDescriptionAdapter​(PlayerNotificationManager.MediaDescriptionAdapter mediaDescriptionAdapter) + +
    The PlayerNotificationManager.MediaDescriptionAdapter to be queried for the notification contents.
    + + + +PlayerNotificationManager.Builder setNextActionIconResourceId​(int nextActionIconResourceId)
    The resource id of the drawable to be used as the icon of action PlayerNotificationManager.ACTION_NEXT.
    - + PlayerNotificationManager.Builder setNotificationListener​(PlayerNotificationManager.NotificationListener notificationListener) - + PlayerNotificationManager.Builder setPauseActionIconResourceId​(int pauseActionIconResourceId)
    The resource id of the drawable to be used as the icon of action PlayerNotificationManager.ACTION_PAUSE.
    - + PlayerNotificationManager.Builder setPlayActionIconResourceId​(int playActionIconResourceId)
    The resource id of the drawable to be used as the icon of action PlayerNotificationManager.ACTION_PLAY.
    - + PlayerNotificationManager.Builder setPreviousActionIconResourceId​(int previousActionIconResourceId)
    The resource id of the drawable to be used as the icon of action PlayerNotificationManager.ACTION_PREVIOUS.
    - + PlayerNotificationManager.Builder setRewindActionIconResourceId​(int rewindActionIconResourceId)
    The resource id of the drawable to be used as the icon of action PlayerNotificationManager.ACTION_REWIND.
    - + PlayerNotificationManager.Builder setSmallIconResourceId​(int smallIconResourceId)
    The resource id of the small icon of the notification shown in the status bar.
    - + PlayerNotificationManager.Builder setStopActionIconResourceId​(int stopActionIconResourceId) @@ -314,20 +331,34 @@ extends + + + + @@ -572,6 +603,22 @@ extends + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.MediaDescriptionAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.MediaDescriptionAdapter.html index 9beec0d3b9..dc1daf0208 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.MediaDescriptionAdapter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.MediaDescriptionAdapter.html @@ -121,6 +121,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • +
      All Known Implementing Classes:
      +
      DefaultMediaDescriptionAdapter
      +
      +
      Enclosing class:
      PlayerNotificationManager
      @@ -213,6 +217,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parameters:
      player - The Player for which a notification is being built.
      +
      Returns:
      +
      The content title for the current media item.
    @@ -230,6 +236,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Parameters:
    player - The Player for which a notification is being built.
    +
    Returns:
    +
    The content intent for the current media item, or null if no intent should be fired.
    @@ -247,6 +255,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Parameters:
    player - The Player for which a notification is being built.
    +
    Returns:
    +
    The content text for the current media item, or null if no context text should be + displayed.
    @@ -264,6 +275,9 @@ default Parameters:
    player - The Player for which a notification is being built.
    +
    Returns:
    +
    The content subtext for the current media item, or null if no subtext should be + displayed.
    @@ -288,6 +302,9 @@ default Parameters:
    player - The Player for which a notification is being built.
    callback - A PlayerNotificationManager.BitmapCallback to provide a Bitmap asynchronously.
    +
    Returns:
    +
    The large icon for the current media item, or null if the icon will be returned + through the PlayerNotificationManager.BitmapCallback or if no icon should be displayed.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.html b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.html index 5713b87567..d23ecfc193 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ui/PlayerNotificationManager.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":41,"i2":41,"i3":41,"i4":41,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":42,"i15":10,"i16":42,"i17":10,"i18":10,"i19":42,"i20":10,"i21":10,"i22":42,"i23":42,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10}; -var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -88,13 +88,13 @@ loadScripts(document, 'script');
  • Summary: 
  • Nested | 
  • Field | 
  • -
  • Constr | 
  • +
  • Constr | 
  • Method
  • @@ -140,7 +140,7 @@ extends If the player is released it must be removed from the manager by calling setPlayer(null). -

    Action customization

    +

    Action customization

    Playback actions can be included or omitted as follows: @@ -150,17 +150,29 @@ extends
    Corresponding setter: setUsePlayPauseActions(boolean)
  • Default: true -
  • rewindIncrementMs - Sets the rewind increment. If set to zero the rewind - action is not used. +
  • useRewindAction - Sets whether the rewind action is used. -
  • fastForwardIncrementMs - Sets the fast forward increment. If set to zero the - fast forward action is not used. +
  • useRewindActionInCompactView - If useRewindAction is true, + sets whether the rewind action is also used in compact view (including the lock screen + notification). Else does nothing. +
  • useFastForwardAction - Sets whether the fast forward action is used. + +
  • useFastForwardActionInCompactView - If useFastForwardAction is + true, sets whether the fast forward action is also used in compact view (including + the lock screen notification). Else does nothing. +
  • usePreviousAction - Whether the previous action is used.
      @@ -193,7 +205,7 @@ extends
    -

    Overriding drawables

    +

    Overriding drawables

    The drawables used by PlayerNotificationManager can be overridden by drawables with the same names defined in your application. The drawables that can be overridden are: @@ -361,71 +373,6 @@ extends
    - -
    - -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/AssetDataSource.AssetDataSourceException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/AssetDataSource.AssetDataSourceException.html index efaea35dab..3a27f6c5fb 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/AssetDataSource.AssetDataSourceException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/AssetDataSource.AssetDataSourceException.html @@ -81,7 +81,7 @@ loadScripts(document, 'script'); @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • +
  • +
    • @@ -147,7 +152,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static final class AssetDataSource.AssetDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when an IOException is encountered reading a local asset.
    See Also:
    @@ -159,6 +164,23 @@ extends
    + +
    • @@ -147,7 +152,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static class ContentDataSource.ContentDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when an IOException is encountered reading from a content URI.
    See Also:
    @@ -159,6 +164,23 @@ extends @@ -236,7 +264,8 @@ extends isCausedByPositionOutOfRange​(IOException e)
    Returns whether the given IOException was caused by a DataSourceException whose - reason is POSITION_OUT_OF_RANGE in its cause stack.
    + reason is PlaybackException.ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE in its + cause stack. @@ -276,7 +305,11 @@ extends
  • POSITION_OUT_OF_RANGE

    -
    public static final int POSITION_OUT_OF_RANGE
    +
    @Deprecated
    +public static final int POSITION_OUT_OF_RANGE
    +
    Indicates that the starting position of the request was outside the bounds of the data.
    @@ -291,8 +324,10 @@ extends
  • reason

    -
    public final int reason
    -
    +
    @ErrorCode
    +public final int reason
    +
    The reason of this DataSourceException, should be one of the ERROR_CODE_IO_* in + PlaybackException.ErrorCode.
  • @@ -308,14 +343,72 @@ extends - diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceInputStream.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceInputStream.html index e0742c6eee..b612dd7e2f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceInputStream.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceInputStream.html @@ -295,8 +295,8 @@ extends public void open() throws IOException
    Optional call to open the underlying DataSource. -

    - Calling this method does nothing if the DataSource is already open. Calling this + +

    Calling this method does nothing if the DataSource is already open. Calling this method is optional, since the read and skip methods will automatically open the underlying DataSource if it's not open already.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultAllocator.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultAllocator.html index 5f71239faa..11cdbf631c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultAllocator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultAllocator.html @@ -238,8 +238,7 @@ implements void trim() -
    Hints to the allocator that it should make a best effort to release any excess - Allocations.
    +
    Hints to the allocator that it should make a best effort to release any excess Allocations.
    @@ -293,8 +292,8 @@ implements Constructs an instance with some Allocations created up front. -

    - Note: Allocations created up front will never be discarded by trim(). + +

    Note: Allocations created up front will never be discarded by trim().

    Parameters:
    trimOnReset - Whether memory is freed when the allocator is reset. Should be true unless @@ -341,8 +340,8 @@ implements public Allocation allocate()
    Description copied from interface: Allocator
    Obtain an Allocation. -

    - When the caller has finished with the Allocation, it should be returned by calling + +

    When the caller has finished with the Allocation, it should be returned by calling Allocator.release(Allocation).

    Specified by:
    @@ -394,8 +393,7 @@ implements public void trim() -
    Hints to the allocator that it should make a best effort to release any excess - Allocations.
    +
    Hints to the allocator that it should make a best effort to release any excess Allocations.
    Specified by:
    trim in interface Allocator
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.html index ac43060636..2a57c81f66 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.html @@ -336,7 +336,7 @@ implements onBytesTransferred​(DataSource source, DataSpec dataSpec, boolean isNetwork, - int bytes) + int bytesTransferred)
    Called incrementally during a transfer.
    @@ -698,7 +698,7 @@ public DefaultBandwidthMeter()
    public void onBytesTransferred​(DataSource source,
                                    DataSpec dataSpec,
                                    boolean isNetwork,
    -                               int bytes)
    + int bytesTransferred)
    Description copied from interface: TransferListener
    Called incrementally during a transfer.
    @@ -708,7 +708,7 @@ public DefaultBandwidthMeter()
    source - The source performing the transfer.
    dataSpec - Describes the data being transferred.
    isNetwork - Whether the data is transferred through a network.
    -
    bytes - The number of bytes transferred since the previous call to this method
    +
    bytesTransferred - The number of bytes transferred since the previous call to this method.
    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 1e4cec5fca..f3e9c9ea1d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.html @@ -284,7 +284,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -472,7 +472,7 @@ implements public int read​(byte[] buffer, int offset, - int readLength) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -487,7 +487,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html index 4101cc270e..b72dd71210 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":42,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10}; +var data = {"i0":10,"i1":42,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -230,19 +230,27 @@ implements DefaultHttpDataSource.Factory +setKeepPostFor302Redirects​(boolean keepPostFor302Redirects) + +
    Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
    + + + +DefaultHttpDataSource.Factory setReadTimeoutMs​(int readTimeoutMs)
    Sets the read timeout, in milliseconds.
    - + DefaultHttpDataSource.Factory setTransferListener​(TransferListener transferListener)
    Sets the TransferListener that will be used.
    - + DefaultHttpDataSource.Factory setUserAgent​(String userAgent) @@ -451,6 +459,17 @@ public final  + + +
      +
    • +

      setKeepPostFor302Redirects

      +
      public DefaultHttpDataSource.Factory setKeepPostFor302Redirects​(boolean keepPostFor302Redirects)
      +
      Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html index 2b2a5e3f67..30798524c2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html @@ -350,7 +350,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -684,7 +684,7 @@ public public int read​(byte[] buffer, int offset, - int readLength) + int length) throws HttpDataSource.HttpDataSourceException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -701,7 +701,7 @@ public Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.html index 1149d29b83..34cff85ae8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -155,7 +155,7 @@ implements LoadErrorHandlingPolicy -LoadErrorHandlingPolicy.LoadErrorInfo +LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.FallbackSelection, LoadErrorHandlingPolicy.FallbackType, LoadErrorHandlingPolicy.LoadErrorInfo @@ -175,13 +175,20 @@ implements Description +static long +DEFAULT_LOCATION_EXCLUSION_MS + +
    The default duration for which a location is excluded in milliseconds.
    + + + static int DEFAULT_MIN_LOADABLE_RETRY_COUNT
    The default minimum number of times to retry loading data prior to propagating the error.
    - + static int DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE @@ -189,14 +196,30 @@ implements + static long DEFAULT_TRACK_BLACKLIST_MS +
    Deprecated. + +
    + + + +static long +DEFAULT_TRACK_EXCLUSION_MS +
    The default duration for which a track is excluded in milliseconds.
    + @@ -244,11 +267,12 @@ implements Description -long -getBlacklistDurationMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) +LoadErrorHandlingPolicy.FallbackSelection +getFallbackSelectionFor​(LoadErrorHandlingPolicy.FallbackOptions fallbackOptions, + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) -
    Returns the exclusion duration, given by DEFAULT_TRACK_BLACKLIST_MS, if the load error - was an HttpDataSource.InvalidResponseCodeException with response code HTTP 404, 410 or 416, or C.TIME_UNSET otherwise.
    +
    Returns whether a loader should fall back to using another resource on encountering an error, + and if so the duration for which the failing resource should be excluded.
    @@ -266,6 +290,13 @@ implements Retries for any exception that is not a subclass of ParserException, FileNotFoundException, HttpDataSource.CleartextNotPermittedException or Loader.UnexpectedLoaderException.
    + +protected boolean +isEligibleForFallback​(IOException exception) + +
    Returns whether an error should trigger a fallback if possible.
    + + @@ -326,17 +357,48 @@ implements + + +
      +
    • +

      DEFAULT_TRACK_EXCLUSION_MS

      +
      public static final long DEFAULT_TRACK_EXCLUSION_MS
      +
      The default duration for which a track is excluded in milliseconds.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    + + + +
    • -

      DEFAULT_TRACK_BLACKLIST_MS

      -
      public static final long DEFAULT_TRACK_BLACKLIST_MS
      -
      The default duration for which a track is excluded in milliseconds.
      +

      DEFAULT_LOCATION_EXCLUSION_MS

      +
      public static final long DEFAULT_LOCATION_EXCLUSION_MS
      +
      The default duration for which a location is excluded in milliseconds.
      See Also:
      -
      Constant Field Values
      +
      Constant Field Values
    @@ -386,23 +448,34 @@ implements + @@ -421,14 +494,15 @@ implements Parameters:
    loadErrorInfo - A LoadErrorHandlingPolicy.LoadErrorInfo holding information about the load error.
    Returns:
    -
    The number of milliseconds to wait before attempting the load again, or C.TIME_UNSET if the error is fatal and should not be retried.
    +
    The duration to wait before retrying in milliseconds, or C.TIME_UNSET if the + error is fatal and should not be retried.
    -
      +
      • getMinimumLoadableRetryCount

        public int getMinimumLoadableRetryCount​(int dataType)
        @@ -438,16 +512,26 @@ implements Specified by:
        getMinimumLoadableRetryCount in interface LoadErrorHandlingPolicy
        Parameters:
        -
        dataType - One of the C.DATA_TYPE_* constants indicating the type of data to - load.
        +
        dataType - One of the C.DATA_TYPE_* constants indicating the type of data being + loaded.
        Returns:
        -
        The minimum number of times to retry a load in the case of a load error, before - propagating the error.
        +
        The minimum number of times to retry a load before a load error that can be retried may + be considered fatal.
        See Also:
        Loader.startLoading(Loadable, Callback, int)
    + + + +
      +
    • +

      isEligibleForFallback

      +
      protected boolean isEligibleForFallback​(IOException exception)
      +
      Returns whether an error should trigger a fallback if possible.
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/DummyDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/DummyDataSource.html index 2f3277a598..3161c8ea2a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/DummyDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/DummyDataSource.html @@ -236,7 +236,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -369,7 +369,7 @@ implements public int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input. @@ -383,7 +383,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/FileDataSource.FileDataSourceException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/FileDataSource.FileDataSourceException.html index aee4749d9f..59154b326d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/FileDataSource.FileDataSourceException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/FileDataSource.FileDataSourceException.html @@ -81,7 +81,7 @@ loadScripts(document, 'script'); @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • + +
    • @@ -147,7 +152,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static class FileDataSource.FileDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when a FileDataSource encounters an error reading a file.
    See Also:
    @@ -159,6 +164,23 @@ extends @@ -230,6 +242,20 @@ extends +
  • + + +

    Methods inherited from class com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException

    +createForIOException
  • + + +
    • diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.Type.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.Type.html index a23402cca8..5862ff93a4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.Type.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.Type.html @@ -116,6 +116,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      @Documented
       @Retention(SOURCE)
       public static @interface HttpDataSource.HttpDataSourceException.Type
      +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.html index 591fe8cf20..4385a27604 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.HttpDataSourceException.html @@ -25,6 +25,12 @@ catch(err) { } //--> +var data = {"i0":9}; +var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; +var altColor = "altColor"; +var rowColor = "rowColor"; +var tableTab = "tableTab"; +var activeTableTab = "activeTableTab"; var pathtoroot = "../../../../../"; var useModuleDirectories = false; loadScripts(document, 'script'); @@ -89,7 +95,7 @@ loadScripts(document, 'script');
  • Detail: 
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • @@ -124,6 +130,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • + +
    • @@ -151,7 +162,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static class HttpDataSource.HttpDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when an error is encountered when trying to read from a HttpDataSource.
    See Also:
    @@ -180,7 +191,9 @@ extends static interface  HttpDataSource.HttpDataSourceException.Type -  + +
    The type of operation that produced the error.
    + @@ -215,19 +228,32 @@ extends static int TYPE_CLOSE -  + +
    The error occurred in closing a HttpDataSource.
    + static int TYPE_OPEN -  + +
    The error occurred reading data from a HttpDataSource.
    + static int TYPE_READ -  + +
    The error occurred in opening a HttpDataSource.
    + + @@ -247,26 +273,81 @@ extends HttpDataSourceException​(DataSpec dataSpec, int type) -  + + + +HttpDataSourceException​(DataSpec dataSpec, + int errorCode, + int type) + +
    Constructs an HttpDataSourceException.
    + + + HttpDataSourceException​(IOException cause, DataSpec dataSpec, int type) -  + + + + + +HttpDataSourceException​(IOException cause, + DataSpec dataSpec, + int errorCode, + int type) + +
    Constructs an HttpDataSourceException.
    + HttpDataSourceException​(String message, DataSpec dataSpec, int type) -  + + + +HttpDataSourceException​(String message, + DataSpec dataSpec, + int errorCode, + int type) + +
    Constructs an HttpDataSourceException.
    + + + HttpDataSourceException​(String message, IOException cause, DataSpec dataSpec, int type) -  + + + + + +HttpDataSourceException​(String message, + IOException cause, + DataSpec dataSpec, + int errorCode, + int type) + +
    Constructs an HttpDataSourceException.
    + @@ -279,6 +360,31 @@ extends +All Methods Static Methods Concrete Methods  + +Modifier and Type +Method +Description + + +static HttpDataSource.HttpDataSourceException +createForIOException​(IOException cause, + DataSpec dataSpec, + int type) + +
    Returns a HttpDataSourceException whose error code is assigned according to the cause + and type.
    + + + + - +
    • -

      type

      -
      @Type
      -public final int type
      +

      dataSpec

      +
      public final DataSpec dataSpec
      +
      The DataSpec associated with the current connection.
    - +
    • -

      dataSpec

      -
      public final DataSpec dataSpec
      -
      The DataSpec associated with the current connection.
      +

      type

      +
      @Type
      +public final int type
    @@ -384,9 +493,33 @@ public final int type + + + + @@ -395,10 +528,37 @@ public final int type + + + + @@ -407,23 +567,104 @@ public final int type + + + + + + + + + + + + +
    + diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.InvalidContentTypeException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.InvalidContentTypeException.html index 6e7474b861..a7a1f22c73 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.InvalidContentTypeException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.InvalidContentTypeException.html @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • +
  • @@ -241,6 +253,20 @@ extends +
  • + + +

    Methods inherited from class com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException

    +createForIOException
  • + + + @@ -248,31 +260,34 @@ extends Description +InvalidResponseCodeException​(int responseCode, + String responseMessage, + IOException cause, + Map<String,​List<String>> headerFields, + DataSpec dataSpec, + byte[] responseBody) +  + + InvalidResponseCodeException​(int responseCode, String responseMessage, Map<String,​List<String>> headerFields, DataSpec dataSpec) - -InvalidResponseCodeException​(int responseCode, - String responseMessage, - Map<String,​List<String>> headerFields, - DataSpec dataSpec, - byte[] responseBody) -  - InvalidResponseCodeException​(int responseCode, Map<String,​List<String>> headerFields, DataSpec dataSpec) @@ -288,6 +303,20 @@ extends +
  • + + +

    Methods inherited from class com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException

    +createForIOException
  • + + + @@ -396,11 +426,12 @@ public InvalidResponseCodeException​(int responseCode, Map<String,​List<String>> headerFields, DataSpec dataSpec) - +
      @@ -409,6 +440,8 @@ public InvalidResponseCodeException​(int responseCode,
      public InvalidResponseCodeException​(int responseCode,
                                           @Nullable
                                           String responseMessage,
      +                                    @Nullable
      +                                    IOException cause,
                                           Map<String,​List<String>> headerFields,
                                           DataSpec dataSpec,
                                           byte[] responseBody)
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.RequestProperties.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.RequestProperties.html index bfc3d24a6b..b43a3548a7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.RequestProperties.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.RequestProperties.html @@ -135,9 +135,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      public static final class HttpDataSource.RequestProperties
       extends Object
      -
      Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers - in a thread safe way to avoid the potential of creating snapshots of an inconsistent or - unintended state.
      +
      Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers in + a thread safe way to avoid the potential of creating snapshots of an inconsistent or unintended + state.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html index 5da301039f..2c98063ba6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html @@ -198,9 +198,9 @@ extends static class  HttpDataSource.RequestProperties -
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers - in a thread safe way to avoid the potential of creating snapshots of an inconsistent or - unintended state.
    +
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers in + a thread safe way to avoid the potential of creating snapshots of an inconsistent or unintended + state.
    @@ -293,7 +293,7 @@ extends int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -405,7 +405,7 @@ extends int read​(byte[] buffer, int offset, - int readLength) + int length) throws HttpDataSource.HttpDataSourceException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -420,7 +420,7 @@ extends Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackOptions.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackOptions.html new file mode 100644 index 0000000000..319d46499b --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackOptions.html @@ -0,0 +1,416 @@ + + + + +LoadErrorHandlingPolicy.FallbackOptions (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class LoadErrorHandlingPolicy.FallbackOptions

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Enclosing interface:
      +
      LoadErrorHandlingPolicy
      +
      +
      +
      public static final class LoadErrorHandlingPolicy.FallbackOptions
      +extends Object
      +
      Holds information about the available fallback options.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          numberOfLocations

          +
          public final int numberOfLocations
          +
          The number of available locations.
          +
        • +
        + + + +
          +
        • +

          numberOfExcludedLocations

          +
          public final int numberOfExcludedLocations
          +
          The number of locations that are already excluded.
          +
        • +
        + + + +
          +
        • +

          numberOfTracks

          +
          public final int numberOfTracks
          +
          The number of tracks.
          +
        • +
        + + + +
          +
        • +

          numberOfExcludedTracks

          +
          public final int numberOfExcludedTracks
          +
          The number of tracks that are already excluded.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          FallbackOptions

          +
          public FallbackOptions​(int numberOfLocations,
          +                       int numberOfExcludedLocations,
          +                       int numberOfTracks,
          +                       int numberOfExcludedTracks)
          +
          Creates an instance.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isFallbackAvailable

          +
          public boolean isFallbackAvailable​(@FallbackType
          +                                   int type)
          +
          Returns whether a fallback is available for the given fallback type.
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackSelection.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackSelection.html new file mode 100644 index 0000000000..9c0bf0ceab --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackSelection.html @@ -0,0 +1,344 @@ + + + + +LoadErrorHandlingPolicy.FallbackSelection (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class LoadErrorHandlingPolicy.FallbackSelection

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackSelection
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Enclosing interface:
      +
      LoadErrorHandlingPolicy
      +
      +
      +
      public static final class LoadErrorHandlingPolicy.FallbackSelection
      +extends Object
      +
      A selected fallback option.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          type

          +
          @FallbackType
          +public final int type
          +
          The type of fallback.
          +
        • +
        + + + +
          +
        • +

          exclusionDurationMs

          +
          public final long exclusionDurationMs
          +
          The duration for which the failing resource should be excluded, in milliseconds.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          FallbackSelection

          +
          public FallbackSelection​(@FallbackType
          +                         int type,
          +                         long exclusionDurationMs)
          +
          Creates an instance.
          +
          +
          Parameters:
          +
          type - The type of fallback.
          +
          exclusionDurationMs - The duration for which the failing resource should be excluded, in + milliseconds. Must be non-negative.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackType.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackType.html new file mode 100644 index 0000000000..74accacca2 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.FallbackType.html @@ -0,0 +1,185 @@ + + + + +LoadErrorHandlingPolicy.FallbackType (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Annotation Type LoadErrorHandlingPolicy.FallbackType

    +
    +
    +
    + +
    +
    +
    + +
    + +
    + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.html index 253bb32aea..2a16b6f494 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoadErrorHandlingPolicy.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":50,"i1":18,"i2":6,"i3":50,"i4":18,"i5":18}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":6,"i1":6,"i2":6,"i3":18}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -87,13 +87,13 @@ loadScripts(document, 'script'); @@ -126,16 +126,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public interface LoadErrorHandlingPolicy
    -
    Defines how errors encountered by loaders are handled. +
    A policy that defines how load errors are handled. -

    A loader that can choose between one of a number of resources can exclude a resource when a - load error occurs. In this case, getBlacklistDurationMsFor(int, long, IOException, int) - defines whether the resource should be excluded. Exclusion will succeed unless all of the - alternatives are already excluded. +

    Some loaders are able to choose between a number of alternate resources. Such loaders will + call getFallbackSelectionFor(FallbackOptions, LoadErrorInfo) when a load error occurs. + The LoadErrorHandlingPolicy.FallbackSelection returned by the policy defines whether the loader should fall back + to using another resource, and if so the duration for which the failing resource should be + excluded. -

    When exclusion does not take place, getRetryDelayMsFor(int, long, IOException, int) - defines whether the load is retried. An error that's not retried will always be propagated. An - error that is retried will be propagated according to getMinimumLoadableRetryCount(int). +

    When fallback does not take place, a loader will call getRetryDelayMsFor(LoadErrorInfo). The value returned by the policy defines whether the failed + load can be retried, and if so the duration to wait before retrying. If the policy indicates that + a load error should not be retried, it will be considered fatal by the loader. The loader may + also consider load errors that can be retried fatal if at least getMinimumLoadableRetryCount(int) retries have been attempted.

    Methods are invoked on the playback thread.

    @@ -160,6 +162,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); static class  +LoadErrorHandlingPolicy.FallbackOptions + +
    Holds information about the available fallback options.
    + + + +static class  +LoadErrorHandlingPolicy.FallbackSelection + +
    A selected fallback option.
    + + + +static interface  +LoadErrorHandlingPolicy.FallbackType + +
    Fallback type.
    + + + +static class  LoadErrorHandlingPolicy.LoadErrorInfo
    Holds information about a load task error.
    @@ -169,6 +192,40 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + +
    +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeFieldDescription
      static intFALLBACK_TYPE_LOCATION +
      Fallback to the same resource at a different location (i.e., a different URL through which the + exact same data can be requested).
      +
      static intFALLBACK_TYPE_TRACK +
      Fallback to a different track (i.e., a different representation of the same content; for + example the same video encoded at a different bitrate or resolution).
      +
      +
    • +
    +
      @@ -177,60 +234,38 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      Method Summary

      - + - - + + - - - - - + + + + + - - - - - - - - - - @@ -607,8 +607,8 @@ implements IOException
      Description copied from interface: LoaderErrorThrower
      Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries. Else does nothing.
      + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries. Else does nothing.
      Specified by:
      maybeThrowError in interface LoaderErrorThrower
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.Dummy.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.Dummy.html index 1668d01983..e9b816c731 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.Dummy.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.Dummy.html @@ -213,8 +213,8 @@ implements maybeThrowError​(int minRetryCount)
      All Methods Instance Methods Abstract Methods Default Methods Deprecated Methods All Methods Instance Methods Abstract Methods Default Methods 
      Modifier and Type Method Description
      default longgetBlacklistDurationMsFor​(int dataType, - long loadDurationMs, - IOException exception, - int errorCount)LoadErrorHandlingPolicy.FallbackSelectiongetFallbackSelectionFor​(LoadErrorHandlingPolicy.FallbackOptions fallbackOptions, + LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) -
      Deprecated. - -
      +
      Returns whether a loader should fall back to using another resource on encountering an error, + and if so the duration for which the failing resource should be excluded.
      default longgetBlacklistDurationMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) -
      Returns the number of milliseconds for which a resource associated to a provided load error - should be excluded, or C.TIME_UNSET if the resource should not be excluded.
      -
      int getMinimumLoadableRetryCount​(int dataType) -
      Returns the minimum number of times to retry a load in the case of a load error, before - propagating the error.
      +
      Returns the minimum number of times to retry a load before a load error that can be retried may + be considered fatal.
      +
      longgetRetryDelayMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) +
      Returns whether a loader can retry on encountering an error, and if so the duration to wait + before retrying.
      default longgetRetryDelayMsFor​(int dataType, - long loadDurationMs, - IOException exception, - int errorCount) -
      Deprecated. - -
      -
      default longgetRetryDelayMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo) -
      Returns the number of milliseconds to wait before attempting the load again, or C.TIME_UNSET if the error is fatal and should not be retried.
      -
      default void onLoadTaskConcluded​(long loadTaskId) @@ -247,6 +282,46 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      • + +
        +
          +
        • + + +

          Field Detail

          + + + +
            +
          • +

            FALLBACK_TYPE_LOCATION

            +
            static final int FALLBACK_TYPE_LOCATION
            +
            Fallback to the same resource at a different location (i.e., a different URL through which the + exact same data can be requested).
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          + + + +
            +
          • +

            FALLBACK_TYPE_TRACK

            +
            static final int FALLBACK_TYPE_TRACK
            +
            Fallback to a different track (i.e., a different representation of the same content; for + example the same video encoded at a different bitrate or resolution).
            +
            +
            See Also:
            +
            Constant Field Values
            +
            +
          • +
          +
        • +
        +
          @@ -254,73 +329,48 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

          Method Detail

          - + - - - - - - - -
          • getRetryDelayMsFor

            -
            default long getRetryDelayMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo)
            -
            Returns the number of milliseconds to wait before attempting the load again, or C.TIME_UNSET if the error is fatal and should not be retried. +
            long getRetryDelayMsFor​(LoadErrorHandlingPolicy.LoadErrorInfo loadErrorInfo)
            +
            Returns whether a loader can retry on encountering an error, and if so the duration to wait + before retrying. A return value of C.TIME_UNSET indicates that the error is fatal and + should not be retried. -

            Loaders may ignore the retry delay returned by this method in order to wait for a specific - event before retrying. However, the load is retried if and only if this method does not return - C.TIME_UNSET.

            +

            For loads that can be retried, loaders may ignore the retry delay returned by this method in + order to wait for a specific event before retrying.

            Parameters:
            loadErrorInfo - A LoadErrorHandlingPolicy.LoadErrorInfo holding information about the load error.
            Returns:
            -
            The number of milliseconds to wait before attempting the load again, or C.TIME_UNSET if the error is fatal and should not be retried.
            +
            The duration to wait before retrying in milliseconds, or C.TIME_UNSET if the + error is fatal and should not be retried.
          @@ -344,15 +394,15 @@ default long getRetryDelayMsFor​(int dataType,
        • getMinimumLoadableRetryCount

          int getMinimumLoadableRetryCount​(int dataType)
          -
          Returns the minimum number of times to retry a load in the case of a load error, before - propagating the error.
          +
          Returns the minimum number of times to retry a load before a load error that can be retried may + be considered fatal.
          Parameters:
          -
          dataType - One of the C.DATA_TYPE_* constants indicating the type of data to - load.
          +
          dataType - One of the C.DATA_TYPE_* constants indicating the type of data being + loaded.
          Returns:
          -
          The minimum number of times to retry a load in the case of a load error, before - propagating the error.
          +
          The minimum number of times to retry a load before a load error that can be retried may + be considered fatal.
          See Also:
          Loader.startLoading(Loadable, Callback, int)
          @@ -410,13 +460,13 @@ default long getRetryDelayMsFor​(int dataType, diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/Loader.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/Loader.html index 475e85eace..f3baf718cf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/Loader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/Loader.html @@ -335,8 +335,8 @@ implements maybeThrowError​(int minRetryCount)
      Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries.
      + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries.
      Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries.
      + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries.
      @@ -286,8 +286,8 @@ implements public void maybeThrowError​(int minRetryCount)
      Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries. Else does nothing.
      + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries. Else does nothing.
    Specified by:
    maybeThrowError in interface LoaderErrorThrower
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.html index 72ce2a24c5..f8d97d80d9 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/LoaderErrorThrower.html @@ -186,8 +186,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); maybeThrowError​(int minRetryCount)
    Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries.
    + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries. @@ -233,8 +233,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    void maybeThrowError​(int minRetryCount)
                   throws IOException
    Throws a fatal error, or a non-fatal error if loading is currently backed off and the current - Loader.Loadable has incurred a number of errors greater than the specified minimum number - of retries. Else does nothing.
    + Loader.Loadable has incurred a number of errors greater than the specified minimum number of + retries. Else does nothing.
    Parameters:
    minRetryCount - A minimum retry count that must be exceeded for a non-fatal error to be diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/PriorityDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/PriorityDataSource.html index 53fed6430d..03587a0e21 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/PriorityDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/PriorityDataSource.html @@ -246,7 +246,7 @@ implements int read​(byte[] buffer, int offset, - int max) + int length)
    Reads up to length bytes of data from the input.
    @@ -370,7 +370,7 @@ implements public int read​(byte[] buffer, int offset, - int max) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -385,7 +385,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    max - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.RawResourceDataSourceException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.RawResourceDataSourceException.html index 465cea787f..2c3b178c47 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.RawResourceDataSourceException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.RawResourceDataSourceException.html @@ -81,7 +81,7 @@ loadScripts(document, 'script'); @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • + +
    • @@ -147,7 +152,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static class RawResourceDataSource.RawResourceDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when an IOException is encountered reading from a raw resource.
    See Also:
    @@ -159,6 +164,23 @@ extends diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.html index b5b438fdfb..c581625984 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/RawResourceDataSource.html @@ -286,7 +286,7 @@ extends int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -440,7 +440,7 @@ extends public int read​(byte[] buffer, int offset, - int readLength) + int length) throws RawResourceDataSource.RawResourceDataSourceException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -453,7 +453,7 @@ extends Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/ResolvingDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/ResolvingDataSource.html index 832e55d834..780b84da36 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/ResolvingDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/ResolvingDataSource.html @@ -251,7 +251,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -373,7 +373,7 @@ implements public int read​(byte[] buffer, int offset, - int readLength) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -388,7 +388,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/StatsDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/StatsDataSource.html index 9df21501ab..018b034925 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/StatsDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/StatsDataSource.html @@ -259,7 +259,7 @@ implements int read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -428,7 +428,7 @@ implements public int read​(byte[] buffer, int offset, - int readLength) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -443,7 +443,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/TeeDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/TeeDataSource.html index 902e8cc256..576ff633f6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/TeeDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/TeeDataSource.html @@ -236,7 +236,7 @@ implements int read​(byte[] buffer, int offset, - int max) + int length)
    Reads up to length bytes of data from the input.
    @@ -358,7 +358,7 @@ implements public int read​(byte[] buffer, int offset, - int max) + int length) throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -373,7 +373,7 @@ implements Parameters:
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    max - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/TransferListener.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/TransferListener.html index 315a0c04e1..229d37e391 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/TransferListener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/TransferListener.html @@ -268,7 +268,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    source - The source performing the transfer.
    dataSpec - Describes the data being transferred.
    isNetwork - Whether the data is transferred through a network.
    -
    bytesTransferred - The number of bytes transferred since the previous call to this method
    +
    bytesTransferred - The number of bytes transferred since the previous call to this method.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/UdpDataSource.UdpDataSourceException.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/UdpDataSource.UdpDataSourceException.html index 1f5bf3f919..a4bb05412f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/UdpDataSource.UdpDataSourceException.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/UdpDataSource.UdpDataSourceException.html @@ -81,7 +81,7 @@ loadScripts(document, 'script'); @@ -124,6 +124,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.io.IOException
  • + +
    • @@ -147,7 +152,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public static final class UdpDataSource.UdpDataSourceException
    -extends IOException
    +extends DataSourceException
    Thrown when an error is encountered when trying to read from a UdpDataSource.
    See Also:
    @@ -159,6 +164,23 @@ extends diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.html index 2c07727ed8..b80af075a5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.html @@ -223,7 +223,7 @@ implements void -write​(byte[] data, +write​(byte[] buffer, int offset, int length) @@ -335,7 +335,7 @@ implements
  • write

    -
    public void write​(byte[] data,
    +
    public void write​(byte[] buffer,
                       int offset,
                       int length)
                throws IOException
    @@ -345,7 +345,7 @@ implements Specified by:
    write in interface DataSink
    Parameters:
    -
    data - The buffer from which data should be consumed.
    +
    buffer - The buffer from which data should be consumed.
    offset - The offset of the data to consume in buffer.
    length - The length of the data to consume, in bytes.
    Throws:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html index bbc22ba773..28403c9b43 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.html @@ -234,9 +234,9 @@ implements int -read​(byte[] data, +read​(byte[] buffer, int offset, - int readLength) + int length)
    Reads up to length bytes of data from the input.
    @@ -351,9 +351,9 @@ implements
  • read

    -
    public int read​(byte[] data,
    +
    public int read​(byte[] buffer,
                     int offset,
    -                int readLength)
    +                int length)
              throws IOException
    Description copied from interface: DataReader
    Reads up to length bytes of data from the input. @@ -366,9 +366,9 @@ implements Specified by:
    read in interface DataReader
    Parameters:
    -
    data - A target array into which data should be written.
    +
    buffer - A target array into which data should be written.
    offset - The offset into the target array at which to write.
    -
    readLength - The maximum number of bytes to read from the input.
    +
    length - The maximum number of bytes to read from the input.
    Returns:
    The number of bytes read, or C.RESULT_END_OF_INPUT if the input has ended. This may be less than length because the end of the input (or available data) was diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/package-summary.html index c52a2571dc..afe9b51fbf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/package-summary.html @@ -190,7 +190,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); LoadErrorHandlingPolicy -
    Defines how errors encountered by loaders are handled.
    +
    A policy that defines how load errors are handled.
    @@ -382,9 +382,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); HttpDataSource.RequestProperties -
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers - in a thread safe way to avoid the potential of creating snapshots of an inconsistent or - unintended state.
    +
    Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers in + a thread safe way to avoid the potential of creating snapshots of an inconsistent or unintended + state.
    @@ -413,6 +413,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +LoadErrorHandlingPolicy.FallbackOptions + +
    Holds information about the available fallback options.
    + + + +LoadErrorHandlingPolicy.FallbackSelection + +
    A selected fallback option.
    + + + LoadErrorHandlingPolicy.LoadErrorInfo
    Holds information about a load task error.
    @@ -575,7 +587,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); HttpDataSource.HttpDataSourceException.Type -  + +
    The type of operation that produced the error.
    + + + +LoadErrorHandlingPolicy.FallbackType + +
    Fallback type.
    + diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/upstream/package-tree.html index e9178a52e3..cc83adbbf2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/upstream/package-tree.html @@ -145,6 +145,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.upstream.Loader (implements com.google.android.exoplayer2.upstream.LoaderErrorThrower)
  • com.google.android.exoplayer2.upstream.Loader.LoadErrorAction
  • com.google.android.exoplayer2.upstream.LoaderErrorThrower.Dummy (implements com.google.android.exoplayer2.upstream.LoaderErrorThrower)
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackSelection
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo
  • com.google.android.exoplayer2.upstream.ParsingLoadable<T> (implements com.google.android.exoplayer2.upstream.Loader.Loadable)
  • com.google.android.exoplayer2.upstream.PriorityDataSource (implements com.google.android.exoplayer2.upstream.DataSource)
  • @@ -159,9 +161,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • @@ -222,6 +227,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.upstream.DataSpec.Flags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.upstream.DataSpec.HttpMethod (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException.Type (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackType (implements java.lang.annotation.Annotation)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/AtomicFile.html b/docs/doc/reference/com/google/android/exoplayer2/util/AtomicFile.html index 2d4cd22862..cc82444189 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/AtomicFile.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/AtomicFile.html @@ -294,8 +294,8 @@ extends IOException
    Start a new write operation on the file. This returns an OutputStream to which you can write the new file data. If the whole data is written successfully you must call - endWrite(OutputStream). On failure you should call OutputStream.close() - only to free up resources used by it. + endWrite(OutputStream). On failure you should call OutputStream.close() only + to free up resources used by it.

    Example usage: diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/BundleableUtils.html b/docs/doc/reference/com/google/android/exoplayer2/util/BundleableUtils.html new file mode 100644 index 0000000000..74e3ce1859 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/util/BundleableUtils.html @@ -0,0 +1,370 @@ + + + + +BundleableUtils (ExoPlayer library) + + + + + + + + + + + + +

    JavaScript is disabled on your browser.
    + +
    + +
    + +
    +
    + +

    Class BundleableUtils

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.util.BundleableUtils
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public final class BundleableUtils
      +extends Object
      +
      Utilities for Bundleable.
      +
    • +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/DebugTextViewHelper.html b/docs/doc/reference/com/google/android/exoplayer2/util/DebugTextViewHelper.html index 694c5eb857..22623a7b09 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/DebugTextViewHelper.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/DebugTextViewHelper.html @@ -218,7 +218,7 @@ implements void onPlayWhenReadyChanged​(boolean playWhenReady, - int playbackState) + int reason)
    Called when the value returned from Player.getPlayWhenReady() changes.
    @@ -269,14 +269,14 @@ implements Player.EventListener -onLoadingChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onTimelineChanged
  • +onLoadingChanged, onMaxSeekToPreviousPositionChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onStaticMetadataChanged
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/EventLogger.html b/docs/doc/reference/com/google/android/exoplayer2/util/EventLogger.html index 0b9bc33594..c2f2e354f1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/EventLogger.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/EventLogger.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -172,7 +172,7 @@ implements AnalyticsListener -EVENT_AUDIO_ATTRIBUTES_CHANGED, EVENT_AUDIO_CODEC_ERROR, EVENT_AUDIO_DECODER_INITIALIZED, EVENT_AUDIO_DECODER_RELEASED, EVENT_AUDIO_DISABLED, EVENT_AUDIO_ENABLED, EVENT_AUDIO_INPUT_FORMAT_CHANGED, EVENT_AUDIO_POSITION_ADVANCING, EVENT_AUDIO_SESSION_ID, EVENT_AUDIO_SINK_ERROR, EVENT_AUDIO_UNDERRUN, EVENT_BANDWIDTH_ESTIMATE, EVENT_DOWNSTREAM_FORMAT_CHANGED, EVENT_DRM_KEYS_LOADED, EVENT_DRM_KEYS_REMOVED, EVENT_DRM_KEYS_RESTORED, EVENT_DRM_SESSION_ACQUIRED, EVENT_DRM_SESSION_MANAGER_ERROR, EVENT_DRM_SESSION_RELEASED, EVENT_DROPPED_VIDEO_FRAMES, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_LOAD_CANCELED, EVENT_LOAD_COMPLETED, EVENT_LOAD_ERROR, EVENT_LOAD_STARTED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_METADATA, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYER_RELEASED, EVENT_POSITION_DISCONTINUITY, EVENT_RENDERED_FIRST_FRAME, EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_SKIP_SILENCE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_SURFACE_SIZE_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, EVENT_UPSTREAM_DISCARDED, EVENT_VIDEO_CODEC_ERROR, EVENT_VIDEO_DECODER_INITIALIZED, EVENT_VIDEO_DECODER_RELEASED, EVENT_VIDEO_DISABLED, EVENT_VIDEO_ENABLED, EVENT_VIDEO_FRAME_PROCESSING_OFFSET, EVENT_VIDEO_INPUT_FORMAT_CHANGED, EVENT_VIDEO_SIZE_CHANGED, EVENT_VOLUME_CHANGED +EVENT_AUDIO_ATTRIBUTES_CHANGED, EVENT_AUDIO_CODEC_ERROR, EVENT_AUDIO_DECODER_INITIALIZED, EVENT_AUDIO_DECODER_RELEASED, EVENT_AUDIO_DISABLED, EVENT_AUDIO_ENABLED, EVENT_AUDIO_INPUT_FORMAT_CHANGED, EVENT_AUDIO_POSITION_ADVANCING, EVENT_AUDIO_SESSION_ID, EVENT_AUDIO_SINK_ERROR, EVENT_AUDIO_UNDERRUN, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_BANDWIDTH_ESTIMATE, EVENT_DOWNSTREAM_FORMAT_CHANGED, EVENT_DRM_KEYS_LOADED, EVENT_DRM_KEYS_REMOVED, EVENT_DRM_KEYS_RESTORED, EVENT_DRM_SESSION_ACQUIRED, EVENT_DRM_SESSION_MANAGER_ERROR, EVENT_DRM_SESSION_RELEASED, EVENT_DROPPED_VIDEO_FRAMES, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_LOAD_CANCELED, EVENT_LOAD_COMPLETED, EVENT_LOAD_ERROR, EVENT_LOAD_STARTED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_METADATA, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYER_RELEASED, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_RENDERED_FIRST_FRAME, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_SKIP_SILENCE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_SURFACE_SIZE_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, EVENT_UPSTREAM_DISCARDED, EVENT_VIDEO_CODEC_ERROR, EVENT_VIDEO_DECODER_INITIALIZED, EVENT_VIDEO_DECODER_RELEASED, EVENT_VIDEO_DISABLED, EVENT_VIDEO_ENABLED, EVENT_VIDEO_FRAME_PROCESSING_OFFSET, EVENT_VIDEO_INPUT_FORMAT_CHANGED, EVENT_VIDEO_SIZE_CHANGED, EVENT_VOLUME_CHANGED @@ -261,7 +261,7 @@ implements void onAudioDisabled​(AnalyticsListener.EventTime eventTime, - DecoderCounters counters) + DecoderCounters decoderCounters)
    Called when an audio renderer is disabled.
    @@ -269,7 +269,7 @@ implements void onAudioEnabled​(AnalyticsListener.EventTime eventTime, - DecoderCounters counters) + DecoderCounters decoderCounters)
    Called when an audio renderer is enabled.
    @@ -351,7 +351,7 @@ implements void onDrmSessionManagerError​(AnalyticsListener.EventTime eventTime, - Exception e) + Exception error)
    Called when a drm error occurs.
    @@ -366,7 +366,7 @@ implements void onDroppedVideoFrames​(AnalyticsListener.EventTime eventTime, - int count, + int droppedFrames, long elapsedMs)
    Called after video frames have been dropped.
    @@ -469,8 +469,8 @@ implements void -onPlayerError​(AnalyticsListener.EventTime eventTime, - ExoPlaybackException e) +onPlayerError​(AnalyticsListener.EventTime eventTime, + PlaybackException error)
    Called when a fatal player error occurred.
    @@ -530,14 +530,6 @@ implements void -onStaticMetadataChanged​(AnalyticsListener.EventTime eventTime, - List<Metadata> metadataList) - -
    Called when the static metadata changes.
    - - - -void onSurfaceSizeChanged​(AnalyticsListener.EventTime eventTime, int width, int height) @@ -545,7 +537,7 @@ implements Called when the output surface size changed. - + void onTimelineChanged​(AnalyticsListener.EventTime eventTime, int reason) @@ -553,16 +545,16 @@ implements Called when the timeline changed. - + void onTracksChanged​(AnalyticsListener.EventTime eventTime, - TrackGroupArray ignored, + TrackGroupArray trackGroups, TrackSelectionArray trackSelections)
    Called when the available or selected tracks for the renderers changed.
    - + void onUpstreamDiscarded​(AnalyticsListener.EventTime eventTime, MediaLoadData mediaLoadData) @@ -571,14 +563,14 @@ implements + void onVideoDecoderInitialized​(AnalyticsListener.EventTime eventTime, String decoderName, long initializationDurationMs)   - + void onVideoDecoderReleased​(AnalyticsListener.EventTime eventTime, String decoderName) @@ -586,23 +578,23 @@ implements Called when a video renderer releases a decoder. - + void onVideoDisabled​(AnalyticsListener.EventTime eventTime, - DecoderCounters counters) + DecoderCounters decoderCounters)
    Called when a video renderer is disabled.
    - + void onVideoEnabled​(AnalyticsListener.EventTime eventTime, - DecoderCounters counters) + DecoderCounters decoderCounters)
    Called when a video renderer is enabled.
    - + void onVideoInputFormatChanged​(AnalyticsListener.EventTime eventTime, Format format, @@ -611,7 +603,7 @@ implements Called when the format of the media being consumed by a video renderer changes. - + void onVideoSizeChanged​(AnalyticsListener.EventTime eventTime, VideoSize videoSize) @@ -620,7 +612,7 @@ implements + void onVolumeChanged​(AnalyticsListener.EventTime eventTime, float volume) @@ -641,7 +633,7 @@ implements AnalyticsListener -onAudioCodecError, onAudioDecoderInitialized, onAudioInputFormatChanged, onAudioPositionAdvancing, onAudioSinkError, onDecoderDisabled, onDecoderEnabled, onDecoderInitialized, onDecoderInputFormatChanged, onDrmSessionAcquired, onEvents, onLoadingChanged, onMediaMetadataChanged, onPlayerReleased, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onSeekStarted, onVideoCodecError, onVideoDecoderInitialized, onVideoFrameProcessingOffset, onVideoInputFormatChanged, onVideoSizeChanged +onAudioCodecError, onAudioDecoderInitialized, onAudioInputFormatChanged, onAudioPositionAdvancing, onAudioSinkError, onAvailableCommandsChanged, onDecoderDisabled, onDecoderEnabled, onDecoderInitialized, onDecoderInputFormatChanged, onDrmSessionAcquired, onEvents, onLoadingChanged, onMaxSeekToPreviousPositionChanged, onMediaMetadataChanged, onPlayerReleased, onPlayerStateChanged, onPlaylistMetadataChanged, onPositionDiscontinuity, onSeekBackIncrementChanged, onSeekForwardIncrementChanged, onSeekProcessed, onSeekStarted, onStaticMetadataChanged, onVideoCodecError, onVideoDecoderInitialized, onVideoFrameProcessingOffset, onVideoInputFormatChanged, onVideoSizeChanged @@ -927,22 +919,24 @@ implements + @@ -953,7 +947,7 @@ implements

    onTracksChanged

    public void onTracksChanged​(AnalyticsListener.EventTime eventTime,
    -                            TrackGroupArray ignored,
    +                            TrackGroupArray trackGroups,
                                 TrackSelectionArray trackSelections)
    Description copied from interface: AnalyticsListener
    Called when the available or selected tracks for the renderers changed.
    @@ -962,38 +956,11 @@ implements onTracksChanged
     in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    ignored - The available tracks. May be empty.
    +
    trackGroups - The available tracks. May be empty.
    trackSelections - The track selections for each renderer. May contain null elements.
    - - - -
      -
    • -

      onStaticMetadataChanged

      -
      public void onStaticMetadataChanged​(AnalyticsListener.EventTime eventTime,
      -                                    List<Metadata> metadataList)
      -
      Description copied from interface: AnalyticsListener
      -
      Called when the static metadata changes. - -

      The provided metadataList is an immutable list of Metadata instances, where - the elements correspond to the current track selections (as returned by AnalyticsListener.onTracksChanged(EventTime, TrackGroupArray, TrackSelectionArray), or an empty list if there - are no track selections or the selected tracks contain no static metadata. - -

      The metadata is considered static in the sense that it comes from the tracks' declared - Formats, rather than being timed (or dynamic) metadata, which is represented within a metadata - track.

      -
      -
      Specified by:
      -
      onStaticMetadataChanged in interface AnalyticsListener
      -
      Parameters:
      -
      eventTime - The event time.
      -
      metadataList - The static metadata.
      -
      -
    • -
    @@ -1020,7 +987,7 @@ implements

    onAudioEnabled

    public void onAudioEnabled​(AnalyticsListener.EventTime eventTime,
    -                           DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Description copied from interface: AnalyticsListener
    Called when an audio renderer is enabled.
    @@ -1028,8 +995,8 @@ implements onAudioEnabled in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that will be updated by the renderer for as long as it - remains enabled.
    +
    decoderCounters - DecoderCounters that will be updated by the renderer for as long + as it remains enabled.
    @@ -1122,7 +1089,7 @@ implements

    onAudioDisabled

    public void onAudioDisabled​(AnalyticsListener.EventTime eventTime,
    -                            DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Description copied from interface: AnalyticsListener
    Called when an audio renderer is disabled.
    @@ -1130,7 +1097,7 @@ implements onAudioDisabled in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that were updated by the renderer.
    +
    decoderCounters - DecoderCounters that were updated by the renderer.
    @@ -1217,7 +1184,7 @@ implements

    onVideoEnabled

    public void onVideoEnabled​(AnalyticsListener.EventTime eventTime,
    -                           DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Description copied from interface: AnalyticsListener
    Called when a video renderer is enabled.
    @@ -1225,8 +1192,8 @@ implements onVideoEnabled in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that will be updated by the renderer for as long as it - remains enabled.
    +
    decoderCounters - DecoderCounters that will be updated by the renderer for as long + as it remains enabled.
    @@ -1276,7 +1243,7 @@ implements

    onDroppedVideoFrames

    public void onDroppedVideoFrames​(AnalyticsListener.EventTime eventTime,
    -                                 int count,
    +                                 int droppedFrames,
                                      long elapsedMs)
    Description copied from interface: AnalyticsListener
    Called after video frames have been dropped.
    @@ -1285,7 +1252,7 @@ implements onDroppedVideoFrames in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    count - The number of dropped frames since the last call to this method.
    +
    droppedFrames - The number of dropped frames since the last call to this method.
    elapsedMs - The duration in milliseconds over which the frames were dropped. This duration is timed from when the renderer was started or from when dropped frames were last reported (whichever was more recent), and not from when the first of the reported drops occurred.
    @@ -1318,7 +1285,7 @@ implements

    onVideoDisabled

    public void onVideoDisabled​(AnalyticsListener.EventTime eventTime,
    -                            DecoderCounters counters)
    + DecoderCounters decoderCounters)
    Description copied from interface: AnalyticsListener
    Called when a video renderer is disabled.
    @@ -1326,7 +1293,7 @@ implements onVideoDisabled in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    counters - DecoderCounters that were updated by the renderer.
    +
    decoderCounters - DecoderCounters that were updated by the renderer.
    @@ -1411,7 +1378,7 @@ implements Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.
    @@ -1580,14 +1547,14 @@ implements

    onDrmSessionManagerError

    public void onDrmSessionManagerError​(AnalyticsListener.EventTime eventTime,
    -                                     Exception e)
    + Exception error)
    Description copied from interface: AnalyticsListener
    Called when a drm error occurs.

    This method being called does not indicate that playback has failed, or that it will fail. The player may be able to recover from the error. Hence applications should not implement this method to display a user visible error or initiate an application level retry. - Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException) is the appropriate place to implement such behavior. This + Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException) is the appropriate place to implement such behavior. This method is called to provide the application with an opportunity to log the error if it wishes to do so.

    @@ -1595,7 +1562,7 @@ implements onDrmSessionManagerError in interface AnalyticsListener
    Parameters:
    eventTime - The event time.
    -
    e - The error.
    +
    error - The error.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/ExoFlags.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/util/FlagSet.Builder.html similarity index 68% rename from docs/doc/reference/com/google/android/exoplayer2/util/ExoFlags.Builder.html rename to docs/doc/reference/com/google/android/exoplayer2/util/FlagSet.Builder.html index 17bc263de2..a3e0355488 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/ExoFlags.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/FlagSet.Builder.html @@ -2,7 +2,7 @@ -ExoFlags.Builder (ExoPlayer library) +FlagSet.Builder (ExoPlayer library) @@ -19,13 +19,13 @@ + + + + + + + + + +
    + +
    + +
    +
    + +

    Class NetworkTypeObserver.Config

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.util.NetworkTypeObserver.Config
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          disable5GNsaDisambiguation

          +
          public static void disable5GNsaDisambiguation()
          +
          Disables logic to disambiguate 5G-NSA networks from 4G networks.
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/NetworkTypeObserver.html b/docs/doc/reference/com/google/android/exoplayer2/util/NetworkTypeObserver.html index 2bdf551ec3..32f92591b7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/NetworkTypeObserver.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/NetworkTypeObserver.html @@ -158,6 +158,13 @@ extends Description +static class  +NetworkTypeObserver.Config + +
    Configuration for NetworkTypeObserver.
    + + + static interface  NetworkTypeObserver.Listener diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/ParsableByteArray.html b/docs/doc/reference/com/google/android/exoplayer2/util/ParsableByteArray.html index 9123bfcbc9..175bce0496 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/ParsableByteArray.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/ParsableByteArray.html @@ -265,8 +265,8 @@ extends readBytes​(ParsableBitArray bitArray, int length) -
    Reads the next length bytes into bitArray, and resets the position of - bitArray to zero.
    +
    Reads the next length bytes into bitArray, and resets the position of + bitArray to zero.
    @@ -786,8 +786,8 @@ extends readBytes
    public void readBytes​(ParsableBitArray bitArray,
                           int length)
    -
    Reads the next length bytes into bitArray, and resets the position of - bitArray to zero.
    +
    Reads the next length bytes into bitArray, and resets the position of + bitArray to zero.
    Parameters:
    bitArray - The ParsableBitArray into which the bytes should be read.
    @@ -1021,8 +1021,8 @@ extends readSynchSafeInt
    public int readSynchSafeInt()
    Reads a Synchsafe integer. -

    - Synchsafe integers keep the highest bit of every byte zeroed. A 32 bit synchsafe integer can + +

    Synchsafe integers keep the highest bit of every byte zeroed. A 32 bit synchsafe integer can store 28 bits of information.

    Returns:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/TimestampAdjuster.html b/docs/doc/reference/com/google/android/exoplayer2/util/TimestampAdjuster.html index e93d2f0f62..0955ea3899 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/TimestampAdjuster.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/TimestampAdjuster.html @@ -131,8 +131,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public final class TimestampAdjuster
     extends Object
    -
    Offsets timestamps according to an initial sample timestamp offset. MPEG-2 TS timestamps scaling - and adjustment is supported, taking into account timestamp rollover.
    +
    Adjusts and offsets sample timestamps. MPEG-2 TS timestamps scaling and adjustment is supported, + taking into account timestamp rollover.
    @@ -155,12 +155,20 @@ extends static long -DO_NOT_OFFSET +MODE_NO_OFFSET
    A special firstSampleTimestampUs value indicating that presentation timestamps should not be offset.
    + +static long +MODE_SHARED + +
    A special firstSampleTimestampUs value indicating that the adjuster will be shared by + multiple threads.
    + + @@ -218,21 +226,22 @@ extends long getFirstSampleTimestampUs() -
    Returns the value of the first adjusted sample timestamp in microseconds, or DO_NOT_OFFSET if timestamps will not be offset.
    +
    Returns the value of the first adjusted sample timestamp in microseconds, or C.TIME_UNSET if timestamps will not be offset or if the adjuster is in shared mode.
    long getLastAdjustedTimestampUs() -
    Returns the last value obtained from adjustSampleTimestamp(long).
    +
    Returns the last adjusted timestamp, in microseconds.
    long getTimestampOffsetUs() -
    Returns the offset between the input of adjustSampleTimestamp(long) and its output.
    +
    Returns the offset between the input of adjustSampleTimestamp(long) and its output, or + C.TIME_UNSET if the offset has not yet been determined.
    @@ -246,13 +255,13 @@ extends void reset​(long firstSampleTimestampUs) -
    Resets the instance to its initial state.
    +
    Resets the instance.
    void sharedInitializeOrWait​(boolean canInitialize, - long startTimeUs) + long nextSampleTimestampUs)
    For shared timestamp adjusters, performs necessary initialization actions for a caller.
    @@ -296,18 +305,43 @@ extends

    Field Detail

    - + + + +
      +
    • +

      MODE_NO_OFFSET

      +
      public static final long MODE_NO_OFFSET
      +
      A special firstSampleTimestampUs value indicating that presentation timestamps should + not be offset. In this mode: + +
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    + @@ -331,7 +365,7 @@ extends
    Parameters:
    firstSampleTimestampUs - The desired value of the first adjusted sample timestamp in - microseconds, or DO_NOT_OFFSET if timestamps should not be offset.
    + microseconds, or MODE_NO_OFFSET if timestamps should not be offset, or MODE_SHARED if the adjuster will be used in shared mode.
    @@ -352,32 +386,26 @@ extends

    sharedInitializeOrWait

    public void sharedInitializeOrWait​(boolean canInitialize,
    -                                   long startTimeUs)
    +                                   long nextSampleTimestampUs)
                                 throws InterruptedException
    For shared timestamp adjusters, performs necessary initialization actions for a caller.
      -
    • If the adjuster does not yet have a target first sample - timestamp and if canInitialize is true, then initialization is started - by setting the target first sample timestamp to firstSampleTimestampUs. The call - returns, allowing the caller to proceed. Initialization completes when a caller adjusts - the first timestamp. -
    • If canInitialize is true and the adjuster already has a target first sample timestamp, then the call returns to allow the - caller to proceed only if firstSampleTimestampUs is equal to the target. This - ensures a caller that's previously started initialization can continue to proceed. It - also allows other callers with the same firstSampleTimestampUs to proceed, since - in this case it doesn't matter which caller adjusts the first timestamp to complete - initialization. -
    • If canInitialize is false or if firstSampleTimestampUs differs - from the target first sample timestamp, then the call - blocks until initialization completes. If initialization has already been completed the - call returns immediately. +
    • If the adjuster has already established a timestamp offset + then this method is a no-op. +
    • If canInitialize is true and the adjuster has not yet established a + timestamp offset, then the adjuster records the desired first sample timestamp for the + calling thread and returns to allow the caller to proceed. If the timestamp offset has + still not been established when the caller attempts to adjust its first timestamp, then + the recorded timestamp is used to set it. +
    • If canInitialize is false and the adjuster has not yet established a + timestamp offset, then the call blocks until the timestamp offset is set.
    Parameters:
    canInitialize - Whether the caller is able to initialize the adjuster, if needed.
    -
    startTimeUs - The desired first sample timestamp of the caller, in microseconds. Only used - if canInitialize is true.
    +
    nextSampleTimestampUs - The desired timestamp for the next sample loaded by the calling + thread, in microseconds. Only used if canInitialize is true.
    Throws:
    InterruptedException - If the thread is interrupted whilst blocked waiting for initialization to complete.
    @@ -391,7 +419,7 @@ extends

    getFirstSampleTimestampUs

    public long getFirstSampleTimestampUs()
    -
    +
    Returns the value of the first adjusted sample timestamp in microseconds, or C.TIME_UNSET if timestamps will not be offset or if the adjuster is in shared mode.
    @@ -401,7 +429,8 @@ extends

    getLastAdjustedTimestampUs

    public long getLastAdjustedTimestampUs()
    -
    +
    Returns the last adjusted timestamp, in microseconds. If no timestamps have been adjusted yet + then the result of getFirstSampleTimestampUs() is returned.
    @@ -411,14 +440,8 @@ extends

    getTimestampOffsetUs

    public long getTimestampOffsetUs()
    -
    Returns the offset between the input of adjustSampleTimestamp(long) and its output. If - DO_NOT_OFFSET was provided to the constructor, 0 is returned. If the timestamp - adjuster is yet not initialized, C.TIME_UNSET is returned.
    -
    -
    Returns:
    -
    The offset between adjustSampleTimestamp(long)'s input and output. C.TIME_UNSET if the adjuster is not yet initialized and 0 if timestamps should not be - offset.
    -
    +
    Returns the offset between the input of adjustSampleTimestamp(long) and its output, or + C.TIME_UNSET if the offset has not yet been determined.
    @@ -428,11 +451,12 @@ extends

    reset

    public void reset​(long firstSampleTimestampUs)
    -
    Resets the instance to its initial state.
    +
    Resets the instance.
    Parameters:
    firstSampleTimestampUs - The desired value of the first adjusted sample timestamp after - this reset, in microseconds, or DO_NOT_OFFSET if timestamps should not be offset.
    + this reset in microseconds, or MODE_NO_OFFSET if timestamps should not be offset, + or MODE_SHARED if the adjuster will be used in shared mode.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/UriUtil.html b/docs/doc/reference/com/google/android/exoplayer2/util/UriUtil.html index 78a4e60fe9..e128a0a513 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/UriUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/UriUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -153,14 +153,21 @@ extends Description +static boolean +isAbsolute​(String uri) + +
    Returns true if the URI is starting with a scheme component, false otherwise.
    + + + static Uri removeQueryParameter​(Uri uri, String queryParameterName) -
    Removes query parameter from an Uri, if present.
    +
    Removes query parameter from a URI, if present.
    - + static String resolve​(String baseUri, String referenceUri) @@ -168,7 +175,7 @@ extends Performs relative resolution of a referenceUri with respect to a baseUri. - + static Uri resolveToUri​(String baseUri, String referenceUri) @@ -238,6 +245,17 @@ extends + + + +
      +
    • +

      isAbsolute

      +
      public static boolean isAbsolute​(@Nullable
      +                                 String uri)
      +
      Returns true if the URI is starting with a scheme component, false otherwise.
      +
    • +
    @@ -246,13 +264,13 @@ extends removeQueryParameter
    public static Uri removeQueryParameter​(Uri uri,
                                            String queryParameterName)
    -
    Removes query parameter from an Uri, if present.
    +
    Removes query parameter from a URI, if present.
    Parameters:
    -
    uri - The uri.
    +
    uri - The URI.
    queryParameterName - The name of the query parameter.
    Returns:
    -
    The uri without the query parameter.
    +
    The URI without the query parameter.
    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 a2fc34c240..01e0e37fed 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/Util.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/Util.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9,"i47":9,"i48":9,"i49":9,"i50":9,"i51":9,"i52":9,"i53":9,"i54":9,"i55":9,"i56":9,"i57":9,"i58":9,"i59":9,"i60":9,"i61":9,"i62":9,"i63":9,"i64":9,"i65":9,"i66":9,"i67":9,"i68":9,"i69":9,"i70":9,"i71":9,"i72":9,"i73":9,"i74":9,"i75":9,"i76":9,"i77":9,"i78":9,"i79":9,"i80":9,"i81":9,"i82":9,"i83":9,"i84":9,"i85":9,"i86":9,"i87":9,"i88":9,"i89":9,"i90":9,"i91":9,"i92":9,"i93":9,"i94":9,"i95":9,"i96":9,"i97":9,"i98":9,"i99":9,"i100":9,"i101":9,"i102":9,"i103":9,"i104":9,"i105":9,"i106":9,"i107":9,"i108":9,"i109":9,"i110":9,"i111":9,"i112":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9,"i47":9,"i48":9,"i49":9,"i50":9,"i51":9,"i52":9,"i53":9,"i54":9,"i55":9,"i56":9,"i57":9,"i58":9,"i59":9,"i60":9,"i61":9,"i62":9,"i63":9,"i64":9,"i65":9,"i66":9,"i67":9,"i68":9,"i69":9,"i70":9,"i71":9,"i72":9,"i73":9,"i74":9,"i75":9,"i76":9,"i77":9,"i78":9,"i79":9,"i80":9,"i81":9,"i82":9,"i83":9,"i84":9,"i85":9,"i86":9,"i87":9,"i88":9,"i89":9,"i90":9,"i91":9,"i92":9,"i93":9,"i94":9,"i95":9,"i96":9,"i97":9,"i98":9,"i99":9,"i100":9,"i101":9,"i102":9,"i103":9,"i104":9,"i105":9,"i106":9,"i107":9,"i108":9,"i109":9,"i110":9,"i111":9,"i112":9,"i113":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -637,20 +637,27 @@ extends static int +getErrorCodeFromPlatformDiagnosticsInfo​(String diagnosticsInfo) + +
    Attempts to parse an error code from a diagnostic string found in framework media exceptions.
    + + + +static int getIntegerCodeForString​(String string)
    Returns the integer equal to the big-endian concatenation of the characters in string as bytes.
    - + static String getLocaleLanguageTag​(Locale locale)
    Returns the language tag for a Locale.
    - + static long getMediaDurationForPlayoutDuration​(long playoutDuration, float speed) @@ -658,21 +665,21 @@ extends Returns the duration of media that will elapse in playoutDuration. - + static long getNowUnixTimeMs​(long elapsedRealtimeEpochOffsetMs)
    Returns the current time in milliseconds since the epoch.
    - + static int getPcmEncoding​(int bitDepth)
    Converts a sample bit depth to a corresponding PCM encoding constant.
    - + static Format getPcmFormat​(int pcmEncoding, int channels, @@ -681,7 +688,7 @@ extends Gets a PCM Format with the specified parameters. - + static int getPcmFrameSize​(int pcmEncoding, int channelCount) @@ -689,7 +696,7 @@ extends Returns the frame size for audio with channelCount channels in the specified encoding. - + static long getPlayoutDurationForMediaDuration​(long mediaDuration, float speed) @@ -697,14 +704,14 @@ extends Returns the playout duration of mediaDuration of media. - + static int getStreamTypeForAudioUsage​(int usage)
    Returns the C.StreamType corresponding to the specified C.AudioUsage.
    - + static String getStringForTime​(StringBuilder builder, Formatter formatter, @@ -713,7 +720,7 @@ extends Returns the specified millisecond time formatted as a string. - + static String[] getSystemLanguageCodes() @@ -721,14 +728,14 @@ extends - + static String getTrackTypeString​(int trackType)
    Returns a string representation of a TRACK_TYPE_* constant defined in C.
    - + static String getUserAgent​(Context context, String applicationName) @@ -736,28 +743,28 @@ extends Returns a user agent string based on the given application name and the library version. - + static byte[] getUtf8Bytes​(String value)
    Returns a new byte array containing the code points of a String encoded using UTF-8.
    - + static byte[] gzip​(byte[] input)
    Compresses input using gzip and returns the result in a newly allocated byte array.
    - + static int inferContentType​(Uri uri)
    Makes a best guess to infer the C.ContentType from a Uri.
    - + static int inferContentType​(Uri uri, String overrideExtension) @@ -765,14 +772,14 @@ extends Makes a best guess to infer the C.ContentType from a Uri. - + static int inferContentType​(String fileName)
    Makes a best guess to infer the C.ContentType from a file name.
    - + static int inferContentTypeForUriAndMimeType​(Uri uri, String mimeType) @@ -780,7 +787,7 @@ extends Makes a best guess to infer the C.ContentType from a Uri and optional MIME type. - + static boolean inflate​(ParsableByteArray input, ParsableByteArray output, @@ -789,42 +796,42 @@ extends Uncompresses the data in input. - + static boolean isEncodingHighResolutionPcm​(int encoding)
    Returns whether encoding is high resolution (> 16-bit) PCM.
    - + static boolean isEncodingLinearPcm​(int encoding)
    Returns whether encoding is one of the linear PCM encodings.
    - + static boolean isLinebreak​(int c)
    Returns whether the given character is a carriage return ('\r') or a line feed ('\n').
    - + static boolean isLocalFileUri​(Uri uri)
    Returns true if the URI is a path to a local file or a reference to a local file.
    - + static boolean isTv​(Context context)
    Returns whether the app is running on a TV device.
    - + static int linearSearch​(int[] array, int value) @@ -832,7 +839,7 @@ extends Returns the index of the first occurrence of value in array, or C.INDEX_UNSET if value is not contained in array. - + static int linearSearch​(long[] array, long value) @@ -840,7 +847,7 @@ extends Returns the index of the first occurrence of value in array, or C.INDEX_UNSET if value is not contained in array. - + static boolean maybeRequestReadExternalStoragePermission​(Activity activity, Uri... uris) @@ -849,7 +856,7 @@ extends Uris, requesting the permission if necessary. - + static boolean maybeRequestReadExternalStoragePermission​(Activity activity, MediaItem... mediaItems) @@ -859,14 +866,14 @@ extends - + static long minValue​(SparseLongArray sparseLongArray)
    Returns the minimum value in the given SparseLongArray.
    - + static <T> void moveItems​(List<T> items, int fromIndex, @@ -876,21 +883,21 @@ extends Moves the elements starting at fromIndex to newFromIndex. - + static ExecutorService newSingleThreadExecutor​(String threadName)
    Instantiates a new single threaded executor whose thread has the specified name.
    - + static @PolyNull String normalizeLanguageCode​(@PolyNull String language)
    Returns a normalized IETF BCP 47 language tag for language.
    - + static <T> T[] nullSafeArrayAppend​(T[] original, T newElement) @@ -898,7 +905,7 @@ extends Creates a new array containing original with newElement appended. - + static <T> T[] nullSafeArrayConcatenation​(T[] first, T[] second) @@ -906,7 +913,7 @@ extends Creates a new array containing the concatenation of two non-null type arrays. - + static <T> T[] nullSafeArrayCopy​(T[] input, int length) @@ -914,7 +921,7 @@ extends Copies and optionally truncates an array. - + static <T> T[] nullSafeArrayCopyOfRange​(T[] input, int from, @@ -923,7 +930,7 @@ extends Copies a subset of an array. - + static <T> void nullSafeListToArray​(List<T> list, T[] array) @@ -931,7 +938,7 @@ extends Copies the contents of list into array. - + static long parseXsDateTime​(String value) @@ -939,14 +946,14 @@ extends - + static long parseXsDuration​(String value)
    Parses an xs:duration attribute value, returning the parsed duration in milliseconds.
    - + static boolean postOrRun​(Handler handler, Runnable runnable) @@ -954,7 +961,7 @@ extends Posts the Runnable if the calling thread differs with the Looper of the Handler. - + static boolean readBoolean​(Parcel parcel) @@ -962,7 +969,7 @@ extends - + static byte[] readExactly​(DataSource dataSource, int length) @@ -971,7 +978,7 @@ extends - + static byte[] readToEnd​(DataSource dataSource) @@ -979,14 +986,14 @@ extends - + static void recursiveDelete​(File fileOrDirectory)
    Recursively deletes a directory and its content.
    - + static <T> void removeRange​(List<T> list, int fromIndex, @@ -995,7 +1002,7 @@ extends Removes an indexed range from a List. - + static long scaleLargeTimestamp​(long timestamp, long multiplier, @@ -1004,7 +1011,7 @@ extends Scales a large timestamp. - + static long[] scaleLargeTimestamps​(List<Long> timestamps, long multiplier, @@ -1013,7 +1020,7 @@ extends Applies scaleLargeTimestamp(long, long, long) to a list of unscaled timestamps. - + static void scaleLargeTimestampsInPlace​(long[] timestamps, long multiplier, @@ -1022,15 +1029,15 @@ extends Applies scaleLargeTimestamp(long, long, long) to an array of unscaled timestamps. - + static void sneakyThrow​(Throwable t) -
    A hacky method that always throws t even if t is a checked exception, - and is not declared to be thrown.
    +
    A hacky method that always throws t even if t is a checked exception, and is + not declared to be thrown.
    - + static String[] split​(String value, String regex) @@ -1038,7 +1045,7 @@ extends Splits a string using value.split(regex, -1). - + static String[] splitAtFirst​(String value, String regex) @@ -1046,14 +1053,14 @@ extends Splits the string at the first occurrence of the delimiter regex. - + static String[] splitCodecs​(String codecs)
    Splits a codecs sequence string, as defined in RFC 6381, into individual codec strings.
    - + static ComponentName startForegroundService​(Context context, Intent intent) @@ -1062,7 +1069,7 @@ extends Context.startService(Intent) otherwise. - + static long subtractWithOverflowDefault​(long x, long y, @@ -1071,7 +1078,7 @@ extends Returns the difference between two arguments, or a third argument if the result overflows. - + static boolean tableExists​(SQLiteDatabase database, String tableName) @@ -1079,21 +1086,21 @@ extends Returns whether the table exists in the database. - + static byte[] toByteArray​(InputStream inputStream)
    Converts the entirety of an InputStream to a byte array.
    - + static String toHexString​(byte[] bytes)
    Returns a string containing a lower-case hex representation of the bytes provided.
    - + static long toLong​(int mostSignificantBits, int leastSignificantBits) @@ -1101,14 +1108,14 @@ extends Return the long that is composed of the bits of the 2 specified integers. - + static long toUnsignedLong​(int x)
    Converts an integer to a long by unsigned conversion.
    - + static CharSequence truncateAscii​(CharSequence sequence, int maxLength) @@ -1116,14 +1123,14 @@ extends Truncates a sequence of ASCII characters to a maximum length. - + static String unescapeFileName​(String fileName)
    Unescapes an escaped file or directory name back to its original value.
    - + static void writeBoolean​(Parcel parcel, boolean value) @@ -2161,8 +2168,8 @@ public static <T> T[] castNonNullTypeArray​(@Nullable boolean stayInBounds)
    Returns the index of the largest element in array that is less than (or optionally equal to) a specified value. -

    - The search is performed using a binary search algorithm, so the array must be sorted. If the + +

    The search is performed using a binary search algorithm, so the array must be sorted. If the array contains multiple elements equal to value and inclusive is true, the index of the first one will be returned.

    @@ -2430,9 +2437,9 @@ public static long minValue​(Scales a large timestamp. -

    - Logically, scaling consists of a multiplication followed by a division. The actual operations - performed are designed to minimize the probability of overflow. + +

    Logically, scaling consists of a multiplication followed by a division. The actual + operations performed are designed to minimize the probability of overflow.

    Parameters:
    timestamp - The timestamp to scale.
    @@ -3000,10 +3007,9 @@ public static 
    Escapes a string so that it's safe for use as a file or directory name on at least FAT32 filesystems. FAT32 is the most restrictive of all filesystems still commonly used today. -

    For simplicity, this only handles common characters known to be illegal on FAT32: - <, >, :, ", /, \, |, ?, and *. % is also escaped since it is used as the escape - character. Escaping is performed in a consistent way so that no collisions occur and - unescapeFileName(String) can be used to retrieve the original file name. +

    For simplicity, this only handles common characters known to be illegal on FAT32: <, + >, :, ", /, \, |, ?, and *. % is also escaped since it is used as the escape character. + Escaping is performed in a consistent way so that no collisions occur and unescapeFileName(String) can be used to retrieve the original file name.

    Parameters:
    fileName - File name to be escaped.
    @@ -3050,8 +3056,8 @@ public static 

    sneakyThrow

    public static void sneakyThrow​(Throwable t)
    -
    A hacky method that always throws t even if t is a checked exception, - and is not declared to be thrown.
    +
    A hacky method that always throws t even if t is a checked exception, and is + not declared to be thrown.
    @@ -3344,7 +3350,7 @@ public static  -
      + + + + +
        +
      • +

        getErrorCodeFromPlatformDiagnosticsInfo

        +
        public static int getErrorCodeFromPlatformDiagnosticsInfo​(@Nullable
        +                                                          String diagnosticsInfo)
        +
        Attempts to parse an error code from a diagnostic string found in framework media exceptions. + +

        For example: android.media.MediaCodec.error_1 or android.media.MediaDrm.error_neg_2.

        +
        +
        Parameters:
        +
        diagnosticsInfo - A string from which to parse the error code.
        +
        Returns:
        +
        The parser error code, or 0 if an error code could not be parsed.
        +
        +
      • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/util/package-summary.html index e096c9fe09..7d38b8e92e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/package-summary.html @@ -195,163 +195,175 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +BundleableUtils + +
    Utilities for Bundleable.
    + + + BundleUtil
    Utilities for Bundle.
    - + CodecSpecificDataUtil
    Provides utilities for handling various types of codec-specific data.
    - + ColorParser
    Parser for color expressions found in styling formats, e.g.
    - + ConditionVariable
    An interruptible condition variable.
    - + CopyOnWriteMultiset<E>
    An unordered collection of elements that allows duplicates, but also allows access to a set of unique elements.
    - + DebugTextViewHelper
    A helper class for periodically updating a TextView with debug information obtained from a SimpleExoPlayer.
    - + EGLSurfaceTexture
    Generates a SurfaceTexture using EGL/GLES functions.
    - + EventLogger
    Logs events from Player and other core components using Log.
    - -ExoFlags - -
    A set of integer flags.
    - - -ExoFlags.Builder - -
    A builder for ExoFlags instances.
    - - - FileTypes
    Defines common file type constants and helper methods.
    - + FlacConstants
    Defines constants used by the FLAC extractor.
    + +FlagSet + +
    A set of integer flags.
    + + +FlagSet.Builder + +
    A builder for FlagSet instances.
    + + + GlUtil
    GL utilities.
    - + GlUtil.Attribute
    GL attribute, which can be attached to a buffer with GlUtil.Attribute.setBuffer(float[], int).
    - + GlUtil.Uniform
    GL uniform, which can be attached to a sampler using GlUtil.Uniform.setSamplerTexId(int, int).
    - + IntArrayQueue
    Array-based unbounded queue for int primitives with amortized O(1) add and remove.
    - + LibraryLoader
    Configurable loader for native libraries.
    - + ListenerSet<T>
    A set of listeners.
    - + Log
    Wrapper around Log which allows to set the log level.
    - + LongArray
    An append-only, auto-growing long[].
    - + MediaFormatUtil
    Helper class containing utility methods for managing MediaFormat instances.
    - + MimeTypes
    Defines common MIME types and helper methods.
    - + NalUnitUtil
    Utility methods for handling H.264/AVC and H.265/HEVC NAL units.
    - + NalUnitUtil.PpsData
    Holds data parsed from a picture parameter set NAL unit.
    - + NalUnitUtil.SpsData
    Holds data parsed from a sequence parameter set NAL unit.
    - + NetworkTypeObserver
    Observer for network type changes.
    + +NetworkTypeObserver.Config + +
    Configuration for NetworkTypeObserver.
    + + NotificationUtil @@ -436,7 +448,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); TimestampAdjuster -
    Offsets timestamps according to an initial sample timestamp offset.
    +
    Adjusts and offsets sample timestamps.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/util/package-tree.html index 6aad6f1e74..3c6628e03a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/package-tree.html @@ -105,6 +105,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @@ -28521,6 +29571,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    S

    +
    sameAs(MediaMetadataCompat, MediaMetadataCompat) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider
    +
    +
    Returns whether the old and the new metadata are considered the same.
    +
    sample(long, int, byte[]) - Static method in class com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem
    Creates an item representing a sample with the provided timestamp, flags and data.
    @@ -28916,6 +29970,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Schedules a seek action and waits until playback resumes after the seek.
    +
    seekBack() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekBack() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekBack() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
    +
    +
    seekForward() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekForward() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekForward() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
    +
    seekMap - Variable in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
     
    seekMap - Variable in class com.google.android.exoplayer2.testutil.FakeExtractorOutput
    @@ -28976,6 +30046,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    seekTo(int, long) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    seekTo(int, long) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    seekTo(int, long) - Method in interface com.google.android.exoplayer2.Player
    Seeks to a position specified in milliseconds in the specified window.
    @@ -28990,6 +30062,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    seekTo(long) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
     
    +
    seekTo(long) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    seekTo(long) - Method in interface com.google.android.exoplayer2.Player
    Seeks to a position specified in milliseconds in the current window.
    @@ -29000,20 +30074,58 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    seekToDefaultPosition() - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    seekToDefaultPosition() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    seekToDefaultPosition() - Method in interface com.google.android.exoplayer2.Player
    Seeks to the default position associated with the current window.
    seekToDefaultPosition(int) - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    seekToDefaultPosition(int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    seekToDefaultPosition(int) - Method in interface com.google.android.exoplayer2.Player
    Seeks to the default position associated with the specified window.
    +
    seekToNext() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekToNext() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekToNext() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks to a later position in the current or next window (if available).
    +
    +
    seekToNextWindow() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekToNextWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekToNextWindow() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks to the default position of the next window, which may depend on the current repeat mode + and whether shuffle mode is enabled.
    +
    seekToPosition(long) - Method in class com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30
     
    seekToPosition(ExtractorInput, long, PositionHolder) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
     
    +
    seekToPrevious() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekToPrevious() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekToPrevious() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks to an earlier position in the current or previous window (if available).
    +
    +
    seekToPreviousWindow() - Method in class com.google.android.exoplayer2.BasePlayer
    +
     
    +
    seekToPreviousWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    seekToPreviousWindow() - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Seeks to the default position of the previous window, which may depend on the current repeat + mode and whether shuffle mode is enabled.
    +
    seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri) - Static method in class com.google.android.exoplayer2.testutil.TestUtil
    Seeks to the given seek time of the stream from the given input, and keeps reading from the @@ -29129,6 +30241,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    +
    selectBaseUrl(List<BaseUrl>) - Method in class com.google.android.exoplayer2.source.dash.BaseUrlExclusionList
    +
    +
    Selects the base URL to use from the given list.
    +
    +
    selectedBaseUrl - Variable in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder
    +
     
    selectEmbeddedTrack(long, int) - Method in class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
    Selects the embedded track, returning a new ChunkSampleStream.EmbeddedSampleStream from which the track's @@ -29355,6 +30473,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Creates a new instance.
    +
    ServerSideInsertedAdsMediaSource - Class in com.google.android.exoplayer2.source.ads
    +
    +
    A MediaSource for server-side inserted ad breaks.
    +
    +
    ServerSideInsertedAdsMediaSource(MediaSource) - Constructor for class com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource
    +
    +
    Creates the media source.
    +
    +
    ServerSideInsertedAdsUtil - Class in com.google.android.exoplayer2.source.ads
    +
    +
    A static utility class with methods to work with server-side inserted ads.
    +
    serviceDescription - Variable in class com.google.android.exoplayer2.source.dash.manifest.DashManifest
    The ServiceDescriptionElement, or null if not present.
    @@ -29367,6 +30497,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Creates a service description element.
    +
    serviceLocation - Variable in class com.google.android.exoplayer2.source.dash.manifest.BaseUrl
    +
    +
    The service location.
    +
    SessionAvailabilityListener - Interface in com.google.android.exoplayer2.ext.cast
    Listener of changes in the cast session availability.
    @@ -29440,11 +30574,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    SessionPlayerConnector(Player) - Constructor for class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
    Creates an instance using DefaultMediaItemConverter to convert between ExoPlayer and - media2 MediaItems and DefaultControlDispatcher to dispatch player commands.
    + media2 MediaItems.
    SessionPlayerConnector(Player, MediaItemConverter) - Constructor for class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
    -
    Creates an instance using the provided ControlDispatcher to dispatch player commands.
    +
    Creates an instance.
    set(int, int[], int[], byte[], byte[], int, int, int) - Method in class com.google.android.exoplayer2.decoder.CryptoInfo
     
    @@ -29511,6 +30645,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the MIME types to prioritize for linear ad media.
    +
    setAdPlaybackState(AdPlaybackState) - Method in class com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource
    +
    +
    Sets the AdPlaybackState published by this source.
    +
    setAdPreloadTimeoutMs(long) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader.Builder
    Sets the duration in milliseconds for which the player must buffer while preloading an ad @@ -29659,7 +30797,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setArtworkData(byte[]) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    -
    Sets the artwork data as a compressed byte array.
    + +
    +
    setArtworkData(byte[], Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the artwork data as a compressed byte array with an associated artworkDataType.
    setArtworkUri(Uri) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    @@ -29778,8 +30922,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setBottomPaddingFraction(float) - Method in class com.google.android.exoplayer2.ui.SubtitleView
    -
    Sets the bottom padding fraction to apply when Cue.line is Cue.DIMEN_UNSET, - as a fraction of the view's remaining height after its top and bottom padding have been +
    Sets the bottom padding fraction to apply when Cue.line is Cue.DIMEN_UNSET, as + a fraction of the view's remaining height after its top and bottom padding have been subtracted.
    setBuffer(float[], int) - Method in class com.google.android.exoplayer2.util.GlUtil.Attribute
    @@ -29929,6 +31073,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the slots to use for companion ads, if they are present in the loaded ad.
    +
    setCompilation(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the compilation.
    +
    +
    setComposer(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the composer.
    +
    setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory) - Method in class com.google.android.exoplayer2.source.dash.DashMediaSource.Factory
    Sets the factory to create composite SequenceableLoaders for when this media source @@ -29944,6 +31096,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the factory to create composite SequenceableLoaders for when this media source loads data from multiple streams (video, audio etc.).
    +
    setConductor(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the conductor.
    +
    setConnectionTimeoutMs(int) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
    Sets the connect timeout, in milliseconds.
    @@ -30014,35 +31170,69 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to the constructor instead. You can also + customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to the constructor instead. You can also + customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to MediaSessionConnector.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to PlayerControlView.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to PlayerNotificationManager.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)), or configure whether the + rewind and fast forward actions should be used with {PlayerNotificationManager.setUseRewindAction(boolean)} + and PlayerNotificationManager.setUseFastForwardAction(boolean).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerView
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to PlayerView.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.StyledPlayerControlView
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to StyledPlayerControlView.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
    +
    setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
    - +
    Deprecated. +
    Use a ForwardingPlayer and pass it to StyledPlayerView.setPlayer(Player) instead. + You can also customize some operations when configuring the player (for example by using + SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
    +
    setControllerAutoShow(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerView
    @@ -30253,6 +31443,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setDeviceMuted(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setDeviceMuted(boolean) - Method in interface com.google.android.exoplayer2.Player
    Sets the mute state of the device.
    @@ -30269,6 +31461,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setDeviceVolume(int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setDeviceVolume(int) - Method in interface com.google.android.exoplayer2.Player
    Sets the volume of the device.
    @@ -30278,11 +31472,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setDeviceVolume(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
     
    setDisabledTextTrackSelectionFlags(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    -
     
    -
    setDisabledTextTrackSelectionFlags(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets a bitmask of selection flags that are disabled for text track selections.
    +
    setDiscNumber(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the disc number.
    +
    setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback) - Method in class com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder
    Sets the SessionCallbackBuilder.DisconnectedCallback to handle cleaning up controller.
    @@ -30291,6 +31487,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets a discontinuity position to be returned from the next call to FakeMediaPeriod.readDiscontinuity().
    +
    setDispatchUnsupportedActionsEnabled(boolean) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    +
    +
    Sets whether actions that are not advertised to the MediaSessionCompat will be + dispatched either way.
    +
    setDisplayTitle(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    Sets the display title.
    @@ -30500,19 +31701,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    -
    setErrorMessageProvider(ErrorMessageProvider<? super ExoPlaybackException>) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
    +
    setErrorMessageProvider(ErrorMessageProvider<? super PlaybackException>) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
    Sets the optional ErrorMessageProvider.
    -
    setErrorMessageProvider(ErrorMessageProvider<? super ExoPlaybackException>) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    +
    setErrorMessageProvider(ErrorMessageProvider<? super PlaybackException>) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    Sets the optional ErrorMessageProvider.
    -
    setErrorMessageProvider(ErrorMessageProvider<? super ExoPlaybackException>) - Method in class com.google.android.exoplayer2.ui.PlayerView
    +
    setErrorMessageProvider(ErrorMessageProvider<? super PlaybackException>) - Method in class com.google.android.exoplayer2.ui.PlayerView
    Sets the optional ErrorMessageProvider.
    -
    setErrorMessageProvider(ErrorMessageProvider<? super ExoPlaybackException>) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
    +
    setErrorMessageProvider(ErrorMessageProvider<? super PlaybackException>) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
    Sets the optional ErrorMessageProvider.
    @@ -30597,7 +31798,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setFallbackFactory(HttpDataSource.Factory) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
    -
    Sets the fallback HttpDataSource.Factory that is used as a fallback if the CronetEngineWrapper fails to provide a CronetEngine.
    +
    Deprecated. +
    Do not use CronetDataSource or its factory in cases where a suitable + CronetEngine is not available. Use the fallback factory directly in such cases.
    +
    setFallbackMaxPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.DefaultLivePlaybackSpeedControl.Builder
    @@ -30622,37 +31826,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the fast forward increment in milliseconds.
    -
    setFastForwardIncrementMs(int) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    -
    - -
    -
    setFastForwardIncrementMs(int) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
    -
    - -
    -
    setFastForwardIncrementMs(int) - Method in class com.google.android.exoplayer2.ui.PlayerView
    -
    - -
    -
    setFastForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
    -
    -
    Deprecated. -
    Create a new instance instead and pass the new instance to the UI component. This - makes sure the UI gets updated and is in sync with the new values.
    -
    -
    -
    setFastForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    -
    - -
    setFinalStreamEndPositionUs(long) - Method in class com.google.android.exoplayer2.text.TextRenderer
    Sets the position at which to stop rendering the current stream.
    @@ -30705,14 +31878,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setFontSize(float) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
     
    -
    setFontSizeUnit(short) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
    +
    setFontSizeUnit(int) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
     
    setForceHighestSupportedBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setForceHighestSupportedBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets whether to force selection of the highest bitrate audio and video tracks that comply with all other constraints.
    setForceLowestBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setForceLowestBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets whether to force selection of the single lowest bitrate audio and video tracks that comply with all other constraints.
    @@ -30764,6 +31941,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Populates the holder with data from an MP3 Xing header, if valid and non-zero.
    +
    setGenre(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the genre.
    +
    setGroup(String) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
    The key of the group the media notification should belong to.
    @@ -30883,6 +32064,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets whether the currently displayed video frame or media artwork is kept visible when the player is reset.
    +
    setKeepPostFor302Redirects(boolean) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
    +
    +
    Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
    +
    +
    setKeepPostFor302Redirects(boolean) - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory
    +
    +
    Sets whether we should keep the POST method and body when we have HTTP 302 redirects for a + POST request.
    +
    setKey(String) - Method in class com.google.android.exoplayer2.upstream.DataSpec.Builder
    Sets the DataSpec.key.
    @@ -31158,10 +32349,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets flags for MatroskaExtractor instances created by the factory.
    setMaxAudioBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxAudioBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the maximum allowed audio bitrate.
    setMaxAudioChannelCount(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxAudioChannelCount(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the maximum allowed audio channel count.
    @@ -31187,20 +32382,28 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the maximum number of parallel downloads.
    setMaxVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the maximum allowed video bitrate.
    setMaxVideoFrameRate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxVideoFrameRate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the maximum allowed video frame rate.
    setMaxVideoSize(int, int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxVideoSize(int, int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the maximum allowed video width and height.
    setMaxVideoSizeSd() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMaxVideoSizeSd() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    - +
    setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    @@ -31210,6 +32413,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets a MediaCodecSelector for use by MediaCodec based renderers.
    +
    setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
    +
    +
    The PlayerNotificationManager.MediaDescriptionAdapter to be queried for the notification contents.
    +
    setMediaId(String) - Method in class com.google.android.exoplayer2.MediaItem.Builder
    Sets the optional media ID which identifies the media item.
    @@ -31217,6 +32424,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setMediaItem(MediaItem) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
    setMediaItem(MediaItem) - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    setMediaItem(MediaItem) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItem(MediaItem) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist, adds the specified MediaItem and resets the position to the @@ -31224,12 +32433,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setMediaItem(MediaItem, boolean) - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    setMediaItem(MediaItem, boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItem(MediaItem, boolean) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist and adds the specified MediaItem.
    setMediaItem(MediaItem, long) - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    setMediaItem(MediaItem, long) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItem(MediaItem, long) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist and adds the specified MediaItem.
    @@ -31240,6 +32453,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setMediaItems(List<MediaItem>) - Method in class com.google.android.exoplayer2.BasePlayer
     
    +
    setMediaItems(List<MediaItem>) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItems(List<MediaItem>) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist, adds the specified MediaItems and resets the position to @@ -31247,6 +32462,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setMediaItems(List<MediaItem>, boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    setMediaItems(List<MediaItem>, boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItems(List<MediaItem>, boolean) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist and adds the specified MediaItems.
    @@ -31257,6 +32474,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setMediaItems(List<MediaItem>, int, long) - Method in interface com.google.android.exoplayer2.Player
    Clears the playlist and adds the specified MediaItems.
    @@ -31376,6 +32595,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    +
    setMetadataDeduplicationEnabled(boolean) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    +
    +
    Sets whether MediaSessionConnector.MediaMetadataProvider.sameAs(MediaMetadataCompat, MediaMetadataCompat) + should be consulted before calling MediaSessionCompat.setMetadata(MediaMetadataCompat).
    +
    setMetadataType(int) - Method in class com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory
    Sets the type of metadata to extract from the HLS source (defaults to HlsMediaSource.METADATA_TYPE_ID3).
    @@ -31404,14 +32628,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the minimum interval between playback speed changes, in milliseconds.
    setMinVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMinVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the minimum allowed video bitrate.
    setMinVideoFrameRate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMinVideoFrameRate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the minimum allowed video frame rate.
    setMinVideoSize(int, int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setMinVideoSize(int, int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the minimum allowed video width and height.
    @@ -31669,6 +32899,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setPlaybackParameters(PlaybackParameters) - Method in interface com.google.android.exoplayer2.Player
    Attempts to set the playback parameters.
    @@ -31695,60 +32927,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
    -
    -
    Deprecated. -
    Use LeanbackPlayerAdapter.setControlDispatcher(ControlDispatcher) instead. The adapter calls - ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that the adapter - uses by default, calls Player.prepare(). If you wish to customize this behaviour, - you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player).
    -
    -
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
    -
    -
    Deprecated. -
    Use PlayerControlView.setControlDispatcher(ControlDispatcher) instead. The view calls ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that the view - uses by default, calls Player.prepare(). If you wish to customize this behaviour, - you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player).
    -
    -
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    -
    -
    Deprecated. -
    Use PlayerNotificationManager.setControlDispatcher(ControlDispatcher) instead. The manager calls - ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that this manager - uses by default, calls Player.prepare(). If you wish to intercept or customize this - behaviour, you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player) and pass it to PlayerNotificationManager.setControlDispatcher(ControlDispatcher).
    -
    -
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ui.PlayerView
    -
    -
    Deprecated. -
    Use PlayerView.setControlDispatcher(ControlDispatcher) instead. The view calls ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that the view - uses by default, calls Player.prepare(). If you wish to customize this behaviour, - you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player).
    -
    -
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ui.StyledPlayerControlView
    -
    -
    Deprecated. -
    Use StyledPlayerControlView.setControlDispatcher(ControlDispatcher) instead. The view calls ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that the view - uses by default, calls Player.prepare(). If you wish to customize this behaviour, - you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player).
    -
    -
    -
    setPlaybackPreparer(PlaybackPreparer) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
    -
    -
    Deprecated. -
    Use StyledPlayerView.setControlDispatcher(ControlDispatcher) instead. The view calls ControlDispatcher.dispatchPrepare(Player) instead of PlaybackPreparer.preparePlayback(). The DefaultControlDispatcher that the view - uses by default, calls Player.prepare(). If you wish to customize this behaviour, - you can provide a custom implementation of ControlDispatcher.dispatchPrepare(Player).
    -
    -
    setPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.BasePlayer
     
    setPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
     
    +
    setPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setPlaybackSpeed(float) - Method in interface com.google.android.exoplayer2.Player
    Changes the rate at which playback occurs.
    @@ -31813,6 +32997,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets an Player.Listener to be registered to listen to player events.
    setPlaylist(List<MediaItem>, MediaMetadata) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
    +
    setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
    +
    +
    This method is not supported and does nothing.
    +
    +
    setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    +
    setPlaylistMetadata(MediaMetadata) - Method in interface com.google.android.exoplayer2.Player
    +
    +
    Sets the playlist MediaMetadata.
    +
    +
    setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
    +
     
    +
    setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
    +
     
    setPlaylistParserFactory(HlsPlaylistParserFactory) - Method in class com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory
    Sets the factory from which playlist parsers will be obtained.
    @@ -31823,6 +33021,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    setPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setPlayWhenReady(boolean) - Method in interface com.google.android.exoplayer2.Player
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    @@ -31899,10 +33099,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the preferred languages for audio and forced text tracks.
    setPreferredAudioMimeType(String) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setPreferredAudioMimeType(String) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the preferred sample MIME type for audio tracks.
    setPreferredAudioMimeTypes(String...) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setPreferredAudioMimeTypes(String...) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the preferred sample MIME types for audio tracks.
    @@ -31938,10 +33142,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the preferred C.RoleFlags for text tracks.
    setPreferredVideoMimeType(String) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setPreferredVideoMimeType(String) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the preferred sample MIME type for video tracks.
    setPreferredVideoMimeTypes(String...) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setPreferredVideoMimeTypes(String...) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the preferred sample MIME types for video tracks.
    @@ -32050,11 +33258,31 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the read timeout, in milliseconds.
    +
    setRecordingDay(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the day of the recording date.
    +
    +
    setRecordingMonth(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the month of the recording date.
    +
    +
    setRecordingYear(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the year of the recording date.
    +
    setRedirectedUri(ContentMetadataMutations, Uri) - Static method in class com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations
    Adds a mutation to set the ContentMetadata.KEY_REDIRECTED_URI value, or to remove any existing entry if null is passed.
    +
    setReleaseDay(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the day of the release date.
    +
    +
    setReleaseMonth(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the month of the release date.
    +
    setReleaseTimeoutMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
    Deprecated.
    @@ -32064,6 +33292,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    +
    setReleaseYear(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the year of the release date.
    +
    setRemoveAudio(boolean) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
    Sets whether to remove the audio from the output.
    @@ -32099,6 +33331,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setRepeatMode(int) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
     
    +
    setRepeatMode(int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setRepeatMode(int) - Method in interface com.google.android.exoplayer2.Player
    Sets the Player.RepeatMode to be used for playback.
    @@ -32129,6 +33363,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets which repeat toggle modes are enabled.
    +
    setRequestPriority(int) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
    +
    +
    Sets the priority of requests made by CronetDataSource instances created by this + factory.
    +
    setRequestProperty(String, String) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource
     
    setRequestProperty(String, String) - Method in class com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource
    @@ -32181,37 +33420,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the rewind increment in milliseconds.
    -
    setRewindIncrementMs(int) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
    -
    - -
    -
    setRewindIncrementMs(int) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
    -
    - -
    -
    setRewindIncrementMs(int) - Method in class com.google.android.exoplayer2.ui.PlayerView
    -
    - -
    -
    setRewindIncrementMs(long) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
    -
    -
    Deprecated. -
    Create a new instance instead and pass the new instance to the UI component. This - makes sure the UI gets updated and is in sync with the new values.
    -
    -
    -
    setRewindIncrementMs(long) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    -
    - -
    setRoleFlags(int) - Method in class com.google.android.exoplayer2.Format.Builder
    @@ -32256,6 +33464,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the color for the scrubber handle.
    +
    setSeekBackIncrementMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
    +
    +
    Sets the BasePlayer.seekBack() increment.
    +
    +
    setSeekBackIncrementMs(long) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
    +
    +
    Sets the seek back increment to be used by the player.
    +
    +
    setSeekForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
    +
    +
    Sets the BasePlayer.seekForward() increment.
    +
    +
    setSeekForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
    +
    +
    Sets the seek forward increment to be used by the player.
    +
    setSeekParameters(SeekParameters) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
    Deprecated.
    @@ -32466,6 +33690,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setShuffleModeEnabled(boolean) - Method in interface com.google.android.exoplayer2.Player
    Sets whether shuffling of windows is enabled.
    @@ -32790,6 +34016,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the title.
    +
    setTotalDiscCount(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the total number of discs.
    +
    setTotalTrackCount(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    Sets the total number of tracks.
    @@ -32840,6 +34070,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the TransferListener that will be used.
    +
    setTransferListener(TransferListener) - Method in class com.google.android.exoplayer2.ext.rtmp.RtmpDataSource.Factory
    +
    +
    Sets the TransferListener that will be used.
    +
    setTransferListener(TransferListener) - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory
    Sets the TransferListener that will be used.
    @@ -32959,6 +34193,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets whether this session manager should attach DrmSessions to the clear sections of the media content.
    +
    setUseFastForwardAction(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    +
    +
    Sets whether the fast forward action should be used.
    +
    +
    setUseFastForwardActionInCompactView(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    +
    +
    Sets whether the fast forward action should also be used in compact view.
    +
    setUseLazyPreparation(boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
    Deprecated.
    @@ -32974,18 +34216,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets whether to use lazy preparation.
    -
    setUseNavigationActions(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    -
    - -
    -
    setUseNavigationActionsInCompactView(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    -
    - -
    setUseNextAction(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    Sets whether the next action should be used.
    @@ -33033,6 +34263,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the text size based on CaptioningManager.getFontScale() if CaptioningManager is available and enabled.
    +
    setUseRewindAction(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    +
    +
    Sets whether the rewind action should be used.
    +
    +
    setUseRewindActionInCompactView(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
    +
    +
    Sets whether the rewind action should also be used in compact view.
    +
    setUserRating(Rating) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    Sets the user Rating.
    @@ -33105,6 +34343,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setVideoSurface(Surface) - Method in interface com.google.android.exoplayer2.Player
    Sets the Surface onto which video will be rendered.
    @@ -33128,6 +34368,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setVideoSurfaceHolder(SurfaceHolder) - Method in interface com.google.android.exoplayer2.Player
    Sets the SurfaceHolder that holds the Surface onto which video will be @@ -33145,6 +34387,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setVideoSurfaceView(SurfaceView) - Method in interface com.google.android.exoplayer2.Player
    Sets the SurfaceView onto which video will be rendered.
    @@ -33161,6 +34405,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setVideoTextureView(TextureView) - Method in interface com.google.android.exoplayer2.Player
    Sets the TextureView onto which video will be rendered.
    @@ -33170,13 +34416,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
     
    setViewportSize(int, int, boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setViewportSize(int, int, boolean) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    Sets the viewport size to constrain adaptive video selections so that only tracks suitable for the viewport are selected.
    setViewportSizeToPhysicalDisplaySize(Context, boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
    +
     
    +
    setViewportSizeToPhysicalDisplaySize(Context, boolean) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
    -
    setViewType(int) - Method in class com.google.android.exoplayer2.ui.SubtitleView
    @@ -33208,6 +34458,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    This method is not supported and does nothing.
    +
    setVolume(float) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    setVolume(float) - Method in interface com.google.android.exoplayer2.Player
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    @@ -33240,9 +34492,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Sets the fill color of the window.
    +
    setWriter(CharSequence) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    +
    +
    Sets the writer.
    +
    setYear(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
    -
    Sets the year.
    +
    ShadowMediaCodecConfig - Class in com.google.android.exoplayer2.robolectric
    @@ -33313,6 +34571,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    shouldInitCodec(MediaCodecInfo) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
     
    +
    shouldPlayAdGroup() - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    +
    +
    Returns whether the ad group has at least one ad that should be played.
    +
    shouldProcessBuffer(long, long) - Method in class com.google.android.exoplayer2.testutil.FakeAudioRenderer
     
    shouldProcessBuffer(long, long) - Method in class com.google.android.exoplayer2.testutil.FakeRenderer
    @@ -33587,7 +34849,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    SingleSegmentBase(RangedUri, long, long, long, long) - Constructor for class com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase
     
    -
    SingleSegmentRepresentation(long, Format, String, SegmentBase.SingleSegmentBase, List<Descriptor>, String, long) - Constructor for class com.google.android.exoplayer2.source.dash.manifest.Representation.SingleSegmentRepresentation
    +
    SingleSegmentRepresentation(long, Format, List<BaseUrl>, SegmentBase.SingleSegmentBase, List<Descriptor>, String, long) - Constructor for class com.google.android.exoplayer2.source.dash.manifest.Representation.SingleSegmentRepresentation
     
    SINK_FORMAT_SUPPORTED_DIRECTLY - Static variable in interface com.google.android.exoplayer2.audio.AudioSink
    @@ -33622,7 +34884,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns the number of events in the set.
    -
    size() - Method in class com.google.android.exoplayer2.util.ExoFlags
    +
    size() - Method in class com.google.android.exoplayer2.util.FlagSet
    Returns the number of flags in this set.
    @@ -33630,6 +34892,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns the number of items in the queue.
    +
    size() - Method in class com.google.android.exoplayer2.util.ListenerSet
    +
    +
    Returns the number of added listeners.
    +
    size() - Method in class com.google.android.exoplayer2.util.LongArray
    Returns the current size of the array.
    @@ -33802,8 +35068,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    sneakyThrow(Throwable) - Static method in class com.google.android.exoplayer2.util.Util
    -
    A hacky method that always throws t even if t is a checked exception, - and is not declared to be thrown.
    +
    A hacky method that always throws t even if t is a checked exception, and is + not declared to be thrown.
    sniff(ExtractorInput) - Method in class com.google.android.exoplayer2.ext.flac.FlacExtractor
     
    @@ -33875,26 +35141,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Information about the original source of the media presentation.
    -
    SOURCE_GMS - Static variable in class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
    -
    -
    Cronet implementation from GMSCore.
    -
    -
    SOURCE_NATIVE - Static variable in class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
    -
    -
    Natively bundled Cronet implementation.
    -
    -
    SOURCE_UNAVAILABLE - Static variable in class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
    -
    -
    No Cronet implementation available.
    -
    -
    SOURCE_UNKNOWN - Static variable in class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
    -
    -
    Other (unknown) Cronet implementation.
    -
    -
    SOURCE_USER_PROVIDED - Static variable in class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
    -
    -
    User-provided Cronet engine.
    -
    sourceId(int) - Method in class com.google.android.exoplayer2.source.SampleQueue
    Sets a source identifier for subsequent samples.
    @@ -34068,18 +35314,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    A downloader for SmoothStreaming streams.
    -
    SsDownloader(Uri, List<StreamKey>, CacheDataSource.Factory) - Constructor for class com.google.android.exoplayer2.source.smoothstreaming.offline.SsDownloader
    -
    - -
    -
    SsDownloader(Uri, List<StreamKey>, CacheDataSource.Factory, Executor) - Constructor for class com.google.android.exoplayer2.source.smoothstreaming.offline.SsDownloader
    -
    - -
    SsDownloader(MediaItem, CacheDataSource.Factory) - Constructor for class com.google.android.exoplayer2.source.smoothstreaming.offline.SsDownloader
    Creates an instance.
    @@ -34290,8 +35524,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    startTimeUs - Variable in class com.google.android.exoplayer2.source.chunk.Chunk
    -
    The start time of the media contained by the chunk, or C.TIME_UNSET if the data - being loaded does not contain media samples.
    +
    The start time of the media contained by the chunk, or C.TIME_UNSET if the data being + loaded does not contain media samples.
    startTimeUs - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist
    @@ -34414,8 +35648,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    STEREO_MODE_STEREO_MESH - Static variable in class com.google.android.exoplayer2.C
    -
    Indicates a stereo layout where the left and right eyes have separate meshes, - used with 360/3D/VR videos.
    +
    Indicates a stereo layout where the left and right eyes have separate meshes, used with + 360/3D/VR videos.
    STEREO_MODE_TOP_BOTTOM - Static variable in class com.google.android.exoplayer2.C
    @@ -34429,6 +35663,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    stop() - Method in class com.google.android.exoplayer2.BaseRenderer
     
    +
    stop() - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    stop() - Method in class com.google.android.exoplayer2.NoSampleRenderer
     
    stop() - Method in interface com.google.android.exoplayer2.Player
    @@ -34463,6 +35699,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    stop(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
     
    +
    stop(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
    +
     
    stop(boolean) - Method in interface com.google.android.exoplayer2.Player
    Deprecated. @@ -34655,13 +35893,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    subsampleOffsetUs - Variable in class com.google.android.exoplayer2.metadata.MetadataInputBuffer
    -
    An offset that must be added to the metadata's timestamps after it's been decoded, or - Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    +
    An offset that must be added to the metadata's timestamps after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    subsampleOffsetUs - Variable in class com.google.android.exoplayer2.text.SubtitleInputBuffer
    -
    An offset that must be added to the subtitle's event times after it's been decoded, or - Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    +
    An offset that must be added to the subtitle's event times after it's been decoded, or Format.OFFSET_SAMPLE_RELATIVE if DecoderInputBuffer.timeUs should be added.
    subset(Uri...) - Method in class com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet
     
    @@ -35151,12 +36387,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    TIMELINE_CHANGE_REASON_SOURCE_UPDATE - Static variable in interface com.google.android.exoplayer2.Player
    -
    Timeline changed as a result of a dynamic update introduced by the played media.
    +
    Timeline changed as a result of a source update (e.g.
    Timeline.Period - Class in com.google.android.exoplayer2
    Holds information about a period in a Timeline.
    +
    Timeline.RemotableTimeline - Class in com.google.android.exoplayer2
    +
    +
    A concrete class of Timeline to restore a Timeline instance from a Bundle sent by another process via IBinder.
    +
    Timeline.Window - Class in com.google.android.exoplayer2
    Holds information about a window in a Timeline.
    @@ -35188,8 +36428,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    TimelineQueueEditor.QueueDataAdapter - Interface in com.google.android.exoplayer2.ext.mediasession
    Adapter to get MediaDescriptionCompat of items in the queue and to notify the - application about changes in the queue to sync the data structure backing the - MediaSessionConnector.
    + application about changes in the queue to sync the data structure backing the MediaSessionConnector.
    TimelineQueueNavigator - Class in com.google.android.exoplayer2.ext.mediasession
    @@ -35266,8 +36505,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    timeShiftBufferDepthMs - Variable in class com.google.android.exoplayer2.source.dash.manifest.DashManifest
    -
    The timeShiftBufferDepth value in milliseconds, or C.TIME_UNSET if not - present.
    +
    The timeShiftBufferDepth value in milliseconds, or C.TIME_UNSET if not present.
    TimeSignalCommand - Class in com.google.android.exoplayer2.metadata.scte35
    @@ -35279,7 +36517,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    TimestampAdjuster - Class in com.google.android.exoplayer2.util
    -
    Offsets timestamps according to an initial sample timestamp offset.
    +
    Adjusts and offsets sample timestamps.
    TimestampAdjuster(long) - Constructor for class com.google.android.exoplayer2.util.TimestampAdjuster
     
    @@ -35289,7 +36527,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    TimestampAdjusterProvider() - Constructor for class com.google.android.exoplayer2.source.hls.TimestampAdjusterProvider
     
    -
    timestampMs - Variable in exception com.google.android.exoplayer2.ExoPlaybackException
    +
    timestampMs - Variable in exception com.google.android.exoplayer2.PlaybackException
    The value of SystemClock.elapsedRealtime() when this exception was created.
    @@ -35315,6 +36553,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    The time of the seek point, in microseconds.
    +
    timeUs - Variable in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    +
    +
    The time of the ad group in the Timeline.Period, in + microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    +
    timeUsToTargetTime(long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker.BinarySearchSeekMap
     
    timeUsToTargetTime(long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker.DefaultSeekTimestampConverter
    @@ -35369,8 +36612,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    toBundle() - Method in class com.google.android.exoplayer2.PercentageRating
     
    +
    toBundle() - Method in exception com.google.android.exoplayer2.PlaybackException
    +
     
    toBundle() - Method in class com.google.android.exoplayer2.PlaybackParameters
     
    +
    toBundle() - Method in class com.google.android.exoplayer2.Player.Commands
    +
     
    toBundle() - Method in class com.google.android.exoplayer2.Player.PositionInfo
    Returns a Bundle representing the information stored in this object.
    @@ -35383,6 +36630,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    toBundle() - Method in class com.google.android.exoplayer2.StarRating
     
    +
    toBundle() - Method in class com.google.android.exoplayer2.text.Cue
    +
     
    toBundle() - Method in class com.google.android.exoplayer2.ThumbRating
     
    toBundle() - Method in class com.google.android.exoplayer2.Timeline.Period
    @@ -35399,6 +36648,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    toBundle() - Method in class com.google.android.exoplayer2.video.VideoSize
     
    +
    toBundle(boolean) - Method in class com.google.android.exoplayer2.Timeline
    +
    toBundleArrayList(List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
    +
    +
    Converts a list of Bundleable to an ArrayList of Bundle so that the + returned list can be put to Bundle using Bundle.putParcelableArrayList(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>) + conveniently.
    +
    +
    toBundleList(List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
    +
    +
    Converts a list of Bundleable to a list Bundle.
    +
    toByteArray(InputStream) - Static method in class com.google.android.exoplayer2.util.Util
    Converts the entirety of an InputStream to a byte array.
    @@ -35445,6 +36705,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Converts a MediaItem to a MediaQueueItem.
    +
    toNullableBundle(Bundleable) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
    +
    +
    Converts a Bundleable to a Bundle.
    +
    toString() - Method in class com.google.android.exoplayer2.audio.AudioCapabilities
     
    toString() - Method in class com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat
    @@ -35557,6 +36821,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Total buffered duration from AnalyticsListener.EventTime.currentPlaybackPositionMs at the time of the event, in milliseconds.
    +
    totalDiscCount - Variable in class com.google.android.exoplayer2.MediaMetadata
    +
    +
    Optional total number of discs.
    +
    totalDroppedFrames - Variable in class com.google.android.exoplayer2.analytics.PlaybackStats
    The total number of dropped video frames.
    @@ -35814,6 +37082,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Constraint parameters for track selection.
    +
    TrackSelectionParameters(TrackSelectionParameters.Builder) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
    +
     
    TrackSelectionParameters.Builder - Class in com.google.android.exoplayer2.trackselection
    @@ -35934,8 +37204,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    trim() - Method in interface com.google.android.exoplayer2.upstream.Allocator
    -
    Hints to the allocator that it should make a best effort to release any excess - Allocations.
    +
    Hints to the allocator that it should make a best effort to release any excess Allocations.
    trim() - Method in class com.google.android.exoplayer2.upstream.DefaultAllocator
     
    @@ -36097,7 +37366,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    type - Variable in class com.google.android.exoplayer2.source.chunk.Chunk
    -
    The type of the chunk.
    +
    The data type of the chunk.
    type - Variable in class com.google.android.exoplayer2.source.dash.manifest.AdaptationSet
    @@ -36113,6 +37382,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    type - Variable in exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
     
    +
    type - Variable in class com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackSelection
    +
    +
    The type of fallback.
    +
    type - Variable in class com.google.android.exoplayer2.upstream.ParsingLoadable
    The type of the data.
    @@ -36134,7 +37407,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Type for when all ad groups failed to load.
    TYPE_CLOSE - Static variable in exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
    -
     
    +
    +
    The error occurred in closing a HttpDataSource.
    +
    TYPE_CUSTOM_BASE - Static variable in interface com.google.android.exoplayer2.trackselection.TrackSelection
    The first value that can be used for application specific track selection types.
    @@ -36164,7 +37439,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    The search didn't find any timestamps.
    TYPE_OPEN - Static variable in exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
    -
     
    +
    +
    The error occurred reading data from a HttpDataSource.
    +
    TYPE_OTHER - Static variable in class com.google.android.exoplayer2.C
    Value returned by Util.inferContentType(String) for files other than DASH, HLS or @@ -36183,14 +37460,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    The search found only timestamps smaller than the target timestamp.
    TYPE_READ - Static variable in exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
    -
     
    +
    +
    The error occurred in opening a HttpDataSource.
    +
    TYPE_REMOTE - Static variable in exception com.google.android.exoplayer2.ExoPlaybackException
    The error occurred in a remote component.
    TYPE_RENDERER - Static variable in exception com.google.android.exoplayer2.ExoPlaybackException
    -
    The error occurred in a Renderer.
    +
    The error occurred in a Renderer.
    TYPE_RTSP - Static variable in class com.google.android.exoplayer2.C
    @@ -36198,7 +37477,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    TYPE_SOURCE - Static variable in exception com.google.android.exoplayer2.ExoPlaybackException
    -
    The error occurred loading data from a MediaSource.
    +
    The error occurred loading data from a MediaSource.
    TYPE_SS - Static variable in class com.google.android.exoplayer2.C
    @@ -36262,8 +37541,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Thrown when an error is encountered when trying to read from a UdpDataSource.
    -
    UdpDataSourceException(IOException) - Constructor for exception com.google.android.exoplayer2.upstream.UdpDataSource.UdpDataSourceException
    -
     
    +
    UdpDataSourceException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.UdpDataSource.UdpDataSourceException
    +
    +
    Creates a UdpDataSourceException.
    +
    uid - Variable in class com.google.android.exoplayer2.Timeline.Period
    A unique identifier for the period.
    @@ -36309,8 +37590,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    unescapeStream(byte[], int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
    -
    Unescapes data up to the specified limit, replacing occurrences of [0, 0, 3] with - [0, 0].
    +
    Unescapes data up to the specified limit, replacing occurrences of [0, 0, 3] with [0, + 0].
    UnexpectedDiscontinuityException(long, long) - Constructor for exception com.google.android.exoplayer2.audio.AudioSink.UnexpectedDiscontinuityException
    @@ -36587,6 +37868,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    url - Variable in class com.google.android.exoplayer2.metadata.id3.UrlLinkFrame
     
    +
    url - Variable in class com.google.android.exoplayer2.source.dash.manifest.BaseUrl
    +
    +
    The URL.
    +
    url - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Rendition
    The rendition's url, or null if the tag does not have a URI attribute.
    @@ -36733,8 +38018,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
     
    UUID_NIL - Static variable in class com.google.android.exoplayer2.C
    -
    The Nil UUID as defined by - RFC4122.
    +
    The Nil UUID as defined by RFC4122.
    @@ -37066,15 +38350,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    -
    viewportHeight - Variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
    +
    viewportHeight - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
    Viewport height in pixels.
    -
    viewportOrientationMayChange - Variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
    +
    viewportOrientationMayChange - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
    Whether the viewport orientation may change during playback.
    -
    viewportWidth - Variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
    +
    viewportWidth - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
    Viewport width in pixels.
    @@ -37128,17 +38412,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Configures and queries the underlying native library.
    -
    VpxOutputBuffer - Class in com.google.android.exoplayer2.ext.vp9
    -
    -
    Deprecated. - -
    -
    -
    VpxOutputBuffer(OutputBuffer.Owner<VideoDecoderOutputBuffer>) - Constructor for class com.google.android.exoplayer2.ext.vp9.VpxOutputBuffer
    -
    -
    Deprecated.
    -
    Creates VpxOutputBuffer.
    -
    @@ -37305,6 +38578,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Utility methods for parsing WebVTT data.
    +
    weight - Variable in class com.google.android.exoplayer2.source.dash.manifest.BaseUrl
    +
    +
    The weight.
    +
    WIDEVINE_UUID - Static variable in class com.google.android.exoplayer2.C
    UUID for the Widevine DRM scheme.
    @@ -37410,6 +38687,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns a copy this data spec with additional HTTP request headers.
    +
    withAdDurationsUs(int, long...) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with the specified ad durations, in microseconds, in the specified ad + group.
    +
    withAdDurationsUs(long[]) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    Returns a new instance with the specified ad durations, in microseconds.
    @@ -37418,6 +38700,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns an instance with the specified ad durations, in microseconds.
    +
    withAdGroupTimeUs(int, long) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with the specified ad group time.
    +
    withAdLoadError(int, int) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    Returns an instance with the specified ad marked as having a load error.
    @@ -37456,6 +38742,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns an instance with the specified content duration, in microseconds.
    +
    withContentResumeOffsetUs(int, long) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with the specified AdPlaybackState.AdGroup.contentResumeOffsetUs, in microseconds, + for the specified ad group.
    +
    +
    withContentResumeOffsetUs(long) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    +
    +
    Returns an instance with the specified AdPlaybackState.AdGroup.contentResumeOffsetUs.
    +
    withFamily(String) - Method in interface com.google.android.exoplayer2.testutil.truth.SpannedSubject.Typefaced
    Checks that at least one of the matched spans has the expected fontFamily.
    @@ -37464,6 +38759,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Checks that one of the matched spans has the expected flags.
    +
    withIsServerSideInserted(boolean) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    +
    +
    Returns an instance with the specified value for AdPlaybackState.AdGroup.isServerSideInserted.
    +
    +
    withIsServerSideInserted(int, boolean) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with the specified value for AdPlaybackState.AdGroup.isServerSideInserted in the + specified ad group.
    +
    withManifestFormatInfo(Format) - Method in class com.google.android.exoplayer2.Format
     
    withMarkAndPosition(int, int, int) - Method in interface com.google.android.exoplayer2.testutil.truth.SpannedSubject.EmphasizedText
    @@ -37471,6 +38775,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Checks that at least one of the matched spans has the expected mark and position.
    +
    withNewAdGroup(int, long) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with a new ad group.
    +
    withParameters(int, MediaSource.MediaPeriodId) - Method in class com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher
    Creates a view of the event dispatcher with the provided window index and media period id.
    @@ -37484,6 +38792,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns an instance with the specified ad marked as played.
    +
    withRemovedAdGroupCount(int) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState
    +
    +
    Returns an instance with the specified number of removed ad + groups.
    +
    withRequestHeaders(Map<String, String>) - Method in class com.google.android.exoplayer2.upstream.DataSpec
    Returns a copy of this data spec with the specified HTTP request headers.
    @@ -37509,6 +38822,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Checks that at least one of the matched spans has the expected text.
    +
    withTimeUs(long) - Method in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
    +
    +
    Returns a new instance with the AdPlaybackState.AdGroup.timeUs set to the specified value.
    +
    withUri(Uri) - Method in class com.google.android.exoplayer2.upstream.DataSpec
    Returns a copy of this data spec with the specified Uri.
    @@ -37563,6 +38880,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Creates an instance.
    +
    writer - Variable in class com.google.android.exoplayer2.MediaMetadata
    +
    +
    Optional writer.
    +
    writeToBuffer(byte[], int, int) - Method in class com.google.android.exoplayer2.source.rtsp.RtpPacket
    Writes the data in an RTP packet to a target buffer.
    @@ -37671,7 +38992,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    year - Variable in class com.google.android.exoplayer2.MediaMetadata
    -
    Optional year.
    +
    Deprecated. + +
    yuvPlanes - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
    diff --git a/docs/doc/reference/member-search-index.js b/docs/doc/reference/member-search-index.js index 47a8fbed67..41bac2c724 100644 --- a/docs/doc/reference/member-search-index.js +++ b/docs/doc/reference/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ACTION_SET_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, int, List, List, List, List)","url":"%3Cinit%3E(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"addAll(ExoFlags)","url":"addAll(com.google.android.exoplayer2.util.ExoFlags)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addItems(int, MediaQueueItem...)","url":"addItems(int,com.google.android.gms.cast.MediaQueueItem...)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addItems(MediaQueueItem...)","url":"addItems(com.google.android.gms.cast.MediaQueueItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroups"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupTimesUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, int)","url":"assertExtensionRendererCreated(java.lang.Class,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionedSame(MediaItem...)","url":"assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionReasonsEqual(Integer...)","url":"assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTrackGroupsEqual(TrackGroupArray)","url":"assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrl"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrl"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, int, List, List, List, List)","url":"buildAdaptationSet(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, Renderer...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecStringFromSps(ParsableNalUnitBitArray)","url":"buildHevcCodecStringFromSps(com.google.android.exoplayer2.util.ParsableNalUnitBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"capacity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(int,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE_STOP"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String, String)","url":"compileProgram(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String[], String[])","url":"compileProgram(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithExoMediaCryptoType(Class)","url":"copyWithExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioContainerFormat(String, String, String, String, String, Metadata, int, int, int, List, int, int, String)","url":"createAudioContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.google.android.exoplayer2.metadata.Metadata,int,int,int,java.util.List,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, int, int, List, DrmInitData, int, String, Metadata)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Exception)","url":"createForRenderer(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException)","url":"createForSource(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createImageSampleFormat(String, String, int, List, String)","url":"createImageSampleFormat(java.lang.String,java.lang.String,int,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.Subtitle, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.Subtitle,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(Uri, Format, long)","url":"createMediaSource(android.net.Uri,com.google.android.exoplayer2.Format,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(int,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createTextContainerFormat(String, String, String, String, String, int, int, int, String, int)","url":"createTextContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createTextContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createTextContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createTextSampleFormat(String, String, int, String, int, long, List)","url":"createTextSampleFormat(java.lang.String,java.lang.String,int,java.lang.String,int,long,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createTextSampleFormat(String, String, int, String)","url":"createTextSampleFormat(java.lang.String,java.lang.String,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoContainerFormat(String, String, String, String, String, Metadata, int, int, int, float, List, int, int)","url":"createVideoContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.google.android.exoplayer2.metadata.Metadata,int,int,int,float,java.util.List,int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, byte[], int, ColorInfo, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,byte[],int,com.google.android.exoplayer2.video.ColorInfo,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createWithNotificationChannel(Context, String, int, int, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener)","url":"createWithNotificationChannel(android.content.Context,java.lang.String,int,int,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createWithNotificationChannel(Context, String, int, int, int, PlayerNotificationManager.MediaDescriptionAdapter)","url":"createWithNotificationChannel(android.content.Context,java.lang.String,int,int,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createWithNotificationChannel(Context, String, int, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener)","url":"createWithNotificationChannel(android.content.Context,java.lang.String,int,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createWithNotificationChannel(Context, String, int, int, PlayerNotificationManager.MediaDescriptionAdapter)","url":"createWithNotificationChannel(android.content.Context,java.lang.String,int,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(Uri, List, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(Uri, List, CacheDataSource.Factory)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(SimpleExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"DecryptionException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DEFAULT_FAST_FORWARD_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DEFAULT_REWIND_MS"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"DEFAULT_USER_AGENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"DO_NOT_OFFSET"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(int, Format, int, Object, long)","url":"downstreamFormatChanged(int,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC_3_CODEC_STRING"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(ExoFlags, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.ExoFlags,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(ExoFlags)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.ExoFlags)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"exoMediaCryptoType"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSkipAndContinueIfSampleTooLarge(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"FrameworkMediaCrypto(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getAttributes(int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getBlacklistDurationMsFor(int, long, IOException, int)","url":"getBlacklistDurationMsFor(int,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getBlacklistDurationMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getBlacklistDurationMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getBlacklistDurationMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getBlacklistDurationMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, int)","url":"getCodecCountOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, int)","url":"getCodecsOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"getCronetEngineSource()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentTag()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTag()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"getEncodingForAudioObjectType(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getFastForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List)","url":"getForegroundNotification(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogStackTraces()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(int, int)","url":"getNextRepeatMode(int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPlaybackError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackError()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getPreSkipSamples(List)","url":"getPreSkipSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(int, long, IOException, int)","url":"getRetryDelayMsFor(int,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getRewindIncrementMs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getSeekPreRollSamples(List)","url":"getSeekPreRollSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTag()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getUniforms(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, boolean)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getWindowIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"GL_ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"GvrAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(SimpleExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.SimpleExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"hasTrackOfType(TrackSelectionArray, int)","url":"hasTrackOfType(com.google.android.exoplayer2.trackselection.TrackSelectionArray,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(Uri, List, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(Uri, List, CacheDataSource.Factory)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"IntArrayQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, ExoFlags)","url":"invoke(T,com.google.android.exoplayer2.util.ExoFlags)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(int, int)","url":"isRepeatModeEnabled(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PCM_ENCODING"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"lazyRelease(int, ListenerSet.Event)","url":"lazyRelease(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"legacyKeepAvailableCodecInfosWithoutCodec()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"loadItem(MediaQueueItem, long)","url":"loadItem(com.google.android.gms.cast.MediaQueueItem,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"loadItems(MediaQueueItem[], int, long, int)","url":"loadItems(com.google.android.gms.cast.MediaQueueItem[],int,long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(int, Format, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveItem(int, int)","url":"moveItem(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SURFACE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, String, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, String, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, String, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, String, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, Exception, long)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,java.lang.Exception,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, Exception, long)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,java.lang.Exception,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, Exception, long)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,java.lang.Exception,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, Exception, long)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,java.lang.Exception,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadChanged(Download)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadRemoved(Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, ControlDispatcher, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(ExoPlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, long)","url":"onPlaylistError(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, long)","url":"onPlaylistError(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(VideoDecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.video.VideoDecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, Object, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,java.lang.Object,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(int, int, int, float)","url":"onVideoSizeChanged(int,int,int,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, ExoMediaCrypto, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.drm.ExoMediaCrypto,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"OutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, String, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, String)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, String)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, String, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.lang.String,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, String, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.CustomActionReceiver)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener, PlayerNotificationManager.CustomActionReceiver)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener,com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfWindow(ExoPlayer, int)","url":"playUntilStartOfWindow(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfWindow(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackPreparer","l":"preparePlayback()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(Uri, String, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(Uri, String, CacheDataSource.Factory)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(SimpleExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, String, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"reset(OutputStream)","url":"reset(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream, int)","url":"%3Cinit%3E(java.io.OutputStream,int)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream)","url":"%3Cinit%3E(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(SimpleExoPlayer)","url":"run(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(Player)","url":"runUntilError(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(SimpleExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], int)","url":"%3Cinit%3E(int,int[],int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setExoMediaCryptoType(Class)","url":"setExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"setFastForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setFastForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(short)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, int)","url":"setLine(float,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.Parameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlaybackPreparer(PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(int)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"setRewindIncrementMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setRewindIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, int)","url":"setTextSize(float,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(int...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNavigationActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNavigationActionsInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"SimpleOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, String, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ExoFlags","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"SOURCE_GMS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"SOURCE_NATIVE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"SOURCE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"SOURCE_UNKNOWN"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"SOURCE_USER_PROVIDED"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(Uri, List, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(Uri, List, CacheDataSource.Factory)","url":"%3Cinit%3E(android.net.Uri,java.util.List,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int, int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,int,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedMediaCrypto","l":"UnsupportedMediaCrypto()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"updateOrientation(float, float, float, float)","url":"updateOrientation(float,float,float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, ExoMediaCrypto, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.drm.ExoMediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxOutputBuffer","l":"VpxOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] \ No newline at end of file +memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, int, List, List, List, List)","url":"%3Cinit%3E(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"addAdGroupToAdPlaybackState(AdPlaybackState, long, long, long)","url":"addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(FlagSet)","url":"addAll(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAllCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkDataType"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, int)","url":"assertExtensionRendererCreated(java.lang.Class,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionedSame(MediaItem...)","url":"assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionReasonsEqual(Integer...)","url":"assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTrackGroupsEqual(TrackGroupArray)","url":"assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_UHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String, String, int, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"BaseUrlExclusionList()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrls"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrls"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, int, List, List, List, List)","url":"buildAdaptationSet(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context, String, boolean)","url":"buildCronetEngine(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(String, RangedUri, String, int)","url":"buildDataSpec(java.lang.String,com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, Renderer...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(TrackSelectionParameters)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecStringFromSps(ParsableNalUnitBitArray)","url":"buildHevcCodecStringFromSps(com.google.android.exoplayer2.util.ParsableNalUnitBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"capacity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter, long, long)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter,long,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"checkContainerInput(boolean, String)","url":"checkContainerInput(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(int,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TIMELINE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_INVALID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE_STOP"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_BACK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_FORWARD"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"compilation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String, String)","url":"compileProgram(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String[], String[])","url":"compileProgram(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"composer"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"conductor"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException, int)","url":"%3Cinit%3E(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"contentIsMalformed"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"contentResumeOffsetUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithExoMediaCryptoType(Class)","url":"copyWithExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createFallbackOptions(ExoTrackSelection)","url":"createFallbackOptions(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"createForIOException(IOException, DataSpec, int)","url":"createForIOException(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedContainer(String, Throwable)","url":"createForMalformedContainer(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedDataOfUnknownType(String, Throwable)","url":"createForMalformedDataOfUnknownType(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedManifest(String, Throwable)","url":"createForMalformedManifest(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForManifestWithUnsupportedFeature(String, Throwable)","url":"createForManifestWithUnsupportedFeature(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean, int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException, int)","url":"createForSource(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException, int)","url":"createForUnexpected(java.lang.RuntimeException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForUnsupportedContainerFeature(String)","url":"createForUnsupportedContainerFeature(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.Subtitle, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.Subtitle,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(Uri, Format, long)","url":"createMediaSource(android.net.Uri,com.google.android.exoplayer2.Format,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(int,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, int, boolean, boolean, String, HttpDataSource.RequestProperties, Predicate, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,int,boolean,boolean,java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,com.google.common.base.Predicate,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CUSTOM_ERROR_CODE_BASE"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"dataType"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(SimpleExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"DecryptionException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_LOCATION_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_PRIORITY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_BACK_INCREMENT_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_FORWARD_INCREMENT_MS"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"DEFAULT_USER_AGENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_WEIGHT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"DefaultMediaDescriptionAdapter(PendingIntent)","url":"%3Cinit%3E(android.app.PendingIntent)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Config","l":"disable5GNsaDisambiguation()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"discNumber"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(int, Format, int, Object, long)","url":"downstreamFormatChanged(int,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_JOC_CODEC_STRING"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_BEHIND_LIVE_WINDOW"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_QUERY_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_CONTENT_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DEVICE_REVOKED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DISALLOWED_OPERATION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_EXPIRED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_PROVISIONING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SCHEME_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SYSTEM_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_FAILED_RUNTIME_CHECK"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_BAD_HTTP_STATUS"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_FILE_NOT_FOUND"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NO_PERMISSION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_REMOTE_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_EXO_MEDIA_DRM"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_LICENSE_ACQUISITION"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_PROVISIONING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorCode"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(FlagSet, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(FlagSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"exclude(BaseUrl, long)","url":"exclude(com.google.android.exoplayer2.source.dash.manifest.BaseUrl,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"exclusionDurationMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"exoMediaCryptoType"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_LOCATION"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_TRACK"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"FallbackOptions(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"FallbackSelection(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"FIELD_CUSTOM_ID_BASE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Exception)","url":"%3Cinit%3E(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"ForwardingPlayer(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"FrameworkMediaCrypto(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromBundleList(Bundleable.Creator, List)","url":"fromBundleList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle, T)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle,T)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getAdCountInGroup(AdPlaybackState, int)","url":"getAdCountInGroup(com.google.android.exoplayer2.source.ads.AdPlaybackState,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getAttributes(int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, int)","url":"getCodecCountOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, int)","url":"getCodecsOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getContentResumeOffsetUs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"getEncodingForAudioObjectType(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2","c":"C","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"getErrorCodeForMediaDrmException(Exception, int)","url":"getErrorCodeForMediaDrmException(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeFromPlatformDiagnosticsInfo(String)","url":"getErrorCodeFromPlatformDiagnosticsInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName(int)"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getFastForwardIncrementMs(Player)","url":"getFastForwardIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List)","url":"getForegroundNotification(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getMediaPeriodPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForAd(long, int, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForContent(long, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(int, int)","url":"getNextRepeatMode(int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getPreSkipSamples(List)","url":"getPreSkipSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCount(List)","url":"getPriorityCount(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCountAfterExclusion(List)","url":"getPriorityCountAfterExclusion(java.util.List)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getRemovedAdGroupCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getRewindIncrementMs(Player)","url":"getRewindIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekBackIncrementMs()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getSeekPreRollSamples(List)","url":"getSeekPreRollSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamDurationUs(Player, AdPlaybackState)","url":"getStreamDurationUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getStreamPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(Player, AdPlaybackState)","url":"getStreamPositionUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForAd(long, int, int, AdPlaybackState)","url":"getStreamPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForContent(long, int, AdPlaybackState)","url":"getStreamPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getUniforms(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getWindowIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"GL_ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"GvrAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(SimpleExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.SimpleExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"hasTrackOfType(TrackSelectionArray, int)","url":"hasTrackOfType(com.google.android.exoplayer2.trackselection.TrackSelectionArray,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"IntArrayQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, IOException, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.io.IOException,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, FlagSet)","url":"invoke(T,com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"isAbsolute(String)","url":"isAbsolute(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"isEligibleForFallback(IOException)","url":"isEligibleForFallback(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"isFallbackAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoColorPrimariesToColorSpace(int)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoTransferCharacteristicsToColorTransfer(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(int, int)","url":"isRepeatModeEnabled(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"isServerSideInserted"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isServerSideInsertedAdGroup(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PCM_ENCODING"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"keyForField(int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation, int)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadInitializationData(ChunkExtractor, DataSource, Representation, boolean)","url":"loadInitializationData(com.google.android.exoplayer2.source.chunk.ChunkExtractor,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Representation,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation, int)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"maybeSetArtworkData(byte[], int)","url":"maybeSetArtworkData(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(int, Format, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_NO_OFFSET"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_SHARED"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SURFACE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, List, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedLocations"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfLocations"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAvailableCommandsChanged(AnalyticsListener.EventTime, Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadChanged(Download)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadRemoved(Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, int)","url":"onMaxSeekToPreviousPositionChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, ControlDispatcher, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaylistMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(VideoDecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.video.VideoDecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekBackIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekBackIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekForwardIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekForwardIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(int, int, int, float)","url":"onVideoSizeChanged(int,int,int,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, ExoMediaCrypto, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.drm.ExoMediaCrypto,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"OutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, List, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, List)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, BaseUrl)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.BaseUrl)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, List, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.util.List,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, List, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.util.List,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable, boolean, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_A_BRIGHT_COLORED_FISH"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BACK_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ARTIST_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ORCHESTRA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_COMPOSER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_CONDUCTOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_PERFORMANCE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_RECORDING"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FRONT_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ILLUSTRATION"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAD_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAFLET_PAGE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LYRICIST"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_PUBLISHER_STUDIO_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_RECORDING_LOCATION"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int, long)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfWindow(ExoPlayer, int)","url":"playUntilStartOfWindow(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfWindow(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"priority"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingDay"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingMonth"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingYear"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(SimpleExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"release()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseDay"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseMonth"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseYear"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"RemotableTimeline(ImmutableList, ImmutableList, int[])","url":"%3Cinit%3E(com.google.common.collect.ImmutableList,com.google.common.collect.ImmutableList,int[])"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"removedAdGroupCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, List, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"reset(OutputStream)","url":"reset(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream, int)","url":"%3Cinit%3E(java.io.OutputStream,int)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream)","url":"%3Cinit%3E(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(SimpleExoPlayer)","url":"run(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(ExoPlayer)","url":"runUntilError(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(SimpleExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"sameAs(MediaMetadataCompat, MediaMetadataCompat)","url":"sameAs(android.support.v4.media.MediaMetadataCompat,android.support.v4.media.MediaMetadataCompat)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekForward()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"selectBaseUrl(List)","url":"selectBaseUrl(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"selectedBaseUrl"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], int)","url":"%3Cinit%3E(int,int[],int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"ServerSideInsertedAdsMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"serviceLocation"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"setAdPlaybackState(AdPlaybackState)","url":"setAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[], Integer)","url":"setArtworkData(byte[],java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setCompilation(CharSequence)","url":"setCompilation(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setComposer(CharSequence)","url":"setComposer(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setConductor(CharSequence)","url":"setConductor(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDiscNumber(Integer)","url":"setDiscNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setDispatchUnsupportedActionsEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setExoMediaCryptoType(Class)","url":"setExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setGenre(CharSequence)","url":"setGenre(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, int)","url":"setLine(float,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter)","url":"setMediaDescriptionAdapter(com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMetadataDeduplicationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.Parameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(int)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingDay(Integer)","url":"setRecordingDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingMonth(Integer)","url":"setRecordingMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingYear(Integer)","url":"setRecordingYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseDay(Integer)","url":"setReleaseDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseMonth(Integer)","url":"setReleaseMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseYear(Integer)","url":"setReleaseYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setRequestPriority(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, int)","url":"setTextSize(float,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalDiscCount(Integer)","url":"setTotalDiscCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(int...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setWriter(CharSequence)","url":"setWriter(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"shouldPlayAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"SimpleOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, List, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int, int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleArrayList(List)","url":"toBundleArrayList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleList(List)","url":"toBundleList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toNullableBundle(Bundleable)","url":"toNullableBundle(com.google.android.exoplayer2.Bundleable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalDiscCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,int,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"TrackSelectionParameters(TrackSelectionParameters.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedMediaCrypto","l":"UnsupportedMediaCrypto()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"updateOrientation(float, float, float, float)","url":"updateOrientation(float,float,float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, ExoMediaCrypto, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.drm.ExoMediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"weight"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(int, long...)","url":"withAdDurationsUs(int,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdGroupTimeUs(int, long)","url":"withAdGroupTimeUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentResumeOffsetUs(int, long)","url":"withContentResumeOffsetUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withContentResumeOffsetUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withIsServerSideInserted(boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withIsServerSideInserted(int, boolean)","url":"withIsServerSideInserted(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withNewAdGroup(int, long)","url":"withNewAdGroup(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withRemovedAdGroupCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withTimeUs(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"writer"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] \ No newline at end of file diff --git a/docs/doc/reference/member-search-index.zip b/docs/doc/reference/member-search-index.zip index 4bcb39d4f4b54ce204955acbe0ac5f226c93b524..c5b1a94e4d69893537327b700d4c22a44ca0fb71 100644 GIT binary patch literal 136087 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 z
  • com.google.android.exoplayer2.source.hls.HlsMediaSource (implements com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)
  • com.google.android.exoplayer2.source.ProgressiveMediaSource
  • com.google.android.exoplayer2.source.rtsp.RtspMediaSource
  • +
  • com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource (implements com.google.android.exoplayer2.drm.DrmSessionEventListener, com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller, com.google.android.exoplayer2.source.MediaSourceEventListener)
  • com.google.android.exoplayer2.source.SilenceMediaSource
  • com.google.android.exoplayer2.source.SingleSampleMediaSource
  • com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource (implements com.google.android.exoplayer2.upstream.Loader.Callback<T>)
  • @@ -365,6 +366,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.trackselection.RandomTrackSelection
  • +
  • com.google.android.exoplayer2.source.dash.manifest.BaseUrl
  • +
  • com.google.android.exoplayer2.source.dash.BaseUrlExclusionList
  • com.google.android.exoplayer2.extractor.BinarySearchSeeker
  • com.google.android.exoplayer2.extractor.BinarySearchSeeker.BinarySearchSeekMap (implements com.google.android.exoplayer2.extractor.SeekMap)
  • com.google.android.exoplayer2.extractor.BinarySearchSeeker.DefaultSeekTimestampConverter (implements com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter)
  • @@ -388,15 +391,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +
  • com.google.android.exoplayer2.util.BundleableUtils
  • com.google.android.exoplayer2.source.chunk.BundledChunkExtractor (implements com.google.android.exoplayer2.source.chunk.ChunkExtractor, com.google.android.exoplayer2.extractor.ExtractorOutput)
  • com.google.android.exoplayer2.source.BundledExtractorsAdapter (implements com.google.android.exoplayer2.source.ProgressiveMediaExtractor)
  • com.google.android.exoplayer2.source.hls.BundledHlsMediaChunkExtractor (implements com.google.android.exoplayer2.source.hls.HlsMediaChunkExtractor)
  • @@ -478,8 +478,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.util.CopyOnWriteMultiset<E> (implements java.lang.Iterable<T>)
  • com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory (implements com.google.android.exoplayer2.upstream.HttpDataSource.Factory)
  • com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
  • +
  • com.google.android.exoplayer2.ext.cronet.CronetUtil
  • com.google.android.exoplayer2.decoder.CryptoInfo
  • -
  • com.google.android.exoplayer2.text.Cue
  • +
  • com.google.android.exoplayer2.text.Cue (implements com.google.android.exoplayer2.Bundleable)
  • com.google.android.exoplayer2.text.Cue.Builder
  • com.google.android.exoplayer2.source.dash.manifest.DashManifest (implements com.google.android.exoplayer2.offline.FilterableManifest<T>)
  • com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo
  • @@ -533,6 +534,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.DefaultLoadControl (implements com.google.android.exoplayer2.LoadControl)
  • com.google.android.exoplayer2.DefaultLoadControl.Builder
  • com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy (implements com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)
  • +
  • com.google.android.exoplayer2.ui.DefaultMediaDescriptionAdapter (implements com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)
  • com.google.android.exoplayer2.ext.cast.DefaultMediaItemConverter (implements com.google.android.exoplayer2.ext.cast.MediaItemConverter)
  • com.google.android.exoplayer2.ext.media2.DefaultMediaItemConverter (implements com.google.android.exoplayer2.ext.media2.MediaItemConverter)
  • com.google.android.exoplayer2.source.DefaultMediaSourceFactory (implements com.google.android.exoplayer2.source.MediaSourceFactory)
  • @@ -568,6 +570,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.drm.DrmInitData (implements java.util.Comparator<T>, android.os.Parcelable)
  • com.google.android.exoplayer2.drm.DrmInitData.SchemeData (implements android.os.Parcelable)
  • com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher
  • +
  • com.google.android.exoplayer2.drm.DrmUtil
  • com.google.android.exoplayer2.extractor.ts.DtsReader (implements com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)
  • com.google.android.exoplayer2.audio.DtsUtil
  • com.google.android.exoplayer2.upstream.DummyDataSource (implements com.google.android.exoplayer2.upstream.DataSource)
  • @@ -586,8 +589,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.metadata.emsg.EventMessage (implements com.google.android.exoplayer2.metadata.Metadata.Entry)
  • com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder
  • com.google.android.exoplayer2.source.dash.manifest.EventStream
  • -
  • com.google.android.exoplayer2.util.ExoFlags
  • -
  • com.google.android.exoplayer2.util.ExoFlags.Builder
  • com.google.android.exoplayer2.testutil.ExoHostedTest (implements com.google.android.exoplayer2.analytics.AnalyticsListener, com.google.android.exoplayer2.testutil.HostActivity.HostedTest)
  • com.google.android.exoplayer2.drm.ExoMediaDrm.AppManagedProvider (implements com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)
  • com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest
  • @@ -655,6 +656,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.extractor.FlacSeekTableSeekMap (implements com.google.android.exoplayer2.extractor.SeekMap)
  • com.google.android.exoplayer2.extractor.FlacStreamMetadata
  • com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable
  • +
  • com.google.android.exoplayer2.util.FlagSet
  • +
  • com.google.android.exoplayer2.util.FlagSet.Builder
  • com.google.android.exoplayer2.extractor.flv.FlvExtractor (implements com.google.android.exoplayer2.extractor.Extractor)
  • com.google.android.exoplayer2.Format (implements android.os.Parcelable)
  • com.google.android.exoplayer2.Format.Builder
  • @@ -665,6 +668,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.extractor.ForwardingExtractorInput (implements com.google.android.exoplayer2.extractor.ExtractorInput)
  • +
  • com.google.android.exoplayer2.ForwardingPlayer (implements com.google.android.exoplayer2.Player)
  • com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor (implements com.google.android.exoplayer2.extractor.Extractor)
  • com.google.android.exoplayer2.drm.FrameworkMediaCrypto (implements com.google.android.exoplayer2.drm.ExoMediaCrypto)
  • com.google.android.exoplayer2.drm.FrameworkMediaDrm (implements com.google.android.exoplayer2.drm.ExoMediaDrm)
  • @@ -758,6 +762,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.upstream.Loader (implements com.google.android.exoplayer2.upstream.LoaderErrorThrower)
  • com.google.android.exoplayer2.upstream.Loader.LoadErrorAction
  • com.google.android.exoplayer2.upstream.LoaderErrorThrower.Dummy (implements com.google.android.exoplayer2.upstream.LoaderErrorThrower)
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackSelection
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo
  • com.google.android.exoplayer2.source.LoadEventInfo
  • com.google.android.exoplayer2.drm.LocalMediaDrmCallback (implements com.google.android.exoplayer2.drm.MediaDrmCallback)
  • @@ -810,6 +816,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.util.NalUnitUtil.PpsData
  • com.google.android.exoplayer2.util.NalUnitUtil.SpsData
  • com.google.android.exoplayer2.util.NetworkTypeObserver
  • +
  • com.google.android.exoplayer2.util.NetworkTypeObserver.Config
  • com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor (implements com.google.android.exoplayer2.upstream.cache.CacheEvictor)
  • com.google.android.exoplayer2.NoSampleRenderer (implements com.google.android.exoplayer2.Renderer, com.google.android.exoplayer2.RendererCapabilities)
  • com.google.android.exoplayer2.util.NotificationUtil
  • @@ -848,7 +855,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.analytics.PlaybackStats.EventTimeAndFormat
  • com.google.android.exoplayer2.analytics.PlaybackStats.EventTimeAndPlaybackState
  • com.google.android.exoplayer2.analytics.PlaybackStatsListener (implements com.google.android.exoplayer2.analytics.AnalyticsListener, com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)
  • -
  • com.google.android.exoplayer2.Player.Commands
  • +
  • com.google.android.exoplayer2.Player.Commands (implements com.google.android.exoplayer2.Bundleable)
  • com.google.android.exoplayer2.Player.Commands.Builder
  • com.google.android.exoplayer2.Player.Events
  • com.google.android.exoplayer2.Player.PositionInfo (implements com.google.android.exoplayer2.Bundleable)
  • @@ -899,6 +906,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.upstream.ResolvingDataSource (implements com.google.android.exoplayer2.upstream.DataSource)
  • com.google.android.exoplayer2.upstream.ResolvingDataSource.Factory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • com.google.android.exoplayer2.robolectric.RobolectricUtil
  • +
  • com.google.android.exoplayer2.ext.rtmp.RtmpDataSource.Factory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • com.google.android.exoplayer2.ext.rtmp.RtmpDataSourceFactory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • com.google.android.exoplayer2.source.rtsp.reader.RtpAc3Reader (implements com.google.android.exoplayer2.source.rtsp.reader.RtpPayloadReader)
  • com.google.android.exoplayer2.source.rtsp.RtpPacket
  • @@ -935,6 +943,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.offline.SegmentDownloader.Segment (implements java.lang.Comparable<T>)
  • com.google.android.exoplayer2.extractor.ts.SeiReader
  • +
  • com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsUtil
  • com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement
  • com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder
  • com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DefaultAllowedCommandProvider (implements com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)
  • @@ -1059,12 +1068,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.drm.DecryptionException
  • com.google.android.exoplayer2.drm.DefaultDrmSessionManager.MissingSchemeDataException
  • -
  • com.google.android.exoplayer2.ExoPlaybackException (implements com.google.android.exoplayer2.Bundleable)
  • -
  • com.google.android.exoplayer2.ExoTimeoutException
  • java.io.IOException
  • com.google.android.exoplayer2.util.PriorityTaskManager.PriorityTooLowException
  • -
  • com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException
  • com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspPlaybackException
  • com.google.android.exoplayer2.source.hls.SampleQueueMappingException
  • -
  • com.google.android.exoplayer2.upstream.UdpDataSource.UdpDataSourceException
  • com.google.android.exoplayer2.drm.KeysExpiredException
  • com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.DecoderInitializationException
  • com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException
  • +
  • com.google.android.exoplayer2.PlaybackException (implements com.google.android.exoplayer2.Bundleable) + +
  • java.lang.RuntimeException
  • com.google.android.exoplayer2.upstream.ParsingLoadable.Parser<T>
  • -
  • com.google.android.exoplayer2.PlaybackPreparer
  • com.google.android.exoplayer2.analytics.PlaybackSessionManager
  • com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener
  • com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback
  • @@ -1594,6 +1610,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.C.ColorTransfer (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.ContentType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.CryptoMode (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.DataType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.Encoding (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.FormatSupport (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.NetworkType (implements java.lang.annotation.Annotation)
  • @@ -1610,7 +1627,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.upstream.cache.CacheDataSource.Flags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.ui.CaptionStyleCompat.EdgeType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.source.ClippingMediaSource.IllegalClippingException.Reason (implements java.lang.annotation.Annotation)
  • -
  • com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper.CronetEngineSource (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.text.Cue.AnchorType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.text.Cue.LineType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.text.Cue.TextSizeType (implements java.lang.annotation.Annotation)
  • @@ -1628,6 +1644,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.offline.Download.FailureReason (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.offline.Download.State (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.drm.DrmSession.State (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.drm.DrmUtil.ErrorSource (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.extractor.mkv.EbmlProcessor.ElementType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.util.EGLSurfaceTexture.SecureMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest.RequestType (implements java.lang.annotation.Annotation)
  • @@ -1641,17 +1658,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.PlaylistType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException.Type (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Flags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.MediaMetadata.FolderType (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.MediaMetadata.PictureType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackActions (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.source.MergingMediaSource.IllegalMergeException.Reason (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.extractor.mp3.Mp3Extractor.Flags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.Flags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.util.NonNullApi (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.util.NotificationUtil.Importance (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.PlaybackException.ErrorCode (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.PlaybackException.FieldNumber (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.Command (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.DiscontinuityReason (implements java.lang.annotation.Annotation)
  • -
  • com.google.android.exoplayer2.Player.EventFlags (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.Player.Event (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.MediaItemTransitionReason (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.PlaybackSuppressionReason (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason (implements java.lang.annotation.Annotation)
  • diff --git a/docs/doc/reference/package-search-index.zip b/docs/doc/reference/package-search-index.zip index e07c33ac2621b7929e92f37b7bbe43f291c01f0c..aa8bb32d54f877f4cd5b2936239fb25ab1628b1f 100644 GIT binary patch delta 32 lcmX@adWe-Tz?+#xgn@&DgW*yKTkuA{WF{66V{$2zF93hA2v7h3 delta 32 lcmX@adWe-Tz?+#xgn@&DgCWH0OVCEXWF{66V{$2zF93l<2(kbG diff --git a/docs/doc/reference/serialized-form.html b/docs/doc/reference/serialized-form.html index 061f312715..7ddcf4a956 100644 --- a/docs/doc/reference/serialized-form.html +++ b/docs/doc/reference/serialized-form.html @@ -102,16 +102,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • -

    Class com.google.android.exoplayer2.ExoPlaybackException extends Exception implements Serializable

    +

    Class com.google.android.exoplayer2.ExoPlaybackException extends PlaybackException implements Serializable

    • Serialized Fields

    • @@ -913,7 +955,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • -

      Class com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException extends IOException implements Serializable

      +

      Class com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException extends DataSourceException implements Serializable

    • @@ -923,7 +965,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • -

      Class com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException extends IOException implements Serializable

      +

      Class com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException extends DataSourceException implements Serializable

      diff --git a/docs/doc/reference/type-search-index.js b/docs/doc/reference/type-search-index.js index cf4c7f3072..427279dba2 100644 --- a/docs/doc/reference/type-search-index.js +++ b/docs/doc/reference/type-search-index.js @@ -1 +1 @@ -typeSearchIndex = [{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.AacAudioObjectType"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AbsoluteSized"},{"p":"com.google.android.exoplayer2","l":"AbstractConcatenatedTimeline"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util"},{"p":"com.google.android.exoplayer2.testutil","l":"Action"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.AdaptationCheckpoint"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"AdaptationSet"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.AdaptiveSupport"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil.AdaptiveTrackSelectionFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"AdditionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.AddMediaItems"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdGroup"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory.AdsLoaderProvider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdState"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsReader"},{"p":"com.google.android.exoplayer2.ui","l":"AdViewProvider"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSink"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSource"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesFlushingCipher"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Aligned"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocation"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.AllowedCommandProvider"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsCollector"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener"},{"p":"com.google.android.exoplayer2.text","l":"Cue.AnchorType"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AndSpanFlags"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ApicFrame"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTable"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTableDecoder"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.AppManagedProvider"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.AspectRatioListener"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig"},{"p":"com.google.android.exoplayer2.util","l":"Assertions"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource.AssetDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"AtomicFile"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Attribute"},{"p":"com.google.android.exoplayer2","l":"C.AudioAllowedCapturePolicy"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.AudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilities"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioComponent"},{"p":"com.google.android.exoplayer2","l":"C.AudioContentType"},{"p":"com.google.android.exoplayer2","l":"C.AudioFlags"},{"p":"com.google.android.exoplayer2","l":"C.AudioFocusGain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.AudioFormat"},{"p":"com.google.android.exoplayer2.audio","l":"AudioListener"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioOffloadListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.AudioTrackScore"},{"p":"com.google.android.exoplayer2","l":"C.AudioUsage"},{"p":"com.google.android.exoplayer2.audio","l":"AuxEffectInfo"},{"p":"com.google.android.exoplayer2.video","l":"AvcConfig"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter"},{"p":"com.google.android.exoplayer2.audio","l":"BaseAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"BaseDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.BaseFactory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkIterator"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkOutput"},{"p":"com.google.android.exoplayer2.source","l":"BaseMediaSource"},{"p":"com.google.android.exoplayer2","l":"BasePlayer"},{"p":"com.google.android.exoplayer2","l":"BaseRenderer"},{"p":"com.google.android.exoplayer2.trackselection","l":"BaseTrackSelection"},{"p":"com.google.android.exoplayer2.source","l":"BehindLiveWindowException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"BinaryFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.BinarySearchSeekMap"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.BitmapCallback"},{"p":"com.google.android.exoplayer2.decoder","l":"Buffer"},{"p":"com.google.android.exoplayer2","l":"C.BufferFlags"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.BufferReplacementMode"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl.Builder"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl.Builder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.Builder"},{"p":"com.google.android.exoplayer2","l":"Format.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"Player.Commands.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.Builder"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader.Builder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.Builder"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource.Builder"},{"p":"com.google.android.exoplayer2.text","l":"Cue.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter.Builder"},{"p":"com.google.android.exoplayer2.util","l":"ExoFlags.Builder"},{"p":"com.google.android.exoplayer2","l":"Bundleable"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BundledChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"BundledExtractorsAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"BundledHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2","l":"BundleListRetriever"},{"p":"com.google.android.exoplayer2.util","l":"BundleUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSource"},{"p":"com.google.android.exoplayer2","l":"C"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.CacheDataSinkException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSinkFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CachedRegionTracker"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheEvictor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.CacheException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.CacheIgnoredReason"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheKeyFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheSpan"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener.Callback"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.Callback"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod.Callback"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget.Callback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Callback"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionListener"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionRenderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.Capabilities"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CaptionCallback"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingAudioSink"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingRenderersFactory"},{"p":"com.google.android.exoplayer2.ext.cast","l":"CastPlayer"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea608Decoder"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea708Decoder"},{"p":"com.google.android.exoplayer2.extractor","l":"CeaUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterTocFrame"},{"p":"com.google.android.exoplayer2.source.chunk","l":"Chunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkHolder"},{"p":"com.google.android.exoplayer2.extractor","l":"ChunkIndex"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearMediaItems"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.CleartextNotPermittedException"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearVideoSurface"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingProperties"},{"p":"com.google.android.exoplayer2.util","l":"Clock"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer.CodecMaxValues"},{"p":"com.google.android.exoplayer2.util","l":"CodecSpecificDataUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Colored"},{"p":"com.google.android.exoplayer2.video","l":"ColorInfo"},{"p":"com.google.android.exoplayer2.util","l":"ColorParser"},{"p":"com.google.android.exoplayer2","l":"C.ColorRange"},{"p":"com.google.android.exoplayer2","l":"C.ColorSpace"},{"p":"com.google.android.exoplayer2","l":"C.ColorTransfer"},{"p":"com.google.android.exoplayer2","l":"Player.Command"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CommandReceiver"},{"p":"com.google.android.exoplayer2","l":"Player.Commands"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"CommentFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.CommentHeader"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.source","l":"CompositeMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoader"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"ConditionVariable"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.Config"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Configuration"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.ConfigurationException"},{"p":"com.google.android.exoplayer2.extractor","l":"ConstantBitrateSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"Consumer"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ContainerMediaChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource.ContentDataSourceException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadata"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadataMutations"},{"p":"com.google.android.exoplayer2","l":"C.ContentType"},{"p":"com.google.android.exoplayer2","l":"ControlDispatcher"},{"p":"com.google.android.exoplayer2.util","l":"CopyOnWriteMultiset"},{"p":"com.google.android.exoplayer2","l":"Bundleable.Creator"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSourceFactory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper.CronetEngineSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.CryptoData"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoInfo"},{"p":"com.google.android.exoplayer2","l":"C.CryptoMode"},{"p":"com.google.android.exoplayer2.text","l":"Cue"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CustomActionProvider"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.CustomActionReceiver"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.CustomCommandProvider"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource"},{"p":"com.google.android.exoplayer2.source.dash.offline","l":"DashDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifest"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashManifestStaleException"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashSegmentIndex"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashUtil"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashWrappingSegmentIndex"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseIOException"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"DataChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"DataReader"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSchemeDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceInputStream"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec"},{"p":"com.google.android.exoplayer2.util","l":"DebugTextViewHelper"},{"p":"com.google.android.exoplayer2.decoder","l":"Decoder"},{"p":"com.google.android.exoplayer2.audio","l":"DecoderAudioRenderer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderCounters"},{"p":"com.google.android.exoplayer2.testutil","l":"DecoderCountersUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderDiscardReasons"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer.DecoderInitializationException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil.DecoderQueryException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderReuseResult"},{"p":"com.google.android.exoplayer2.video","l":"DecoderVideoRenderer"},{"p":"com.google.android.exoplayer2.drm","l":"DecryptionException"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultAllocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DefaultAllowedCommandProvider"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.DefaultAudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultCastOptionsProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultCompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"DefaultContentMetadata"},{"p":"com.google.android.exoplayer2","l":"DefaultControlDispatcher"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource"},{"p":"com.google.android.exoplayer2.database","l":"DefaultDatabaseProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSourceFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloadIndex"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorsFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultLoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.DefaultMediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultPlaybackSessionManager"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"DefaultRenderersFactoryAsserts"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"DefaultRtpPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.DefaultSeekTimestampConverter"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.DefaultShuffleOrder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTimeBar"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTrackNameProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Definition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser.DeltaUpdateException"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Descriptor"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.DeviceComponent"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo"},{"p":"com.google.android.exoplayer2.device","l":"DeviceListener"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder.DialogCallback"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DisconnectedCallback"},{"p":"com.google.android.exoplayer2","l":"Player.DiscontinuityReason"},{"p":"com.google.android.exoplayer2.video","l":"DolbyVisionConfig"},{"p":"com.google.android.exoplayer2.offline","l":"Download"},{"p":"com.google.android.exoplayer2.testutil","l":"DownloadBuilder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadCursor"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader"},{"p":"com.google.android.exoplayer2.offline","l":"DownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil.DownloadIdProvider"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadIndex"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager"},{"p":"com.google.android.exoplayer2.ui","l":"DownloadNotificationHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadProgress"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadService"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.DrmSessionException"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager.DrmSessionReference"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DtsReader"},{"p":"com.google.android.exoplayer2.audio","l":"DtsUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower.Dummy"},{"p":"com.google.android.exoplayer2.upstream","l":"DummyDataSource"},{"p":"com.google.android.exoplayer2.drm","l":"DummyExoMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread"},{"p":"com.google.android.exoplayer2.video","l":"DummySurface"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper.Dumpable"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpableFormat"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpFileAsserts"},{"p":"com.google.android.exoplayer2.text.dvb","l":"DvbDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.DvbSubtitleInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DvbSubtitleReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat.EdgeType"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"ElementaryStreamReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor.ElementType"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.EmbeddedSampleStream"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.EmphasizedText"},{"p":"com.google.android.exoplayer2.source","l":"EmptySampleStream"},{"p":"com.google.android.exoplayer2","l":"C.Encoding"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata.Entry"},{"p":"com.google.android.exoplayer2.util","l":"ErrorMessageProvider"},{"p":"com.google.android.exoplayer2.drm","l":"ErrorStateDrmSession"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.EsInfo"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.Event"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.Event"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2","l":"Player.EventFlags"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventFlags"},{"p":"com.google.android.exoplayer2","l":"Player.EventListener"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.EventListener"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.EventListener"},{"p":"com.google.android.exoplayer2.util","l":"EventLogger"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessage"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageDecoder"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageEncoder"},{"p":"com.google.android.exoplayer2","l":"Player.Events"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.Events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"EventStream"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventTime"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndException"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndFormat"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ExecuteRunnable"},{"p":"com.google.android.exoplayer2.database","l":"ExoDatabaseProvider"},{"p":"com.google.android.exoplayer2.util","l":"ExoFlags"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoHostedTest"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer"},{"p":"com.google.android.exoplayer2","l":"ExoPlayerLibraryInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory.ExtensionRendererMode"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.ExtractorFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorOutput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorsFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorUtil"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink"},{"p":"com.google.android.exoplayer2.offline","l":"Download.FailureReason"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAudioRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunk"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunkIterator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaClockRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream.FakeSampleStreamItem"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelection"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelector"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.FakeTransferListener"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeVideoRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegDecoderException"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegLibrary"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.FileDataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes"},{"p":"com.google.android.exoplayer2.offline","l":"FilterableManifest"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"FilteringHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.offline","l":"FilteringManifestParser"},{"p":"com.google.android.exoplayer2.trackselection","l":"FixedTrackSelection"},{"p":"com.google.android.exoplayer2.util","l":"FlacConstants"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoderException"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacLibrary"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacSeekTableSeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader.FlacStreamMetadataHolder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Flags"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Flags"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Flags"},{"p":"com.google.android.exoplayer2.extractor.flv","l":"FlvExtractor"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.FolderType"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.FontSizeUnit"},{"p":"com.google.android.exoplayer2","l":"Format"},{"p":"com.google.android.exoplayer2","l":"FormatHolder"},{"p":"com.google.android.exoplayer2","l":"C.FormatSupport"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.FormatSupport"},{"p":"com.google.android.exoplayer2.audio","l":"ForwardingAudioSink"},{"p":"com.google.android.exoplayer2.extractor","l":"ForwardingExtractorInput"},{"p":"com.google.android.exoplayer2.source","l":"ForwardingTimeline"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder.FramePredicate"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"GaplessInfoHolder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Decoder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1DecoderException"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Library"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"GeobFrame"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.GlException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil"},{"p":"com.google.android.exoplayer2.ext.gvr","l":"GvrAudioProcessor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H262Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H263Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H264Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H265Reader"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock.HandlerMessage"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil.Header"},{"p":"com.google.android.exoplayer2","l":"HeartRating"},{"p":"com.google.android.exoplayer2.video","l":"HevcConfig"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls.offline","l":"HlsDownloader"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsManifest"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaPeriod"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry"},{"p":"com.google.android.exoplayer2.text.span","l":"HorizontalTextInVerticalContextSpan"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity.HostedTest"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException"},{"p":"com.google.android.exoplayer2.testutil","l":"HttpDataSourceTestEnv"},{"p":"com.google.android.exoplayer2.drm","l":"HttpMediaDrmCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.HttpMethod"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpUtil"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyDecoder"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyHeaders"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Frame"},{"p":"com.google.android.exoplayer2.extractor","l":"Id3Peeker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Id3Reader"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException"},{"p":"com.google.android.exoplayer2","l":"IllegalSeekPositionException"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil.Importance"},{"p":"com.google.android.exoplayer2.extractor","l":"IndexSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient.InitializationCallback"},{"p":"com.google.android.exoplayer2.source.chunk","l":"InitializationChunk"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.InitializationException"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource.InitialTimeline"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"InputReaderAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.InsufficientCapacityException"},{"p":"com.google.android.exoplayer2.util","l":"IntArrayQueue"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"InternalFrame"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector.InvalidationListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.InvalidAudioTrackTimestampException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidContentTypeException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidResponseCodeException"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.IterationFinishedEvent"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Iterator"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"JpegExtractor"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest"},{"p":"com.google.android.exoplayer2.drm","l":"KeysExpiredException"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyStatus"},{"p":"com.google.android.exoplayer2.text.span","l":"LanguageFeatureSpan"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"LatmReader"},{"p":"com.google.android.exoplayer2.ext.leanback","l":"LeanbackPlayerAdapter"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"LeastRecentlyUsedCacheEvictor"},{"p":"com.google.android.exoplayer2.ext.flac","l":"LibflacAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Libgav1VideoRenderer"},{"p":"com.google.android.exoplayer2.ext.opus","l":"LibopusAudioRenderer"},{"p":"com.google.android.exoplayer2.util","l":"LibraryLoader"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"LibvpxVideoRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.LicenseServer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.LineType"},{"p":"com.google.android.exoplayer2","l":"Player.Listener"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.Listener"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager.Listener"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Listener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.Listener"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Listener"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.LiveContentUnsupportedException"},{"p":"com.google.android.exoplayer2","l":"LivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Loadable"},{"p":"com.google.android.exoplayer2","l":"LoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.LoadErrorAction"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.LoadErrorInfo"},{"p":"com.google.android.exoplayer2.source","l":"LoadEventInfo"},{"p":"com.google.android.exoplayer2.drm","l":"LocalMediaDrmCallback"},{"p":"com.google.android.exoplayer2.util","l":"Log"},{"p":"com.google.android.exoplayer2.util","l":"LongArray"},{"p":"com.google.android.exoplayer2.source","l":"LoopingMediaSource"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkFill"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkShape"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MdtaMetadataEntry"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaButtonEventHandler"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunkIterator"},{"p":"com.google.android.exoplayer2.util","l":"MediaClock"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter"},{"p":"com.google.android.exoplayer2.audio","l":"MediaCodecAudioRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecDecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecSelector"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoDecoderException"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.MediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaDescriptionConverter"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallback"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallbackException"},{"p":"com.google.android.exoplayer2.util","l":"MediaFormatUtil"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaIdEqualityChecker"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaIdMediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"MediaItem"},{"p":"com.google.android.exoplayer2.ext.cast","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"Player.MediaItemTransitionReason"},{"p":"com.google.android.exoplayer2.source","l":"MediaLoadData"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaParserChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"MediaParserExtractorAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"MediaParserHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"MediaParserUtil"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriodId"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaPeriodId"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaSourceCaller"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaSourceTestRunner"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper.Message"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.MetadataComponent"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoder"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoderFactory"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataInputBuffer"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataOutput"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataRenderer"},{"p":"com.google.android.exoplayer2","l":"MetadataRetriever"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.MetadataType"},{"p":"com.google.android.exoplayer2.util","l":"MimeTypes"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser.MissingFieldException"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.MissingSchemeDataException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"MlltFrame"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Mode"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.Mode"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor.Mode"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MotionPhotoMetadata"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.MoveMediaItem"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"Mp4WebvttDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"MpegAudioReader"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.MultiSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.MultiSegmentRepresentation"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil"},{"p":"com.google.android.exoplayer2","l":"C.NetworkType"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver"},{"p":"com.google.android.exoplayer2.util","l":"NonNullApi"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"NoOpCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"NoSampleRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.NotificationListener"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"NoUidTimeline"},{"p":"com.google.android.exoplayer2.drm","l":"OfflineLicenseHelper"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OffloadMode"},{"p":"com.google.android.exoplayer2.extractor.ogg","l":"OggExtractor"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnExpirationUpdateListener"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.OnFrameRenderedListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.OnFullScreenModeChangedListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnKeyStatusChangeListener"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar.OnScrubListener"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.OpenException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoder"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoderException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusLibrary"},{"p":"com.google.android.exoplayer2.audio","l":"OpusUtil"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.OtherTrackScore"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"OutputConsumerAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer.Owner"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.ParametersBuilder"},{"p":"com.google.android.exoplayer2.util","l":"ParsableBitArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableByteArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableNalUnitBitArray"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable.Parser"},{"p":"com.google.android.exoplayer2","l":"ParserException"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Part"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PassthroughSectionPayloadReader"},{"p":"com.google.android.exoplayer2","l":"C.PcmEncoding"},{"p":"com.google.android.exoplayer2","l":"PercentageRating"},{"p":"com.google.android.exoplayer2","l":"Timeline.Period"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Period"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PesReader"},{"p":"com.google.android.exoplayer2.text.pgs","l":"PgsDecoder"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"PictureFrame"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource.PlaceholderTimeline"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler.PlatformSchedulerService"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackActions"},{"p":"com.google.android.exoplayer2.robolectric","l":"PlaybackOutput"},{"p":"com.google.android.exoplayer2","l":"PlaybackParameters"},{"p":"com.google.android.exoplayer2","l":"PlaybackPreparer"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackPreparer"},{"p":"com.google.android.exoplayer2","l":"MediaItem.PlaybackProperties"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener"},{"p":"com.google.android.exoplayer2","l":"Player.PlaybackSuppressionReason"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo.PlaybackType"},{"p":"com.google.android.exoplayer2","l":"Player"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerEmsgCallback"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerTrackEmsgHandler"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistEventListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistResetException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistStuckException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.PlaylistType"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.PlayUntilPosition"},{"p":"com.google.android.exoplayer2","l":"Player.PlayWhenReadyChangeReason"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation.Position"},{"p":"com.google.android.exoplayer2.extractor","l":"PositionHolder"},{"p":"com.google.android.exoplayer2","l":"Player.PositionInfo"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.PostConnectCallback"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.PpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Prepare"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod.PrepareListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PrimaryPlaylistListener"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Priority"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager.PriorityTooLowException"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"PrivateCommand"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"PrivFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ProgramInformation"},{"p":"com.google.android.exoplayer2.transformer","l":"ProgressHolder"},{"p":"com.google.android.exoplayer2.offline","l":"ProgressiveDownloader"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader.ProgressListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter.ProgressListener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.ProgressState"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2","l":"C.Projection"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.ProtectionElement"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.Provider"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.ProvisionRequest"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PsExtractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"PsshAtomUtil"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Purpose"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.QueueDataAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueNavigator"},{"p":"com.google.android.exoplayer2.robolectric","l":"RandomizedMp3Decoder"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"RangedUri"},{"p":"com.google.android.exoplayer2","l":"Rating"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.RatingCallback"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.RatingCallback"},{"p":"com.google.android.exoplayer2.extractor.rawcc","l":"RawCcExtractor"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource.RawResourceDataSourceException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadDataResult"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadFlags"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor.ReadResult"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException.Reason"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RelativeSized"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.ReleaseCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.ReleaseCallback"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItem"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItems"},{"p":"com.google.android.exoplayer2","l":"Renderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities"},{"p":"com.google.android.exoplayer2","l":"RendererConfiguration"},{"p":"com.google.android.exoplayer2","l":"RenderersFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Rendition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.RenditionReport"},{"p":"com.google.android.exoplayer2","l":"Player.RepeatMode"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"RepeatModeActionProvider"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil.RepeatToggleModes"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationHolder"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser.RepresentationInfo"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationSegmentIterator"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.RequestProperties"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts.RequestSet"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest.RequestType"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements.RequirementFlags"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.ResizeMode"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Resolver"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource"},{"p":"com.google.android.exoplayer2.util","l":"ReusableBufferedOutputStream"},{"p":"com.google.android.exoplayer2.robolectric","l":"RobolectricUtil"},{"p":"com.google.android.exoplayer2","l":"C.RoleFlags"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpAc3Reader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPayloadFormat"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpUtils"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.RtspPlaybackException"},{"p":"com.google.android.exoplayer2.text.span","l":"RubySpan"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RubyText"},{"p":"com.google.android.exoplayer2.util","l":"RunnableFutureTask"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.SampleDataPart"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader.SampleNumberHolder"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue"},{"p":"com.google.android.exoplayer2.source.hls","l":"SampleQueueMappingException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream"},{"p":"com.google.android.exoplayer2.scheduler","l":"Scheduler"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler.SchedulerWorker"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData.SchemeData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionReader"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.SecureMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Seek"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekOperationParams"},{"p":"com.google.android.exoplayer2","l":"SeekParameters"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekPoint"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.SeekPoints"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata.SeekTable"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekTimestampConverter"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData.Segment"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader.Segment"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Segment"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData.Segment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.SegmentBase"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentList"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTimelineElement"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SeiReader"},{"p":"com.google.android.exoplayer2","l":"C.SelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionOverride"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Sender"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SendMessages"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.ServerControl"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ServiceDescriptionElement"},{"p":"com.google.android.exoplayer2.ext.cast","l":"SessionAvailabilityListener"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionPlayerConnector"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetAudioAttributes"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItems"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItemsResetPosition"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlaybackParameters"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRendererDisabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRepeatMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleModeEnabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetVideoSurface"},{"p":"com.google.android.exoplayer2.robolectric","l":"ShadowMediaCodecConfig"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource"},{"p":"com.google.android.exoplayer2.audio","l":"SilenceSkippingAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"SimpleCache"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer"},{"p":"com.google.android.exoplayer2.metadata","l":"SimpleMetadataDecoder"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleOutputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SimpleSubtitleDecoder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.SimulatedIOException"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.SimulationConfig"},{"p":"com.google.android.exoplayer2.source.ads","l":"SinglePeriodAdTimeline"},{"p":"com.google.android.exoplayer2.source","l":"SinglePeriodTimeline"},{"p":"com.google.android.exoplayer2.source.chunk","l":"SingleSampleMediaChunk"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SingleSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.SingleSegmentRepresentation"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.SinkFormatSupport"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.SkipCallback"},{"p":"com.google.android.exoplayer2.util","l":"SlidingPercentile"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SmtaMetadataEntry"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient"},{"p":"com.google.android.exoplayer2.audio","l":"SonicAudioProcessor"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject"},{"p":"com.google.android.exoplayer2.text.span","l":"SpanUtil"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInfoDecoder"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceNullCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.SpsData"},{"p":"com.google.android.exoplayer2.text.ssa","l":"SsaDecoder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","l":"SsDownloader"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"StandaloneMediaClock"},{"p":"com.google.android.exoplayer2","l":"StarRating"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"StartOffsetExtractorOutput"},{"p":"com.google.android.exoplayer2","l":"Player.State"},{"p":"com.google.android.exoplayer2","l":"Renderer.State"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.State"},{"p":"com.google.android.exoplayer2.offline","l":"Download.State"},{"p":"com.google.android.exoplayer2.upstream","l":"StatsDataSource"},{"p":"com.google.android.exoplayer2","l":"C.StereoMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Stop"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.StreamElement"},{"p":"com.google.android.exoplayer2.offline","l":"StreamKey"},{"p":"com.google.android.exoplayer2","l":"C.StreamType"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo.StreamType"},{"p":"com.google.android.exoplayer2.testutil","l":"StubExoPlayer"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.StyleFlags"},{"p":"com.google.android.exoplayer2.text.subrip","l":"SubripDecoder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderException"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderFactory"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleInputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleOutputBuffer"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter"},{"p":"com.google.android.exoplayer2.util","l":"SystemClock"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Target"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"TeeDataSource"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestDownloadManagerListener"},{"p":"com.google.android.exoplayer2.testutil","l":"TestExoPlayerBuilder"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestPlayerRunHelper"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread.TestRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"TestUtil"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.TextComponent"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"TextInformationFrame"},{"p":"com.google.android.exoplayer2.text","l":"TextOutput"},{"p":"com.google.android.exoplayer2.text","l":"TextRenderer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.TextSizeType"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.TextTrackScore"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.TextureImageListener"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ThrowPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ThumbRating"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar"},{"p":"com.google.android.exoplayer2.util","l":"TimedValueQueue"},{"p":"com.google.android.exoplayer2","l":"Timeline"},{"p":"com.google.android.exoplayer2.testutil","l":"TimelineAsserts"},{"p":"com.google.android.exoplayer2","l":"Player.TimelineChangeReason"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueNavigator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline.TimelineWindowDefinition"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException.TimeoutOperation"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"TimeSignalCommand"},{"p":"com.google.android.exoplayer2.util","l":"TimestampAdjuster"},{"p":"com.google.android.exoplayer2.source.hls","l":"TimestampAdjusterProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSearchResult"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSeeker"},{"p":"com.google.android.exoplayer2.upstream","l":"TimeToFirstByteEstimator"},{"p":"com.google.android.exoplayer2.util","l":"TraceUtil"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod.TrackDataFactory"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"TrackEncryptionBox"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroup"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroupArray"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.TrackIdGenerator"},{"p":"com.google.android.exoplayer2.ui","l":"TrackNameProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.TrackOutputProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionArray"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView.TrackSelectionListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectorResult"},{"p":"com.google.android.exoplayer2.upstream","l":"TransferListener"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track.Transformation"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsUtil"},{"p":"com.google.android.exoplayer2.text.ttml","l":"TtmlDecoder"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.TunnelingSupport"},{"p":"com.google.android.exoplayer2.text.tx3g","l":"Tx3gDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException.Type"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException.Type"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException.Type"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes.Type"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Typefaced"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource.UdpDataSourceException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.UnexpectedDiscontinuityException"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.UnexpectedLoaderException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.UnhandledAudioFormatException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Uniform"},{"p":"com.google.android.exoplayer2.util","l":"UnknownNull"},{"p":"com.google.android.exoplayer2.source","l":"UnrecognizedInputFormatException"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.Unseekable"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.UnshuffledShuffleOrder"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedMediaCrypto"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.UnsupportedRequestException"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue.UpstreamFormatChangedListener"},{"p":"com.google.android.exoplayer2.util","l":"UriUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"UrlLinkFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UrlTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UtcTimingElement"},{"p":"com.google.android.exoplayer2.util","l":"Util"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Variant"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry.VariantInfo"},{"p":"com.google.android.exoplayer2.database","l":"VersionTable"},{"p":"com.google.android.exoplayer2.text","l":"Cue.VerticalType"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.VideoComponent"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderGLSurfaceView"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderInputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBufferRenderer"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameMetadataListener"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameReleaseHelper"},{"p":"com.google.android.exoplayer2.video","l":"VideoListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoOutputMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoScalingMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.VideoScalingMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoSize"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView.VideoSurfaceListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.VideoTrackScore"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView.ViewType"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Visibility"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisBitArray"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.VorbisIdHeader"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoder"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoderException"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxLibrary"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxOutputBuffer"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForIsLoading"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForMessage"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPendingPlayerCommands"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPositionDiscontinuity"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForTimelineChanged"},{"p":"com.google.android.exoplayer2","l":"C.WakeMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.WakeupListener"},{"p":"com.google.android.exoplayer2.extractor.wav","l":"WavExtractor"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.WavFileAudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"WavUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueInfo"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueParser"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttDecoder"},{"p":"com.google.android.exoplayer2.source.hls","l":"WebvttExtractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttParserUtil"},{"p":"com.google.android.exoplayer2.drm","l":"WidevineUtil"},{"p":"com.google.android.exoplayer2","l":"Timeline.Window"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.WithSpanFlags"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler"},{"p":"com.google.android.exoplayer2.offline","l":"WritableDownloadIndex"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.WriteException"},{"p":"com.google.android.exoplayer2.util","l":"XmlPullParserUtil"}] \ No newline at end of file +typeSearchIndex = [{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.AacAudioObjectType"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AbsoluteSized"},{"p":"com.google.android.exoplayer2","l":"AbstractConcatenatedTimeline"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util"},{"p":"com.google.android.exoplayer2.testutil","l":"Action"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.AdaptationCheckpoint"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"AdaptationSet"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.AdaptiveSupport"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil.AdaptiveTrackSelectionFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"AdditionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.AddMediaItems"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdGroup"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory.AdsLoaderProvider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdState"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsReader"},{"p":"com.google.android.exoplayer2.ui","l":"AdViewProvider"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSink"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSource"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesFlushingCipher"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Aligned"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocation"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.AllowedCommandProvider"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsCollector"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener"},{"p":"com.google.android.exoplayer2.text","l":"Cue.AnchorType"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AndSpanFlags"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ApicFrame"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTable"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTableDecoder"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.AppManagedProvider"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.AspectRatioListener"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig"},{"p":"com.google.android.exoplayer2.util","l":"Assertions"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource.AssetDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"AtomicFile"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Attribute"},{"p":"com.google.android.exoplayer2","l":"C.AudioAllowedCapturePolicy"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.AudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilities"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioComponent"},{"p":"com.google.android.exoplayer2","l":"C.AudioContentType"},{"p":"com.google.android.exoplayer2","l":"C.AudioFlags"},{"p":"com.google.android.exoplayer2","l":"C.AudioFocusGain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.AudioFormat"},{"p":"com.google.android.exoplayer2.audio","l":"AudioListener"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioOffloadListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.AudioTrackScore"},{"p":"com.google.android.exoplayer2","l":"C.AudioUsage"},{"p":"com.google.android.exoplayer2.audio","l":"AuxEffectInfo"},{"p":"com.google.android.exoplayer2.video","l":"AvcConfig"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter"},{"p":"com.google.android.exoplayer2.audio","l":"BaseAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"BaseDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.BaseFactory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkIterator"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkOutput"},{"p":"com.google.android.exoplayer2.source","l":"BaseMediaSource"},{"p":"com.google.android.exoplayer2","l":"BasePlayer"},{"p":"com.google.android.exoplayer2","l":"BaseRenderer"},{"p":"com.google.android.exoplayer2.trackselection","l":"BaseTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"BaseUrl"},{"p":"com.google.android.exoplayer2.source.dash","l":"BaseUrlExclusionList"},{"p":"com.google.android.exoplayer2.source","l":"BehindLiveWindowException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"BinaryFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.BinarySearchSeekMap"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.BitmapCallback"},{"p":"com.google.android.exoplayer2.decoder","l":"Buffer"},{"p":"com.google.android.exoplayer2","l":"C.BufferFlags"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.BufferReplacementMode"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl.Builder"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl.Builder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.Builder"},{"p":"com.google.android.exoplayer2","l":"Format.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"Player.Commands.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.Builder"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader.Builder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.Builder"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource.Builder"},{"p":"com.google.android.exoplayer2.text","l":"Cue.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter.Builder"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet.Builder"},{"p":"com.google.android.exoplayer2","l":"Bundleable"},{"p":"com.google.android.exoplayer2.util","l":"BundleableUtils"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BundledChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"BundledExtractorsAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"BundledHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2","l":"BundleListRetriever"},{"p":"com.google.android.exoplayer2.util","l":"BundleUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSource"},{"p":"com.google.android.exoplayer2","l":"C"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.CacheDataSinkException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSinkFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CachedRegionTracker"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheEvictor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.CacheException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.CacheIgnoredReason"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheKeyFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheSpan"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener.Callback"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.Callback"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod.Callback"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget.Callback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Callback"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionListener"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionRenderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.Capabilities"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CaptionCallback"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingAudioSink"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingRenderersFactory"},{"p":"com.google.android.exoplayer2.ext.cast","l":"CastPlayer"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea608Decoder"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea708Decoder"},{"p":"com.google.android.exoplayer2.extractor","l":"CeaUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterTocFrame"},{"p":"com.google.android.exoplayer2.source.chunk","l":"Chunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkHolder"},{"p":"com.google.android.exoplayer2.extractor","l":"ChunkIndex"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearMediaItems"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.CleartextNotPermittedException"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearVideoSurface"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingProperties"},{"p":"com.google.android.exoplayer2.util","l":"Clock"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer.CodecMaxValues"},{"p":"com.google.android.exoplayer2.util","l":"CodecSpecificDataUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Colored"},{"p":"com.google.android.exoplayer2.video","l":"ColorInfo"},{"p":"com.google.android.exoplayer2.util","l":"ColorParser"},{"p":"com.google.android.exoplayer2","l":"C.ColorRange"},{"p":"com.google.android.exoplayer2","l":"C.ColorSpace"},{"p":"com.google.android.exoplayer2","l":"C.ColorTransfer"},{"p":"com.google.android.exoplayer2","l":"Player.Command"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CommandReceiver"},{"p":"com.google.android.exoplayer2","l":"Player.Commands"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"CommentFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.CommentHeader"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.source","l":"CompositeMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoader"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"ConditionVariable"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.Config"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Config"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Configuration"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.ConfigurationException"},{"p":"com.google.android.exoplayer2.extractor","l":"ConstantBitrateSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"Consumer"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ContainerMediaChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource.ContentDataSourceException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadata"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadataMutations"},{"p":"com.google.android.exoplayer2","l":"C.ContentType"},{"p":"com.google.android.exoplayer2","l":"ControlDispatcher"},{"p":"com.google.android.exoplayer2.util","l":"CopyOnWriteMultiset"},{"p":"com.google.android.exoplayer2","l":"Bundleable.Creator"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSourceFactory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetUtil"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.CryptoData"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoInfo"},{"p":"com.google.android.exoplayer2","l":"C.CryptoMode"},{"p":"com.google.android.exoplayer2.text","l":"Cue"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CustomActionProvider"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.CustomActionReceiver"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.CustomCommandProvider"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource"},{"p":"com.google.android.exoplayer2.source.dash.offline","l":"DashDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifest"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashManifestStaleException"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashSegmentIndex"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashUtil"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashWrappingSegmentIndex"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseIOException"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"DataChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"DataReader"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSchemeDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceInputStream"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec"},{"p":"com.google.android.exoplayer2","l":"C.DataType"},{"p":"com.google.android.exoplayer2.util","l":"DebugTextViewHelper"},{"p":"com.google.android.exoplayer2.decoder","l":"Decoder"},{"p":"com.google.android.exoplayer2.audio","l":"DecoderAudioRenderer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderCounters"},{"p":"com.google.android.exoplayer2.testutil","l":"DecoderCountersUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderDiscardReasons"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer.DecoderInitializationException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil.DecoderQueryException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderReuseResult"},{"p":"com.google.android.exoplayer2.video","l":"DecoderVideoRenderer"},{"p":"com.google.android.exoplayer2.drm","l":"DecryptionException"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultAllocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DefaultAllowedCommandProvider"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.DefaultAudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultCastOptionsProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultCompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"DefaultContentMetadata"},{"p":"com.google.android.exoplayer2","l":"DefaultControlDispatcher"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource"},{"p":"com.google.android.exoplayer2.database","l":"DefaultDatabaseProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSourceFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloadIndex"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorsFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultLoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultMediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.DefaultMediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultPlaybackSessionManager"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"DefaultRenderersFactoryAsserts"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"DefaultRtpPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.DefaultSeekTimestampConverter"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.DefaultShuffleOrder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTimeBar"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTrackNameProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Definition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser.DeltaUpdateException"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Descriptor"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.DeviceComponent"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo"},{"p":"com.google.android.exoplayer2.device","l":"DeviceListener"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder.DialogCallback"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DisconnectedCallback"},{"p":"com.google.android.exoplayer2","l":"Player.DiscontinuityReason"},{"p":"com.google.android.exoplayer2.video","l":"DolbyVisionConfig"},{"p":"com.google.android.exoplayer2.offline","l":"Download"},{"p":"com.google.android.exoplayer2.testutil","l":"DownloadBuilder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadCursor"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader"},{"p":"com.google.android.exoplayer2.offline","l":"DownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil.DownloadIdProvider"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadIndex"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager"},{"p":"com.google.android.exoplayer2.ui","l":"DownloadNotificationHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadProgress"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadService"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.DrmSessionException"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager.DrmSessionReference"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DtsReader"},{"p":"com.google.android.exoplayer2.audio","l":"DtsUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower.Dummy"},{"p":"com.google.android.exoplayer2.upstream","l":"DummyDataSource"},{"p":"com.google.android.exoplayer2.drm","l":"DummyExoMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread"},{"p":"com.google.android.exoplayer2.video","l":"DummySurface"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper.Dumpable"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpableFormat"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpFileAsserts"},{"p":"com.google.android.exoplayer2.text.dvb","l":"DvbDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.DvbSubtitleInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DvbSubtitleReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat.EdgeType"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"ElementaryStreamReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor.ElementType"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.EmbeddedSampleStream"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.EmphasizedText"},{"p":"com.google.android.exoplayer2.source","l":"EmptySampleStream"},{"p":"com.google.android.exoplayer2","l":"C.Encoding"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata.Entry"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.ErrorCode"},{"p":"com.google.android.exoplayer2.util","l":"ErrorMessageProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil.ErrorSource"},{"p":"com.google.android.exoplayer2.drm","l":"ErrorStateDrmSession"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.EsInfo"},{"p":"com.google.android.exoplayer2","l":"Player.Event"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.Event"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.Event"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventFlags"},{"p":"com.google.android.exoplayer2","l":"Player.EventListener"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.EventListener"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.EventListener"},{"p":"com.google.android.exoplayer2.util","l":"EventLogger"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessage"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageDecoder"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageEncoder"},{"p":"com.google.android.exoplayer2","l":"Player.Events"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.Events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"EventStream"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventTime"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndException"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndFormat"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ExecuteRunnable"},{"p":"com.google.android.exoplayer2.database","l":"ExoDatabaseProvider"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoHostedTest"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer"},{"p":"com.google.android.exoplayer2","l":"ExoPlayerLibraryInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory.ExtensionRendererMode"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.ExtractorFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorOutput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorsFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorUtil"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource.Factory"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink"},{"p":"com.google.android.exoplayer2.offline","l":"Download.FailureReason"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAudioRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunk"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunkIterator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaClockRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream.FakeSampleStreamItem"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelection"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelector"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.FakeTransferListener"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackOptions"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackSelection"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackType"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegDecoderException"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegLibrary"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.FieldNumber"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.FileDataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes"},{"p":"com.google.android.exoplayer2.offline","l":"FilterableManifest"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"FilteringHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.offline","l":"FilteringManifestParser"},{"p":"com.google.android.exoplayer2.trackselection","l":"FixedTrackSelection"},{"p":"com.google.android.exoplayer2.util","l":"FlacConstants"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoderException"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacLibrary"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacSeekTableSeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader.FlacStreamMetadataHolder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Flags"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Flags"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Flags"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet"},{"p":"com.google.android.exoplayer2.extractor.flv","l":"FlvExtractor"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.FolderType"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.FontSizeUnit"},{"p":"com.google.android.exoplayer2","l":"Format"},{"p":"com.google.android.exoplayer2","l":"FormatHolder"},{"p":"com.google.android.exoplayer2","l":"C.FormatSupport"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.FormatSupport"},{"p":"com.google.android.exoplayer2.audio","l":"ForwardingAudioSink"},{"p":"com.google.android.exoplayer2.extractor","l":"ForwardingExtractorInput"},{"p":"com.google.android.exoplayer2","l":"ForwardingPlayer"},{"p":"com.google.android.exoplayer2.source","l":"ForwardingTimeline"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder.FramePredicate"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"GaplessInfoHolder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Decoder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1DecoderException"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Library"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"GeobFrame"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.GlException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil"},{"p":"com.google.android.exoplayer2.ext.gvr","l":"GvrAudioProcessor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H262Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H263Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H264Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H265Reader"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock.HandlerMessage"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil.Header"},{"p":"com.google.android.exoplayer2","l":"HeartRating"},{"p":"com.google.android.exoplayer2.video","l":"HevcConfig"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls.offline","l":"HlsDownloader"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsManifest"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaPeriod"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry"},{"p":"com.google.android.exoplayer2.text.span","l":"HorizontalTextInVerticalContextSpan"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity.HostedTest"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException"},{"p":"com.google.android.exoplayer2.testutil","l":"HttpDataSourceTestEnv"},{"p":"com.google.android.exoplayer2.drm","l":"HttpMediaDrmCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.HttpMethod"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpUtil"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyDecoder"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyHeaders"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Frame"},{"p":"com.google.android.exoplayer2.extractor","l":"Id3Peeker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Id3Reader"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException"},{"p":"com.google.android.exoplayer2","l":"IllegalSeekPositionException"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil.Importance"},{"p":"com.google.android.exoplayer2.extractor","l":"IndexSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient.InitializationCallback"},{"p":"com.google.android.exoplayer2.source.chunk","l":"InitializationChunk"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.InitializationException"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource.InitialTimeline"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"InputReaderAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.InsufficientCapacityException"},{"p":"com.google.android.exoplayer2.util","l":"IntArrayQueue"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"InternalFrame"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector.InvalidationListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.InvalidAudioTrackTimestampException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidContentTypeException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidResponseCodeException"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.IterationFinishedEvent"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Iterator"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"JpegExtractor"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest"},{"p":"com.google.android.exoplayer2.drm","l":"KeysExpiredException"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyStatus"},{"p":"com.google.android.exoplayer2.text.span","l":"LanguageFeatureSpan"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"LatmReader"},{"p":"com.google.android.exoplayer2.ext.leanback","l":"LeanbackPlayerAdapter"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"LeastRecentlyUsedCacheEvictor"},{"p":"com.google.android.exoplayer2.ext.flac","l":"LibflacAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Libgav1VideoRenderer"},{"p":"com.google.android.exoplayer2.ext.opus","l":"LibopusAudioRenderer"},{"p":"com.google.android.exoplayer2.util","l":"LibraryLoader"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"LibvpxVideoRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.LicenseServer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.LineType"},{"p":"com.google.android.exoplayer2","l":"Player.Listener"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.Listener"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager.Listener"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Listener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.Listener"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Listener"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.LiveContentUnsupportedException"},{"p":"com.google.android.exoplayer2","l":"LivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Loadable"},{"p":"com.google.android.exoplayer2","l":"LoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.LoadErrorAction"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.LoadErrorInfo"},{"p":"com.google.android.exoplayer2.source","l":"LoadEventInfo"},{"p":"com.google.android.exoplayer2.drm","l":"LocalMediaDrmCallback"},{"p":"com.google.android.exoplayer2.util","l":"Log"},{"p":"com.google.android.exoplayer2.util","l":"LongArray"},{"p":"com.google.android.exoplayer2.source","l":"LoopingMediaSource"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkFill"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkShape"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MdtaMetadataEntry"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaButtonEventHandler"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunkIterator"},{"p":"com.google.android.exoplayer2.util","l":"MediaClock"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter"},{"p":"com.google.android.exoplayer2.audio","l":"MediaCodecAudioRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecDecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecSelector"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoDecoderException"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.MediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaDescriptionConverter"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallback"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallbackException"},{"p":"com.google.android.exoplayer2.util","l":"MediaFormatUtil"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaIdEqualityChecker"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaIdMediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"MediaItem"},{"p":"com.google.android.exoplayer2.ext.cast","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"Player.MediaItemTransitionReason"},{"p":"com.google.android.exoplayer2.source","l":"MediaLoadData"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaParserChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"MediaParserExtractorAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"MediaParserHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"MediaParserUtil"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriodId"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaPeriodId"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaSourceCaller"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaSourceTestRunner"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper.Message"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.MetadataComponent"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoder"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoderFactory"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataInputBuffer"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataOutput"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataRenderer"},{"p":"com.google.android.exoplayer2","l":"MetadataRetriever"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.MetadataType"},{"p":"com.google.android.exoplayer2.util","l":"MimeTypes"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser.MissingFieldException"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.MissingSchemeDataException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"MlltFrame"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Mode"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.Mode"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor.Mode"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MotionPhotoMetadata"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.MoveMediaItem"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"Mp4WebvttDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"MpegAudioReader"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.MultiSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.MultiSegmentRepresentation"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil"},{"p":"com.google.android.exoplayer2","l":"C.NetworkType"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver"},{"p":"com.google.android.exoplayer2.util","l":"NonNullApi"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"NoOpCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"NoSampleRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.NotificationListener"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"NoUidTimeline"},{"p":"com.google.android.exoplayer2.drm","l":"OfflineLicenseHelper"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OffloadMode"},{"p":"com.google.android.exoplayer2.extractor.ogg","l":"OggExtractor"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnExpirationUpdateListener"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.OnFrameRenderedListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.OnFullScreenModeChangedListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnKeyStatusChangeListener"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar.OnScrubListener"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.OpenException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoder"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoderException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusLibrary"},{"p":"com.google.android.exoplayer2.audio","l":"OpusUtil"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.OtherTrackScore"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"OutputConsumerAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer.Owner"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.ParametersBuilder"},{"p":"com.google.android.exoplayer2.util","l":"ParsableBitArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableByteArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableNalUnitBitArray"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable.Parser"},{"p":"com.google.android.exoplayer2","l":"ParserException"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Part"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PassthroughSectionPayloadReader"},{"p":"com.google.android.exoplayer2","l":"C.PcmEncoding"},{"p":"com.google.android.exoplayer2","l":"PercentageRating"},{"p":"com.google.android.exoplayer2","l":"Timeline.Period"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Period"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PesReader"},{"p":"com.google.android.exoplayer2.text.pgs","l":"PgsDecoder"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"PictureFrame"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.PictureType"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource.PlaceholderTimeline"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler.PlatformSchedulerService"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackActions"},{"p":"com.google.android.exoplayer2","l":"PlaybackException"},{"p":"com.google.android.exoplayer2.robolectric","l":"PlaybackOutput"},{"p":"com.google.android.exoplayer2","l":"PlaybackParameters"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackPreparer"},{"p":"com.google.android.exoplayer2","l":"MediaItem.PlaybackProperties"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener"},{"p":"com.google.android.exoplayer2","l":"Player.PlaybackSuppressionReason"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo.PlaybackType"},{"p":"com.google.android.exoplayer2","l":"Player"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerEmsgCallback"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerTrackEmsgHandler"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistEventListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistResetException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistStuckException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.PlaylistType"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.PlayUntilPosition"},{"p":"com.google.android.exoplayer2","l":"Player.PlayWhenReadyChangeReason"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation.Position"},{"p":"com.google.android.exoplayer2.extractor","l":"PositionHolder"},{"p":"com.google.android.exoplayer2","l":"Player.PositionInfo"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.PostConnectCallback"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.PpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Prepare"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod.PrepareListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PrimaryPlaylistListener"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Priority"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager.PriorityTooLowException"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"PrivateCommand"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"PrivFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ProgramInformation"},{"p":"com.google.android.exoplayer2.transformer","l":"ProgressHolder"},{"p":"com.google.android.exoplayer2.offline","l":"ProgressiveDownloader"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader.ProgressListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter.ProgressListener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.ProgressState"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2","l":"C.Projection"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.ProtectionElement"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.Provider"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.ProvisionRequest"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PsExtractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"PsshAtomUtil"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Purpose"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.QueueDataAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueNavigator"},{"p":"com.google.android.exoplayer2.robolectric","l":"RandomizedMp3Decoder"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"RangedUri"},{"p":"com.google.android.exoplayer2","l":"Rating"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.RatingCallback"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.RatingCallback"},{"p":"com.google.android.exoplayer2.extractor.rawcc","l":"RawCcExtractor"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource.RawResourceDataSourceException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadDataResult"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadFlags"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor.ReadResult"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException.Reason"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RelativeSized"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.ReleaseCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.ReleaseCallback"},{"p":"com.google.android.exoplayer2","l":"Timeline.RemotableTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItem"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItems"},{"p":"com.google.android.exoplayer2","l":"Renderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities"},{"p":"com.google.android.exoplayer2","l":"RendererConfiguration"},{"p":"com.google.android.exoplayer2","l":"RenderersFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Rendition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.RenditionReport"},{"p":"com.google.android.exoplayer2","l":"Player.RepeatMode"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"RepeatModeActionProvider"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil.RepeatToggleModes"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationHolder"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser.RepresentationInfo"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationSegmentIterator"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.RequestProperties"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts.RequestSet"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest.RequestType"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements.RequirementFlags"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.ResizeMode"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Resolver"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource"},{"p":"com.google.android.exoplayer2.util","l":"ReusableBufferedOutputStream"},{"p":"com.google.android.exoplayer2.robolectric","l":"RobolectricUtil"},{"p":"com.google.android.exoplayer2","l":"C.RoleFlags"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpAc3Reader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPayloadFormat"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpUtils"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.RtspPlaybackException"},{"p":"com.google.android.exoplayer2.text.span","l":"RubySpan"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RubyText"},{"p":"com.google.android.exoplayer2.util","l":"RunnableFutureTask"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.SampleDataPart"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader.SampleNumberHolder"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue"},{"p":"com.google.android.exoplayer2.source.hls","l":"SampleQueueMappingException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream"},{"p":"com.google.android.exoplayer2.scheduler","l":"Scheduler"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler.SchedulerWorker"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData.SchemeData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionReader"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.SecureMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Seek"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekOperationParams"},{"p":"com.google.android.exoplayer2","l":"SeekParameters"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekPoint"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.SeekPoints"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata.SeekTable"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekTimestampConverter"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData.Segment"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader.Segment"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Segment"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData.Segment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.SegmentBase"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentList"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTimelineElement"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SeiReader"},{"p":"com.google.android.exoplayer2","l":"C.SelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionOverride"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Sender"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SendMessages"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.ServerControl"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ServiceDescriptionElement"},{"p":"com.google.android.exoplayer2.ext.cast","l":"SessionAvailabilityListener"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionPlayerConnector"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetAudioAttributes"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItems"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItemsResetPosition"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlaybackParameters"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRendererDisabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRepeatMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleModeEnabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetVideoSurface"},{"p":"com.google.android.exoplayer2.robolectric","l":"ShadowMediaCodecConfig"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource"},{"p":"com.google.android.exoplayer2.audio","l":"SilenceSkippingAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"SimpleCache"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer"},{"p":"com.google.android.exoplayer2.metadata","l":"SimpleMetadataDecoder"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleOutputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SimpleSubtitleDecoder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.SimulatedIOException"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.SimulationConfig"},{"p":"com.google.android.exoplayer2.source.ads","l":"SinglePeriodAdTimeline"},{"p":"com.google.android.exoplayer2.source","l":"SinglePeriodTimeline"},{"p":"com.google.android.exoplayer2.source.chunk","l":"SingleSampleMediaChunk"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SingleSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.SingleSegmentRepresentation"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.SinkFormatSupport"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.SkipCallback"},{"p":"com.google.android.exoplayer2.util","l":"SlidingPercentile"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SmtaMetadataEntry"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient"},{"p":"com.google.android.exoplayer2.audio","l":"SonicAudioProcessor"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject"},{"p":"com.google.android.exoplayer2.text.span","l":"SpanUtil"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInfoDecoder"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceNullCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.SpsData"},{"p":"com.google.android.exoplayer2.text.ssa","l":"SsaDecoder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","l":"SsDownloader"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"StandaloneMediaClock"},{"p":"com.google.android.exoplayer2","l":"StarRating"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"StartOffsetExtractorOutput"},{"p":"com.google.android.exoplayer2","l":"Player.State"},{"p":"com.google.android.exoplayer2","l":"Renderer.State"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.State"},{"p":"com.google.android.exoplayer2.offline","l":"Download.State"},{"p":"com.google.android.exoplayer2.upstream","l":"StatsDataSource"},{"p":"com.google.android.exoplayer2","l":"C.StereoMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Stop"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.StreamElement"},{"p":"com.google.android.exoplayer2.offline","l":"StreamKey"},{"p":"com.google.android.exoplayer2","l":"C.StreamType"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo.StreamType"},{"p":"com.google.android.exoplayer2.testutil","l":"StubExoPlayer"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.StyleFlags"},{"p":"com.google.android.exoplayer2.text.subrip","l":"SubripDecoder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderException"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderFactory"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleInputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleOutputBuffer"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter"},{"p":"com.google.android.exoplayer2.util","l":"SystemClock"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Target"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"TeeDataSource"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestDownloadManagerListener"},{"p":"com.google.android.exoplayer2.testutil","l":"TestExoPlayerBuilder"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestPlayerRunHelper"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread.TestRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"TestUtil"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.TextComponent"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"TextInformationFrame"},{"p":"com.google.android.exoplayer2.text","l":"TextOutput"},{"p":"com.google.android.exoplayer2.text","l":"TextRenderer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.TextSizeType"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.TextTrackScore"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.TextureImageListener"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ThrowPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ThumbRating"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar"},{"p":"com.google.android.exoplayer2.util","l":"TimedValueQueue"},{"p":"com.google.android.exoplayer2","l":"Timeline"},{"p":"com.google.android.exoplayer2.testutil","l":"TimelineAsserts"},{"p":"com.google.android.exoplayer2","l":"Player.TimelineChangeReason"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueNavigator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline.TimelineWindowDefinition"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException.TimeoutOperation"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"TimeSignalCommand"},{"p":"com.google.android.exoplayer2.util","l":"TimestampAdjuster"},{"p":"com.google.android.exoplayer2.source.hls","l":"TimestampAdjusterProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSearchResult"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSeeker"},{"p":"com.google.android.exoplayer2.upstream","l":"TimeToFirstByteEstimator"},{"p":"com.google.android.exoplayer2.util","l":"TraceUtil"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod.TrackDataFactory"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"TrackEncryptionBox"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroup"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroupArray"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.TrackIdGenerator"},{"p":"com.google.android.exoplayer2.ui","l":"TrackNameProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.TrackOutputProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionArray"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView.TrackSelectionListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectorResult"},{"p":"com.google.android.exoplayer2.upstream","l":"TransferListener"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track.Transformation"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsUtil"},{"p":"com.google.android.exoplayer2.text.ttml","l":"TtmlDecoder"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.TunnelingSupport"},{"p":"com.google.android.exoplayer2.text.tx3g","l":"Tx3gDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException.Type"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException.Type"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException.Type"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes.Type"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Typefaced"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource.UdpDataSourceException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.UnexpectedDiscontinuityException"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.UnexpectedLoaderException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.UnhandledAudioFormatException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Uniform"},{"p":"com.google.android.exoplayer2.util","l":"UnknownNull"},{"p":"com.google.android.exoplayer2.source","l":"UnrecognizedInputFormatException"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.Unseekable"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.UnshuffledShuffleOrder"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedMediaCrypto"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.UnsupportedRequestException"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue.UpstreamFormatChangedListener"},{"p":"com.google.android.exoplayer2.util","l":"UriUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"UrlLinkFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UrlTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UtcTimingElement"},{"p":"com.google.android.exoplayer2.util","l":"Util"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Variant"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry.VariantInfo"},{"p":"com.google.android.exoplayer2.database","l":"VersionTable"},{"p":"com.google.android.exoplayer2.text","l":"Cue.VerticalType"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.VideoComponent"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderGLSurfaceView"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderInputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBufferRenderer"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameMetadataListener"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameReleaseHelper"},{"p":"com.google.android.exoplayer2.video","l":"VideoListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoOutputMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoScalingMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.VideoScalingMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoSize"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView.VideoSurfaceListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.VideoTrackScore"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView.ViewType"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Visibility"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisBitArray"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.VorbisIdHeader"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoder"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoderException"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxLibrary"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForIsLoading"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForMessage"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPendingPlayerCommands"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPositionDiscontinuity"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForTimelineChanged"},{"p":"com.google.android.exoplayer2","l":"C.WakeMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.WakeupListener"},{"p":"com.google.android.exoplayer2.extractor.wav","l":"WavExtractor"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.WavFileAudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"WavUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueInfo"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueParser"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttDecoder"},{"p":"com.google.android.exoplayer2.source.hls","l":"WebvttExtractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttParserUtil"},{"p":"com.google.android.exoplayer2.drm","l":"WidevineUtil"},{"p":"com.google.android.exoplayer2","l":"Timeline.Window"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.WithSpanFlags"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler"},{"p":"com.google.android.exoplayer2.offline","l":"WritableDownloadIndex"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.WriteException"},{"p":"com.google.android.exoplayer2.util","l":"XmlPullParserUtil"}] \ No newline at end of file diff --git a/docs/doc/reference/type-search-index.zip b/docs/doc/reference/type-search-index.zip index e905702b74eb1583f00a90bea41e91aa4f6317cd..b925ec2f1fbacf3597c18535d39a7f8c49b2c859 100644 GIT binary patch literal 10091 zcmZvCRa6`d%q0}}!JQ6n#ogU0t_6w?&QPorEv|#R76ylb;!xbRxVyW%6xr|Jm)$*Q zlZPZHc~5Tc)lfk|B!ELjMTMJ=K-Px)zl`X=+}-ONh|LXT?rLevW(T$c{b09ua|Sn< z7vy+-R!5Hfo)cteuF#@va>}s=suZeHtoqZGBCc2F&QhyBhu>x zzH-jsfqW6AjE}E%=YGClaLjSMU#V#APj!5HAdTLpsZ`08KW&HAKK30;D7d6uU#CgD zBt~|&MJ1)B+9W(aptDPy`dcdf^DSTGcz-~lNw*nI<#R%L0H0Ke*+w`K5+kWJ<(w+G zH#m&I9F|hw$F(GkXVOe&=3S=2BQ%jldJ*r_Ho0{W;*Pk1b$V$-1t&|5BpiW#d%y^O zwDvv*7un7(f(0Z;;N2rd;gN3>*PmWBsl#P-w5QJL>6vAtY3(-E=Co*e0eX|)zQ}-* z`aR>qH%RJbsv1(JFsW!~-0(7#yERz(#Fdz4`PeK}y{n*m4ZUmoto_}i2g(b^)}$hS z(RE+z$dFy*Ru^2mjwIX$)p_IVU&Y$A?ZF~dH=0azQyQG#0lk1AL3ypL>>GwASNmTP z_|%_;0{WJm{?=7ld-gk!a+k<5&iJHWKURUff_?T}mN_PFHDBt32MI2+&?ePAmUP{l z4<1wXMJ$u-g_{SNTHgAr}~Ixx+r7 zrB27%W;>F$ys9tKbyIrntV0^eN-95}4DH2`D(uB!z*d`F>fPi;UV72zoU%fpP{rL>4hIo7Df9 z_V%7QF!cHCrZ&A8Bf?esC{m>FO_8{`p^`XT@-z!Y9pOF4N6;Vgq8y?$==|itnJp@W zDa||;;g+x*<*z&U%_r8Q(vx7Hcf4|SQ`+s|?-e{I3FJ10`^+bP9T{vkFI*BhQS6nD z8=P=5GAyB$+=d8$nfZ*JlWrx`S@>9=K&;>M2R}GQLyUb}%-v~^Ei?v#ErxBqS=ng+ zQAU8rM|wyLnIbXg5&|ONG_^O4nf*Z4M4XsDSt}Q3)=Jw>#GvEuLPN3SdFA{RMtDXM zHKy>j?+&eC`F7+G)qHeYSjds|U*Lj0aUk@l=-=Xk@)9edJ&Qk^(c4Ihx#W>B-1@!? zh`_@XOZmj8WmF4JHW#xTSDu=3L#M*mGt^)eT}4KmYYJ%oM^NLU-!!kKNL@1BsGan; zg;_Pza?4*Dr$L}OIx_>Jb$m2aWeQNiUf3XLxbk8wssMOcGS6QS7E-h4mBO_R$en@4 zD+cdLO+=jtFBI4Mi$USKF9&W6g4g$4oUs)?#H>0sZJmCMcVZ?@`OI?3HX)J>{ zz$&TwzgQR)*0J|2agwqj!QC|*m{qPymAK7Vo*uP`p!A2~_sB?|WH0igeS}!EV%57N z?a``ZVR78Gcr}u?sAef2R?C{JjDc$&JD!x!ccgf$NVSZfXiQ{&GFfLF+dD8S;!9h# z15jy$Fe749I|;8BH?Hr!c5@c3f}`B1;PG13i`twuedoqmbZuC8To&Qv`?#7zJI-Z0 za z&0?JnS&{2X(gZ+HIln}y6Q$XR4H-l4a(=AojM;Ki`Su<`mH@1b!s<}rfHS*3v$4`Zg@=F0T_@j`HUfMR>28lY`i(Ipv?fZcnw4@7dnW3~>v zHij{nC=RBwLpsfp>nZqm&H0SV-n-SE={q}5?lvwJsH zqLFA0GPY0KsAFC$+`Lzhs-B(Q#T{qI3nar)e3off<#^nOKXl+e_nvdE1K^>! zEYy7V=21NQxq4v*05xwNe5j((hk-2R{GNo4em(^fUlZJXot{(u`Hqx3oIDiqQ?jGQ zF7x3coFHdz5&ily0chW;ASuX_4ra!Me>wuS+kw6g^?Rh#F$wn`^6{I*^4Y~%wba^L zvL_qyhT74@+11)G$v7b6k5$1eg|tft7&~cZ{YpMC*39a18|h6kBmV+|$aG7>rN7Ld zx5DeF1hrNp&|1U3I22Cu;(v?xKp}!#DwRC6&>q4~1~%sF^$4 z5X!%JE~y9IkO$5K@#piex3!ZU8c1EF@w-;}FenBlaQ6yr43J-WA5d%3^pi*dUABNV zjrM4FPzZCtMY48}3CviCkyXnYz$l+>W(nvk-aq||e?s=%4N|9;`03%d<{PBVg>kh9{w5@YmFE8+Ys^+;~nV8Y}l(Eg%>nV~?nu~_S zpKoYr{A@)jnt@H57x1+r%i*yOkKEvL_XXL;68j9JJ3n0eHjkP~_k2yM%z&GBzh@kn0KL})4jz1!^^P+r%UE1WGdB9q-=0Oa1h;fJyN=w!&~vQ?PO-a)6VJs zn2(SWDJ!@iBUZppBzAFWiLI-S-@mM{n7~5l7wO~OcpPSZ%aLWy@1+Dr$6ys3f}&d8 zjqrlqp&v=j6qN}&*Zyy@8=HJ_b*>u@YuDt7(6h?v8wO2AoZa=FRSVS|EkQO8;q_dN zd}dk)<%~16jUU0EXZEp|fVs3ScVr2BSylHF;X7fdr&4)6C7RW&ug0iYXgwJ|KO72lWH}^LSjr#_Jdnur>kTd{Uw!!D--Eql)J0mnmJ>SbP zEJzq-M<`6*ylGCvMp9dOorhS>O3EVU1Y59ni+*z36?xdZhw+|e_pxWA)}|m#SH4-^ zI)TbC#|V-(Lb}D!aC{(R($O8@?iI_om02aJUC-Q0reOP%$7(c>teXJR5uvQZFO~^^ zB)%U?Lb31H5r>E=*%j&~_;HZNF5zR5mUENzq#Gr0k}RcbdI{ItNHEDoxDoPAB~Apv zbrrXFB@9Vqs+=b9&)Ii2XC8>?#WET)a5k1xa!(>w-f(G;R9Io#wGiZ!H9reHk%$isPQ}~a_uY;FUmpVmG|Es1 z(kvQqQP0peT5|(kwIc|TkjYG&I=-KhE~yOuSS4VaHgkdnwfo`?&p7U=(>EM2^R^T7 zNJSu1bBE~=(UDxy={V*0A$_5`U91F?@yh8ttZ7xtc3A%EqQtDa>wrXHJVkN>{Lz95 z>6Qb1HGz!VqFlC{ggw9Vo8k$^lk|!%GKD*r;3K+KCuahJ2{X!>zJ^t5Q zJcOrb@LQ?`wv$6Ghr~;IA*6d}&PjaNbv(G5{m55PGEVVPvg@o&5qmo(*#tjIObY_R ziTbFE9PWP%LsRxvvP{LC=$fl0`$GMun&B)>JyBQ%-C{#Ys0t!}X(P^9=UoiEvd4Qt zhUVmt*pjhec_(Xhlm)d4AJl$Ua^yAs$+DRFD1npUTKBfQIiZ)A`Yac1c z{+SAw+WSG7w;fJ)49?b9G)e`$E0lyXM3!g+L~R7_c~Klg4NBjNra*WL)hs6gvPyoN zd1AuSXmSd=l0mVl??Ri4`k^5T8fjgKPtTe9e-8_rt}*ruOao}FnGGdpViP6(C)sQa zpBqL!XP0=0-WN2f?&09=0Cb&s4R>yAh(W}BtxYAu%laF2b^qMMuMC6=aTPf zc|;~2`65XaraBP=DpwN;T7J!5 z`)-KNHnxT7XJ0aN_{H%0rTG!Ok{6i4@9+qAQI{Kr?MIY#BXpieC~RYLS}$I({#wPC zqgaIB>ipp&*wnjST&QBrm)gc4SOPqOZ6J;KTbY8;8yd$akri#LJuZM+wR_vKI&9UP zWimS&Gg=&Ed*>POFPWOu;-BTaMckbr7Tv4y>&rpsTLwv*wWY5C{LTU)=UY&Z!S$Hz z^w)lSintBw=`)u-yi@$m^~FZ3A4J7N2}khBAwG%yuAb(Lr zif{~ESns8l-NP@RY6+NQICiiZ|Qj}Dr*Mb+}88e zFwK$p0)A4la%}o3A{HnCEi6;8rzE``V|3?VJWKy3cXRpZ`v#-OC}j_ewqCG7ElY1}V|4Ee`cAlX+7UFdn1oIl31wj)wO@cj`r=7d!~4JJ~JC>O6o zT(*Uoox{V27{iey$pSqZgTft9XiQ*4pHRgkqIpQNJHgmTkhen1DkD(CVxzfgv#s3G zJq_f@@txuopDoSQ*}Uul{NoX+RdEcT6_L|ULORIpi(yB^0YgQ%3DpBv=MR^K@iBU& z`BsWgA8URFL6=|w?v}gL0V~kTzEMj#@)%YbpeIlvxf>Bj>e3}m53|D9C0F0FD}jjk zb(R~mSc?YYbzkls2WKpZU8JBTLj6fAw7vY~@is2j zYr)vf39Rv@D1zrN_JO-!ED7tjdE9nR$#o8`A%l&BtgW$^)OyWC68T}tFI2K;alNI1 zUqSDEndP6zkm2>=-MZD<^V8kAO)a{!5LCGS2#QMM#H+S%@&0o%i+?G3jF?-^&hMYv zSVBuH_!fZsITUJqMP{n(U&8^AUeDJuH}vjKYhLuc%3Z4^fjFazby0KsMjE*b7c*J9 zP^;s_7DzxR077Zp_`_xWnh*jMP!0xJf8>Zjr{I>+=Fw!LeU6&?N z=AC+%DbAX5*P>)yw;@Kutp{=p8KF;E_!L!Zwt=-YZ?%tZttTv^Tkf+`|8D(NKVwvj z+2gzyH+j69oWRM)Cea&{`maA$WFV>(%M!LXy=_E6rbB^2-haNTO2P)5r%tB%i<`ML zK#<+JIFprQ_vmF)RRNX!-m!5DV9Fvh5*7Z&4W-%PL*p nW36CIoAOFlD@Ka(=%qX@I{OpHoVTW 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 C3?)wh literal 9934 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 A{Qv*} From b4e99304c42fa3026aa77e654ac5f8fe61820fae Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 10 Aug 2021 14:49:07 +0100 Subject: [PATCH 043/441] Bump version to 2.15.0 and tidy release notes #minor-release PiperOrigin-RevId: 389871495 --- RELEASENOTES.md | 222 ++++++++---------- constants.gradle | 4 +- .../exoplayer2/ExoPlayerLibraryInfo.java | 6 +- 3 files changed, 109 insertions(+), 123 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9d60eff4a0..de78e1407c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,22 +1,46 @@ # Release notes ### dev-v2 (not yet released) +* Core Library: + * Move `com.google.android.exoplayer2.device.DeviceInfo` to + `com.google.android.exoplayer2.DeviceInfo`. +* Android 12 compatibility: + * Disable platform transcoding when playing content URIs on Android 12. + * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of + calls from the player to `Surface.setFrameRate`. This is useful for + applications wanting to call `Surface.setFrameRate` directly from + application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. +* GVR extension: + * Remove `GvrAudioProcessor`, which has been deprecated since 2.11.0. +* Remove deprecated symbols: + * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named + constants in `C` instead. + * Remove `C.MSG_*` constants. Use identically named constants in + `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced + with `Renderer.MSG_SET_VIDEO_OUTPUT`. + * Remove `DeviceListener`. Use `Player.Listener` instead. + +### 2.15.0 (2021-08-10) * Core Library: - * Add `needsReconfiguration` API to the `MediaCodecAdapter` interface. - * Add `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement` and - `seekForward` methods to `Player`. - * Add `getMaxSeekToPreviousPosition`, `seekToPrevious` and `seekToNext` - methods to `Player`. - * Rename `Player` methods `hasPrevious`, `previous`, `hasNext` and `next` - to `hasPreviousWindow`, `seekToPreviousWindow`, `hasNextWindow` and - `seekToNextWindow`, respectively. - * Rename `Player` commands `COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM`, - `COMMAND_SEEK_TO_NEXT_MEDIA_ITEM`, - `COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM`, `COMMAND_SEEK_TO_MEDIA_ITEM` and - `COMMAND_GET_MEDIA_ITEMS` to `COMMAND_SEEK_IN_CURRENT_WINDOW`, - `COMMAND_SEEK_TO_NEXT_WINDOW`, `COMMAND_SEEK_TO_PREVIOUS_WINDOW`, - `COMMAND_SEEK_TO_WINDOW` and `COMMAND_GET_TIMELINE`, respectively. + * Add `MediaCodecAdapter.needsReconfiguration` method. + * Add `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement`, + `seekForward`, `getMaxSeekToPreviousPosition`, `seekToPrevious` and + `seekToNext` methods to `Player`. + * Rename `Player` methods: + * `hasPrevious` to `hasPreviousWindow`. + * `previous` to `seekToPreviousWindow`. + * `hasNext` to `hasNextWindow`. + * `next` to `seekToNextWindow`. + * Rename `Player` commands: + * `COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM` to + `COMMAND_SEEK_IN_CURRENT_WINDOW`. + * `COMMAND_SEEK_TO_NEXT_MEDIA_ITEM` to `COMMAND_SEEK_TO_NEXT_WINDOW`. + * `COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM` to + `COMMAND_SEEK_TO_PREVIOUS_WINDOW`. + * `COMMAND_SEEK_TO_MEDIA_ITEM` to `COMMAND_SEEK_TO_WINDOW`. + * `COMMAND_GET_MEDIA_ITEMS` to `COMMAND_GET_TIMELINE`. + * Rename `Player.EventFlags` IntDef to `Player.Event`. * Make `Player` depend on the new `PlaybackException` class instead of `ExoPlaybackException`: * `Player.getPlayerError` now returns a `PlaybackException`. @@ -29,24 +53,14 @@ users can downcast the `PlaybackException` instance to obtain implementation-specific fields (like `ExoPlaybackException.rendererIndex`). - * `PlaybackException` introduces an `errorCode` which identifies the - cause of the failure in order to simplify error handling - ([#1611](https://github.com/google/ExoPlayer/issues/1611)). - * Add `@FallbackType` to `LoadErrorHandlingPolicy` to support - customization of the exclusion duration for locations and tracks. - * Rename `Player.EventFlags` IntDef to `Player.Event`. + * `PlaybackException` introduces an `errorCode` which identifies the cause + of the failure in order to simplify error handling + ([#1611](https://github.com/google/ExoPlayer/issues/1611)). * Add a `DefaultMediaDescriptionAdapter` for the `PlayerNotificationManager`, that makes use of the `Player` `MediaMetadata` to populate the notification fields. - * Deprecate `Player.getCurrentStaticMetadata`, - `Player.Listener.onStaticMetadataChanged` and - `Player.EVENT_STATIC_METADATA_CHANGED`. Use `Player.getMediaMetadata`, - `Player.Listener.onMediaMetadataChanged` and - `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to - structured metadata, or access the raw static metadata directly from the - `TrackSelection#getFormat()`. - * Deprecate `ControlDispatcher` and `DefaultControlDispatcher`. Use a - `ForwardingPlayer` or configure the player to customize operations. + * Add `@FallbackType` to `LoadErrorHandlingPolicy` to support + customization of the exclusion duration for locations and tracks. * Change interface of `LoadErrorHandlingPolicy` to support configuring the behavior of track and location fallback. Location fallback is currently only supported for DASH manifests with multiple base URLs. @@ -54,57 +68,18 @@ listing audio offload encodings as supported for passthrough mode on mobile devices ([#9239](https://github.com/google/ExoPlayer/issues/9239)). - * Move `com.google.android.exoplayer2.device.DeviceInfo` to - `com.google.android.exoplayer2.DeviceInfo`. -* Android 12 compatibility: - * Disable platform transcoding when playing content URIs on Android 12. - * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of - calls from the player to `Surface.setFrameRate`. This is useful for - applications wanting to call `Surface.setFrameRate` directly from - application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. -* Remove deprecated symbols: - * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. - * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and - `MediaItem.PlaybackProperties.tag` instead. - * Remove `Player.Listener.onTimelineChanged(Timeline, Object, int)`. Use - `Player.Listener.onTimelineChanged(Timeline, int)` instead. The manifest - can be accessed using `Player.getCurrentManifest`. - * Remove `PlaybackPreparer`. UI components that previously had - `setPlaybackPreparer` methods will now call `Player.prepare` by default. - If this behavior is sufficient, use of `PlaybackPreparer` can be removed - from application code without replacement. For custom preparation logic, - use a `ForwardingPlayer` that implements custom preparation logic in - `prepare`. - * Remove `setRewindIncrementMs` and `setFastForwardIncrementMs` from UI - components. These increments can be customized by configuring the - `Player` (see `setSeekBackIncrementMs` and `setSeekForwardIncrementMs` - in `SimpleExoPlayer.Builder`), or by using a `ForwardingPlayer` that - overrides `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement` - and `seekForward`. The rewind and fast forward buttons can be disabled - by using a `ForwardingPlayer` that removes `COMMAND_SEEK_BACK` and - `COMMAND_SEEK_FORWARD` from the available commands. - * Remove `PlayerNotificationManager` constructors and `createWith` - methods. Use `PlayerNotificationManager.Builder` instead. - * Remove `PlayerNotificationManager.setNotificationListener`. Use - `PlayerNotificationManager.Builder.setNotificationListener` instead. - * Remove `PlayerNotificationManager` `setUseNavigationActions` and - `setUseNavigationActionsInCompactView`. Use `setUseNextAction`, - `setUsePreviousAction`, `setUseNextActionInCompactView` and - `setUsePreviousActionInCompactView` instead. - * Remove `Format.create` methods. Use `Format.Builder` instead. - * Remove `Timeline.getWindow(int, Window, boolean)`. Use - `Timeline.getWindow(int, Window)` instead, which will always set tags. - * Remove `MediaSource.getTag`. Use `MediaSource.getMediaItem` and - `MediaItem.PlaybackProperties.tag` instead. - * Remove `CastPlayer` specific playlist manipulation methods. Use - `setMediaItems`, `addMediaItems`, `removeMediaItem` and `moveMediaItem` - instead. - * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named - constants in `C` instead. - * Remove `C.MSG_*` constants. Use identically named constants in - `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced - with `Renderer.MSG_SET_VIDEO_OUTPUT`. - * Remove `DeviceListener`. Use `Player.Listener` instead. +* Extractors: + * Add support for DTS-UHD in MP4 + ([#9163](https://github.com/google/ExoPlayer/issues/9163)). +* Text: + * TTML: Inherit the `rubyPosition` value from a containing `` element. + * WebVTT: Add support for CSS `font-size` property + ([#8964](https://github.com/google/ExoPlayer/issues/8964)). +* Ad playback: + * Support changing ad break positions in the player logic + ([#5067](https://github.com/google/ExoPlayer/issues/5067)). + * Support resuming content with an offset after an ad group. * UI: * Add `setUseRewindAction` and `setUseFastForwardAction` to `PlayerNotificationManager`, and `setUseFastForwardActionInCompactView` @@ -121,37 +96,15 @@ available commands. * Update `DefaultControlDispatcher` `getRewindIncrementMs` and `getFastForwardIncrementMs` to take the player as parameter. - * Deprecate `setControlDispatcher` in `PlayerView`, `StyledPlayerView`, - `PlayerControlView`, `StyledPlayerControlView` and - `PlayerNotificationManager`. * HLS: * Fix issue that could cause some playbacks to be stuck buffering ([#8850](https://github.com/google/ExoPlayer/issues/8850), [#9153](https://github.com/google/ExoPlayer/issues/9153)). -* Extractors: - * Add support for DTS-UHD in MP4 - ([#9163](https://github.com/google/ExoPlayer/issues/9163)). -* Text: - * TTML: Inherit the `rubyPosition` value from a containing `` element. - * WebVTT: Add support for CSS `font-size` property - ([#8964](https://github.com/google/ExoPlayer/issues/8964)). -* Ad playback: - * Support changing ad break positions in the player logic - ([#5067](https://github.com/google/ExoPlayer/issues/5067). - * Support resuming content with an offset after an ad group. -* OkHttp extension: - * Switch to OkHttp 4.9.1. This increases the extension's minimum SDK - version requirement from 16 to 21. -* Cronet extension: - * Add `CronetDataSource.Factory.setRequestPriority` to allow setting the - priority of requests made by `CronetDataSource` instances. -* Leanback extension: - * Deprecate `setControlDispatcher` in `LeanbackPlayerAdapter`. -* Media2 extension: - * Deprecate `setControlDispatcher` in `SessionPlayerConnector`. -* GVR extension: - * Remove `GvrAudioProcessor`, which has been deprecated since 2.11.0. + * Report audio track type in + `AnalyticsListener.onDownstreamFormatChanged()` for audio-only + playlists, so that the `PlaybackStatsListener` can derive audio + format-related information + ([#9175](https://github.com/google/ExoPlayer/issues/9175)). * RTSP: * Use standard RTSP header names ([#9182](https://github.com/google/ExoPlayer/issues/9182)). @@ -159,19 +112,52 @@ ([#9247](https://github.com/google/ExoPlayer/pull/9247)). * Fix handling of special characters in the RTSP session ID ([#9254](https://github.com/google/ExoPlayer/issues/9254)). -* MediaSession extension: - * Deprecate `setControlDispatcher` in `MediaSessionConnector`. The - `ControlDispatcher` parameter has also been deprecated in all - `MediaSessionConnector` listener methods. -* HLS: - * Report audio track type in - `AnalyticsListener.onDownstreamFormatChanged()` for audio-only - playlists, so that the `PlaybackStatsListener` can derive audio - format-related information. - ([#9175](https://github.com/google/ExoPlayer/issues/9175)). -* SS: +* SmoothStreaming: * Propagate `StreamIndex` element `Name` attribute value as `Format` label ([#9252](https://github.com/google/ExoPlayer/issues/9252)). +* Cronet extension: + * Add `CronetDataSource.Factory.setRequestPriority` to allow setting the + priority of requests made by `CronetDataSource` instances. +* OkHttp extension: + * Switch to OkHttp 4.9.1. This increases the extension's minimum SDK + version requirement from 16 to 21. +* Remove deprecated symbols: + * Remove `CastPlayer` specific playlist manipulation methods. Use + `setMediaItems`, `addMediaItems`, `removeMediaItem` and `moveMediaItem` + instead. + * Remove `Format.create` methods. Use `Format.Builder` instead. + * Remove `MediaSource.getTag`. Use `MediaSource.getMediaItem` and + `MediaItem.PlaybackProperties.tag` instead. + * Remove `PlaybackPreparer`. UI components that previously had + `setPlaybackPreparer` methods will now call `Player.prepare` by default. + If this behavior is sufficient, use of `PlaybackPreparer` can be removed + from application code without replacement. For custom preparation logic, + use a `ForwardingPlayer` that implements custom preparation logic in + `prepare`. + * Remove `Player.Listener.onTimelineChanged(Timeline, Object, int)`. Use + `Player.Listener.onTimelineChanged(Timeline, int)` instead. The manifest + can be accessed using `Player.getCurrentManifest`. + * Remove `Player.getCurrentTag`. Use `Player.getCurrentMediaItem` and + `MediaItem.PlaybackProperties.tag` instead. + * Remove `Player.getPlaybackError`. Use `Player.getPlayerError` instead. + * Remove `PlayerNotificationManager` constructors and `createWith` + methods. Use `PlayerNotificationManager.Builder` instead. + * Remove `PlayerNotificationManager.setNotificationListener`. Use + `PlayerNotificationManager.Builder.setNotificationListener` instead. + * Remove `PlayerNotificationManager` `setUseNavigationActions` and + `setUseNavigationActionsInCompactView`. Use `setUseNextAction`, + `setUsePreviousAction`, `setUseNextActionInCompactView` and + `setUsePreviousActionInCompactView` instead. + * Remove `setRewindIncrementMs` and `setFastForwardIncrementMs` from UI + components. These increments can be customized by configuring the + `Player` (see `setSeekBackIncrementMs` and `setSeekForwardIncrementMs` + in `SimpleExoPlayer.Builder`), or by using a `ForwardingPlayer` that + overrides `getSeekBackIncrement`, `seekBack`, `getSeekForwardIncrement` + and `seekForward`. The rewind and fast forward buttons can be disabled + by using a `ForwardingPlayer` that removes `COMMAND_SEEK_BACK` and + `COMMAND_SEEK_FORWARD` from the available commands. + * Remove `Timeline.getWindow(int, Window, boolean)`. Use + `Timeline.getWindow(int, Window)` instead, which will always set tags. ### 2.14.2 (2021-07-20) diff --git a/constants.gradle b/constants.gradle index 3755fc2779..51e671fd2c 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.14.2' - releaseVersionCode = 2014002 + releaseVersion = '2.15.0' + releaseVersionCode = 2015000 minSdkVersion = 16 appTargetSdkVersion = 29 // Upgrading this requires [Internal ref: b/193254928] to be fixed, or some 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 30235cdba7..198ec23817 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 @@ -26,11 +26,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.14.2"; + public static final String VERSION = "2.15.0"; /** The version of the library expressed as {@code "ExoPlayerLib/" + VERSION}. */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final String VERSION_SLASHY = "ExoPlayerLib/2.14.2"; + public static final String VERSION_SLASHY = "ExoPlayerLib/2.15.0"; /** * The version of the library expressed as an integer, for example 1002003. @@ -40,7 +40,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 = 2014002; + public static final int VERSION_INT = 2015000; /** * The default user agent for requests made by the library. From 31a839c848c6247515cf828b30d479d0e663e095 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 10 Aug 2021 14:51:19 +0100 Subject: [PATCH 044/441] Move non-player specific classes to common These will all be needed in common to break dependencies between decoder extension modules and the core module. PiperOrigin-RevId: 389871983 --- .../google/android/exoplayer2/decoder/SimpleDecoder.java | 6 ++++-- .../android/exoplayer2/decoder/SimpleOutputBuffer.java | 0 .../google/android/exoplayer2/drm/DecryptionException.java | 0 .../com/google/android/exoplayer2/util/LibraryLoader.java | 0 4 files changed, 4 insertions(+), 2 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java (98%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java similarity index 98% rename from library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java index 896fb06568..1886cdf9f4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java @@ -40,9 +40,9 @@ public abstract class SimpleDecoder< private int availableInputBufferCount; private int availableOutputBufferCount; - private I dequeuedInputBuffer; + @Nullable private I dequeuedInputBuffer; - private E exception; + @Nullable private E exception; private boolean flushed; private boolean released; private int skippedOutputBufferCount; @@ -51,6 +51,7 @@ public abstract class SimpleDecoder< * @param inputBuffers An array of nulls that will be used to store references to input buffers. * @param outputBuffers An array of nulls that will be used to store references to output buffers. */ + @SuppressWarnings("nullness:method.invocation") protected SimpleDecoder(I[] inputBuffers, O[] outputBuffers) { lock = new Object(); queuedInputBuffers = new ArrayDeque<>(); @@ -178,6 +179,7 @@ public abstract class SimpleDecoder< * @throws E The decode exception. */ private void maybeThrowException() throws E { + @Nullable E exception = this.exception; if (exception != null) { throw exception; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java b/library/common/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java rename to library/common/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java b/library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/LibraryLoader.java From f5d8c211f5eb9cd59c1b646ff1fff24b9192f815 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 10 Aug 2021 15:31:49 +0100 Subject: [PATCH 045/441] Remove some deprecated source/sink classes PiperOrigin-RevId: 389879570 --- RELEASENOTES.md | 3 + .../upstream/FileDataSourceFactory.java | 38 ------ .../upstream/cache/CacheDataSinkFactory.java | 44 ------- .../cache/CacheDataSourceFactory.java | 112 ------------------ 4 files changed, 3 insertions(+), 194 deletions(-) delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSourceFactory.java delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.java delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index de78e1407c..99783b63e3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -19,6 +19,9 @@ `Renderer` instead, except for `C.MSG_SET_SURFACE`, which is replaced with `Renderer.MSG_SET_VIDEO_OUTPUT`. * Remove `DeviceListener`. Use `Player.Listener` instead. + * Remove `CacheDataSourceFactory`. Use `CacheDataSource.Factory` instead. + * Remove `CacheDataSinkFactory`. Use `CacheDataSink.Factory` instead. + * Remove `FileDataSourceFactory`. Use `FileDataSource.Factory` instead. ### 2.15.0 (2021-08-10) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSourceFactory.java deleted file mode 100644 index 004a68fdaf..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSourceFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.upstream; - -import androidx.annotation.Nullable; - -/** @deprecated Use {@link FileDataSource.Factory}. */ -@Deprecated -public final class FileDataSourceFactory implements DataSource.Factory { - - private final FileDataSource.Factory wrappedFactory; - - public FileDataSourceFactory() { - this(/* listener= */ null); - } - - public FileDataSourceFactory(@Nullable TransferListener listener) { - wrappedFactory = new FileDataSource.Factory().setListener(listener); - } - - @Override - public FileDataSource createDataSource() { - return wrappedFactory.createDataSource(); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.java deleted file mode 100644 index effb5f213e..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.upstream.cache; - -import com.google.android.exoplayer2.upstream.DataSink; - -/** @deprecated Use {@link CacheDataSink.Factory}. */ -@Deprecated -public final class CacheDataSinkFactory implements DataSink.Factory { - - private final Cache cache; - private final long fragmentSize; - private final int bufferSize; - - /** @see CacheDataSink#CacheDataSink(Cache, long) */ - public CacheDataSinkFactory(Cache cache, long fragmentSize) { - this(cache, fragmentSize, CacheDataSink.DEFAULT_BUFFER_SIZE); - } - - /** @see CacheDataSink#CacheDataSink(Cache, long, int) */ - public CacheDataSinkFactory(Cache cache, long fragmentSize, int bufferSize) { - this.cache = cache; - this.fragmentSize = fragmentSize; - this.bufferSize = bufferSize; - } - - @Override - public DataSink createDataSink() { - return new CacheDataSink(cache, fragmentSize, bufferSize); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.java deleted file mode 100644 index 0f6159e349..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.upstream.cache; - -import androidx.annotation.Nullable; -import com.google.android.exoplayer2.upstream.DataSink; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.FileDataSource; - -/** @deprecated Use {@link CacheDataSource.Factory}. */ -@Deprecated -public final class CacheDataSourceFactory implements DataSource.Factory { - - private final Cache cache; - private final DataSource.Factory upstreamFactory; - private final DataSource.Factory cacheReadDataSourceFactory; - @CacheDataSource.Flags private final int flags; - @Nullable private final DataSink.Factory cacheWriteDataSinkFactory; - @Nullable private final CacheDataSource.EventListener eventListener; - @Nullable private final CacheKeyFactory cacheKeyFactory; - - /** - * Constructs a factory which creates {@link CacheDataSource} instances with default {@link - * DataSource} and {@link DataSink} instances for reading and writing the cache. - * - * @param cache The cache. - * @param upstreamFactory A {@link DataSource.Factory} for creating upstream {@link DataSource}s - * for reading data not in the cache. - */ - public CacheDataSourceFactory(Cache cache, DataSource.Factory upstreamFactory) { - this(cache, upstreamFactory, /* flags= */ 0); - } - - /** @see CacheDataSource#CacheDataSource(Cache, DataSource, int) */ - public CacheDataSourceFactory( - Cache cache, DataSource.Factory upstreamFactory, @CacheDataSource.Flags int flags) { - this( - cache, - upstreamFactory, - new FileDataSource.Factory(), - new CacheDataSink.Factory().setCache(cache), - flags, - /* eventListener= */ null); - } - - /** - * @see CacheDataSource#CacheDataSource(Cache, DataSource, DataSource, DataSink, int, - * CacheDataSource.EventListener) - */ - public CacheDataSourceFactory( - Cache cache, - DataSource.Factory upstreamFactory, - DataSource.Factory cacheReadDataSourceFactory, - @Nullable DataSink.Factory cacheWriteDataSinkFactory, - @CacheDataSource.Flags int flags, - @Nullable CacheDataSource.EventListener eventListener) { - this( - cache, - upstreamFactory, - cacheReadDataSourceFactory, - cacheWriteDataSinkFactory, - flags, - eventListener, - /* cacheKeyFactory= */ null); - } - - /** - * @see CacheDataSource#CacheDataSource(Cache, DataSource, DataSource, DataSink, int, - * CacheDataSource.EventListener, CacheKeyFactory) - */ - public CacheDataSourceFactory( - Cache cache, - DataSource.Factory upstreamFactory, - DataSource.Factory cacheReadDataSourceFactory, - @Nullable DataSink.Factory cacheWriteDataSinkFactory, - @CacheDataSource.Flags int flags, - @Nullable CacheDataSource.EventListener eventListener, - @Nullable CacheKeyFactory cacheKeyFactory) { - this.cache = cache; - this.upstreamFactory = upstreamFactory; - this.cacheReadDataSourceFactory = cacheReadDataSourceFactory; - this.cacheWriteDataSinkFactory = cacheWriteDataSinkFactory; - this.flags = flags; - this.eventListener = eventListener; - this.cacheKeyFactory = cacheKeyFactory; - } - - @Override - public CacheDataSource createDataSource() { - return new CacheDataSource( - cache, - upstreamFactory.createDataSource(), - cacheReadDataSourceFactory.createDataSource(), - cacheWriteDataSinkFactory == null ? null : cacheWriteDataSinkFactory.createDataSink(), - flags, - eventListener, - cacheKeyFactory); - } -} From 10b4e10f43b8c20c2d80700a09c7d75e09460149 Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 10 Aug 2021 16:28:08 +0100 Subject: [PATCH 046/441] Move SimpleExoPlayer.Builder to ExoPlayer - Remove ExoPlayer.Builder - Copy SimpleExoPlayer.Builder to ExoPlayer - Deprecate SimpleExoPlayer.Builder PiperOrigin-RevId: 389890299 --- RELEASENOTES.md | 2 + .../google/android/exoplayer2/ExoPlayer.java | 401 ++++++++++++------ .../android/exoplayer2/SimpleExoPlayer.java | 374 ++++------------ 3 files changed, 356 insertions(+), 421 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 99783b63e3..98ac2c62e7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,8 @@ * Core Library: * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. + * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. + * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Android 12 compatibility: * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index b4a9ab2980..fff434fb99 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -23,6 +23,7 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.TextureView; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.analytics.AnalyticsCollector; @@ -33,6 +34,8 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; +import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; @@ -47,8 +50,8 @@ import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; @@ -59,7 +62,7 @@ import java.util.List; /** * An extensible media player that plays {@link MediaSource}s. Instances can be obtained from {@link - * SimpleExoPlayer.Builder}. + * Builder}. * *

      Player components

      * @@ -73,10 +76,10 @@ import java.util.List; *
    • {@link MediaSource MediaSources} that define the media to be played, load the media, * and from which the loaded media can be read. MediaSources are created from {@link MediaItem * MediaItems} by the {@link MediaSourceFactory} injected into the player {@link - * SimpleExoPlayer.Builder#setMediaSourceFactory Builder}, or can be added directly by methods - * like {@link #setMediaSource(MediaSource)}. The library provides a {@link - * DefaultMediaSourceFactory} for progressive media files, DASH, SmoothStreaming and HLS, - * which also includes functionality for side-loading subtitle files and clipping media. + * Builder#setMediaSourceFactory Builder}, or can be added directly by methods like {@link + * #setMediaSource(MediaSource)}. The library provides a {@link DefaultMediaSourceFactory} for + * progressive media files, DASH, SmoothStreaming and HLS, which also includes functionality + * for side-loading subtitle files and clipping media. *
    • {@link Renderer}s that render individual components of the media. The library * provides default implementations for common media types ({@link MediaCodecVideoRenderer}, * {@link MediaCodecAudioRenderer}, {@link TextRenderer} and {@link MetadataRenderer}). A @@ -505,12 +508,6 @@ public interface ExoPlayer extends Player { void setDeviceMuted(boolean muted); } - /** - * The default timeout for calls to {@link #release} and {@link #setForegroundMode}, in - * milliseconds. - */ - long DEFAULT_RELEASE_TIMEOUT_MS = 500; - /** * A listener for audio offload events. * @@ -519,7 +516,7 @@ public interface ExoPlayer extends Player { interface AudioOffloadListener { /** * Called when the player has started or stopped offload scheduling using {@link - * ExoPlayer#experimentalSetOffloadSchedulingEnabled(boolean)}. + * #experimentalSetOffloadSchedulingEnabled(boolean)}. * *

      This method is experimental, and will be renamed or removed in a future release. */ @@ -534,39 +531,28 @@ public interface ExoPlayer extends Player { } /** - * A builder for {@link ExoPlayer} instances. + * A builder for {@link SimpleExoPlayer} instances. * - *

      See {@link #Builder(Context, Renderer...)} for the list of default values. - * - * @deprecated Use {@link SimpleExoPlayer.Builder} instead. + *

      See {@link #Builder(Context)} for the list of default values. */ - @Deprecated + @SuppressWarnings("deprecation") final class Builder { - private final Renderer[] renderers; - - private Clock clock; - private TrackSelector trackSelector; - private MediaSourceFactory mediaSourceFactory; - private LoadControl loadControl; - private BandwidthMeter bandwidthMeter; - private Looper looper; - @Nullable private AnalyticsCollector analyticsCollector; - private boolean useLazyPreparation; - private SeekParameters seekParameters; - private boolean pauseAtEndOfMediaItems; - private long releaseTimeoutMs; - private LivePlaybackSpeedControl livePlaybackSpeedControl; - private boolean buildCalled; - - private long setForegroundModeTimeoutMs; + private final SimpleExoPlayer.Builder wrappedBuilder; /** - * Creates a builder with a list of {@link Renderer Renderers}. + * Creates a builder. + * + *

      Use {@link #Builder(Context, RenderersFactory)}, {@link #Builder(Context, + * RenderersFactory)} or {@link #Builder(Context, RenderersFactory, ExtractorsFactory)} instead, + * if you intend to provide a custom {@link RenderersFactory} or a custom {@link + * ExtractorsFactory}. This is to ensure that ProGuard or R8 can remove ExoPlayer's {@link + * DefaultRenderersFactory} and {@link DefaultExtractorsFactory} from the APK. * *

      The builder uses the following default values: * *

        + *
      • {@link RenderersFactory}: {@link DefaultRenderersFactory} *
      • {@link TrackSelector}: {@link DefaultTrackSelector} *
      • {@link MediaSourceFactory}: {@link DefaultMediaSourceFactory} *
      • {@link LoadControl}: {@link DefaultLoadControl} @@ -576,23 +562,70 @@ public interface ExoPlayer extends Player { * Looper} of the application's main thread if the current thread doesn't have a {@link * Looper} *
      • {@link AnalyticsCollector}: {@link AnalyticsCollector} with {@link Clock#DEFAULT} + *
      • {@link PriorityTaskManager}: {@code null} (not used) + *
      • {@link AudioAttributes}: {@link AudioAttributes#DEFAULT}, not handling audio focus + *
      • {@link C.WakeMode}: {@link C#WAKE_MODE_NONE} + *
      • {@code handleAudioBecomingNoisy}: {@code false} + *
      • {@code skipSilenceEnabled}: {@code false} + *
      • {@link C.VideoScalingMode}: {@link C#VIDEO_SCALING_MODE_DEFAULT} + *
      • {@link C.VideoChangeFrameRateStrategy}: {@link + * C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS} *
      • {@code useLazyPreparation}: {@code true} *
      • {@link SeekParameters}: {@link SeekParameters#DEFAULT} - *
      • {@code releaseTimeoutMs}: {@link ExoPlayer#DEFAULT_RELEASE_TIMEOUT_MS} + *
      • {@code seekBackIncrementMs}: {@link C#DEFAULT_SEEK_BACK_INCREMENT_MS} + *
      • {@code seekForwardIncrementMs}: {@link C#DEFAULT_SEEK_FORWARD_INCREMENT_MS} + *
      • {@code releaseTimeoutMs}: {@link #DEFAULT_RELEASE_TIMEOUT_MS} + *
      • {@code detachSurfaceTimeoutMs}: {@link #DEFAULT_DETACH_SURFACE_TIMEOUT_MS} *
      • {@code pauseAtEndOfMediaItems}: {@code false} *
      • {@link Clock}: {@link Clock#DEFAULT} *
      * * @param context A {@link Context}. - * @param renderers The {@link Renderer Renderers} to be used by the player. */ - public Builder(Context context, Renderer... renderers) { - this( - renderers, - new DefaultTrackSelector(context), - new DefaultMediaSourceFactory(context), - new DefaultLoadControl(), - DefaultBandwidthMeter.getSingletonInstance(context)); + public Builder(Context context) { + wrappedBuilder = new SimpleExoPlayer.Builder(context); + } + + /** + * Creates a builder with a custom {@link RenderersFactory}. + * + *

      See {@link #Builder(Context)} for a list of default values. + * + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the + * player. + */ + public Builder(Context context, RenderersFactory renderersFactory) { + wrappedBuilder = new SimpleExoPlayer.Builder(context, renderersFactory); + } + + /** + * Creates a builder with a custom {@link ExtractorsFactory}. + * + *

      See {@link #Builder(Context)} for a list of default values. + * + * @param context A {@link Context}. + * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from + * its container. + */ + public Builder(Context context, ExtractorsFactory extractorsFactory) { + wrappedBuilder = new SimpleExoPlayer.Builder(context, extractorsFactory); + } + + /** + * Creates a builder with a custom {@link RenderersFactory} and {@link ExtractorsFactory}. + * + *

      See {@link #Builder(Context)} for a list of default values. + * + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the + * player. + * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from + * its container. + */ + public Builder( + Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { + wrappedBuilder = new SimpleExoPlayer.Builder(context, renderersFactory, extractorsFactory); } /** @@ -601,44 +634,45 @@ public interface ExoPlayer extends Player { *

      Note that this constructor is only useful to try and ensure that ExoPlayer's default * components can be removed by ProGuard or R8. * - * @param renderers The {@link Renderer Renderers} to be used by the player. + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the + * player. * @param trackSelector A {@link TrackSelector}. * @param mediaSourceFactory A {@link MediaSourceFactory}. * @param loadControl A {@link LoadControl}. * @param bandwidthMeter A {@link BandwidthMeter}. + * @param analyticsCollector An {@link AnalyticsCollector}. */ public Builder( - Renderer[] renderers, + Context context, + RenderersFactory renderersFactory, TrackSelector trackSelector, MediaSourceFactory mediaSourceFactory, LoadControl loadControl, - BandwidthMeter bandwidthMeter) { - Assertions.checkArgument(renderers.length > 0); - this.renderers = renderers; - this.trackSelector = trackSelector; - this.mediaSourceFactory = mediaSourceFactory; - this.loadControl = loadControl; - this.bandwidthMeter = bandwidthMeter; - looper = Util.getCurrentOrMainLooper(); - useLazyPreparation = true; - seekParameters = SeekParameters.DEFAULT; - livePlaybackSpeedControl = new DefaultLivePlaybackSpeedControl.Builder().build(); - clock = Clock.DEFAULT; - releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS; + BandwidthMeter bandwidthMeter, + AnalyticsCollector analyticsCollector) { + wrappedBuilder = + new SimpleExoPlayer.Builder( + context, + renderersFactory, + trackSelector, + mediaSourceFactory, + loadControl, + bandwidthMeter, + analyticsCollector); } /** - * Set a limit on the time a call to {@link ExoPlayer#setForegroundMode} can spend. If a call to - * {@link ExoPlayer#setForegroundMode} takes more than {@code timeoutMs} milliseconds to - * complete, the player will raise an error via {@link Player.Listener#onPlayerError}. + * Set a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link + * #setForegroundMode} takes more than {@code timeoutMs} milliseconds to complete, the player + * will raise an error via {@link Player.Listener#onPlayerError}. * *

      This method is experimental, and will be renamed or removed in a future release. * * @param timeoutMs The time limit in milliseconds. */ public Builder experimentalSetForegroundModeTimeoutMs(long timeoutMs) { - Assertions.checkState(!buildCalled); - setForegroundModeTimeoutMs = timeoutMs; + wrappedBuilder.experimentalSetForegroundModeTimeoutMs(timeoutMs); return this; } @@ -650,8 +684,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setTrackSelector(TrackSelector trackSelector) { - Assertions.checkState(!buildCalled); - this.trackSelector = trackSelector; + wrappedBuilder.setTrackSelector(trackSelector); return this; } @@ -663,8 +696,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { - Assertions.checkState(!buildCalled); - this.mediaSourceFactory = mediaSourceFactory; + wrappedBuilder.setMediaSourceFactory(mediaSourceFactory); return this; } @@ -676,8 +708,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLoadControl(LoadControl loadControl) { - Assertions.checkState(!buildCalled); - this.loadControl = loadControl; + wrappedBuilder.setLoadControl(loadControl); return this; } @@ -689,8 +720,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { - Assertions.checkState(!buildCalled); - this.bandwidthMeter = bandwidthMeter; + wrappedBuilder.setBandwidthMeter(bandwidthMeter); return this; } @@ -703,8 +733,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLooper(Looper looper) { - Assertions.checkState(!buildCalled); - this.looper = looper; + wrappedBuilder.setLooper(looper); return this; } @@ -716,8 +745,124 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { - Assertions.checkState(!buildCalled); - this.analyticsCollector = analyticsCollector; + wrappedBuilder.setAnalyticsCollector(analyticsCollector); + return this; + } + + /** + * Sets an {@link PriorityTaskManager} that will be used by the player. + * + *

      The priority {@link C#PRIORITY_PLAYBACK} will be set while the player is loading. + * + * @param priorityTaskManager A {@link PriorityTaskManager}, or null to not use one. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { + wrappedBuilder.setPriorityTaskManager(priorityTaskManager); + return this; + } + + /** + * Sets {@link AudioAttributes} that will be used by the player and whether to handle audio + * focus. + * + *

      If audio focus should be handled, the {@link AudioAttributes#usage} must be {@link + * C#USAGE_MEDIA} or {@link C#USAGE_GAME}. Other usages will throw an {@link + * IllegalArgumentException}. + * + * @param audioAttributes {@link AudioAttributes}. + * @param handleAudioFocus Whether the player should handle audio focus. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { + wrappedBuilder.setAudioAttributes(audioAttributes, handleAudioFocus); + return this; + } + + /** + * Sets the {@link C.WakeMode} that will be used by the player. + * + *

      Enabling this feature requires the {@link android.Manifest.permission#WAKE_LOCK} + * permission. It should be used together with a foreground {@link android.app.Service} for use + * cases where playback occurs and the screen is off (e.g. background audio playback). It is not + * useful when the screen will be kept on during playback (e.g. foreground video playback). + * + *

      When enabled, the locks ({@link android.os.PowerManager.WakeLock} / {@link + * android.net.wifi.WifiManager.WifiLock}) will be held whenever the player is in the {@link + * #STATE_READY} or {@link #STATE_BUFFERING} states with {@code playWhenReady = true}. The locks + * held depend on the specified {@link C.WakeMode}. + * + * @param wakeMode A {@link C.WakeMode}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setWakeMode(@C.WakeMode int wakeMode) { + wrappedBuilder.setWakeMode(wakeMode); + return this; + } + + /** + * Sets whether the player should pause automatically when audio is rerouted from a headset to + * device speakers. See the + * audio becoming noisy documentation for more information. + * + * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is + * rerouted from a headset to device speakers. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { + wrappedBuilder.setHandleAudioBecomingNoisy(handleAudioBecomingNoisy); + return this; + } + + /** + * Sets whether silences silences in the audio stream is enabled. + * + * @param skipSilenceEnabled Whether skipping silences is enabled. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { + wrappedBuilder.setSkipSilenceEnabled(skipSilenceEnabled); + return this; + } + + /** + * Sets the {@link C.VideoScalingMode} that will be used by the player. + * + *

      The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is + * enabled and if the output surface is owned by a {@link SurfaceView}. + * + * @param videoScalingMode A {@link C.VideoScalingMode}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { + wrappedBuilder.setVideoScalingMode(videoScalingMode); + return this; + } + + /** + * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided + * with a video output {@link Surface}. + * + *

      The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. + * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to + * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link + * Surface#setFrameRate} from ExoPlayer, and should then call {@link Surface#setFrameRate} + * directly from application code. + * + * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setVideoChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { + wrappedBuilder.setVideoChangeFrameRateStrategy(videoChangeFrameRateStrategy); return this; } @@ -733,8 +878,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setUseLazyPreparation(boolean useLazyPreparation) { - Assertions.checkState(!buildCalled); - this.useLazyPreparation = useLazyPreparation; + wrappedBuilder.setUseLazyPreparation(useLazyPreparation); return this; } @@ -746,8 +890,33 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekParameters(SeekParameters seekParameters) { - Assertions.checkState(!buildCalled); - this.seekParameters = seekParameters; + wrappedBuilder.setSeekParameters(seekParameters); + return this; + } + + /** + * Sets the {@link #seekBack()} increment. + * + * @param seekBackIncrementMs The seek back increment, in milliseconds. + * @return This builder. + * @throws IllegalArgumentException If {@code seekBackIncrementMs} is non-positive. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { + wrappedBuilder.setSeekBackIncrementMs(seekBackIncrementMs); + return this; + } + + /** + * Sets the {@link #seekForward()} increment. + * + * @param seekForwardIncrementMs The seek forward increment, in milliseconds. + * @return This builder. + * @throws IllegalArgumentException If {@code seekForwardIncrementMs} is non-positive. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { + wrappedBuilder.setSeekForwardIncrementMs(seekForwardIncrementMs); return this; } @@ -763,8 +932,23 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { - Assertions.checkState(!buildCalled); - this.releaseTimeoutMs = releaseTimeoutMs; + wrappedBuilder.setReleaseTimeoutMs(releaseTimeoutMs); + return this; + } + + /** + * Sets a timeout for detaching a surface from the player. + * + *

      If detaching a surface or replacing a surface takes more than {@code + * detachSurfaceTimeoutMs} to complete, the player will report an error via {@link + * Player.Listener#onPlayerError}. + * + * @param detachSurfaceTimeoutMs The timeout for detaching a surface, in milliseconds. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { + wrappedBuilder.setDetachSurfaceTimeoutMs(detachSurfaceTimeoutMs); return this; } @@ -781,8 +965,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { - Assertions.checkState(!buildCalled); - this.pauseAtEndOfMediaItems = pauseAtEndOfMediaItems; + wrappedBuilder.setPauseAtEndOfMediaItems(pauseAtEndOfMediaItems); return this; } @@ -795,8 +978,7 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { - Assertions.checkState(!buildCalled); - this.livePlaybackSpeedControl = livePlaybackSpeedControl; + wrappedBuilder.setLivePlaybackSpeedControl(livePlaybackSpeedControl); return this; } @@ -810,46 +992,29 @@ public interface ExoPlayer extends Player { */ @VisibleForTesting public Builder setClock(Clock clock) { - Assertions.checkState(!buildCalled); - this.clock = clock; + wrappedBuilder.setClock(clock); return this; } /** - * Builds an {@link ExoPlayer} instance. + * Builds a {@link SimpleExoPlayer} instance. * - * @throws IllegalStateException If {@code build} has already been called. + * @throws IllegalStateException If this method has already been called. */ - public ExoPlayer build() { - Assertions.checkState(!buildCalled); - buildCalled = true; - ExoPlayerImpl player = - new ExoPlayerImpl( - renderers, - trackSelector, - mediaSourceFactory, - loadControl, - bandwidthMeter, - analyticsCollector, - useLazyPreparation, - seekParameters, - C.DEFAULT_SEEK_BACK_INCREMENT_MS, - C.DEFAULT_SEEK_FORWARD_INCREMENT_MS, - livePlaybackSpeedControl, - releaseTimeoutMs, - pauseAtEndOfMediaItems, - clock, - looper, - /* wrappingPlayer= */ null, - /* additionalPermanentAvailableCommands= */ Commands.EMPTY); - - if (setForegroundModeTimeoutMs > 0) { - player.experimentalSetForegroundModeTimeoutMs(setForegroundModeTimeoutMs); - } - return player; + public SimpleExoPlayer build() { + return wrappedBuilder.build(); } } + /** + * The default timeout for calls to {@link #release} and {@link #setForegroundMode}, in + * milliseconds. + */ + long DEFAULT_RELEASE_TIMEOUT_MS = 500; + + /** The default timeout for detaching a surface from the player, in milliseconds. */ + long DEFAULT_DETACH_SURFACE_TIMEOUT_MS = 2_000; + /** * Equivalent to {@link Player#getPlayerError()}, except the exception is guaranteed to be an * {@link ExoPlaybackException}. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index a8d4cce101..6f10613cfa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -35,7 +35,6 @@ import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.media.AudioFormat; import android.media.AudioTrack; -import android.media.MediaCodec; import android.media.MediaFormat; import android.os.Handler; import android.os.Looper; @@ -91,7 +90,7 @@ import java.util.concurrent.TimeoutException; /** * An {@link ExoPlayer} implementation that uses default {@link Renderer} components. Instances can - * be obtained from {@link SimpleExoPlayer.Builder}. + * be obtained from {@link ExoPlayer.Builder}. */ public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, @@ -101,14 +100,9 @@ public class SimpleExoPlayer extends BasePlayer ExoPlayer.MetadataComponent, ExoPlayer.DeviceComponent { - /** The default timeout for detaching a surface from the player, in milliseconds. */ - public static final long DEFAULT_DETACH_SURFACE_TIMEOUT_MS = 2_000; - - /** - * A builder for {@link SimpleExoPlayer} instances. - * - *

      See {@link #Builder(Context)} for the list of default values. - */ + /** @deprecated Use {@link ExoPlayer.Builder} instead. */ + @Deprecated + @SuppressWarnings("deprecation") public static final class Builder { private final Context context; @@ -140,89 +134,29 @@ public class SimpleExoPlayer extends BasePlayer private boolean pauseAtEndOfMediaItems; private boolean buildCalled; - /** - * Creates a builder. - * - *

      Use {@link #Builder(Context, RenderersFactory)}, {@link #Builder(Context, - * RenderersFactory)} or {@link #Builder(Context, RenderersFactory, ExtractorsFactory)} instead, - * if you intend to provide a custom {@link RenderersFactory} or a custom {@link - * ExtractorsFactory}. This is to ensure that ProGuard or R8 can remove ExoPlayer's {@link - * DefaultRenderersFactory} and {@link DefaultExtractorsFactory} from the APK. - * - *

      The builder uses the following default values: - * - *

        - *
      • {@link RenderersFactory}: {@link DefaultRenderersFactory} - *
      • {@link TrackSelector}: {@link DefaultTrackSelector} - *
      • {@link MediaSourceFactory}: {@link DefaultMediaSourceFactory} - *
      • {@link LoadControl}: {@link DefaultLoadControl} - *
      • {@link BandwidthMeter}: {@link DefaultBandwidthMeter#getSingletonInstance(Context)} - *
      • {@link LivePlaybackSpeedControl}: {@link DefaultLivePlaybackSpeedControl} - *
      • {@link Looper}: The {@link Looper} associated with the current thread, or the {@link - * Looper} of the application's main thread if the current thread doesn't have a {@link - * Looper} - *
      • {@link AnalyticsCollector}: {@link AnalyticsCollector} with {@link Clock#DEFAULT} - *
      • {@link PriorityTaskManager}: {@code null} (not used) - *
      • {@link AudioAttributes}: {@link AudioAttributes#DEFAULT}, not handling audio focus - *
      • {@link C.WakeMode}: {@link C#WAKE_MODE_NONE} - *
      • {@code handleAudioBecomingNoisy}: {@code false} - *
      • {@code skipSilenceEnabled}: {@code false} - *
      • {@link C.VideoScalingMode}: {@link C#VIDEO_SCALING_MODE_DEFAULT} - *
      • {@link C.VideoChangeFrameRateStrategy}: {@link - * C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS} - *
      • {@code useLazyPreparation}: {@code true} - *
      • {@link SeekParameters}: {@link SeekParameters#DEFAULT} - *
      • {@code seekBackIncrementMs}: {@link C#DEFAULT_SEEK_BACK_INCREMENT_MS} - *
      • {@code seekForwardIncrementMs}: {@link C#DEFAULT_SEEK_FORWARD_INCREMENT_MS} - *
      • {@code releaseTimeoutMs}: {@link ExoPlayer#DEFAULT_RELEASE_TIMEOUT_MS} - *
      • {@code detachSurfaceTimeoutMs}: {@link #DEFAULT_DETACH_SURFACE_TIMEOUT_MS} - *
      • {@code pauseAtEndOfMediaItems}: {@code false} - *
      • {@link Clock}: {@link Clock#DEFAULT} - *
      - * - * @param context A {@link Context}. - */ + /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context)} instead. */ + @Deprecated public Builder(Context context) { this(context, new DefaultRenderersFactory(context), new DefaultExtractorsFactory()); } - /** - * Creates a builder with a custom {@link RenderersFactory}. - * - *

      See {@link #Builder(Context)} for a list of default values. - * - * @param context A {@link Context}. - * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the - * player. - */ + /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory)} instead. */ + @Deprecated public Builder(Context context, RenderersFactory renderersFactory) { this(context, renderersFactory, new DefaultExtractorsFactory()); } - /** - * Creates a builder with a custom {@link ExtractorsFactory}. - * - *

      See {@link #Builder(Context)} for a list of default values. - * - * @param context A {@link Context}. - * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from - * its container. - */ + /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context, ExtractorsFactory)} instead. */ + @Deprecated public Builder(Context context, ExtractorsFactory extractorsFactory) { this(context, new DefaultRenderersFactory(context), extractorsFactory); } /** - * Creates a builder with a custom {@link RenderersFactory} and {@link ExtractorsFactory}. - * - *

      See {@link #Builder(Context)} for a list of default values. - * - * @param context A {@link Context}. - * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the - * player. - * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from - * its container. + * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory, + * ExtractorsFactory)} instead. */ + @Deprecated public Builder( Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { this( @@ -236,20 +170,10 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Creates a builder with the specified custom components. - * - *

      Note that this constructor is only useful to try and ensure that ExoPlayer's default - * components can be removed by ProGuard or R8. - * - * @param context A {@link Context}. - * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the - * player. - * @param trackSelector A {@link TrackSelector}. - * @param mediaSourceFactory A {@link MediaSourceFactory}. - * @param loadControl A {@link LoadControl}. - * @param bandwidthMeter A {@link BandwidthMeter}. - * @param analyticsCollector An {@link AnalyticsCollector}. + * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory, TrackSelector, + * MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)} instead. */ + @Deprecated public Builder( Context context, RenderersFactory renderersFactory, @@ -276,32 +200,23 @@ public class SimpleExoPlayer extends BasePlayer seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; livePlaybackSpeedControl = new DefaultLivePlaybackSpeedControl.Builder().build(); clock = Clock.DEFAULT; - releaseTimeoutMs = ExoPlayer.DEFAULT_RELEASE_TIMEOUT_MS; + releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS; detachSurfaceTimeoutMs = DEFAULT_DETACH_SURFACE_TIMEOUT_MS; } /** - * Set a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link - * #setForegroundMode} takes more than {@code timeoutMs} milliseconds to complete, the player - * will raise an error via {@link Player.Listener#onPlayerError}. - * - *

      This method is experimental, and will be renamed or removed in a future release. - * - * @param timeoutMs The time limit in milliseconds. + * @deprecated Use {@link ExoPlayer.Builder#experimentalSetForegroundModeTimeoutMs(long)} + * instead. */ + @Deprecated public Builder experimentalSetForegroundModeTimeoutMs(long timeoutMs) { Assertions.checkState(!buildCalled); foregroundModeTimeoutMs = timeoutMs; return this; } - /** - * Sets the {@link TrackSelector} that will be used by the player. - * - * @param trackSelector A {@link TrackSelector}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setTrackSelector(TrackSelector)} instead. */ + @Deprecated public Builder setTrackSelector(TrackSelector trackSelector) { Assertions.checkState(!buildCalled); this.trackSelector = trackSelector; @@ -309,52 +224,33 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Sets the {@link MediaSourceFactory} that will be used by the player. - * - * @param mediaSourceFactory A {@link MediaSourceFactory}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @deprecated Use {@link ExoPlayer.Builder#setMediaSourceFactory(MediaSourceFactory)} instead. */ + @Deprecated public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { Assertions.checkState(!buildCalled); this.mediaSourceFactory = mediaSourceFactory; return this; } - /** - * Sets the {@link LoadControl} that will be used by the player. - * - * @param loadControl A {@link LoadControl}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setLoadControl(LoadControl)} instead. */ + @Deprecated public Builder setLoadControl(LoadControl loadControl) { Assertions.checkState(!buildCalled); this.loadControl = loadControl; return this; } - /** - * Sets the {@link BandwidthMeter} that will be used by the player. - * - * @param bandwidthMeter A {@link BandwidthMeter}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setBandwidthMeter(BandwidthMeter)} instead. */ + @Deprecated public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { Assertions.checkState(!buildCalled); this.bandwidthMeter = bandwidthMeter; return this; } - /** - * Sets the {@link Looper} that must be used for all calls to the player and that is used to - * call listeners on. - * - * @param looper A {@link Looper}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setLooper(Looper)} instead. */ + @Deprecated public Builder setLooper(Looper looper) { Assertions.checkState(!buildCalled); this.looper = looper; @@ -362,12 +258,9 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Sets the {@link AnalyticsCollector} that will collect and forward all player events. - * - * @param analyticsCollector An {@link AnalyticsCollector}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @deprecated Use {@link ExoPlayer.Builder#setAnalyticsCollector(AnalyticsCollector)} instead. */ + @Deprecated public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { Assertions.checkState(!buildCalled); this.analyticsCollector = analyticsCollector; @@ -375,14 +268,10 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Sets an {@link PriorityTaskManager} that will be used by the player. - * - *

      The priority {@link C#PRIORITY_PLAYBACK} will be set while the player is loading. - * - * @param priorityTaskManager A {@link PriorityTaskManager}, or null to not use one. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @deprecated Use {@link ExoPlayer.Builder#setPriorityTaskManager(PriorityTaskManager)} + * instead. */ + @Deprecated public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { Assertions.checkState(!buildCalled); this.priorityTaskManager = priorityTaskManager; @@ -390,18 +279,10 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Sets {@link AudioAttributes} that will be used by the player and whether to handle audio - * focus. - * - *

      If audio focus should be handled, the {@link AudioAttributes#usage} must be {@link - * C#USAGE_MEDIA} or {@link C#USAGE_GAME}. Other usages will throw an {@link - * IllegalArgumentException}. - * - * @param audioAttributes {@link AudioAttributes}. - * @param handleAudioFocus Whether the player should handle audio focus. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @deprecated Use {@link ExoPlayer.Builder#setAudioAttributes(AudioAttributes, boolean)} + * instead. */ + @Deprecated public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { Assertions.checkState(!buildCalled); this.audioAttributes = audioAttributes; @@ -409,89 +290,40 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Sets the {@link C.WakeMode} that will be used by the player. - * - *

      Enabling this feature requires the {@link android.Manifest.permission#WAKE_LOCK} - * permission. It should be used together with a foreground {@link android.app.Service} for use - * cases where playback occurs and the screen is off (e.g. background audio playback). It is not - * useful when the screen will be kept on during playback (e.g. foreground video playback). - * - *

      When enabled, the locks ({@link android.os.PowerManager.WakeLock} / {@link - * android.net.wifi.WifiManager.WifiLock}) will be held whenever the player is in the {@link - * #STATE_READY} or {@link #STATE_BUFFERING} states with {@code playWhenReady = true}. The locks - * held depend on the specified {@link C.WakeMode}. - * - * @param wakeMode A {@link C.WakeMode}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setWakeMode(int)} instead. */ + @Deprecated public Builder setWakeMode(@C.WakeMode int wakeMode) { Assertions.checkState(!buildCalled); this.wakeMode = wakeMode; return this; } - /** - * Sets whether the player should pause automatically when audio is rerouted from a headset to - * device speakers. See the audio - * becoming noisy documentation for more information. - * - * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is - * rerouted from a headset to device speakers. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setHandleAudioBecomingNoisy(boolean)} instead. */ + @Deprecated public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { Assertions.checkState(!buildCalled); this.handleAudioBecomingNoisy = handleAudioBecomingNoisy; return this; } - /** - * Sets whether silences silences in the audio stream is enabled. - * - * @param skipSilenceEnabled Whether skipping silences is enabled. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setSkipSilenceEnabled(boolean)} instead. */ + @Deprecated public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { Assertions.checkState(!buildCalled); this.skipSilenceEnabled = skipSilenceEnabled; return this; } - /** - * Sets the {@link C.VideoScalingMode} that will be used by the player. - * - *

      The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is - * enabled and if the output surface is owned by a {@link SurfaceView}. - * - * @param videoScalingMode A {@link C.VideoScalingMode}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setVideoScalingMode(int)} instead. */ + @Deprecated public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { Assertions.checkState(!buildCalled); this.videoScalingMode = videoScalingMode; return this; } - /** - * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided - * with a video output {@link Surface}. - * - *

      The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. - * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to - * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link - * Surface#setFrameRate} from ExoPlayer, and should then call {@link Surface#setFrameRate} - * directly from application code. - * - * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setVideoChangeFrameRateStrategy(int)} instead. */ + @Deprecated public Builder setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { Assertions.checkState(!buildCalled); @@ -499,44 +331,24 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Sets whether media sources should be initialized lazily. - * - *

      If false, all initial preparation steps (e.g., manifest loads) happen immediately. If - * true, these initial preparations are triggered only when the player starts buffering the - * media. - * - * @param useLazyPreparation Whether to use lazy preparation. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setUseLazyPreparation(boolean)} instead. */ + @Deprecated public Builder setUseLazyPreparation(boolean useLazyPreparation) { Assertions.checkState(!buildCalled); this.useLazyPreparation = useLazyPreparation; return this; } - /** - * Sets the parameters that control how seek operations are performed. - * - * @param seekParameters The {@link SeekParameters}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setSeekParameters(SeekParameters)} instead. */ + @Deprecated public Builder setSeekParameters(SeekParameters seekParameters) { Assertions.checkState(!buildCalled); this.seekParameters = seekParameters; return this; } - /** - * Sets the {@link #seekBack()} increment. - * - * @param seekBackIncrementMs The seek back increment, in milliseconds. - * @return This builder. - * @throws IllegalArgumentException If {@code seekBackIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)} instead. */ + @Deprecated public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { checkArgument(seekBackIncrementMs > 0); Assertions.checkState(!buildCalled); @@ -544,14 +356,8 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Sets the {@link #seekForward()} increment. - * - * @param seekForwardIncrementMs The seek forward increment, in milliseconds. - * @return This builder. - * @throws IllegalArgumentException If {@code seekForwardIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setSeekForwardIncrementMs(long)} instead. */ + @Deprecated public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { checkArgument(seekForwardIncrementMs > 0); Assertions.checkState(!buildCalled); @@ -559,52 +365,24 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Sets a timeout for calls to {@link #release} and {@link #setForegroundMode}. - * - *

      If a call to {@link #release} or {@link #setForegroundMode} takes more than {@code - * timeoutMs} to complete, the player will report an error via {@link - * Player.Listener#onPlayerError}. - * - * @param releaseTimeoutMs The release timeout, in milliseconds. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setReleaseTimeoutMs(long)} instead. */ + @Deprecated public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { Assertions.checkState(!buildCalled); this.releaseTimeoutMs = releaseTimeoutMs; return this; } - /** - * Sets a timeout for detaching a surface from the player. - * - *

      If detaching a surface or replacing a surface takes more than {@code - * detachSurfaceTimeoutMs} to complete, the player will report an error via {@link - * Player.Listener#onPlayerError}. - * - * @param detachSurfaceTimeoutMs The timeout for detaching a surface, in milliseconds. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setDetachSurfaceTimeoutMs(long)} instead. */ + @Deprecated public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { Assertions.checkState(!buildCalled); this.detachSurfaceTimeoutMs = detachSurfaceTimeoutMs; return this; } - /** - * Sets whether to pause playback at the end of each media item. - * - *

      This means the player will pause at the end of each window in the current {@link - * #getCurrentTimeline() timeline}. Listeners will be informed by a call to {@link - * Player.Listener#onPlayWhenReadyChanged(boolean, int)} with the reason {@link - * Player#PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM} when this happens. - * - * @param pauseAtEndOfMediaItems Whether to pause playback at the end of each media item. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setPauseAtEndOfMediaItems(boolean)} instead. */ + @Deprecated public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { Assertions.checkState(!buildCalled); this.pauseAtEndOfMediaItems = pauseAtEndOfMediaItems; @@ -612,27 +390,18 @@ public class SimpleExoPlayer extends BasePlayer } /** - * Sets the {@link LivePlaybackSpeedControl} that will control the playback speed when playing - * live streams, in order to maintain a steady target offset from the live stream edge. - * - * @param livePlaybackSpeedControl The {@link LivePlaybackSpeedControl}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @deprecated Use {@link + * ExoPlayer.Builder#setLivePlaybackSpeedControl(LivePlaybackSpeedControl)} instead. */ + @Deprecated public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { Assertions.checkState(!buildCalled); this.livePlaybackSpeedControl = livePlaybackSpeedControl; return this; } - /** - * Sets the {@link Clock} that will be used by the player. Should only be set for testing - * purposes. - * - * @param clock A {@link Clock}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#setClock(Clock)} instead. */ + @Deprecated @VisibleForTesting public Builder setClock(Clock clock) { Assertions.checkState(!buildCalled); @@ -640,11 +409,8 @@ public class SimpleExoPlayer extends BasePlayer return this; } - /** - * Builds a {@link SimpleExoPlayer} instance. - * - * @throws IllegalStateException If this method has already been called. - */ + /** @deprecated Use {@link ExoPlayer.Builder#build()} instead. */ + @Deprecated public SimpleExoPlayer build() { Assertions.checkState(!buildCalled); buildCalled = true; @@ -706,6 +472,7 @@ public class SimpleExoPlayer extends BasePlayer /** @deprecated Use the {@link Builder} and pass it to {@link #SimpleExoPlayer(Builder)}. */ @Deprecated + @SuppressWarnings("deprecation") protected SimpleExoPlayer( Context context, RenderersFactory renderersFactory, @@ -730,6 +497,7 @@ public class SimpleExoPlayer extends BasePlayer } /** @param builder The {@link Builder} to obtain all construction parameters. */ + @SuppressWarnings("deprecation") protected SimpleExoPlayer(Builder builder) { constructorFinished = new ConditionVariable(); try { From c57bfcee93b6a2cf3eddf52c33c36ae7946a2b15 Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 11 Aug 2021 11:27:09 +0100 Subject: [PATCH 047/441] Move DASH multiple base URL release note The release note was put under 2.14.2 but the feature is released in 2.15.0. #minor-release PiperOrigin-RevId: 390093836 --- RELEASENOTES.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 98ac2c62e7..91dc983f48 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -101,6 +101,12 @@ available commands. * Update `DefaultControlDispatcher` `getRewindIncrementMs` and `getFastForwardIncrementMs` to take the player as parameter. +* DASH: + * Add support for multiple base URLs and DVB attributes in the manifest. + Apps that are using `DefaultLoadErrorHandlingPolicy` with such manifests + have base URL fallback automatically enabled + ([#771](https://github.com/google/ExoPlayer/issues/771), + [#7654](https://github.com/google/ExoPlayer/issues/7654)). * HLS: * Fix issue that could cause some playbacks to be stuck buffering ([#8850](https://github.com/google/ExoPlayer/issues/8850), @@ -193,12 +199,6 @@ ([#9158](https://github.com/google/ExoPlayer/issues/9158)). * Fix issue around TS synchronization when reading a file's duration ([#9100](https://github.com/google/ExoPlayer/pull/9100)). -* DASH: - * Add support for multiple base URLs and DVB attributes in the manifest. - Apps that are using `DefaultLoadErrorHandlingPolicy` with such manifests - have base URL fallback automatically enabled - ([#771](https://github.com/google/ExoPlayer/issues/771), - [#7654](https://github.com/google/ExoPlayer/issues/7654)). * HLS: * Fix issue where playback of a live event could become stuck rather than transitioning to `STATE_ENDED` when the event ends From 7dffb2dc4d98548f93d12e2b0c9bb57aa5311503 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 11 Aug 2021 15:09:43 +0100 Subject: [PATCH 048/441] Migrate to Player.Listener PiperOrigin-RevId: 390124675 --- .../com/google/android/exoplayer2/Player.java | 4 +- .../exoplayer2/ClippedPlaybackTest.java | 58 ++++++++----------- .../android/exoplayer2/ui/PlayerView.java | 2 +- .../exoplayer2/ui/StyledPlayerView.java | 2 +- .../robolectric/PlaybackOutput.java | 15 ++++- .../robolectric/TestPlayerRunHelper.java | 3 +- 6 files changed, 41 insertions(+), 43 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index bbd8d9237c..1a51a89baf 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -140,7 +140,7 @@ public interface Player { * *

      The provided {@link MediaMetadata} is a combination of the {@link MediaItem#mediaMetadata} * and the static and dynamic metadata from the {@link TrackSelection#getFormat(int) track - * selections' formats} and {@link MetadataOutput#onMetadata(Metadata)}. + * selections' formats} and {@link Listener#onMetadata(Metadata)}. * *

      {@link #onEvents(Player, Events)} will also be called to report this event along with * other events that happen in the same {@link Looper} message queue iteration. @@ -1924,7 +1924,7 @@ public interface Player { * *

      This {@link MediaMetadata} is a combination of the {@link MediaItem#mediaMetadata} and the * static and dynamic metadata from the {@link TrackSelection#getFormat(int) track selections' - * formats} and {@link MetadataOutput#onMetadata(Metadata)}. + * formats} and {@link Listener#onMetadata(Metadata)}. */ MediaMetadata getMediaMetadata(); diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index e5a2fac4d9..81d39c65c2 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -22,7 +22,6 @@ import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.source.ClippingMediaSource; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; @@ -56,34 +55,22 @@ public final class ClippedPlaybackTest { .setClipEndPositionMs(1000) .build(); AtomicReference player = new AtomicReference<>(); - CapturingTextOutput textOutput = new CapturingTextOutput(); - ConditionVariable playbackEnded = new ConditionVariable(); + TextCapturingPlaybackListener textCapturer = new TextCapturingPlaybackListener(); getInstrumentation() .runOnMainSync( () -> { player.set(new SimpleExoPlayer.Builder(getInstrumentation().getContext()).build()); - player.get().addTextOutput(textOutput); - player - .get() - .addListener( - new Player.Listener() { - @Override - public void onPlaybackStateChanged(@Player.State int playbackState) { - if (playbackState == Player.STATE_ENDED) { - playbackEnded.open(); - } - } - }); + player.get().addListener(textCapturer); player.get().setMediaItem(mediaItem); player.get().prepare(); player.get().play(); }); - playbackEnded.block(); + textCapturer.block(); getInstrumentation().runOnMainSync(() -> player.get().release()); getInstrumentation().waitForIdleSync(); - assertThat(Iterables.getOnlyElement(Iterables.concat(textOutput.cues)).text.toString()) + assertThat(Iterables.getOnlyElement(Iterables.concat(textCapturer.cues)).text.toString()) .isEqualTo("This is the first subtitle."); } @@ -110,42 +97,32 @@ public final class ClippedPlaybackTest { .setClipEndPositionMs(4_000) .build()); AtomicReference player = new AtomicReference<>(); - CapturingTextOutput textOutput = new CapturingTextOutput(); - ConditionVariable playbackEnded = new ConditionVariable(); + TextCapturingPlaybackListener textCapturer = new TextCapturingPlaybackListener(); getInstrumentation() .runOnMainSync( () -> { player.set(new SimpleExoPlayer.Builder(getInstrumentation().getContext()).build()); - player.get().addTextOutput(textOutput); - player - .get() - .addListener( - new Player.Listener() { - @Override - public void onPlaybackStateChanged(@Player.State int playbackState) { - if (playbackState == Player.STATE_ENDED) { - playbackEnded.open(); - } - } - }); + player.get().addListener(textCapturer); player.get().setMediaItems(mediaItems); player.get().prepare(); player.get().play(); }); - playbackEnded.block(); + textCapturer.block(); getInstrumentation().runOnMainSync(() -> player.get().release()); getInstrumentation().waitForIdleSync(); - assertThat(Iterables.getOnlyElement(Iterables.concat(textOutput.cues)).text.toString()) + assertThat(Iterables.getOnlyElement(Iterables.concat(textCapturer.cues)).text.toString()) .isEqualTo("This is the first subtitle."); } - private static class CapturingTextOutput implements TextOutput { + private static class TextCapturingPlaybackListener implements Player.Listener { + private final ConditionVariable playbackEnded; private final List> cues; - private CapturingTextOutput() { + private TextCapturingPlaybackListener() { + playbackEnded = new ConditionVariable(); cues = new ArrayList<>(); } @@ -153,5 +130,16 @@ public final class ClippedPlaybackTest { public void onCues(List cues) { this.cues.add(cues); } + + @Override + public void onPlaybackStateChanged(@Player.State int playbackState) { + if (playbackState == Player.STATE_ENDED) { + playbackEnded.open(); + } + } + + public void block() throws InterruptedException { + playbackEnded.block(); + } } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 530b81e138..4ef12414d0 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -1490,7 +1490,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { @Override public void onCues(List cues) { if (subtitleView != null) { - subtitleView.onCues(cues); + subtitleView.setCues(cues); } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index b5a2822c8d..2fb299048b 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -1531,7 +1531,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { @Override public void onCues(List cues) { if (subtitleView != null) { - subtitleView.onCues(cues); + subtitleView.setCues(cues); } } diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java index 2724835e4e..0fe00c4110 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.robolectric; import android.graphics.Bitmap; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable; @@ -63,8 +64,18 @@ public final class PlaybackOutput implements Dumper.Dumpable { // TODO: Consider passing playback position into MetadataOutput and TextOutput. Calling // player.getCurrentPosition() inside onMetadata/Cues will likely be non-deterministic // because renderer-thread != playback-thread. - player.addMetadataOutput(metadatas::add); - // TODO(internal b/174661563): Output subtitle data when it's not flaky. + player.addListener( + new Player.Listener() { + @Override + public void onMetadata(Metadata metadata) { + metadatas.add(metadata); + } + + @Override + public void onCues(List cues) { + // TODO(internal b/174661563): Output subtitle data when it's not flaky. + } + }); } /** diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java index a58af6b55b..c31a310de0 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java @@ -27,7 +27,6 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoListener; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -252,7 +251,7 @@ public class TestPlayerRunHelper { } /** - * Runs tasks of the main {@link Looper} until the {@link VideoListener#onRenderedFirstFrame} + * Runs tasks of the main {@link Looper} until the {@link Player.Listener#onRenderedFirstFrame} * callback is called or a playback error occurs. * *

      If a playback error occurs it will be thrown wrapped in an {@link IllegalStateException}.. From 01613a2e55af1c5bfc414f06e9d2f73e8f3f277b Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 11 Aug 2021 15:48:29 +0100 Subject: [PATCH 049/441] Remove usages of deprecated SimpleExoPlayer.Builder PiperOrigin-RevId: 390130681 --- .../android/exoplayer2/castdemo/PlayerManager.java | 3 ++- .../android/exoplayer2/gldemo/MainActivity.java | 3 ++- .../android/exoplayer2/demo/PlayerActivity.java | 3 ++- .../exoplayer2/surfacedemo/MainActivity.java | 3 ++- docs/ad-insertion.md | 2 +- docs/analytics.md | 2 +- docs/customization.md | 10 +++++----- docs/dash.md | 4 ++-- docs/downloading-media.md | 2 +- docs/hello-world.md | 8 ++++---- docs/hls.md | 4 ++-- docs/live-streaming.md | 4 ++-- docs/media-sources.md | 2 +- docs/network-stacks.md | 2 +- docs/progressive.md | 4 ++-- docs/rtsp.md | 4 ++-- docs/shrinking.md | 12 ++++++------ docs/smoothstreaming.md | 4 ++-- docs/track-selection.md | 2 +- docs/ui-components.md | 4 ++-- extensions/av1/README.md | 14 +++++++------- extensions/ffmpeg/README.md | 13 ++++++------- extensions/flac/README.md | 13 ++++++------- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 3 ++- .../ext/leanback/LeanbackPlayerAdapter.java | 2 +- .../exoplayer2/ext/media2/PlayerTestRule.java | 3 ++- .../ext/media2/SessionPlayerConnectorTest.java | 6 +++--- .../exoplayer2/ext/media2/PlayerWrapper.java | 2 +- .../ext/media2/SessionPlayerConnector.java | 2 +- .../ext/mediasession/MediaSessionConnector.java | 14 +++++++------- extensions/opus/README.md | 13 ++++++------- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 3 ++- extensions/vp9/README.md | 14 +++++++------- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 3 ++- .../android/exoplayer2/ClippedPlaybackTest.java | 4 ++-- .../android/exoplayer2/SimpleExoPlayerTest.java | 12 ++++++------ .../analytics/AnalyticsCollectorTest.java | 3 ++- .../exoplayer2/e2etest/EndToEndGaplessTest.java | 3 ++- .../exoplayer2/e2etest/FlacPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/FlvPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/MkaPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/MkvPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/Mp3PlaybackTest.java | 3 ++- .../exoplayer2/e2etest/Mp4PlaybackTest.java | 3 ++- .../exoplayer2/e2etest/OggPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/PlaylistPlaybackTest.java | 5 +++-- .../exoplayer2/e2etest/SilencePlaybackTest.java | 5 +++-- .../android/exoplayer2/e2etest/TsPlaybackTest.java | 3 ++- .../exoplayer2/e2etest/Vp9PlaybackTest.java | 3 ++- .../exoplayer2/e2etest/WavPlaybackTest.java | 3 ++- .../ads/ServerSideInsertedAdMediaSourceTest.java | 11 +++++------ .../source/dash/e2etest/DashPlaybackTest.java | 5 +++-- .../exoplayer2/source/rtsp/RtspPlaybackTest.java | 3 ++- .../exoplayer2/transformer/Transformer.java | 3 ++- .../android/exoplayer2/ui/PlayerControlView.java | 4 ++-- .../exoplayer2/ui/PlayerNotificationManager.java | 8 ++++---- .../google/android/exoplayer2/ui/PlayerView.java | 4 ++-- .../exoplayer2/ui/StyledPlayerControlView.java | 3 +-- .../android/exoplayer2/ui/StyledPlayerView.java | 4 ++-- .../playbacktests/gts/DashTestRunner.java | 3 ++- .../android/exoplayer2/testutil/ExoHostedTest.java | 2 +- .../exoplayer2/testutil/TestExoPlayerBuilder.java | 3 ++- 62 files changed, 162 insertions(+), 140 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index f1df1c32d5..711550c923 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -21,6 +21,7 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; @@ -94,7 +95,7 @@ import java.util.ArrayList; currentItemIndex = C.INDEX_UNSET; trackSelector = new DefaultTrackSelector(context); - exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); + exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); exoPlayer.addListener(this); localPlayerView.setPlayer(exoPlayer); diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index abccb41c49..7488d94f98 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -24,6 +24,7 @@ import android.widget.FrameLayout; import android.widget.Toast; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -172,7 +173,7 @@ public final class MainActivity extends Activity { throw new IllegalStateException(); } - SimpleExoPlayer player = new SimpleExoPlayer.Builder(getApplicationContext()).build(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setRepeatMode(Player.REPEAT_MODE_ALL); player.setMediaSource(mediaSource); player.prepare(); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 48748f2c08..c918603931 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -32,6 +32,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -272,7 +273,7 @@ public class PlayerActivity extends AppCompatActivity trackSelector.setParameters(trackSelectorParameters); lastSeenTrackGroupArray = null; player = - new SimpleExoPlayer.Builder(/* context= */ this, renderersFactory) + new ExoPlayer.Builder(/* context= */ this, renderersFactory) .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) .build(); diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index 6a40cd48a4..44dd9d423b 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -28,6 +28,7 @@ import android.widget.Button; import android.widget.GridLayout; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -216,7 +217,7 @@ public final class MainActivity extends Activity { } else { throw new IllegalStateException(); } - SimpleExoPlayer player = new SimpleExoPlayer.Builder(getApplicationContext()).build(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setMediaSource(mediaSource); player.prepare(); player.play(); diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 972f07a9c5..be1371f201 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -49,7 +49,7 @@ MediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setAdsLoaderProvider(adsLoaderProvider) .setAdViewProvider(playerView); -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); ~~~ diff --git a/docs/analytics.md b/docs/analytics.md index 5451d8a992..2a819fe2e3 100644 --- a/docs/analytics.md +++ b/docs/analytics.md @@ -246,7 +246,7 @@ class ExtendedCollector extends AnalyticsCollector { } // Usage - Setup and listener registration. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setAnalyticsCollector(new ExtendedCollector()) .build(); player.addAnalyticsListener(new ExtendedListener() { diff --git a/docs/customization.md b/docs/customization.md index 38024a816b..7cf0077b5d 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -60,7 +60,7 @@ DefaultDataSource.Factory dataSourceFactory = // Inject the DefaultDataSourceFactory when creating the player. SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); ~~~ @@ -82,7 +82,7 @@ DataSource.Factory cacheDataSourceFactory = .setCache(simpleCache) .setUpstreamDataSourceFactory(httpDataSourceFactory); -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(cacheDataSourceFactory)) .build(); @@ -107,7 +107,7 @@ DataSource.Factory dataSourceFactory = () -> { return dataSource; }; -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); ~~~ @@ -158,7 +158,7 @@ LoadErrorHandlingPolicy loadErrorHandlingPolicy = }; SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context) .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy)) @@ -181,7 +181,7 @@ DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory() .setMp3ExtractorFlags(Mp3Extractor.FLAG_ENABLE_INDEX_SEEKING); -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context, extractorsFactory)) .build(); diff --git a/docs/dash.md b/docs/dash.md index 01bf698455..57159c0d6e 100644 --- a/docs/dash.md +++ b/docs/dash.md @@ -17,7 +17,7 @@ You can then create a `MediaItem` for a DASH MPD URI and pass it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. @@ -45,7 +45,7 @@ MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/downloading-media.md b/docs/downloading-media.md index d696520a2f..d18438c77b 100644 --- a/docs/downloading-media.md +++ b/docs/downloading-media.md @@ -322,7 +322,7 @@ DataSource.Factory cacheDataSourceFactory = .setUpstreamDataSourceFactory(httpDataSourceFactory) .setCacheWriteDataSinkFactory(null); // Disable writing. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(cacheDataSourceFactory)) .build(); diff --git a/docs/hello-world.md b/docs/hello-world.md index 80dd002825..d6986c52be 100644 --- a/docs/hello-world.md +++ b/docs/hello-world.md @@ -92,12 +92,12 @@ to prevent build errors. ## Creating the player ## -You can create an `ExoPlayer` instance using `SimpleExoPlayer.Builder`, which -provides a range of customization options. The code below is the simplest -example of creating an instance. +You can create an `ExoPlayer` instance using `ExoPlayer.Builder`, which provides +a range of customization options. The code below is the simplest example of +creating an instance. ~~~ -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); ~~~ {: .language-java} diff --git a/docs/hls.md b/docs/hls.md index bc017ae74d..f3bd225b09 100644 --- a/docs/hls.md +++ b/docs/hls.md @@ -18,7 +18,7 @@ player. ~~~ // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)); // Prepare the player. @@ -48,7 +48,7 @@ HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(hlsUri)); // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(hlsMediaSource); // Prepare the player. diff --git a/docs/live-streaming.md b/docs/live-streaming.md index 4756296e2b..368ae11afc 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -97,7 +97,7 @@ values will override parameters defined by the media. ~~~ // Global settings. SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000)) .build(); @@ -164,7 +164,7 @@ instance can be set when building the player: ~~~ SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( new DefaultLivePlaybackSpeedControl.Builder() .setFallbackMaxPlaybackSpeed(1.04f) diff --git a/docs/media-sources.md b/docs/media-sources.md index 4cc6376303..c280739342 100644 --- a/docs/media-sources.md +++ b/docs/media-sources.md @@ -37,7 +37,7 @@ MediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(cacheDataSourceFactory) .setAdsLoaderProvider(adsLoaderProvider) .setAdViewProvider(playerView); -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context) +SimpleExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); ~~~ diff --git a/docs/network-stacks.md b/docs/network-stacks.md index ee89344bad..b2db3a65b3 100644 --- a/docs/network-stacks.md +++ b/docs/network-stacks.md @@ -50,7 +50,7 @@ DefaultDataSource.Factory dataSourceFactory = // Inject the DefaultDataSourceFactory when creating the player. SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); ~~~ diff --git a/docs/progressive.md b/docs/progressive.md index 061e9cf522..cf9e242ba1 100644 --- a/docs/progressive.md +++ b/docs/progressive.md @@ -11,7 +11,7 @@ it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(progressiveUri)); // Prepare the player. @@ -31,7 +31,7 @@ DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(progressiveUri)); // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/rtsp.md b/docs/rtsp.md index 9c56cc9614..7af42ec888 100644 --- a/docs/rtsp.md +++ b/docs/rtsp.md @@ -17,7 +17,7 @@ You can then create a `MediaItem` for an RTSP URI and pass it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(rtspUri)); // Prepare the player. @@ -43,7 +43,7 @@ MediaSource mediaSource = new RtspMediaSource.Factory() .createMediaSource(MediaItem.fromUri(rtspUri)); // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/shrinking.md b/docs/shrinking.md index 57e96386f8..53e753dc15 100644 --- a/docs/shrinking.md +++ b/docs/shrinking.md @@ -59,7 +59,7 @@ RenderersFactory audioOnlyRenderersFactory = context, MediaCodecSelector.DEFAULT, handler, audioListener) }; SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, audioOnlyRenderersFactory).build(); + new ExoPlayer.Builder(context, audioOnlyRenderersFactory).build(); ~~~ {: .language-java} @@ -81,14 +81,14 @@ an app that only needs to play mp4 files can provide a factory like: ExtractorsFactory mp4ExtractorFactory = () -> new Extractor[] {new Mp4Extractor()}; SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, mp4ExtractorFactory).build(); + new ExoPlayer.Builder(context, mp4ExtractorFactory).build(); ~~~ {: .language-java} This will allow other `Extractor` implementations to be removed by code shrinking, which can result in a significant reduction in size. -You should pass `ExtractorsFactory.EMPTY` to the `SimpleExoPlayer.Builder` +You should pass `ExtractorsFactory.EMPTY` to the `ExoPlayer.Builder` constructor, if your app is doing one of the following: * Not playing progressive media at all, for example because it only @@ -99,18 +99,18 @@ constructor, if your app is doing one of the following: ~~~ // Only playing DASH, HLS or SmoothStreaming. SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); + new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); // Providing a customized `DefaultMediaSourceFactory` SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, ExtractorsFactory.EMPTY) + new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY) .setMediaSourceFactory( new DefaultMediaSourceFactory(context, customExtractorsFactory)) .build(); // Using a MediaSource directly. SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); + new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory( dataSourceFactory, customExtractorsFactory) diff --git a/docs/smoothstreaming.md b/docs/smoothstreaming.md index 67c04cbd49..6039046731 100644 --- a/docs/smoothstreaming.md +++ b/docs/smoothstreaming.md @@ -19,7 +19,7 @@ to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(ssUri)); // Prepare the player. @@ -47,7 +47,7 @@ MediaSource mediaSource = new SsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(ssUri)); // Create a player instance. -SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); +SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/track-selection.md b/docs/track-selection.md index 0a525ecff0..206ccbf8fb 100644 --- a/docs/track-selection.md +++ b/docs/track-selection.md @@ -9,7 +9,7 @@ of which can be provided whenever an `ExoPlayer` is built. ~~~ DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setTrackSelector(trackSelector) .build(); ~~~ diff --git a/docs/ui-components.md b/docs/ui-components.md index c8942e86da..79078b1731 100644 --- a/docs/ui-components.md +++ b/docs/ui-components.md @@ -70,7 +70,7 @@ When a player has been initialized, it can be attached to the view by calling ~~~ // Instantiate the player. -player = new SimpleExoPlayer.Builder(context).build(); +player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media source to be played. @@ -157,7 +157,7 @@ protected void onCreate(Bundle savedInstanceState) { private void initializePlayer() { // Instantiate the player. - player = new SimpleExoPlayer.Builder(context).build(); + player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerControlView.setPlayer(player); // Prepare the player with the dash media source. diff --git a/extensions/av1/README.md b/extensions/av1/README.md index 8e11a5e2e7..fad332a00e 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -74,13 +74,13 @@ Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `Libgav1VideoRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `SimpleExoPlayer.Builder`, - you can enable using the extension by setting the `extensionRendererMode` - parameter of the `DefaultRenderersFactory` constructor to - `EXTENSION_RENDERER_MODE_ON`. This will use `Libgav1VideoRenderer` for - playback if `MediaCodecVideoRenderer` doesn't support decoding the input AV1 - stream. Pass `EXTENSION_RENDERER_MODE_PREFER` to give `Libgav1VideoRenderer` - priority over `MediaCodecVideoRenderer`. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can + enable using the extension by setting the `extensionRendererMode` parameter of + the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. + This will use `Libgav1VideoRenderer` for playback if `MediaCodecVideoRenderer` + doesn't support decoding the input AV1 stream. Pass + `EXTENSION_RENDERER_MODE_PREFER` to give `Libgav1VideoRenderer` priority over + `MediaCodecVideoRenderer`. * If you've subclassed `DefaultRenderersFactory`, add a `Libvgav1VideoRenderer` to the output list in `buildVideoRenderers`. ExoPlayer will use the first `Renderer` in the list that supports the input media format. diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index 77dbc2588d..ad3481c4f6 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -90,13 +90,12 @@ Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `FfmpegAudioRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `SimpleExoPlayer.Builder`, - you can enable using the extension by setting the `extensionRendererMode` - parameter of the `DefaultRenderersFactory` constructor to - `EXTENSION_RENDERER_MODE_ON`. This will use `FfmpegAudioRenderer` for playback - if `MediaCodecAudioRenderer` doesn't support the input format. Pass - `EXTENSION_RENDERER_MODE_PREFER` to give `FfmpegAudioRenderer` priority over - `MediaCodecAudioRenderer`. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can + enable using the extension by setting the `extensionRendererMode` parameter of + the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. + This will use `FfmpegAudioRenderer` for playback if `MediaCodecAudioRenderer` + doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to + give `FfmpegAudioRenderer` priority over `MediaCodecAudioRenderer`. * If you've subclassed `DefaultRenderersFactory`, add an `FfmpegAudioRenderer` to the output list in `buildAudioRenderers`. ExoPlayer will use the first `Renderer` in the list that supports the input media format. diff --git a/extensions/flac/README.md b/extensions/flac/README.md index 074daca71e..8b58a3fc6b 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -75,13 +75,12 @@ renderer. ### Using `LibflacAudioRenderer` ### -* If you're passing a `DefaultRenderersFactory` to `SimpleExoPlayer.Builder`, - you can enable using the extension by setting the `extensionRendererMode` - parameter of the `DefaultRenderersFactory` constructor to - `EXTENSION_RENDERER_MODE_ON`. This will use `LibflacAudioRenderer` for - playback if `MediaCodecAudioRenderer` doesn't support the input format. Pass - `EXTENSION_RENDERER_MODE_PREFER` to give `LibflacAudioRenderer` priority over - `MediaCodecAudioRenderer`. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can + enable using the extension by setting the `extensionRendererMode` parameter of + the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. + This will use `LibflacAudioRenderer` for playback if `MediaCodecAudioRenderer` + doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to + give `LibflacAudioRenderer` priority over `MediaCodecAudioRenderer`. * If you've subclassed `DefaultRenderersFactory`, add a `LibflacAudioRenderer` to the output list in `buildAudioRenderers`. ExoPlayer will use the first `Renderer` in the list that supports the input media format. diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index ecf7d5f934..f5886505a9 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -23,6 +23,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -116,7 +117,7 @@ public class FlacPlaybackTest { new Renderer[] { new LibflacAudioRenderer(eventHandler, audioRendererEventListener, audioSink) }; - player = new SimpleExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index f38fe14f20..f0d7b246a4 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -79,7 +79,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab /** * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also * customize some operations when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(@Nullable ControlDispatcher controlDispatcher) { diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index 89a58312ef..0dc6b89238 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -21,6 +21,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.platform.app.InstrumentationRegistry; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.upstream.DataSource; @@ -69,7 +70,7 @@ import org.junit.rules.ExternalResource; DataSource.Factory dataSourceFactory = new InstrumentingDataSourceFactory(context); exoPlayer = - new SimpleExoPlayer.Builder(context) + new ExoPlayer.Builder(context) .setLooper(Looper.myLooper()) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java index d8e29cc79f..5e78ba99a2 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java @@ -44,6 +44,7 @@ import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -169,7 +170,7 @@ public class SessionPlayerConnectorTest { SimpleExoPlayer simpleExoPlayer = null; SessionPlayerConnector playerConnector = null; try { - simpleExoPlayer = new SimpleExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); playerConnector = new SessionPlayerConnector(simpleExoPlayer, new DefaultMediaItemConverter()); playerConnector.setControlDispatcher(controlDispatcher); @@ -194,8 +195,7 @@ public class SessionPlayerConnectorTest { Player forwardingPlayer = null; SessionPlayerConnector playerConnector = null; try { - Player simpleExoPlayer = - new SimpleExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + Player simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); forwardingPlayer = new ForwardingPlayer(simpleExoPlayer) { @Override diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java index 4b25db5643..739029a20e 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java @@ -166,7 +166,7 @@ import java.util.List; /** * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also * customize some operations when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java index e2eb6d1134..b26ecf1193 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java @@ -116,7 +116,7 @@ public final class SessionPlayerConnector extends SessionPlayer { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also * customize some operations when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 3c461c8853..e1bc902dc3 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -176,7 +176,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param command The command name. * @param extras Optional parameters for the command, may be null. * @param cb A result receiver to which a result may be sent by the command, may be null. @@ -299,7 +299,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ void onSkipToPrevious(Player player, @Deprecated ControlDispatcher controlDispatcher); /** @@ -309,7 +309,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ void onSkipToQueueItem(Player player, @Deprecated ControlDispatcher controlDispatcher, long id); /** @@ -319,7 +319,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ void onSkipToNext(Player player, @Deprecated ControlDispatcher controlDispatcher); } @@ -377,7 +377,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param mediaButtonEvent The {@link Intent}. * @return True if the event was handled, false otherwise. */ @@ -397,7 +397,7 @@ public final class MediaSessionConnector { * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or * when configuring the player (for example by using {@code - * SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param action The name of the action which was sent by a media controller. * @param extras Optional extras sent by a media controller, may be null. */ @@ -562,7 +562,7 @@ public final class MediaSessionConnector { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@code SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@code ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/extensions/opus/README.md b/extensions/opus/README.md index 4daff54abf..29c4a46357 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -79,13 +79,12 @@ Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `LibopusAudioRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `SimpleExoPlayer.Builder`, - you can enable using the extension by setting the `extensionRendererMode` - parameter of the `DefaultRenderersFactory` constructor to - `EXTENSION_RENDERER_MODE_ON`. This will use `LibopusAudioRenderer` for - playback if `MediaCodecAudioRenderer` doesn't support the input format. Pass - `EXTENSION_RENDERER_MODE_PREFER` to give `LibopusAudioRenderer` priority over - `MediaCodecAudioRenderer`. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can + enable using the extension by setting the `extensionRendererMode` parameter of + the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. + This will use `LibopusAudioRenderer` for playback if `MediaCodecAudioRenderer` + doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to + give `LibopusAudioRenderer` priority over `MediaCodecAudioRenderer`. * If you've subclassed `DefaultRenderersFactory`, add a `LibopusAudioRenderer` to the output list in `buildAudioRenderers`. ExoPlayer will use the first `Renderer` in the list that supports the input media format. diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 0ca53d4b41..a398399068 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -23,6 +23,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -96,7 +97,7 @@ public class OpusPlaybackTest { textRendererOutput, metadataRendererOutput) -> new Renderer[] {new LibopusAudioRenderer(eventHandler, audioRendererEventListener)}; - player = new SimpleExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index 84f3f01326..557e7e6d70 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -89,13 +89,13 @@ Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `LibvpxVideoRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `SimpleExoPlayer.Builder`, - you can enable using the extension by setting the `extensionRendererMode` - parameter of the `DefaultRenderersFactory` constructor to - `EXTENSION_RENDERER_MODE_ON`. This will use `LibvpxVideoRenderer` for playback - if `MediaCodecVideoRenderer` doesn't support decoding the input VP9 stream. - Pass `EXTENSION_RENDERER_MODE_PREFER` to give `LibvpxVideoRenderer` priority - over `MediaCodecVideoRenderer`. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can + enable using the extension by setting the `extensionRendererMode` parameter of + the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. + This will use `LibvpxVideoRenderer` for playback if `MediaCodecVideoRenderer` + doesn't support decoding the input VP9 stream. Pass + `EXTENSION_RENDERER_MODE_PREFER` to give `LibvpxVideoRenderer` priority over + `MediaCodecVideoRenderer`. * If you've subclassed `DefaultRenderersFactory`, add a `LibvpxVideoRenderer` to the output list in `buildVideoRenderers`. ExoPlayer will use the first `Renderer` in the list that supports the input media format. diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 37b4d4110b..544418bd51 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -24,6 +24,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -130,7 +131,7 @@ public class VpxPlaybackTest { videoRendererEventListener, /* maxDroppedFramesToNotify= */ -1) }; - player = new SimpleExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index 81d39c65c2..001c3d69c9 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -59,7 +59,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new SimpleExoPlayer.Builder(getInstrumentation().getContext()).build()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); player.get().addListener(textCapturer); player.get().setMediaItem(mediaItem); player.get().prepare(); @@ -101,7 +101,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new SimpleExoPlayer.Builder(getInstrumentation().getContext()).build()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); player.get().addListener(textCapturer); player.get().setMediaItems(mediaItems); player.get().prepare(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java index 4fb49e8b79..15bd503925 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java @@ -52,7 +52,7 @@ public class SimpleExoPlayerTest { public void builder_inBackgroundThread_doesNotThrow() throws Exception { Thread builderThread = new Thread( - () -> new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); + () -> new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); AtomicReference builderThrow = new AtomicReference<>(); builderThread.setUncaughtExceptionHandler((thread, throwable) -> builderThrow.set(throwable)); @@ -65,7 +65,7 @@ public class SimpleExoPlayerTest { @Test public void onPlaylistMetadataChanged_calledWhenPlaylistMetadataSet() { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener playerListener = mock(Player.Listener.class); player.addListener(playerListener); AnalyticsListener analyticsListener = mock(AnalyticsListener.class); @@ -81,7 +81,7 @@ public class SimpleExoPlayerTest { @Test public void release_triggersAllPendingEventsInAnalyticsListeners() throws Exception { SimpleExoPlayer player = - new SimpleExoPlayer.Builder( + new ExoPlayer.Builder( ApplicationProvider.getApplicationContext(), (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) @@ -107,7 +107,7 @@ public class SimpleExoPlayerTest { public void releaseAfterRendererEvents_triggersPendingVideoEventsInListener() throws Exception { Surface surface = new Surface(new SurfaceTexture(/* texName= */ 0)); SimpleExoPlayer player = - new SimpleExoPlayer.Builder( + new ExoPlayer.Builder( ApplicationProvider.getApplicationContext(), (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) @@ -133,7 +133,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingVolumeEventInListener() throws Exception { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); @@ -147,7 +147,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingDeviceVolumeEventsInListener() { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 549fa0cd5b..8cd72a140f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -69,6 +69,7 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; @@ -1944,7 +1945,7 @@ public final class AnalyticsCollectorTest { public void recursiveListenerInvocation_arrivesInCorrectOrder() { AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); analyticsCollector.setPlayer( - new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), Looper.myLooper()); AnalyticsListener listener1 = mock(AnalyticsListener.class); AnalyticsListener listener2 = diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java index b4574a6b7f..3e2422f064 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java @@ -22,6 +22,7 @@ import android.media.AudioFormat; import android.media.MediaFormat; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; @@ -87,7 +88,7 @@ public class EndToEndGaplessTest { @Test public void testPlayback_twoIdenticalMp3Files() throws Exception { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()) + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java index 200b071e75..779199c7a7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -64,7 +65,7 @@ public class FlacPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java index 8a414ced43..51e9051b60 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -55,7 +56,7 @@ public final class FlvPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java index 081a6a5658..a3e2c1c32e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -57,7 +58,7 @@ public final class MkaPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index 2d6bd31fdd..398d6c05d4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -61,7 +62,7 @@ public final class MkvPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java index 773f274388..53a2d62de7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -60,7 +61,7 @@ public final class Mp3PlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java index 557f00f64d..ccb6ca9961 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -77,7 +78,7 @@ public class Mp4PlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, renderersFactory) + new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java index 88c2e14c61..3966dd59ca 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -58,7 +59,7 @@ public final class OggPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java index 9d2316e37f..a5ecc58580 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -45,7 +46,7 @@ public final class PlaylistPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -67,7 +68,7 @@ public final class PlaylistPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java index f7f9da385a..7acd02fc66 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; @@ -45,7 +46,7 @@ public final class SilencePlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -66,7 +67,7 @@ public final class SilencePlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java index 5ac951f51b..fc741e0710 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -81,7 +82,7 @@ public class TsPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java index 9c29e27808..01f12d272d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -59,7 +60,7 @@ public final class Vp9PlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java index 6391547433..451a9d9f8b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.e2etest; import android.content.Context; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -52,7 +53,7 @@ public final class WavPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java index 1169522103..d93f802190 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java @@ -35,6 +35,7 @@ import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -143,7 +144,7 @@ public final class ServerSideInsertedAdMediaSourceTest { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, renderersFactory) + new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); @@ -202,7 +203,7 @@ public final class ServerSideInsertedAdMediaSourceTest { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, renderersFactory) + new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); @@ -262,7 +263,7 @@ public final class ServerSideInsertedAdMediaSourceTest { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context, renderersFactory) + new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); @@ -319,9 +320,7 @@ public final class ServerSideInsertedAdMediaSourceTest { public void playbackWithSeek_isHandledCorrectly() throws Exception { Context context = ApplicationProvider.getApplicationContext(); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(context) - .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + new ExoPlayer.Builder(context).setClock(new FakeClock(/* isAutoAdvancing= */ true)).build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); ServerSideInsertedAdsMediaSource mediaSource = diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index e3615d8f8e..053fd707e4 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -22,6 +22,7 @@ import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -51,7 +52,7 @@ public final class DashPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); @@ -78,7 +79,7 @@ public final class DashPlaybackTest { CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java index 61cde4a725..4fd7361444 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java @@ -25,6 +25,7 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -150,7 +151,7 @@ public final class RtspPlaybackTest { private SimpleExoPlayer createSimpleExoPlayer( int serverRtspPortNumber, RtpDataChannel.Factory rtpDataChannelFactory) { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(applicationContext, capturingRenderersFactory) + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(clock) .build(); player.setMediaSource( diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 57583c79ad..bb36733a48 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -37,6 +37,7 @@ import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -477,7 +478,7 @@ public final class Transformer { DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10) .build(); player = - new SimpleExoPlayer.Builder( + new ExoPlayer.Builder( context, new TransformerRenderersFactory(muxerWrapper, transformation)) .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index dd8a6d212f..2c1e469d81 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -47,12 +47,12 @@ import android.widget.TextView; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; import com.google.android.exoplayer2.Player.State; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.RepeatModeUtil; @@ -603,7 +603,7 @@ public class PlayerControlView extends FrameLayout { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 53d989d9d6..f6ccf5a77a 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -53,9 +53,9 @@ import androidx.media.app.NotificationCompat.MediaStyle; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.util.NotificationUtil; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; @@ -819,9 +819,9 @@ public class PlayerNotificationManager { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}), or configure whether the - * rewind and fast forward actions should be used with {{@link #setUseRewindAction(boolean)}} - * and {@link #setUseFastForwardAction(boolean)}. + * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}), or configure whether the rewind + * and fast forward actions should be used with {{@link #setUseRewindAction(boolean)}} and + * {@link #setUseFastForwardAction(boolean)}. */ @Deprecated public final void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 4ef12414d0..fa454a1813 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -47,13 +47,13 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -931,7 +931,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 8a4b6ae9a9..45786b1eaa 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -65,7 +65,6 @@ import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; import com.google.android.exoplayer2.Player.State; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -836,7 +835,7 @@ public class StyledPlayerControlView extends FrameLayout { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 2fb299048b..cb8e95997c 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -48,13 +48,13 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -949,7 +949,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index 836c05bb22..e0ae2074e2 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -25,6 +25,7 @@ import androidx.annotation.RequiresApi; import androidx.test.core.app.ApplicationProvider; import androidx.test.platform.app.InstrumentationRegistry; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.RendererCapabilities; @@ -314,7 +315,7 @@ import java.util.List; protected SimpleExoPlayer buildExoPlayer( HostActivity host, Surface surface, MappingTrackSelector trackSelector) { SimpleExoPlayer player = - new SimpleExoPlayer.Builder(host, new DebugRenderersFactory(host)) + new ExoPlayer.Builder(host, new DebugRenderersFactory(host)) .setTrackSelector(trackSelector) .build(); player.setVideoSurface(surface); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index e83d2a2a1a..97004ddacb 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -248,7 +248,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); renderersFactory.setAllowedVideoJoiningTimeMs(/* allowedVideoJoiningTimeMs= */ 0); SimpleExoPlayer player = - new SimpleExoPlayer.Builder(host, renderersFactory).setTrackSelector(trackSelector).build(); + new ExoPlayer.Builder(host, renderersFactory).setTrackSelector(trackSelector).build(); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index 5c847c10be..654218e1a5 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -22,6 +22,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.LoadControl; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; @@ -276,7 +277,7 @@ public class TestExoPlayerBuilder { }; } - return new SimpleExoPlayer.Builder(context, playerRenderersFactory) + return new ExoPlayer.Builder(context, playerRenderersFactory) .setTrackSelector(trackSelector) .setLoadControl(loadControl) .setBandwidthMeter(bandwidthMeter) From 2fa54e0df3636634c23874dbf2a1170110517c1c Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 11 Aug 2021 16:23:49 +0100 Subject: [PATCH 050/441] Minor javadoc fix in BaseUrlExclusionList PiperOrigin-RevId: 390136807 --- .../android/exoplayer2/source/dash/BaseUrlExclusionList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.java index 7971085933..e2110a7c10 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.java @@ -34,8 +34,8 @@ import java.util.Random; import java.util.Set; /** - * Holds the state of {@link #exclude(BaseUrl, long) excluded} base URLs to be used {@link - * #selectBaseUrl(List) to select} a base URL based on these exclusions. + * Holds the state of {@link #exclude(BaseUrl, long) excluded} base URLs to be used to {@link + * #selectBaseUrl(List) select} a base URL based on these exclusions. */ public final class BaseUrlExclusionList { From f7a511af2dd275cf9ecdc112d44a7b3ab98cdb50 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 11 Aug 2021 16:26:26 +0100 Subject: [PATCH 051/441] Remove Player.Listener inheritance of MetadataOutput PiperOrigin-RevId: 390137267 --- RELEASENOTES.md | 2 + .../com/google/android/exoplayer2/Player.java | 10 ++-- .../google/android/exoplayer2/ExoPlayer.java | 29 ------------ .../android/exoplayer2/ExoPlayerImpl.java | 6 --- .../android/exoplayer2/SimpleExoPlayer.java | 47 +++++-------------- .../exoplayer2/metadata/MetadataOutput.java | 0 .../exoplayer2/testutil/StubExoPlayer.java | 5 -- 7 files changed, 19 insertions(+), 80 deletions(-) rename library/{common => core}/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java (100%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 91dc983f48..429ab4b1c2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,8 @@ * Remove `CacheDataSourceFactory`. Use `CacheDataSource.Factory` instead. * Remove `CacheDataSinkFactory`. Use `CacheDataSink.Factory` instead. * Remove `FileDataSourceFactory`. Use `FileDataSource.Factory` instead. + * Remove `SimpleExoPlayer.addMetadataOutput` and `removeMetadataOutput`. + Use `Player.addListener` and `Player.Listener` instead. ### 2.15.0 (2021-08-10) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 1a51a89baf..5040d84e63 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioListener; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextOutput; @@ -871,8 +870,7 @@ public interface Player { * *

      All methods have no-op default implementations to allow selective overrides. */ - interface Listener - extends VideoListener, AudioListener, TextOutput, MetadataOutput, EventListener { + interface Listener extends VideoListener, AudioListener, TextOutput, EventListener { @Override default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {} @@ -963,7 +961,11 @@ public interface Player { @Override default void onCues(List cues) {} - @Override + /** + * Called when there is metadata associated with the current playback time. + * + * @param metadata The metadata. + */ default void onMetadata(Metadata metadata) {} @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index fff434fb99..fa151ec271 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -36,7 +36,6 @@ import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; @@ -447,28 +446,6 @@ public interface ExoPlayer extends Player { List getCurrentCues(); } - /** The metadata component of an {@link ExoPlayer}. */ - interface MetadataComponent { - - /** - * Adds a {@link MetadataOutput} to receive metadata. - * - * @param output The output to register. - * @deprecated Use {@link #addListener(Listener)}. - */ - @Deprecated - void addMetadataOutput(MetadataOutput output); - - /** - * Removes a {@link MetadataOutput}. - * - * @param output The output to remove. - * @deprecated Use {@link #removeListener(Listener)}. - */ - @Deprecated - void removeMetadataOutput(MetadataOutput output); - } - /** The device component of an {@link ExoPlayer}. */ interface DeviceComponent { @@ -1034,12 +1011,6 @@ public interface ExoPlayer extends Player { @Nullable TextComponent getTextComponent(); - /** - * Returns the component of this player for metadata output, or null if metadata is not supported. - */ - @Nullable - MetadataComponent getMetadataComponent(); - /** Returns the component of this player for playback device, or null if it's not supported. */ @Nullable DeviceComponent getDeviceComponent(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index ad09ee28fb..69f59c6925 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -291,12 +291,6 @@ import java.util.concurrent.CopyOnWriteArraySet; return null; } - @Override - @Nullable - public MetadataComponent getMetadataComponent() { - return null; - } - @Override @Nullable public DeviceComponent getDeviceComponent() { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 6f10613cfa..7aa7084bb1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -97,7 +97,6 @@ public class SimpleExoPlayer extends BasePlayer ExoPlayer.AudioComponent, ExoPlayer.VideoComponent, ExoPlayer.TextComponent, - ExoPlayer.MetadataComponent, ExoPlayer.DeviceComponent { /** @deprecated Use {@link ExoPlayer.Builder} instead. */ @@ -430,8 +429,7 @@ public class SimpleExoPlayer extends BasePlayer private final CopyOnWriteArraySet videoListeners; private final CopyOnWriteArraySet audioListeners; private final CopyOnWriteArraySet textOutputs; - private final CopyOnWriteArraySet metadataOutputs; - private final CopyOnWriteArraySet deviceListeners; + private final CopyOnWriteArraySet listeners; private final AnalyticsCollector analyticsCollector; private final AudioBecomingNoisyManager audioBecomingNoisyManager; private final AudioFocusManager audioFocusManager; @@ -514,8 +512,7 @@ public class SimpleExoPlayer extends BasePlayer videoListeners = new CopyOnWriteArraySet<>(); audioListeners = new CopyOnWriteArraySet<>(); textOutputs = new CopyOnWriteArraySet<>(); - metadataOutputs = new CopyOnWriteArraySet<>(); - deviceListeners = new CopyOnWriteArraySet<>(); + listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); renderers = builder.renderersFactory.createRenderers( @@ -634,12 +631,6 @@ public class SimpleExoPlayer extends BasePlayer return this; } - @Override - @Nullable - public MetadataComponent getMetadataComponent() { - return this; - } - @Override @Nullable public DeviceComponent getDeviceComponent() { @@ -1109,21 +1100,6 @@ public class SimpleExoPlayer extends BasePlayer return currentCues; } - @Deprecated - @Override - public void addMetadataOutput(MetadataOutput output) { - // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(output); - metadataOutputs.add(output); - } - - @Deprecated - @Override - public void removeMetadataOutput(MetadataOutput output) { - // Don't verify application thread. We allow calls to this method from any thread. - metadataOutputs.remove(output); - } - // ExoPlayer implementation @Override @@ -1147,8 +1123,7 @@ public class SimpleExoPlayer extends BasePlayer addAudioListener(listener); addVideoListener(listener); addTextOutput(listener); - addMetadataOutput(listener); - deviceListeners.add(listener); + listeners.add(listener); EventListener eventListener = listener; addListener(eventListener); } @@ -1167,8 +1142,7 @@ public class SimpleExoPlayer extends BasePlayer removeAudioListener(listener); removeVideoListener(listener); removeTextOutput(listener); - removeMetadataOutput(listener); - deviceListeners.remove(listener); + listeners.remove(listener); EventListener eventListener = listener; removeListener(eventListener); } @@ -2132,8 +2106,9 @@ public class SimpleExoPlayer extends BasePlayer public void onMetadata(Metadata metadata) { analyticsCollector.onMetadata(metadata); player.onMetadata(metadata); - for (MetadataOutput metadataOutput : metadataOutputs) { - metadataOutput.onMetadata(metadata); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onMetadata(metadata); } } @@ -2228,8 +2203,8 @@ public class SimpleExoPlayer extends BasePlayer if (!deviceInfo.equals(SimpleExoPlayer.this.deviceInfo)) { SimpleExoPlayer.this.deviceInfo = deviceInfo; // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener deviceListener : deviceListeners) { - deviceListener.onDeviceInfoChanged(deviceInfo); + for (Listener listener : listeners) { + listener.onDeviceInfoChanged(deviceInfo); } } } @@ -2237,8 +2212,8 @@ public class SimpleExoPlayer extends BasePlayer @Override public void onStreamVolumeChanged(int streamVolume, boolean streamMuted) { // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener deviceListener : deviceListeners) { - deviceListener.onDeviceVolumeChanged(streamVolume, streamMuted); + for (Listener listener : listeners) { + listener.onDeviceVolumeChanged(streamVolume, streamMuted); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java rename to library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 488fa3fb11..8445c10c2d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -65,11 +65,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public MetadataComponent getMetadataComponent() { - throw new UnsupportedOperationException(); - } - @Override public DeviceComponent getDeviceComponent() { throw new UnsupportedOperationException(); From 4ef03558844a65a5c537a444e762e29610479b3a Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 11 Aug 2021 20:25:39 +0100 Subject: [PATCH 052/441] Prototype video transcoding The prototype is built upon Transformer and took many references from TransformerAudioRenderer. Please take a look and we can discuss more details. PiperOrigin-RevId: 390192487 --- demos/main/src/main/assets/media.exolist.json | 2 +- .../mediacodec/MediaCodecAdapter.java | 5 +- .../SynchronousMediaCodecAdapter.java | 24 ++- .../source/rtsp/RtspMediaSource.java | 2 +- .../transformer/MediaCodecAdapterWrapper.java | 124 ++++++++++- .../TransformerTranscodingVideoRenderer.java | 204 ++++++++++++++++++ 6 files changed, 350 insertions(+), 11 deletions(-) create mode 100644 library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index 0513dda601..a032d11034 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -4,7 +4,7 @@ "samples": [ { "name": "HD (MP4, H264)", - "uri": "https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd" + "uri": "rtsp://localhost:15554" }, { "name": "UHD (MP4, H264)", diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index 0b8fffd6e9..183adfc417 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -45,7 +45,10 @@ public interface MediaCodecAdapter { public final MediaFormat mediaFormat; /** The {@link Format} for which the codec is being configured. */ public final Format format; - /** For video playbacks, the output where the object will render the decoded frames. */ + /** + * For video decoding, the output where the object will render the decoded frames; for video + * encoding, this is the input surface from which the decoded frames are retrieved. + */ @Nullable public final Surface surface; /** For DRM protected playbacks, a {@link MediaCrypto} to use for decryption. */ @Nullable public final MediaCrypto crypto; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index 90bf99fa06..d74e41b2cf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java @@ -21,9 +21,11 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.media.MediaCodec; import android.media.MediaFormat; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.Surface; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -42,17 +44,29 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { public static class Factory implements MediaCodecAdapter.Factory { @Override + @RequiresApi(16) public MediaCodecAdapter createAdapter(Configuration configuration) throws IOException { @Nullable MediaCodec codec = null; + boolean isEncoder = configuration.flags == MediaCodec.CONFIGURE_FLAG_ENCODE; + @Nullable Surface decoderOutputSurface = isEncoder ? null : configuration.surface; try { codec = createCodec(configuration); TraceUtil.beginSection("configureCodec"); codec.configure( configuration.mediaFormat, - configuration.surface, + decoderOutputSurface, configuration.crypto, configuration.flags); TraceUtil.endSection(); + if (isEncoder && configuration.surface != null) { + if (Build.VERSION.SDK_INT >= 23) { + Api23.setCodecInputSurface(codec, configuration.surface); + } else { + throw new IllegalStateException( + "Encoding from a surface is only supported on API 23 and up"); + } + } + TraceUtil.beginSection("startCodec"); codec.start(); TraceUtil.endSection(); @@ -198,4 +212,12 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { public void setVideoScalingMode(@C.VideoScalingMode int scalingMode) { codec.setVideoScalingMode(scalingMode); } + + @RequiresApi(23) + private static final class Api23 { + @DoNotInline + public static void setCodecInputSurface(MediaCodec codec, Surface surface) { + codec.setInputSurface(surface); + } + } } diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java index 688c2f40b3..2d6603b5a5 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java @@ -69,7 +69,7 @@ public final class RtspMediaSource extends BaseMediaSource { private long timeoutMs; private String userAgent; private boolean forceUseRtpTcp; - private boolean debugLoggingEnabled; + private boolean debugLoggingEnabled = true; public Factory() { timeoutMs = DEFAULT_TIMEOUT_MS; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 3987fca812..6e30f3f27e 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -21,8 +21,11 @@ import static com.google.android.exoplayer2.util.Assertions.checkState; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; +import android.media.MediaCodecInfo.CodecCapabilities; import android.media.MediaFormat; +import android.view.Surface; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; @@ -129,6 +132,47 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } + /** + * Returns a {@link MediaCodecAdapterWrapper} for a configured and started {@link + * MediaCodecAdapter} video decoder. + * + * @param format The {@link Format} (of the input data) used to determine the underlying {@link + * MediaCodec} and its configuration values. + * @param surface The {@link Surface} to which the decoder output is rendered. + * @return A configured and started decoder wrapper. + * @throws IOException If the underlying codec cannot be created. + */ + @RequiresApi(23) + public static MediaCodecAdapterWrapper createForVideoDecoding(Format format, Surface surface) + throws IOException { + @Nullable MediaCodecAdapter adapter = null; + try { + MediaFormat mediaFormat = + MediaFormat.createVideoFormat( + checkNotNull(format.sampleMimeType), format.width, format.height); + MediaFormatUtil.maybeSetInteger( + mediaFormat, MediaFormat.KEY_MAX_INPUT_SIZE, format.maxInputSize); + MediaFormatUtil.setCsdBuffers(mediaFormat, format.initializationData); + adapter = + new Factory(/* decoder= */ true) + .createAdapter( + new MediaCodecAdapter.Configuration( + createPlaceholderMediaCodecInfo(), + mediaFormat, + format, + surface, + /* crypto= */ null, + /* flags= */ 0)); + adapter.setOutputSurface(surface); + return new MediaCodecAdapterWrapper(adapter); + } catch (Exception e) { + if (adapter != null) { + adapter.release(); + } + throw e; + } + } + /** * Returns a {@link MediaCodecAdapterWrapper} for a configured and started {@link * MediaCodecAdapter} audio encoder. @@ -167,6 +211,49 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } + /** + * Returns a {@link MediaCodecAdapterWrapper} for a configured and started {@link + * MediaCodecAdapter} video encoder. + * + * @param format The {@link Format} (of the output data) used to determine the underlying {@link + * MediaCodec} and its configuration values. + * @param surface The {@link Surface} from which the encoder obtains the frame input. + * @return A configured and started encoder wrapper. + * @throws IOException If the underlying codec cannot be created. + */ + @RequiresApi(18) + public static MediaCodecAdapterWrapper createForVideoEncoding(Format format, Surface surface) + throws IOException { + @Nullable MediaCodecAdapter adapter = null; + try { + MediaFormat mediaFormat = + MediaFormat.createVideoFormat( + checkNotNull(format.sampleMimeType), format.width, format.height); + // TODO(claincly): enable configuration. + mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); + mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); + mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); + mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 5_000_000); + + adapter = + new Factory(/* decoder= */ false) + .createAdapter( + new MediaCodecAdapter.Configuration( + createPlaceholderMediaCodecInfo(), + mediaFormat, + format, + surface, + /* crypto= */ null, + MediaCodec.CONFIGURE_FLAG_ENCODE)); + return new MediaCodecAdapterWrapper(adapter); + } catch (Exception e) { + if (adapter != null) { + adapter.release(); + } + throw e; + } + } + private MediaCodecAdapterWrapper(MediaCodecAdapter codec) { this.codec = codec; outputBufferInfo = new BufferInfo(); @@ -232,13 +319,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Returns the current output {@link ByteBuffer}, if available. */ @Nullable public ByteBuffer getOutputBuffer() { - return maybeDequeueOutputBuffer() ? outputBuffer : null; + return maybeDequeueAndSetOutputBuffer() ? outputBuffer : null; } /** Returns the {@link BufferInfo} associated with the current output buffer, if available. */ @Nullable public BufferInfo getOutputBufferInfo() { - return maybeDequeueOutputBuffer() ? outputBufferInfo : null; + return maybeDequeueAndSetOutputBuffer() ? outputBufferInfo : null; } /** @@ -264,6 +351,34 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; codec.release(); } + /** Returns {@code true} if a buffer is successfully obtained, rendered and released. */ + public boolean maybeDequeueRenderAndReleaseOutputBuffer() { + if (!maybeDequeueOutputBuffer()) { + return false; + } + + codec.releaseOutputBuffer(outputBufferIndex, /* render= */ true); + outputBuffer = null; + outputBufferIndex = C.INDEX_UNSET; + return true; + } + + /** + * Tries obtaining an output buffer and sets {@link #outputBuffer} to the obtained output buffer. + * + * @return {@code true} if a buffer is successfully obtained, {@code false} otherwise. + */ + private boolean maybeDequeueAndSetOutputBuffer() { + if (!maybeDequeueOutputBuffer()) { + return false; + } + + outputBuffer = checkNotNull(codec.getOutputBuffer(outputBufferIndex)); + outputBuffer.position(outputBufferInfo.offset); + outputBuffer.limit(outputBufferInfo.offset + outputBufferInfo.size); + return true; + } + /** * Returns true if there is already an output buffer pending. Otherwise attempts to dequeue an * output buffer and returns whether there is a new output buffer. @@ -295,11 +410,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; releaseOutputBuffer(); return false; } - - outputBuffer = checkNotNull(codec.getOutputBuffer(outputBufferIndex)); - outputBuffer.position(outputBufferInfo.offset); - outputBuffer.limit(outputBufferInfo.offset + outputBufferInfo.size); - return true; } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java new file mode 100644 index 0000000000..6fd210fa8b --- /dev/null +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -0,0 +1,204 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.exoplayer2.transformer; + +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + +import android.media.MediaCodec; +import android.view.Surface; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.FormatHolder; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.source.SampleStream; +import java.io.IOException; +import java.nio.ByteBuffer; + +@RequiresApi(23) +/* package */ final class TransformerTranscodingVideoRenderer extends TransformerBaseRenderer { + + private static final String TAG = "TransformerTranscodingVideoRenderer"; + + private final DecoderInputBuffer buffer; + /** The format the encoder is configured to output, may differ from the actual output format. */ + private final Format encoderConfigurationOutputFormat; + + private final Surface surface; + + @Nullable private MediaCodecAdapterWrapper decoder; + @Nullable private MediaCodecAdapterWrapper encoder; + /** Whether encoder's actual output format is obtained. */ + private boolean hasEncoderActualOutputFormat; + + private boolean muxerWrapperTrackEnded; + + public TransformerTranscodingVideoRenderer( + MuxerWrapper muxerWrapper, + TransformerMediaClock mediaClock, + Transformation transformation, + Format encoderConfigurationOutputFormat) { + super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); + + buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + surface = MediaCodec.createPersistentInputSurface(); + this.encoderConfigurationOutputFormat = encoderConfigurationOutputFormat; + } + + @Override + public String getName() { + return TAG; + } + + @Override + public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { + if (!isRendererStarted || isEnded()) { + return; + } + + if (!ensureDecoderConfigured()) { + return; + } + + if (ensureEncoderConfigured()) { + while (feedMuxerFromEncoder()) {} + while (feedEncoderFromDecoder()) {} + } + while (feedDecoderFromInput()) {} + } + + @Override + public boolean isEnded() { + return muxerWrapperTrackEnded; + } + + private boolean ensureDecoderConfigured() throws ExoPlaybackException { + if (decoder != null) { + return true; + } + + FormatHolder formatHolder = getFormatHolder(); + @SampleStream.ReadDataResult + int result = + readSource(formatHolder, buffer, /* readFlags= */ SampleStream.FLAG_REQUIRE_FORMAT); + if (result != C.RESULT_FORMAT_READ) { + return false; + } + + Format inputFormat = checkNotNull(formatHolder.format); + try { + decoder = MediaCodecAdapterWrapper.createForVideoDecoding(inputFormat, surface); + } catch (IOException e) { + throw createRendererException( + e, formatHolder.format, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); + } + return true; + } + + private boolean ensureEncoderConfigured() throws ExoPlaybackException { + if (encoder != null) { + return true; + } + + try { + encoder = + MediaCodecAdapterWrapper.createForVideoEncoding( + encoderConfigurationOutputFormat, surface); + } catch (IOException e) { + throw createRendererException( + // TODO(claincly): should be "ENCODER_INIT_FAILED" + e, + checkNotNull(this.decoder).getOutputFormat(), + PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); + } + return true; + } + + private boolean feedDecoderFromInput() { + MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + if (!decoder.maybeDequeueInputBuffer(buffer)) { + return false; + } + + buffer.clear(); + @SampleStream.ReadDataResult + int result = readSource(getFormatHolder(), buffer, /* readFlags= */ 0); + + switch (result) { + case C.RESULT_FORMAT_READ: + throw new IllegalStateException("Format changes are not supported."); + case C.RESULT_BUFFER_READ: + mediaClock.updateTimeForTrackType(getTrackType(), buffer.timeUs); + ByteBuffer data = checkNotNull(buffer.data); + data.flip(); + decoder.queueInputBuffer(buffer); + return !buffer.isEndOfStream(); + case C.RESULT_NOTHING_READ: + default: + return false; + } + } + + private boolean feedEncoderFromDecoder() { + MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + if (decoder.isEnded()) { + return false; + } + // Rendering the decoder output queues input to the encoder because they share the same surface. + return decoder.maybeDequeueRenderAndReleaseOutputBuffer(); + } + + private boolean feedMuxerFromEncoder() { + MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + if (!hasEncoderActualOutputFormat) { + @Nullable Format encoderOutputFormat = encoder.getOutputFormat(); + if (encoderOutputFormat == null) { + return false; + } + hasEncoderActualOutputFormat = true; + muxerWrapper.addTrackFormat(encoderOutputFormat); + } + + // TODO(claincly) May have to use inputStreamBuffer.isEndOfStream result to call + // decoder.signalEndOfInputStream(). + MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + if (decoder.isEnded()) { + muxerWrapper.endTrack(getTrackType()); + muxerWrapperTrackEnded = true; + return false; + } + + @Nullable ByteBuffer encoderOutputBuffer = encoder.getOutputBuffer(); + if (encoderOutputBuffer == null) { + return false; + } + + MediaCodec.BufferInfo encoderOutputBufferInfo = checkNotNull(encoder.getOutputBufferInfo()); + if (!muxerWrapper.writeSample( + getTrackType(), + encoderOutputBuffer, + /* isKeyFrame= */ (encoderOutputBufferInfo.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) > 0, + encoderOutputBufferInfo.presentationTimeUs)) { + return false; + } + encoder.releaseOutputBuffer(); + return true; + } +} From 21251e69a6c7de6e19a6c4a54d2fc30e1deec57c Mon Sep 17 00:00:00 2001 From: claincly Date: Thu, 12 Aug 2021 09:45:35 +0100 Subject: [PATCH 053/441] Revert unwanted changes. PiperOrigin-RevId: 390319457 --- demos/main/src/main/assets/media.exolist.json | 2 +- .../google/android/exoplayer2/source/rtsp/RtspMediaSource.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index a032d11034..0513dda601 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -4,7 +4,7 @@ "samples": [ { "name": "HD (MP4, H264)", - "uri": "rtsp://localhost:15554" + "uri": "https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd" }, { "name": "UHD (MP4, H264)", diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java index 2d6603b5a5..688c2f40b3 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java @@ -69,7 +69,7 @@ public final class RtspMediaSource extends BaseMediaSource { private long timeoutMs; private String userAgent; private boolean forceUseRtpTcp; - private boolean debugLoggingEnabled = true; + private boolean debugLoggingEnabled; public Factory() { timeoutMs = DEFAULT_TIMEOUT_MS; From c5b01b2f7b5bd7f05eac2cae0d29b3b371dbb2ed Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 12 Aug 2021 09:49:28 +0100 Subject: [PATCH 054/441] Add SubtitleExtractor which wraps a SubtitleDecoder. SubtitleExtractor is a component that extracts subtitle data taken from ExtractorInput into samples. Samples are pushed into an ExtractorOutput (usually SampleQueue). As a temporary solution SubtitleExtractor uses SubtitleDecoder to extract Cues from input data. PiperOrigin-RevId: 390319875 --- .../extractor/subtitle/SubtitleExtractor.java | 210 ++++++++++++++++++ .../extractor/subtitle/package-info.java | 19 ++ .../subtitle/SubtitleExtractorTest.java | 101 +++++++++ 3 files changed, 330 insertions(+) create mode 100644 library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java create mode 100644 library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java create mode 100644 library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java new file mode 100644 index 0000000000..8282c74d97 --- /dev/null +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -0,0 +1,210 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.extractor.subtitle; + +import static com.google.android.exoplayer2.util.Assertions.checkState; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; + +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.extractor.Extractor; +import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.ExtractorOutput; +import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.extractor.TrackOutput; +import com.google.android.exoplayer2.text.Cue; +import com.google.android.exoplayer2.text.CueEncoder; +import com.google.android.exoplayer2.text.SubtitleDecoder; +import com.google.android.exoplayer2.text.SubtitleDecoderException; +import com.google.android.exoplayer2.text.SubtitleInputBuffer; +import com.google.android.exoplayer2.text.SubtitleOutputBuffer; +import com.google.android.exoplayer2.util.ParsableByteArray; +import com.google.common.primitives.Ints; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.List; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; + +/** Generic extractor for extracting subtitles from various subtitle formats. */ +public class SubtitleExtractor implements Extractor { + @IntDef( + value = { + STATE_CREATED, + STATE_INITIALIZED, + STATE_READING, + STATE_DECODING, + STATE_WRITING, + STATE_FINISHED + }) + @Retention(RetentionPolicy.SOURCE) + private @interface State {} + + /** The extractor has been created. */ + private static final int STATE_CREATED = 0; + /** The extractor has been initialized. */ + private static final int STATE_INITIALIZED = 1; + /** The extractor is reading data from the input. */ + private static final int STATE_READING = 2; + /** The extractor is queueing data for decoding. */ + private static final int STATE_DECODING = 3; + /** The extractor is writing data to the output. */ + private static final int STATE_WRITING = 4; + /** The extractor has finished writing. */ + private static final int STATE_FINISHED = 5; + + private static final int DEFAULT_BUFFER_SIZE = 1024; + + private final SubtitleDecoder subtitleDecoder; + private final CueEncoder cueEncoder; + private final ParsableByteArray subtitleData; + private final Format format; + + private @MonotonicNonNull ExtractorOutput extractorOutput; + private @MonotonicNonNull TrackOutput trackOutput; + private int bytesRead; + @State private int state; + + public SubtitleExtractor(SubtitleDecoder subtitleDecoder, Format format) { + this.subtitleDecoder = subtitleDecoder; + cueEncoder = new CueEncoder(); + subtitleData = new ParsableByteArray(); + this.format = format; + state = STATE_CREATED; + } + + @Override + public boolean sniff(ExtractorInput input) throws IOException { + // TODO: Implement sniff() according to the Extractor interface documentation. For now sniff() + // can safely return true because we plan to use this class in an ExtractorFactory that returns + // exactly one Extractor implementation. + return true; + } + + @Override + public void init(ExtractorOutput output) { + checkState(state == STATE_CREATED); + extractorOutput = output; + trackOutput = extractorOutput.track(/* id= */ 0, C.TRACK_TYPE_TEXT); + trackOutput.format(format); + state = STATE_INITIALIZED; + } + + @Override + public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { + switch (state) { + case STATE_INITIALIZED: + prepareMemory(input); + state = readFromInput(input) ? STATE_DECODING : STATE_READING; + return Extractor.RESULT_CONTINUE; + case STATE_READING: + state = readFromInput(input) ? STATE_DECODING : STATE_READING; + return Extractor.RESULT_CONTINUE; + case STATE_DECODING: + queueDataToDecoder(); + state = STATE_WRITING; + return RESULT_CONTINUE; + case STATE_WRITING: + writeToOutput(); + state = STATE_FINISHED; + return Extractor.RESULT_END_OF_INPUT; + case STATE_FINISHED: + return Extractor.RESULT_END_OF_INPUT; + case STATE_CREATED: + default: + throw new IllegalStateException(); + } + } + + @Override + public void seek(long position, long timeUs) {} + + @Override + public void release() { + // TODO: Proper implementation of this method is missing. Implement release() according to the + // Extractor interface documentation. + } + + private void prepareMemory(ExtractorInput input) { + subtitleData.reset( + input.getLength() != C.LENGTH_UNSET + ? Ints.checkedCast(input.getLength()) + : DEFAULT_BUFFER_SIZE); + } + + /** Returns whether reading has been finished. */ + private boolean readFromInput(ExtractorInput input) throws IOException { + if (subtitleData.capacity() == bytesRead) { + subtitleData.ensureCapacity(bytesRead + DEFAULT_BUFFER_SIZE); + } + int readResult = + input.read(subtitleData.getData(), bytesRead, subtitleData.capacity() - bytesRead); + if (readResult != C.RESULT_END_OF_INPUT) { + bytesRead += readResult; + } + return readResult == C.RESULT_END_OF_INPUT; + } + + private void queueDataToDecoder() throws IOException { + try { + @Nullable SubtitleInputBuffer inputBuffer = subtitleDecoder.dequeueInputBuffer(); + while (inputBuffer == null) { + inputBuffer = subtitleDecoder.dequeueInputBuffer(); + Thread.sleep(5); + } + inputBuffer.ensureSpaceForWrite(bytesRead); + inputBuffer.data.put(subtitleData.getData(), /* offset= */ 0, bytesRead); + subtitleDecoder.queueInputBuffer(inputBuffer); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new InterruptedIOException(); + } catch (SubtitleDecoderException e) { + throw ParserException.createForMalformedContainer("SubtitleDecoder failed.", e); + } + } + + private void writeToOutput() throws IOException { + checkStateNotNull(this.trackOutput); + try { + @Nullable SubtitleOutputBuffer outputBuffer = subtitleDecoder.dequeueOutputBuffer(); + while (outputBuffer == null) { + outputBuffer = subtitleDecoder.dequeueOutputBuffer(); + Thread.sleep(5); + } + + for (int i = 0; i < outputBuffer.getEventTimeCount(); i++) { + List cues = outputBuffer.getCues(outputBuffer.getEventTime(i)); + byte[] cuesSample = cueEncoder.encode(cues); + trackOutput.sampleData(new ParsableByteArray(cuesSample), cuesSample.length); + trackOutput.sampleMetadata( + /* timeUs= */ outputBuffer.getEventTime(i), + /* flags= */ C.BUFFER_FLAG_KEY_FRAME, + /* size= */ cuesSample.length, + /* offset= */ 0, + /* cryptoData= */ null); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new InterruptedIOException(); + } catch (SubtitleDecoderException e) { + throw ParserException.createForMalformedContainer("SubtitleDecoder failed.", e); + } + } +} diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java new file mode 100644 index 0000000000..ba60a48a62 --- /dev/null +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@NonNullApi +package com.google.android.exoplayer2.extractor.subtitle; + +import com.google.android.exoplayer2.util.NonNullApi; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java new file mode 100644 index 0000000000..dc842ef9cc --- /dev/null +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java @@ -0,0 +1,101 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.extractor.subtitle; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.extractor.Extractor; +import com.google.android.exoplayer2.testutil.FakeExtractorInput; +import com.google.android.exoplayer2.testutil.FakeExtractorOutput; +import com.google.android.exoplayer2.testutil.FakeTrackOutput; +import com.google.android.exoplayer2.text.Cue; +import com.google.android.exoplayer2.text.CueDecoder; +import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; +import com.google.android.exoplayer2.util.Util; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for {@link SubtitleExtractor}. */ +@RunWith(AndroidJUnit4.class) +public class SubtitleExtractorTest { + @Test + public void extractor_outputsCues() throws Exception { + String testData = + "WEBVTT\n" + + "\n" + + "00:00.000 --> 00:01.234\n" + + "This is the first subtitle.\n" + + "\n" + + "00:02.345 --> 00:03.456\n" + + "This is the second subtitle.\n" + + "\n" + + "00:02.600 --> 00:04.567\n" + + "This is the third subtitle."; + CueDecoder decoder = new CueDecoder(); + FakeExtractorOutput output = new FakeExtractorOutput(); + FakeExtractorInput input = + new FakeExtractorInput.Builder() + .setData(Util.getUtf8Bytes(testData)) + .setSimulatePartialReads(true) + .build(); + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + extractor.init(output); + + while (extractor.read(input, null) != Extractor.RESULT_END_OF_INPUT) {} + + FakeTrackOutput trackOutput = output.trackOutputs.get(0); + assertThat(trackOutput.getSampleCount()).isEqualTo(6); + // Check sample timestamps. + assertThat(trackOutput.getSampleTimeUs(0)).isEqualTo(0L); + assertThat(trackOutput.getSampleTimeUs(1)).isEqualTo(1_234_000L); + assertThat(trackOutput.getSampleTimeUs(2)).isEqualTo(2_345_000L); + assertThat(trackOutput.getSampleTimeUs(3)).isEqualTo(2_600_000L); + assertThat(trackOutput.getSampleTimeUs(4)).isEqualTo(3_456_000L); + assertThat(trackOutput.getSampleTimeUs(5)).isEqualTo(4_567_000L); + // Check sample content. + List cues0 = decoder.decode(trackOutput.getSampleData(0)); + assertThat(cues0).hasSize(1); + assertThat(cues0.get(0).text.toString()).isEqualTo("This is the first subtitle."); + List cues1 = decoder.decode(trackOutput.getSampleData(1)); + assertThat(cues1).isEmpty(); + List cues2 = decoder.decode(trackOutput.getSampleData(2)); + assertThat(cues2).hasSize(1); + assertThat(cues2.get(0).text.toString()).isEqualTo("This is the second subtitle."); + List cues3 = decoder.decode(trackOutput.getSampleData(3)); + assertThat(cues3).hasSize(2); + assertThat(cues3.get(0).text.toString()).isEqualTo("This is the second subtitle."); + assertThat(cues3.get(1).text.toString()).isEqualTo("This is the third subtitle."); + List cues4 = decoder.decode(trackOutput.getSampleData(4)); + assertThat(cues4).hasSize(1); + assertThat(cues4.get(0).text.toString()).isEqualTo("This is the third subtitle."); + List cues5 = decoder.decode(trackOutput.getSampleData(5)); + assertThat(cues5).isEmpty(); + } + + @Test + public void read_notInitialized_fails() { + FakeExtractorInput input = new FakeExtractorInput.Builder().setData(new byte[0]).build(); + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + + assertThrows(IllegalStateException.class, () -> extractor.read(input, null)); + } +} From 2a6136f37081b3a8d70bb553c1633d0ac6e83329 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 12 Aug 2021 11:25:28 +0100 Subject: [PATCH 055/441] Remove Player.Listener inheritance of AudioListener PiperOrigin-RevId: 390332263 --- RELEASENOTES.md | 2 + .../com/google/android/exoplayer2/Player.java | 27 +++++++-- .../exoplayer2/audio/AudioListener.java | 55 ------------------- .../google/android/exoplayer2/ExoPlayer.java | 19 ------- .../android/exoplayer2/SimpleExoPlayer.java | 38 ++++--------- 5 files changed, 34 insertions(+), 107 deletions(-) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/audio/AudioListener.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 429ab4b1c2..8bea7b5e18 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -26,6 +26,8 @@ * Remove `FileDataSourceFactory`. Use `FileDataSource.Factory` instead. * Remove `SimpleExoPlayer.addMetadataOutput` and `removeMetadataOutput`. Use `Player.addListener` and `Player.Listener` instead. + * Remove `SimpleExoPlayer.addAudioListener`, `removeAudioListener` and + `AudioListener`. Use `Player.addListener` and `Player.Listener` instead. ### 2.15.0 (2021-08-10) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 5040d84e63..a5ddac0779 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -24,7 +24,6 @@ import android.view.TextureView; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.audio.AudioListener; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; @@ -870,7 +869,7 @@ public interface Player { * *

      All methods have no-op default implementations to allow selective overrides. */ - interface Listener extends VideoListener, AudioListener, TextOutput, EventListener { + interface Listener extends VideoListener, TextOutput, EventListener { @Override default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {} @@ -928,16 +927,32 @@ public interface Player { @Override default void onSeekBackIncrementChanged(long seekBackIncrementMs) {} - @Override + /** + * Called when the audio session ID changes. + * + * @param audioSessionId The audio session ID. + */ default void onAudioSessionIdChanged(int audioSessionId) {} - @Override + /** + * Called when the audio attributes change. + * + * @param audioAttributes The audio attributes. + */ default void onAudioAttributesChanged(AudioAttributes audioAttributes) {} - @Override + /** + * Called when the volume changes. + * + * @param volume The new volume, with 0 being silence and 1 being unity gain. + */ default void onVolumeChanged(float volume) {} - @Override + /** + * Called when skipping silences is enabled or disabled in the audio stream. + * + * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. + */ default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {} /** Called when the device information changes. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/AudioListener.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/AudioListener.java deleted file mode 100644 index 99e83e3060..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/AudioListener.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.audio; - -import com.google.android.exoplayer2.Player; - -/** - * A listener for changes in audio configuration. - * - * @deprecated Use {@link Player.Listener}. - */ -@Deprecated -public interface AudioListener { - - /** - * Called when the audio session ID changes. - * - * @param audioSessionId The audio session ID. - */ - default void onAudioSessionIdChanged(int audioSessionId) {} - - /** - * Called when the audio attributes change. - * - * @param audioAttributes The audio attributes. - */ - default void onAudioAttributesChanged(AudioAttributes audioAttributes) {} - - /** - * Called when the volume changes. - * - * @param volume The new volume, with 0 being silence and 1 being unity gain. - */ - default void onVolumeChanged(float volume) {} - - /** - * Called when skipping silences is enabled or disabled in the audio stream. - * - * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. - */ - default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {} -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index fa151ec271..6bf7d66f15 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -29,7 +29,6 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioCapabilities; -import com.google.android.exoplayer2.audio.AudioListener; import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.DefaultAudioSink; @@ -146,24 +145,6 @@ public interface ExoPlayer extends Player { /** The audio component of an {@link ExoPlayer}. */ interface AudioComponent { - /** - * Adds a listener to receive audio events. - * - * @param listener The listener to register. - * @deprecated Use {@link #addListener(Listener)}. - */ - @Deprecated - void addAudioListener(AudioListener listener); - - /** - * Removes a listener of audio events. - * - * @param listener The listener to unregister. - * @deprecated Use {@link #removeListener(Listener)}. - */ - @Deprecated - void removeAudioListener(AudioListener listener); - /** * Sets the attributes for audio playback, used by the underlying audio track. If not set, the * default audio attributes will be used. They are suitable for general media playback. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 7aa7084bb1..5748c49b5b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -48,7 +48,6 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.audio.AudioListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; @@ -427,7 +426,6 @@ public class SimpleExoPlayer extends BasePlayer private final ComponentListener componentListener; private final FrameMetadataListener frameMetadataListener; private final CopyOnWriteArraySet videoListeners; - private final CopyOnWriteArraySet audioListeners; private final CopyOnWriteArraySet textOutputs; private final CopyOnWriteArraySet listeners; private final AnalyticsCollector analyticsCollector; @@ -510,7 +508,6 @@ public class SimpleExoPlayer extends BasePlayer componentListener = new ComponentListener(); frameMetadataListener = new FrameMetadataListener(); videoListeners = new CopyOnWriteArraySet<>(); - audioListeners = new CopyOnWriteArraySet<>(); textOutputs = new CopyOnWriteArraySet<>(); listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); @@ -802,21 +799,6 @@ public class SimpleExoPlayer extends BasePlayer player.removeAudioOffloadListener(listener); } - @Deprecated - @Override - public void addAudioListener(AudioListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); - audioListeners.add(listener); - } - - @Deprecated - @Override - public void removeAudioListener(AudioListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - audioListeners.remove(listener); - } - @Override public void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { verifyApplicationThread(); @@ -828,8 +810,9 @@ public class SimpleExoPlayer extends BasePlayer sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); streamVolumeManager.setStreamType(Util.getStreamTypeForAudioUsage(audioAttributes.usage)); analyticsCollector.onAudioAttributesChanged(audioAttributes); - for (AudioListener audioListener : audioListeners) { - audioListener.onAudioAttributesChanged(audioAttributes); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onAudioAttributesChanged(audioAttributes); } } @@ -867,8 +850,9 @@ public class SimpleExoPlayer extends BasePlayer sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); analyticsCollector.onAudioSessionIdChanged(audioSessionId); - for (AudioListener audioListener : audioListeners) { - audioListener.onAudioSessionIdChanged(audioSessionId); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onAudioSessionIdChanged(audioSessionId); } } @@ -898,8 +882,9 @@ public class SimpleExoPlayer extends BasePlayer this.audioVolume = audioVolume; sendVolumeToRenderers(); analyticsCollector.onVolumeChanged(audioVolume); - for (AudioListener audioListener : audioListeners) { - audioListener.onVolumeChanged(audioVolume); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onVolumeChanged(audioVolume); } } @@ -1120,7 +1105,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Listener listener) { Assertions.checkNotNull(listener); - addAudioListener(listener); addVideoListener(listener); addTextOutput(listener); listeners.add(listener); @@ -1139,7 +1123,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void removeListener(Listener listener) { Assertions.checkNotNull(listener); - removeAudioListener(listener); removeVideoListener(listener); removeTextOutput(listener); listeners.remove(listener); @@ -1827,7 +1810,8 @@ public class SimpleExoPlayer extends BasePlayer @SuppressWarnings("SuspiciousMethodCalls") private void notifySkipSilenceEnabledChanged() { analyticsCollector.onSkipSilenceEnabledChanged(skipSilenceEnabled); - for (AudioListener listener : audioListeners) { + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { listener.onSkipSilenceEnabledChanged(skipSilenceEnabled); } } From 288fb4a8a5e024ff17bd3755231425fb013bb6e7 Mon Sep 17 00:00:00 2001 From: christosts Date: Thu, 12 Aug 2021 12:23:56 +0100 Subject: [PATCH 056/441] Annotate deprecated methods in ForwardingPlayer This change is needed to generate correct javadoc, otherwise these methods appear as not deprecated. #minor-release PiperOrigin-RevId: 390339092 --- .../com/google/android/exoplayer2/ForwardingPlayer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index c1dd1577d0..9060c18be4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -47,8 +47,8 @@ public class ForwardingPlayer implements Player { return player.getApplicationLooper(); } + @Deprecated @Override - @SuppressWarnings("deprecation") // Implementing deprecated method. public void addListener(EventListener listener) { player.addListener(new ForwardingEventListener(this, listener)); } @@ -58,8 +58,8 @@ public class ForwardingPlayer implements Player { player.addListener(new ForwardingListener(this, listener)); } + @Deprecated @Override - @SuppressWarnings("deprecation") // Implementing deprecated method. public void removeListener(EventListener listener) { player.removeListener(new ForwardingEventListener(this, listener)); } @@ -350,8 +350,8 @@ public class ForwardingPlayer implements Player { player.stop(); } + @Deprecated @Override - @SuppressWarnings("deprecation") // Forwarding to deprecated method. public void stop(boolean reset) { player.stop(reset); } From 24b0cf8c305417bb3c3fcc0fc73279ed29264949 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 12 Aug 2021 15:25:07 +0100 Subject: [PATCH 057/441] Fix references to AudioAttributes in Javadoc PiperOrigin-RevId: 390365923 --- .../main/java/com/google/android/exoplayer2/Renderer.java | 8 ++++---- .../android/exoplayer2/audio/DecoderAudioRenderer.java | 4 ++-- .../android/exoplayer2/audio/MediaCodecAudioRenderer.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index 9c866e531b..8dc5fdcbd2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -20,6 +20,7 @@ import android.view.Surface; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.PlayerMessage.Target; +import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.MediaClock; @@ -90,10 +91,9 @@ public interface Renderer extends PlayerMessage.Target { int MSG_SET_VOLUME = 2; /** * A type of a message that can be passed to an audio renderer via {@link - * ExoPlayer#createMessage(Target)}. The message payload should be an {@link - * com.google.android.exoplayer2.audio.AudioAttributes} instance that will configure the - * underlying audio track. If not set, the default audio attributes will be used. They are - * suitable for general media playback. + * ExoPlayer#createMessage(Target)}. The message payload should be an {@link AudioAttributes} + * instance that will configure the underlying audio track. If not set, the default audio + * attributes will be used. They are suitable for general media playback. * *

      Setting the audio attributes during playback may introduce a short gap in audio output as * the audio track is recreated. A new audio session id will also be generated. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index 286efe08e1..3c8d25e70f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -68,8 +68,8 @@ import java.lang.annotation.RetentionPolicy; *

    • Message with type {@link #MSG_SET_VOLUME} to set the volume. The message payload should be * a {@link Float} with 0 being silence and 1 being unity gain. *
    • Message with type {@link #MSG_SET_AUDIO_ATTRIBUTES} to set the audio attributes. The - * message payload should be an {@link com.google.android.exoplayer2.audio.AudioAttributes} - * instance that will configure the underlying audio track. + * message payload should be an {@link AudioAttributes} instance that will configure the + * underlying audio track. *
    • Message with type {@link #MSG_SET_AUX_EFFECT_INFO} to set the auxiliary effect. The message * payload should be an {@link AuxEffectInfo} instance that will configure the underlying * audio track. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index 0e3aa17212..db00fd1121 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -70,8 +70,8 @@ import java.util.List; *
    • Message with type {@link #MSG_SET_VOLUME} to set the volume. The message payload should be * a {@link Float} with 0 being silence and 1 being unity gain. *
    • Message with type {@link #MSG_SET_AUDIO_ATTRIBUTES} to set the audio attributes. The - * message payload should be an {@link com.google.android.exoplayer2.audio.AudioAttributes} - * instance that will configure the underlying audio track. + * message payload should be an {@link AudioAttributes} instance that will configure the + * underlying audio track. *
    • Message with type {@link #MSG_SET_AUX_EFFECT_INFO} to set the auxiliary effect. The message * payload should be an {@link AuxEffectInfo} instance that will configure the underlying * audio track. From 149958fb07cd663c943406977b68e89c9c610251 Mon Sep 17 00:00:00 2001 From: jaewan Date: Fri, 13 Aug 2021 09:08:33 +0100 Subject: [PATCH 058/441] Change return type of getMaxSeekToPreviousPosition() to long This matches the type of all position related APIs. PiperOrigin-RevId: 390558523 --- .../com/google/android/exoplayer2/ext/cast/CastPlayer.java | 2 +- .../src/main/java/com/google/android/exoplayer2/C.java | 4 ++-- .../com/google/android/exoplayer2/ForwardingPlayer.java | 4 ++-- .../src/main/java/com/google/android/exoplayer2/Player.java | 6 +++--- .../java/com/google/android/exoplayer2/ExoPlayerImpl.java | 2 +- .../java/com/google/android/exoplayer2/SimpleExoPlayer.java | 2 +- .../android/exoplayer2/analytics/AnalyticsCollector.java | 2 +- .../android/exoplayer2/analytics/AnalyticsListener.java | 2 +- .../google/android/exoplayer2/testutil/StubExoPlayer.java | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index bb8026b479..ac113f3ab8 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -459,7 +459,7 @@ public final class CastPlayer extends BasePlayer { } @Override - public int getMaxSeekToPreviousPosition() { + public long getMaxSeekToPreviousPosition() { return C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS; } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 4364103ace..37a5b09d99 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -665,7 +665,7 @@ public final class C { public static final int DEFAULT_BUFFER_SEGMENT_SIZE = 64 * 1024; /** A default seek back increment, in milliseconds. */ - public static final long DEFAULT_SEEK_BACK_INCREMENT_MS = 5000; + public static final long DEFAULT_SEEK_BACK_INCREMENT_MS = 5_000; /** A default seek forward increment, in milliseconds. */ public static final long DEFAULT_SEEK_FORWARD_INCREMENT_MS = 15_000; @@ -673,7 +673,7 @@ public final class C { * A default maximum position for which a seek to previous will seek to the previous window, in * milliseconds. */ - public static final int DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 3000; + public static final long DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS = 3_000; /** "cenc" scheme type name as defined in ISO/IEC 23001-7:2016. */ @SuppressWarnings("ConstantField") diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 9060c18be4..395fea9c6f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -299,7 +299,7 @@ public class ForwardingPlayer implements Player { } @Override - public int getMaxSeekToPreviousPosition() { + public long getMaxSeekToPreviousPosition() { return player.getMaxSeekToPreviousPosition(); } @@ -752,7 +752,7 @@ public class ForwardingPlayer implements Player { } @Override - public void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) { + public void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) { eventListener.onMaxSeekToPreviousPositionChanged(maxSeekToPreviousPositionMs); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index a5ddac0779..898c4026aa 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -338,7 +338,7 @@ public interface Player { * @param maxSeekToPreviousPositionMs The maximum position for which {@link #seekToPrevious()} * seeks to the previous position, in milliseconds. */ - default void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) {} + default void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) {} /** * @deprecated Seeks are processed without delay. Listen to {@link @@ -1785,9 +1785,9 @@ public interface Player { * in milliseconds. * * @return The maximum seek to previous position, in milliseconds. - * @see Listener#onMaxSeekToPreviousPositionChanged(int) + * @see Listener#onMaxSeekToPreviousPositionChanged(long) */ - int getMaxSeekToPreviousPosition(); + long getMaxSeekToPreviousPosition(); /** * Seeks to an earlier position in the current or previous window (if available). More precisely: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 69f59c6925..06e4a99571 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -724,7 +724,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } @Override - public int getMaxSeekToPreviousPosition() { + public long getMaxSeekToPreviousPosition() { return C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 5748c49b5b..81254f4e47 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1380,7 +1380,7 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public int getMaxSeekToPreviousPosition() { + public long getMaxSeekToPreviousPosition() { verifyApplicationThread(); return player.getMaxSeekToPreviousPosition(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 00d7547202..77d77603e3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -769,7 +769,7 @@ public class AnalyticsCollector } @Override - public void onMaxSeekToPreviousPositionChanged(int maxSeekToPreviousPositionMs) { + public void onMaxSeekToPreviousPositionChanged(long maxSeekToPreviousPositionMs) { EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); sendEvent( eventTime, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index a8c9ed38a0..24dce074e1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -623,7 +623,7 @@ public interface AnalyticsListener { * @param maxSeekToPreviousPositionMs The maximum seek to previous position, in milliseconds. */ default void onMaxSeekToPreviousPositionChanged( - EventTime eventTime, int maxSeekToPreviousPositionMs) {} + EventTime eventTime, long maxSeekToPreviousPositionMs) {} /** * Called when the repeat mode changed. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 8445c10c2d..eab86983d5 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -305,7 +305,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override - public int getMaxSeekToPreviousPosition() { + public long getMaxSeekToPreviousPosition() { throw new UnsupportedOperationException(); } From 88a637bc45123338ae1ce1ecb6ad57d58368935a Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 13 Aug 2021 11:39:18 +0100 Subject: [PATCH 059/441] Move format util classes to extractor package PiperOrigin-RevId: 390577072 --- .../android/exoplayer2/util/MimeTypes.java | 41 +++++++++++++++---- .../dash/manifest/DashManifestParser.java | 3 +- .../android/exoplayer2/audio/AacUtil.java | 21 ---------- .../android/exoplayer2/audio/Ac3Util.java | 7 ---- .../android/exoplayer2/audio/Ac4Util.java | 0 .../android/exoplayer2/audio/DtsUtil.java | 0 .../exoplayer2/audio/MpegAudioUtil.java | 0 .../android/exoplayer2/audio/OpusUtil.java | 0 .../android/exoplayer2/audio/WavUtil.java | 0 .../android/exoplayer2/video/AvcConfig.java | 0 .../exoplayer2/video/DolbyVisionConfig.java | 0 .../android/exoplayer2/video/HevcConfig.java | 0 .../android/exoplayer2/audio/Ac3UtilTest.java | 0 .../exoplayer2/audio/OpusUtilTest.java | 0 .../exoplayer2/video/HevcConfigTest.java | 0 .../hls/playlist/HlsPlaylistParser.java | 3 +- 16 files changed, 36 insertions(+), 39 deletions(-) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java (95%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java (98%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/video/DolbyVisionConfig.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/audio/Ac3UtilTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/video/HevcConfigTest.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index a3bf921172..7320847483 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -19,8 +19,6 @@ import android.text.TextUtils; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.audio.AacUtil; -import com.google.android.exoplayer2.audio.Ac3Util; import com.google.common.base.Ascii; import java.util.ArrayList; import java.util.regex.Matcher; @@ -120,6 +118,14 @@ public final class MimeTypes { public static final String IMAGE_JPEG = BASE_TYPE_IMAGE + "/jpeg"; + /** + * A non-standard codec string for E-AC3-JOC. Use of this constant allows for disambiguation + * between regular E-AC3 ("ec-3") and E-AC3-JOC ("ec+3") streams from the codec string alone. The + * standard is to use "ec-3" for both, as per the MP4RA + * registered codec types. + */ + public static final String CODEC_E_AC3_JOC = "ec+3"; + private static final ArrayList customMimeTypes = new ArrayList<>(); private static final Pattern MP4A_RFC_6381_CODEC_PATTERN = @@ -214,8 +220,7 @@ public final class MimeTypes { if (objectType == null) { return false; } - @C.Encoding - int encoding = AacUtil.getEncodingForAudioObjectType(objectType.audioObjectTypeIndication); + @C.Encoding int encoding = objectType.getEncoding(); // xHE-AAC is an exception in which it's not true that all samples will be sync samples. // Also return false for ENCODING_INVALID, which indicates we weren't able to parse the // encoding from the codec string. @@ -377,7 +382,7 @@ public final class MimeTypes { return MimeTypes.AUDIO_AC3; } else if (codec.startsWith("ec-3") || codec.startsWith("dec3")) { return MimeTypes.AUDIO_E_AC3; - } else if (codec.startsWith(Ac3Util.E_AC3_JOC_CODEC_STRING)) { + } else if (codec.startsWith(CODEC_E_AC3_JOC)) { return MimeTypes.AUDIO_E_AC3_JOC; } else if (codec.startsWith("ac-4") || codec.startsWith("dac4")) { return MimeTypes.AUDIO_AC4; @@ -514,7 +519,7 @@ public final class MimeTypes { if (objectType == null) { return C.ENCODING_INVALID; } - return AacUtil.getEncodingForAudioObjectType(objectType.audioObjectTypeIndication); + return objectType.getEncoding(); case MimeTypes.AUDIO_AC3: return C.ENCODING_AC3; case MimeTypes.AUDIO_E_AC3: @@ -665,12 +670,34 @@ public final class MimeTypes { /** The Object Type Indication of the MP4A codec. */ public final int objectTypeIndication; /** The Audio Object Type Indication of the MP4A codec, or 0 if it is absent. */ - @AacUtil.AacAudioObjectType public final int audioObjectTypeIndication; + public final int audioObjectTypeIndication; public Mp4aObjectType(int objectTypeIndication, int audioObjectTypeIndication) { this.objectTypeIndication = objectTypeIndication; this.audioObjectTypeIndication = audioObjectTypeIndication; } + + /** Returns the encoding for {@link #audioObjectTypeIndication}. */ + @C.Encoding + public int getEncoding() { + // See AUDIO_OBJECT_TYPE_AAC_* constants in AacUtil. + switch (audioObjectTypeIndication) { + case 2: + return C.ENCODING_AAC_LC; + case 5: + return C.ENCODING_AAC_HE_V1; + case 29: + return C.ENCODING_AAC_HE_V2; + case 42: + return C.ENCODING_AAC_XHE; + case 23: + return C.ENCODING_AAC_ELD; + case 22: + return C.ENCODING_AAC_ER_BSAC; + default: + return C.ENCODING_INVALID; + } + } } private static final class CustomMimeType { diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index f58e428a6f..970ddf0829 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -24,7 +24,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.audio.Ac3Util; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; @@ -776,7 +775,7 @@ public class DashManifestParser extends DefaultHandler if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType)) { sampleMimeType = parseEac3SupplementalProperties(supplementalProperties); if (MimeTypes.AUDIO_E_AC3_JOC.equals(sampleMimeType)) { - codecs = Ac3Util.E_AC3_JOC_CODEC_STRING; + codecs = MimeTypes.CODEC_E_AC3_JOC; } } @C.SelectionFlags int selectionFlags = parseSelectionFlagsFromRoleDescriptors(roleDescriptors); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java similarity index 95% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java index 2684273b2e..9fe10f1f86 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java @@ -300,27 +300,6 @@ public final class AacUtil { return specificConfig; } - /** Returns the encoding for a given AAC audio object type. */ - @C.Encoding - public static int getEncodingForAudioObjectType(@AacAudioObjectType int audioObjectType) { - switch (audioObjectType) { - case AUDIO_OBJECT_TYPE_AAC_LC: - return C.ENCODING_AAC_LC; - case AUDIO_OBJECT_TYPE_AAC_SBR: - return C.ENCODING_AAC_HE_V1; - case AUDIO_OBJECT_TYPE_AAC_PS: - return C.ENCODING_AAC_HE_V2; - case AUDIO_OBJECT_TYPE_AAC_XHE: - return C.ENCODING_AAC_XHE; - case AUDIO_OBJECT_TYPE_AAC_ELD: - return C.ENCODING_AAC_ELD; - case AUDIO_OBJECT_TYPE_AAC_ER_BSAC: - return C.ENCODING_AAC_ER_BSAC; - default: - return C.ENCODING_INVALID; - } - } - /** * Returns the AAC audio object type as specified in 14496-3 (2005) Table 1.14. * diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java similarity index 98% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java index dbb234c5d8..f3dfb20f9b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java @@ -91,13 +91,6 @@ public final class Ac3Util { } } - /** - * A non-standard codec string for E-AC3-JOC. Use of this constant allows for disambiguation - * between regular E-AC3 ("ec-3") and E-AC3-JOC ("ec+3") streams from the codec string alone. The - * standard is to use "ec-3" for both, as per the MP4RA - * registered codec types. - */ - public static final String E_AC3_JOC_CODEC_STRING = "ec+3"; /** Maximum rate for an AC-3 audio stream, in bytes per second. */ public static final int AC3_MAX_RATE_BYTES_PER_SECOND = 640 * 1000 / 8; /** Maximum rate for an E-AC-3 audio stream, in bytes per second. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/DtsUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/audio/WavUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/video/DolbyVisionConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/DolbyVisionConfig.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/video/DolbyVisionConfig.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/video/DolbyVisionConfig.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/audio/Ac3UtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/audio/Ac3UtilTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/audio/Ac3UtilTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/audio/Ac3UtilTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/video/HevcConfigTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/video/HevcConfigTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/video/HevcConfigTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/video/HevcConfigTest.java diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index ce44211b31..ac8bf1e5a8 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.audio.Ac3Util; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; @@ -518,7 +517,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser Date: Fri, 13 Aug 2021 12:29:00 +0100 Subject: [PATCH 060/441] Move DecryptionException into decoder package PiperOrigin-RevId: 390582804 --- RELEASENOTES.md | 3 +++ .../com/google/android/exoplayer2/ext/opus/OpusDecoder.java | 2 +- .../java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java | 2 +- .../exoplayer2/{drm => decoder}/DecryptionException.java | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) rename library/common/src/main/java/com/google/android/exoplayer2/{drm => decoder}/DecryptionException.java (95%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8bea7b5e18..174da6899f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,9 +1,12 @@ # Release notes ### dev-v2 (not yet released) + * Core Library: * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. + * Move `com.google.android.exoplayer2.drm.DecryptionException` to + `com.google.android.exoplayer2.decoder.DecryptionException`. * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Android 12 compatibility: diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index f6da031a7a..9005755cd6 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -23,9 +23,9 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.audio.OpusUtil; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.decoder.DecryptionException; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; -import com.google.android.exoplayer2.drm.DecryptionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index 7e8eedb210..07c5a8700b 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -23,8 +23,8 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.decoder.DecryptionException; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.drm.DecryptionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java similarity index 95% rename from library/common/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java index eddaba3d93..0737cc47a5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/drm/DecryptionException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.drm; +package com.google.android.exoplayer2.decoder; /** Thrown when a non-platform component fails to decrypt data. */ public class DecryptionException extends Exception { From a44878482cdbb44d9100f511639037941d9de31c Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 13 Aug 2021 14:53:54 +0100 Subject: [PATCH 061/441] Add section comments to MimeTypes.java PiperOrigin-RevId: 390602716 --- .../main/java/com/google/android/exoplayer2/C.java | 1 - .../google/android/exoplayer2/util/MimeTypes.java | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 37a5b09d99..5c7cdca992 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -1041,7 +1041,6 @@ public final class C { * audio MIME type. */ public static final int FORMAT_UNSUPPORTED_TYPE = 0b000; - /** * Converts a time in microseconds to the corresponding time in milliseconds, preserving {@link * #TIME_UNSET} and {@link #TIME_END_OF_SOURCE} values. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 7320847483..044dbf13a9 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -33,6 +33,8 @@ public final class MimeTypes { public static final String BASE_TYPE_IMAGE = "image"; public static final String BASE_TYPE_APPLICATION = "application"; + // video/ MIME types + public static final String VIDEO_MP4 = BASE_TYPE_VIDEO + "/mp4"; public static final String VIDEO_MATROSKA = BASE_TYPE_VIDEO + "/x-matroska"; public static final String VIDEO_WEBM = BASE_TYPE_VIDEO + "/webm"; @@ -54,6 +56,8 @@ public final class MimeTypes { public static final String VIDEO_OGG = BASE_TYPE_VIDEO + "/ogg"; public static final String VIDEO_UNKNOWN = BASE_TYPE_VIDEO + "/x-unknown"; + // audio/ MIME types + public static final String AUDIO_MP4 = BASE_TYPE_AUDIO + "/mp4"; public static final String AUDIO_AAC = BASE_TYPE_AUDIO + "/mp4a-latm"; public static final String AUDIO_MATROSKA = BASE_TYPE_AUDIO + "/x-matroska"; @@ -87,12 +91,18 @@ public final class MimeTypes { public static final String AUDIO_WAV = BASE_TYPE_AUDIO + "/wav"; public static final String AUDIO_UNKNOWN = BASE_TYPE_AUDIO + "/x-unknown"; + // text/ MIME types + public static final String TEXT_VTT = BASE_TYPE_TEXT + "/vtt"; public static final String TEXT_SSA = BASE_TYPE_TEXT + "/x-ssa"; + // application/ MIME types + public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4"; public static final String APPLICATION_WEBM = BASE_TYPE_APPLICATION + "/webm"; + public static final String APPLICATION_MATROSKA = BASE_TYPE_APPLICATION + "/x-matroska"; + public static final String APPLICATION_MPD = BASE_TYPE_APPLICATION + "/dash+xml"; public static final String APPLICATION_M3U8 = BASE_TYPE_APPLICATION + "/x-mpegURL"; public static final String APPLICATION_SS = BASE_TYPE_APPLICATION + "/vnd.ms-sstr+xml"; @@ -108,7 +118,9 @@ public final class MimeTypes { public static final String APPLICATION_VOBSUB = BASE_TYPE_APPLICATION + "/vobsub"; public static final String APPLICATION_PGS = BASE_TYPE_APPLICATION + "/pgs"; public static final String APPLICATION_SCTE35 = BASE_TYPE_APPLICATION + "/x-scte35"; + public static final String APPLICATION_CAMERA_MOTION = BASE_TYPE_APPLICATION + "/x-camera-motion"; + public static final String APPLICATION_EMSG = BASE_TYPE_APPLICATION + "/x-emsg"; public static final String APPLICATION_DVBSUBS = BASE_TYPE_APPLICATION + "/dvbsubs"; public static final String APPLICATION_EXIF = BASE_TYPE_APPLICATION + "/x-exif"; @@ -116,6 +128,8 @@ public final class MimeTypes { public static final String APPLICATION_AIT = BASE_TYPE_APPLICATION + "/vnd.dvb.ait"; public static final String APPLICATION_RTSP = BASE_TYPE_APPLICATION + "/x-rtsp"; + // image/ MIME types + public static final String IMAGE_JPEG = BASE_TYPE_IMAGE + "/jpeg"; /** From 743b33e821cd06ec7b7b704725c97031736da05d Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 13 Aug 2021 16:10:54 +0100 Subject: [PATCH 062/441] Remove Player.Listener inheritance of VideoListener NO_EXTERNAL PiperOrigin-RevId: 390614839 --- RELEASENOTES.md | 2 + .../android/exoplayer2/ForwardingPlayer.java | 17 ------ .../com/google/android/exoplayer2/Player.java | 24 ++++++-- .../exoplayer2/video/VideoListener.java | 57 ------------------- .../google/android/exoplayer2/ExoPlayer.java | 21 +------ .../android/exoplayer2/SimpleExoPlayer.java | 40 +++---------- 6 files changed, 31 insertions(+), 130 deletions(-) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/video/VideoListener.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 174da6899f..4381e61448 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -31,6 +31,8 @@ Use `Player.addListener` and `Player.Listener` instead. * Remove `SimpleExoPlayer.addAudioListener`, `removeAudioListener` and `AudioListener`. Use `Player.addListener` and `Player.Listener` instead. + * Remove `SimpleExoPlayer.addVideoListener`, `removeVideoListener` and + `VideoListener`. Use `Player.addListener` and `Player.Listener` instead. ### 2.15.0 (2021-08-10) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 395fea9c6f..59329088f8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -802,20 +802,11 @@ public class ForwardingPlayer implements Player { this.listener = listener; } - // VideoListener methods. - @Override public void onVideoSizeChanged(VideoSize videoSize) { listener.onVideoSizeChanged(videoSize); } - @Override - @SuppressWarnings("deprecation") // Forwarding to deprecated method. - public void onVideoSizeChanged( - int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { - listener.onVideoSizeChanged(width, height, unappliedRotationDegrees, pixelWidthHeightRatio); - } - @Override public void onSurfaceSizeChanged(int width, int height) { listener.onSurfaceSizeChanged(width, height); @@ -826,8 +817,6 @@ public class ForwardingPlayer implements Player { listener.onRenderedFirstFrame(); } - // AudioListener methods - @Override public void onAudioSessionIdChanged(int audioSessionId) { listener.onAudioSessionIdChanged(audioSessionId); @@ -848,22 +837,16 @@ public class ForwardingPlayer implements Player { listener.onSkipSilenceEnabledChanged(skipSilenceEnabled); } - // TextOutput methods. - @Override public void onCues(List cues) { listener.onCues(cues); } - // MetadataOutput methods. - @Override public void onMetadata(Metadata metadata) { listener.onMetadata(metadata); } - // DeviceListener callbacks - @Override public void onDeviceInfoChanged(DeviceInfo deviceInfo) { listener.onDeviceInfoChanged(deviceInfo); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 898c4026aa..457332bb44 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -32,7 +32,6 @@ import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.FlagSet; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.common.base.Objects; import java.lang.annotation.Documented; @@ -869,7 +868,7 @@ public interface Player { * *

      All methods have no-op default implementations to allow selective overrides. */ - interface Listener extends VideoListener, TextOutput, EventListener { + interface Listener extends TextOutput, EventListener { @Override default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {} @@ -964,13 +963,28 @@ public interface Player { @Override default void onEvents(Player player, Events events) {} - @Override + /** + * Called each time there's a change in the size of the video being rendered. + * + * @param videoSize The new size of the video. + */ default void onVideoSizeChanged(VideoSize videoSize) {} - @Override + /** + * Called each time there's a change in the size of the surface onto which the video is being + * rendered. + * + * @param width The surface width in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if + * the video is not rendered onto a surface. + * @param height The surface height in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if + * the video is not rendered onto a surface. + */ default void onSurfaceSizeChanged(int width, int height) {} - @Override + /** + * Called when a frame is rendered for the first time since setting the surface, or since the + * renderer was reset, or since the stream being rendered was changed. + */ default void onRenderedFirstFrame() {} @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/video/VideoListener.java b/library/common/src/main/java/com/google/android/exoplayer2/video/VideoListener.java deleted file mode 100644 index 6a05230dce..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/video/VideoListener.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.video; - -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.Player; - -/** - * A listener for metadata corresponding to video being rendered. - * - * @deprecated Use {@link Player.Listener}. - */ -@Deprecated -public interface VideoListener { - - /** - * Called each time there's a change in the size of the video being rendered. - * - * @param videoSize The new size of the video. - */ - default void onVideoSizeChanged(VideoSize videoSize) {} - - /** @deprecated Use {@link #onVideoSizeChanged(VideoSize videoSize)}. */ - @Deprecated - default void onVideoSizeChanged( - int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {} - - /** - * Called each time there's a change in the size of the surface onto which the video is being - * rendered. - * - * @param width The surface width in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if the - * video is not rendered onto a surface. - * @param height The surface height in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if - * the video is not rendered onto a surface. - */ - default void onSurfaceSizeChanged(int width, int height) {} - - /** - * Called when a frame is rendered for the first time since setting the surface, or since the - * renderer was reset, or since the stream being rendered was changed. - */ - default void onRenderedFirstFrame() {} -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 6bf7d66f15..80d3899832 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -53,7 +53,6 @@ import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; -import com.google.android.exoplayer2.video.VideoListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; import java.util.List; @@ -253,24 +252,6 @@ public interface ExoPlayer extends Player { @C.VideoChangeFrameRateStrategy int getVideoChangeFrameRateStrategy(); - /** - * Adds a listener to receive video events. - * - * @param listener The listener to register. - * @deprecated Use {@link #addListener(Listener)}. - */ - @Deprecated - void addVideoListener(VideoListener listener); - - /** - * Removes a listener of video events. - * - * @param listener The listener to unregister. - * @deprecated Use {@link #removeListener(Listener)}. - */ - @Deprecated - void removeVideoListener(VideoListener listener); - /** * Sets a listener to receive video frame metadata events. * @@ -397,7 +378,7 @@ public interface ExoPlayer extends Player { *

      The width and height of size could be 0 if there is no video or the size has not been * determined yet. * - * @see Listener#onVideoSizeChanged(int, int, int, float) + * @see Listener#onVideoSizeChanged(VideoSize) */ VideoSize getVideoSize(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 81254f4e47..ed678d1d9b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -76,7 +76,6 @@ import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; -import com.google.android.exoplayer2.video.VideoListener; import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; @@ -425,7 +424,6 @@ public class SimpleExoPlayer extends BasePlayer private final ExoPlayerImpl player; private final ComponentListener componentListener; private final FrameMetadataListener frameMetadataListener; - private final CopyOnWriteArraySet videoListeners; private final CopyOnWriteArraySet textOutputs; private final CopyOnWriteArraySet listeners; private final AnalyticsCollector analyticsCollector; @@ -507,7 +505,6 @@ public class SimpleExoPlayer extends BasePlayer detachSurfaceTimeoutMs = builder.detachSurfaceTimeoutMs; componentListener = new ComponentListener(); frameMetadataListener = new FrameMetadataListener(); - videoListeners = new CopyOnWriteArraySet<>(); textOutputs = new CopyOnWriteArraySet<>(); listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); @@ -1001,21 +998,6 @@ public class SimpleExoPlayer extends BasePlayer return audioDecoderCounters; } - @Deprecated - @Override - public void addVideoListener(VideoListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); - videoListeners.add(listener); - } - - @Deprecated - @Override - public void removeVideoListener(VideoListener listener) { - // Don't verify application thread. We allow calls to this method from any thread. - videoListeners.remove(listener); - } - @Override public void setVideoFrameMetadataListener(VideoFrameMetadataListener listener) { verifyApplicationThread(); @@ -1105,7 +1087,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Listener listener) { Assertions.checkNotNull(listener); - addVideoListener(listener); addTextOutput(listener); listeners.add(listener); EventListener eventListener = listener; @@ -1123,7 +1104,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void removeListener(Listener listener) { Assertions.checkNotNull(listener); - removeVideoListener(listener); removeTextOutput(listener); listeners.remove(listener); EventListener eventListener = listener; @@ -1796,8 +1776,9 @@ public class SimpleExoPlayer extends BasePlayer surfaceWidth = width; surfaceHeight = height; analyticsCollector.onSurfaceSizeChanged(width, height); - for (VideoListener videoListener : videoListeners) { - videoListener.onSurfaceSizeChanged(width, height); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onSurfaceSizeChanged(width, height); } } } @@ -1969,13 +1950,9 @@ public class SimpleExoPlayer extends BasePlayer public void onVideoSizeChanged(VideoSize videoSize) { SimpleExoPlayer.this.videoSize = videoSize; analyticsCollector.onVideoSizeChanged(videoSize); - for (VideoListener videoListener : videoListeners) { - videoListener.onVideoSizeChanged(videoSize); - videoListener.onVideoSizeChanged( - videoSize.width, - videoSize.height, - videoSize.unappliedRotationDegrees, - videoSize.pixelWidthHeightRatio); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onVideoSizeChanged(videoSize); } } @@ -1983,8 +1960,9 @@ public class SimpleExoPlayer extends BasePlayer public void onRenderedFirstFrame(Object output, long renderTimeMs) { analyticsCollector.onRenderedFirstFrame(output, renderTimeMs); if (videoOutput == output) { - for (VideoListener videoListener : videoListeners) { - videoListener.onRenderedFirstFrame(); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listener : listeners) { + listener.onRenderedFirstFrame(); } } } From 38e5864f87b8e24e69db7144be3bc792a02650cd Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 13 Aug 2021 17:36:48 +0100 Subject: [PATCH 063/441] Remove Player.Listener inheritance of TextOutput PiperOrigin-RevId: 390630998 --- RELEASENOTES.md | 4 ++++ .../com/google/android/exoplayer2/Player.java | 12 +++++++--- .../google/android/exoplayer2/ExoPlayer.java | 19 --------------- .../android/exoplayer2/SimpleExoPlayer.java | 24 +++---------------- .../android/exoplayer2/text/TextOutput.java | 0 .../android/exoplayer2/ui/SubtitleView.java | 4 ++-- 6 files changed, 18 insertions(+), 45 deletions(-) rename library/{common => core}/src/main/java/com/google/android/exoplayer2/text/TextOutput.java (100%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4381e61448..597c9377b1 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,10 @@ application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. * GVR extension: * Remove `GvrAudioProcessor`, which has been deprecated since 2.11.0. +* UI + * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` + implements `Player.Listener`, so can be registered to a player with + `Player.addListener`. * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 457332bb44..c8d5ad88c5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -27,7 +27,6 @@ import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.FlagSet; @@ -868,7 +867,7 @@ public interface Player { * *

      All methods have no-op default implementations to allow selective overrides. */ - interface Listener extends TextOutput, EventListener { + interface Listener extends EventListener { @Override default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {} @@ -987,7 +986,14 @@ public interface Player { */ default void onRenderedFirstFrame() {} - @Override + /** + * Called when there is a change in the {@link Cue Cues}. + * + *

      {@code cues} is in ascending order of priority. If any of the cue boxes overlap when + * displayed, the {@link Cue} nearer the end of the list should be shown on top. + * + * @param cues The {@link Cue Cues}. May be empty. + */ default void onCues(List cues) {} /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 80d3899832..c04d516cc5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -41,7 +41,6 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.text.TextRenderer; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; @@ -386,24 +385,6 @@ public interface ExoPlayer extends Player { /** The text component of an {@link ExoPlayer}. */ interface TextComponent { - /** - * Registers an output to receive text events. - * - * @param listener The output to register. - * @deprecated Use {@link #addListener(Listener)}. - */ - @Deprecated - void addTextOutput(TextOutput listener); - - /** - * Removes a text output. - * - * @param listener The output to remove. - * @deprecated Use {@link #removeListener(Listener)}. - */ - @Deprecated - void removeTextOutput(TextOutput listener); - /** Returns the current {@link Cue Cues}. This list may be empty. */ List getCurrentCues(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index ed678d1d9b..b822761f88 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -424,7 +424,6 @@ public class SimpleExoPlayer extends BasePlayer private final ExoPlayerImpl player; private final ComponentListener componentListener; private final FrameMetadataListener frameMetadataListener; - private final CopyOnWriteArraySet textOutputs; private final CopyOnWriteArraySet listeners; private final AnalyticsCollector analyticsCollector; private final AudioBecomingNoisyManager audioBecomingNoisyManager; @@ -505,7 +504,6 @@ public class SimpleExoPlayer extends BasePlayer detachSurfaceTimeoutMs = builder.detachSurfaceTimeoutMs; componentListener = new ComponentListener(); frameMetadataListener = new FrameMetadataListener(); - textOutputs = new CopyOnWriteArraySet<>(); listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); renderers = @@ -1046,21 +1044,6 @@ public class SimpleExoPlayer extends BasePlayer .send(); } - @Deprecated - @Override - public void addTextOutput(TextOutput listener) { - // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); - textOutputs.add(listener); - } - - @Deprecated - @Override - public void removeTextOutput(TextOutput listener) { - // Don't verify application thread. We allow calls to this method from any thread. - textOutputs.remove(listener); - } - @Override public List getCurrentCues() { verifyApplicationThread(); @@ -1087,7 +1070,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Listener listener) { Assertions.checkNotNull(listener); - addTextOutput(listener); listeners.add(listener); EventListener eventListener = listener; addListener(eventListener); @@ -1104,7 +1086,6 @@ public class SimpleExoPlayer extends BasePlayer @Override public void removeListener(Listener listener) { Assertions.checkNotNull(listener); - removeTextOutput(listener); listeners.remove(listener); EventListener eventListener = listener; removeListener(eventListener); @@ -2057,8 +2038,9 @@ public class SimpleExoPlayer extends BasePlayer @Override public void onCues(List cues) { currentCues = cues; - for (TextOutput textOutput : textOutputs) { - textOutput.onCues(cues); + // TODO(internal b/187152483): Events should be dispatched via ListenerSet + for (Listener listeners : listeners) { + listeners.onCues(cues); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/TextOutput.java b/library/core/src/main/java/com/google/android/exoplayer2/text/TextOutput.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/TextOutput.java rename to library/core/src/main/java/com/google/android/exoplayer2/text/TextOutput.java diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java index 9731506ecd..ee62328b4e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java @@ -30,8 +30,8 @@ import android.widget.FrameLayout; import androidx.annotation.Dimension; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -40,7 +40,7 @@ import java.util.Collections; import java.util.List; /** A view for displaying subtitle {@link Cue}s. */ -public final class SubtitleView extends FrameLayout implements TextOutput { +public final class SubtitleView extends FrameLayout implements Player.Listener { /** * An output for displaying subtitles. From 80d9d47d1c1ecd97da66f129f421777bde872ba8 Mon Sep 17 00:00:00 2001 From: apodob Date: Mon, 16 Aug 2021 16:01:04 +0100 Subject: [PATCH 064/441] Add Extractor#release() implementation. SubtitleExtractor.release() releases the underlying SubtitleDecoder. This change introduces the STATE_RELEASED state. The extractor handles the new state in the read() and seek() methods. PiperOrigin-RevId: 391046478 --- .../extractor/subtitle/SubtitleExtractor.java | 23 +++++++-- .../subtitle/SubtitleExtractorTest.java | 47 ++++++++++++++++++- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index 8282c74d97..805b1fb434 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -52,7 +52,8 @@ public class SubtitleExtractor implements Extractor { STATE_READING, STATE_DECODING, STATE_WRITING, - STATE_FINISHED + STATE_FINISHED, + STATE_RELEASED }) @Retention(RetentionPolicy.SOURCE) private @interface State {} @@ -69,6 +70,8 @@ public class SubtitleExtractor implements Extractor { private static final int STATE_WRITING = 4; /** The extractor has finished writing. */ private static final int STATE_FINISHED = 5; + /** The extractor has bean released */ + private static final int STATE_RELEASED = 6; private static final int DEFAULT_BUFFER_SIZE = 1024; @@ -82,6 +85,11 @@ public class SubtitleExtractor implements Extractor { private int bytesRead; @State private int state; + /** + * @param subtitleDecoder The decoder used for decoding the subtitle data. The extractor will + * release the decoder in {@link SubtitleExtractor#release()}. + * @param format Format that describes subtitle data. + */ public SubtitleExtractor(SubtitleDecoder subtitleDecoder, Format format) { this.subtitleDecoder = subtitleDecoder; cueEncoder = new CueEncoder(); @@ -128,18 +136,25 @@ public class SubtitleExtractor implements Extractor { case STATE_FINISHED: return Extractor.RESULT_END_OF_INPUT; case STATE_CREATED: + case STATE_RELEASED: default: throw new IllegalStateException(); } } @Override - public void seek(long position, long timeUs) {} + public void seek(long position, long timeUs) { + checkState(state != STATE_CREATED && state != STATE_RELEASED); + } + /** Releases the extractor's resources, including the {@link SubtitleDecoder}. */ @Override public void release() { - // TODO: Proper implementation of this method is missing. Implement release() according to the - // Extractor interface documentation. + if (state == STATE_RELEASED) { + return; + } + subtitleDecoder.release(); + state = STATE_RELEASED; } private void prepareMemory(ExtractorInput input) { diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java index dc842ef9cc..9d516d2e2a 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java @@ -91,11 +91,56 @@ public class SubtitleExtractorTest { } @Test - public void read_notInitialized_fails() { + public void read_withoutInit_fails() { FakeExtractorInput input = new FakeExtractorInput.Builder().setData(new byte[0]).build(); SubtitleExtractor extractor = new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); assertThrows(IllegalStateException.class, () -> extractor.read(input, null)); } + + @Test + public void read_afterRelease_fails() { + FakeExtractorInput input = new FakeExtractorInput.Builder().setData(new byte[0]).build(); + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + FakeExtractorOutput output = new FakeExtractorOutput(); + + extractor.init(output); + extractor.release(); + + assertThrows(IllegalStateException.class, () -> extractor.read(input, null)); + } + + @Test + public void seek_withoutInit_fails() { + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + + assertThrows(IllegalStateException.class, () -> extractor.seek(0, 0)); + } + + @Test + public void seek_afterRelease_fails() { + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + FakeExtractorOutput output = new FakeExtractorOutput(); + + extractor.init(output); + extractor.release(); + + assertThrows(IllegalStateException.class, () -> extractor.seek(0, 0)); + } + + @Test + public void released_calledTwice() { + SubtitleExtractor extractor = + new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + FakeExtractorOutput output = new FakeExtractorOutput(); + + extractor.init(output); + extractor.release(); + extractor.release(); + // Calling realease() twice does not throw an exception. + } } From ef0bfa487fdea54dbfc81879a8e3e716e3695d14 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 16 Aug 2021 16:44:32 +0100 Subject: [PATCH 065/441] Remove previously deprecated DefaultHttpDataSourceFactory NO_EXTERNAL PiperOrigin-RevId: 391054962 --- RELEASENOTES.md | 2 + .../exoplayer2/castdemo/PlayerManager.java | 5 - .../DefaultHttpDataSourceFactory.java | 136 ------------------ 3 files changed, 2 insertions(+), 141 deletions(-) delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 597c9377b1..5b16444420 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -37,6 +37,8 @@ `AudioListener`. Use `Player.addListener` and `Player.Listener` instead. * Remove `SimpleExoPlayer.addVideoListener`, `removeVideoListener` and `VideoListener`. Use `Player.addListener` and `Player.Listener` instead. + * Remove `DefaultHttpDataSourceFactory`. Use + `DefaultHttpDataSource.Factory` instead. ### 2.15.0 (2021-08-10) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 711550c923..e6a55b1ce5 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -36,7 +36,6 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; import com.google.android.gms.cast.framework.CastContext; import java.util.ArrayList; @@ -57,10 +56,6 @@ import java.util.ArrayList; void onUnsupportedTrack(int trackType); } - private static final String USER_AGENT = "ExoCastDemoPlayer"; - private static final DefaultHttpDataSourceFactory DATA_SOURCE_FACTORY = - new DefaultHttpDataSourceFactory(USER_AGENT); - private final PlayerView localPlayerView; private final PlayerControlView castControlView; private final DefaultTrackSelector trackSelector; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java deleted file mode 100644 index ca309ad592..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.upstream; - -import androidx.annotation.Nullable; -import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory; - -/** @deprecated Use {@link DefaultHttpDataSource.Factory} instead. */ -@Deprecated -public final class DefaultHttpDataSourceFactory extends BaseFactory { - - @Nullable private final String userAgent; - @Nullable private final TransferListener listener; - private final int connectTimeoutMillis; - private final int readTimeoutMillis; - private final boolean allowCrossProtocolRedirects; - - /** - * Creates an instance. Sets {@link DefaultHttpDataSource#DEFAULT_CONNECT_TIMEOUT_MILLIS} as the - * connection timeout, {@link DefaultHttpDataSource#DEFAULT_READ_TIMEOUT_MILLIS} as the read - * timeout and disables cross-protocol redirects. - */ - public DefaultHttpDataSourceFactory() { - this(/* userAgent= */ null); - } - - /** - * Creates an instance. Sets {@link DefaultHttpDataSource#DEFAULT_CONNECT_TIMEOUT_MILLIS} as the - * connection timeout, {@link DefaultHttpDataSource#DEFAULT_READ_TIMEOUT_MILLIS} as the read - * timeout and disables cross-protocol redirects. - * - * @param userAgent The user agent that will be used, or {@code null} to use the default user - * agent of the underlying platform. - */ - public DefaultHttpDataSourceFactory(@Nullable String userAgent) { - this(userAgent, null); - } - - /** - * Creates an instance. Sets {@link DefaultHttpDataSource#DEFAULT_CONNECT_TIMEOUT_MILLIS} as the - * connection timeout, {@link DefaultHttpDataSource#DEFAULT_READ_TIMEOUT_MILLIS} as the read - * timeout and disables cross-protocol redirects. - * - * @param userAgent The user agent that will be used, or {@code null} to use the default user - * agent of the underlying platform. - * @param listener An optional listener. - * @see #DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean) - */ - public DefaultHttpDataSourceFactory( - @Nullable String userAgent, @Nullable TransferListener listener) { - this( - userAgent, - listener, - DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, - DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, - false); - } - - /** - * @param userAgent The user agent that will be used, or {@code null} to use the default user - * agent of the underlying platform. - * @param connectTimeoutMillis The connection timeout that should be used when requesting remote - * data, in milliseconds. A timeout of zero is interpreted as an infinite timeout. - * @param readTimeoutMillis The read timeout that should be used when requesting remote data, in - * milliseconds. A timeout of zero is interpreted as an infinite timeout. - * @param allowCrossProtocolRedirects Whether cross-protocol redirects (i.e. redirects from HTTP - * to HTTPS and vice versa) are enabled. - */ - public DefaultHttpDataSourceFactory( - @Nullable String userAgent, - int connectTimeoutMillis, - int readTimeoutMillis, - boolean allowCrossProtocolRedirects) { - this( - userAgent, - /* listener= */ null, - connectTimeoutMillis, - readTimeoutMillis, - allowCrossProtocolRedirects); - } - - /** - * @param userAgent The user agent that will be used, or {@code null} to use the default user - * agent of the underlying platform. - * @param listener An optional listener. - * @param connectTimeoutMillis The connection timeout that should be used when requesting remote - * data, in milliseconds. A timeout of zero is interpreted as an infinite timeout. - * @param readTimeoutMillis The read timeout that should be used when requesting remote data, in - * milliseconds. A timeout of zero is interpreted as an infinite timeout. - * @param allowCrossProtocolRedirects Whether cross-protocol redirects (i.e. redirects from HTTP - * to HTTPS and vice versa) are enabled. - */ - public DefaultHttpDataSourceFactory( - @Nullable String userAgent, - @Nullable TransferListener listener, - int connectTimeoutMillis, - int readTimeoutMillis, - boolean allowCrossProtocolRedirects) { - this.userAgent = userAgent; - this.listener = listener; - this.connectTimeoutMillis = connectTimeoutMillis; - this.readTimeoutMillis = readTimeoutMillis; - this.allowCrossProtocolRedirects = allowCrossProtocolRedirects; - } - - // Calls deprecated constructor. - @SuppressWarnings("deprecation") - @Override - protected DefaultHttpDataSource createDataSourceInternal( - HttpDataSource.RequestProperties defaultRequestProperties) { - DefaultHttpDataSource dataSource = - new DefaultHttpDataSource( - userAgent, - connectTimeoutMillis, - readTimeoutMillis, - allowCrossProtocolRedirects, - defaultRequestProperties); - if (listener != null) { - dataSource.addTransferListener(listener); - } - return dataSource; - } -} From d58e8df252d9e110f119c0051f43be4a4fb70bc4 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Mon, 16 Aug 2021 18:21:02 +0100 Subject: [PATCH 066/441] Deprecate ExoPlayer TextComponent. PiperOrigin-RevId: 391077147 --- .../com/google/android/exoplayer2/ExoPlayer.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index c04d516cc5..588dc49866 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -382,10 +382,15 @@ public interface ExoPlayer extends Player { VideoSize getVideoSize(); } - /** The text component of an {@link ExoPlayer}. */ + /** + * @deprecated Use {@link Player} instead, as the {@link TextComponent} methods are a part of the + * {@link Player interface}. + */ + @Deprecated interface TextComponent { - /** Returns the current {@link Cue Cues}. This list may be empty. */ + /** @deprecated Use {@link Player#getCurrentCues()} instead. */ + @Deprecated List getCurrentCues(); } @@ -950,8 +955,12 @@ public interface ExoPlayer extends Player { @Nullable VideoComponent getVideoComponent(); - /** Returns the component of this player for text output, or null if text is not supported. */ + /** + * @deprecated Use {@link Player} instead, as the {@link TextComponent} methods are a part of the + * {@link Player interface}. + */ @Nullable + @Deprecated TextComponent getTextComponent(); /** Returns the component of this player for playback device, or null if it's not supported. */ From ce4c8e405c7858756b6beb7b3c57f08c26c6934d Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 17 Aug 2021 11:49:12 +0100 Subject: [PATCH 067/441] Add some range annotations PiperOrigin-RevId: 391253301 --- .../exoplayer2/ext/cast/CastPlayer.java | 5 ++- .../exoplayer2/ext/ima/ImaAdsLoader.java | 7 +-- .../google/android/exoplayer2/MediaItem.java | 3 +- .../exoplayer2/PlaybackParameters.java | 9 ++-- .../com/google/android/exoplayer2/Player.java | 31 +++++++------ .../source/ads/AdPlaybackState.java | 45 ++++++++++++------- .../exoplayer2/offline/DownloadManager.java | 3 +- .../exoplayer2/source/SilenceMediaSource.java | 3 +- .../ui/PlayerNotificationManager.java | 3 +- 9 files changed, 67 insertions(+), 42 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index ac113f3ab8..246c69e8da 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -24,6 +24,7 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.TextureView; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.BasePlayer; @@ -190,8 +191,8 @@ public final class CastPlayer extends BasePlayer { public CastPlayer( CastContext castContext, MediaItemConverter mediaItemConverter, - long seekBackIncrementMs, - long seekForwardIncrementMs) { + @IntRange(from = 1) long seekBackIncrementMs, + @IntRange(from = 1) long seekForwardIncrementMs) { checkArgument(seekBackIncrementMs > 0 && seekForwardIncrementMs > 0); this.castContext = castContext; this.mediaItemConverter = mediaItemConverter; diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index f77a5a0aa6..7f52005b68 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -26,6 +26,7 @@ import android.content.Context; import android.os.Looper; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.ads.interactivemedia.v3.api.AdDisplayContainer; @@ -276,7 +277,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader { * @return This builder, for convenience. * @see AdsRequest#setVastLoadTimeout(float) */ - public Builder setVastLoadTimeoutMs(int vastLoadTimeoutMs) { + public Builder setVastLoadTimeoutMs(@IntRange(from = 1) int vastLoadTimeoutMs) { checkArgument(vastLoadTimeoutMs > 0); this.vastLoadTimeoutMs = vastLoadTimeoutMs; return this; @@ -289,7 +290,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader { * @return This builder, for convenience. * @see AdsRenderingSettings#setLoadVideoTimeout(int) */ - public Builder setMediaLoadTimeoutMs(int mediaLoadTimeoutMs) { + public Builder setMediaLoadTimeoutMs(@IntRange(from = 1) int mediaLoadTimeoutMs) { checkArgument(mediaLoadTimeoutMs > 0); this.mediaLoadTimeoutMs = mediaLoadTimeoutMs; return this; @@ -302,7 +303,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader { * @return This builder, for convenience. * @see AdsRenderingSettings#setBitrateKbps(int) */ - public Builder setMaxMediaBitrate(int bitrate) { + public Builder setMaxMediaBitrate(@IntRange(from = 1) int bitrate) { checkArgument(bitrate > 0); this.mediaBitrate = bitrate; return this; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index e8373532a1..568a9b97ca 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -21,6 +21,7 @@ import static com.google.android.exoplayer2.util.Assertions.checkState; import android.net.Uri; import android.os.Bundle; import androidx.annotation.IntDef; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.util.Assertions; @@ -197,7 +198,7 @@ public final class MediaItem implements Bundleable { * Sets the optional start position in milliseconds which must be a value larger than or equal * to zero (Default: 0). */ - public Builder setClipStartPositionMs(long startPositionMs) { + public Builder setClipStartPositionMs(@IntRange(from = 0) long startPositionMs) { Assertions.checkArgument(startPositionMs >= 0); this.clipStartPositionMs = startPositionMs; return this; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackParameters.java index 806bf11064..8034944e17 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackParameters.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2; import android.os.Bundle; import androidx.annotation.CheckResult; +import androidx.annotation.FloatRange; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.Assertions; @@ -57,7 +58,9 @@ public final class PlaybackParameters implements Bundleable { * zero. Useful values are {@code 1} (to time-stretch audio) and the same value as passed in * as the {@code speed} (to resample audio, which is useful for slow-motion videos). */ - public PlaybackParameters(float speed, float pitch) { + public PlaybackParameters( + @FloatRange(from = 0, fromInclusive = false) float speed, + @FloatRange(from = 0, fromInclusive = false) float pitch) { Assertions.checkArgument(speed > 0); Assertions.checkArgument(pitch > 0); this.speed = speed; @@ -79,11 +82,11 @@ public final class PlaybackParameters implements Bundleable { /** * Returns a copy with the given speed. * - * @param speed The new speed. + * @param speed The new speed. Must be greater than zero. * @return The copied playback parameters. */ @CheckResult - public PlaybackParameters withSpeed(float speed) { + public PlaybackParameters withSpeed(@FloatRange(from = 0, fromInclusive = false) float speed) { return new PlaybackParameters(speed, pitch); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index c8d5ad88c5..591f67288f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -21,7 +21,9 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.TextureView; +import androidx.annotation.FloatRange; import androidx.annotation.IntDef; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.metadata.Metadata; @@ -429,7 +431,7 @@ public interface Player { * @throws IndexOutOfBoundsException If index is outside the allowed range. */ @Event - public int get(int index) { + public int get(@IntRange(from = 0) int index) { return flags.get(index); } @@ -800,7 +802,7 @@ public interface Player { * @throws IndexOutOfBoundsException If index is outside the allowed range. */ @Command - public int get(int index) { + public int get(@IntRange(from = 0) int index) { return flags.get(index); } @@ -1498,7 +1500,7 @@ public interface Player { * the playlist, the media item is added to the end of the playlist. * @param mediaItem The {@link MediaItem} to add. */ - void addMediaItem(int index, MediaItem mediaItem); + void addMediaItem(@IntRange(from = 0) int index, MediaItem mediaItem); /** * Adds a list of media items to the end of the playlist. @@ -1514,7 +1516,7 @@ public interface Player { * the playlist, the media items are added to the end of the playlist. * @param mediaItems The {@link MediaItem MediaItems} to add. */ - void addMediaItems(int index, List mediaItems); + void addMediaItems(@IntRange(from = 0) int index, List mediaItems); /** * Moves the media item at the current index to the new index. @@ -1523,7 +1525,7 @@ public interface Player { * @param newIndex The new index of the media item. If the new index is larger than the size of * the playlist the item is moved to the end of the playlist. */ - void moveMediaItem(int currentIndex, int newIndex); + void moveMediaItem(@IntRange(from = 0) int currentIndex, @IntRange(from = 0) int newIndex); /** * Moves the media item range to the new index. @@ -1534,14 +1536,17 @@ public interface Player { * than the size of the remaining playlist after removing the range, the range is moved to the * end of the playlist. */ - void moveMediaItems(int fromIndex, int toIndex, int newIndex); + void moveMediaItems( + @IntRange(from = 0) int fromIndex, + @IntRange(from = 0) int toIndex, + @IntRange(from = 0) int newIndex); /** * Removes the media item at the given index of the playlist. * * @param index The index at which to remove the media item. */ - void removeMediaItem(int index); + void removeMediaItem(@IntRange(from = 0) int index); /** * Removes a range of media items from the playlist. @@ -1550,7 +1555,7 @@ public interface Player { * @param toIndex The index of the first item to be kept (exclusive). If the index is larger than * the size of the playlist, media items to the end of the playlist are removed. */ - void removeMediaItems(int fromIndex, int toIndex); + void removeMediaItems(@IntRange(from = 0) int fromIndex, @IntRange(from = 0) int toIndex); /** Clears the playlist. */ void clearMediaItems(); @@ -1728,7 +1733,7 @@ public interface Player { * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided * {@code windowIndex} is not within the bounds of the current timeline. */ - void seekToDefaultPosition(int windowIndex); + void seekToDefaultPosition(@IntRange(from = 0) int windowIndex); /** * Seeks to a position specified in milliseconds in the current window. @@ -1747,7 +1752,7 @@ public interface Player { * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided * {@code windowIndex} is not within the bounds of the current timeline. */ - void seekTo(int windowIndex, long positionMs); + void seekTo(@IntRange(from = 0) int windowIndex, long positionMs); /** * Returns the {@link #seekBack()} increment. @@ -1892,7 +1897,7 @@ public interface Player { * @param speed The linear factor by which playback will be sped up. Must be higher than 0. 1 is * normal speed, 2 is twice as fast, 0.5 is half normal speed... */ - void setPlaybackSpeed(float speed); + void setPlaybackSpeed(@FloatRange(from = 0, fromInclusive = false) float speed); /** * Returns the currently active playback parameters. @@ -2032,7 +2037,7 @@ public interface Player { int getMediaItemCount(); /** Returns the {@link MediaItem} at the given index. */ - MediaItem getMediaItemAt(int index); + MediaItem getMediaItemAt(@IntRange(from = 0) int index); /** * Returns the duration of the current content window or ad in milliseconds, or {@link @@ -2145,7 +2150,7 @@ public interface Player { * * @param audioVolume Linear output gain to apply to all audio channels. */ - void setVolume(float audioVolume); + void setVolume(@FloatRange(from = 0) float audioVolume); /** * Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java index cc6e6f1332..319b5cc12d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java @@ -23,6 +23,7 @@ import android.net.Uri; import android.os.Bundle; import androidx.annotation.CheckResult; import androidx.annotation.IntDef; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; @@ -119,7 +120,7 @@ public final class AdPlaybackState implements Bundleable { * Returns the index of the next ad in the ad group that should be played after playing {@code * lastPlayedAdIndex}, or {@link #count} if no later ads should be played. */ - public int getNextAdIndexToPlay(int lastPlayedAdIndex) { + public int getNextAdIndexToPlay(@IntRange(from = 0) int lastPlayedAdIndex) { int nextAdIndexToPlay = lastPlayedAdIndex + 1; while (nextAdIndexToPlay < states.length) { if (isServerSideInserted @@ -204,7 +205,7 @@ public final class AdPlaybackState implements Bundleable { * marked as {@link #AD_STATE_AVAILABLE}. */ @CheckResult - public AdGroup withAdUri(Uri uri, int index) { + public AdGroup withAdUri(Uri uri, @IntRange(from = 0) int index) { @AdState int[] states = copyStatesWithSpaceForAdCount(this.states, index + 1); long[] durationsUs = this.durationsUs.length == states.length @@ -226,7 +227,7 @@ public final class AdPlaybackState implements Bundleable { * ad count specified later. Otherwise, {@code index} must be less than the current ad count. */ @CheckResult - public AdGroup withAdState(@AdState int state, int index) { + public AdGroup withAdState(@AdState int state, @IntRange(from = 0) int index) { checkArgument(count == C.LENGTH_UNSET || index < count); @AdState int[] states = copyStatesWithSpaceForAdCount(this.states, index + 1); checkArgument( @@ -477,7 +478,7 @@ public final class AdPlaybackState implements Bundleable { } /** Returns the specified {@link AdGroup}. */ - public AdGroup getAdGroup(int adGroupIndex) { + public AdGroup getAdGroup(@IntRange(from = 0) int adGroupIndex) { return adGroupIndex < removedAdGroupCount ? REMOVED_AD_GROUP : adGroups[adGroupIndex - removedAdGroupCount]; @@ -534,7 +535,8 @@ public final class AdPlaybackState implements Bundleable { } /** Returns whether the specified ad has been marked as in {@link #AD_STATE_ERROR}. */ - public boolean isAdInErrorState(int adGroupIndex, int adIndexInAdGroup) { + public boolean isAdInErrorState( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 0) int adIndexInAdGroup) { if (adGroupIndex >= adGroupCount) { return false; } @@ -554,7 +556,8 @@ public final class AdPlaybackState implements Bundleable { * @return The updated ad playback state. */ @CheckResult - public AdPlaybackState withAdGroupTimeUs(int adGroupIndex, long adGroupTimeUs) { + public AdPlaybackState withAdGroupTimeUs( + @IntRange(from = 0) int adGroupIndex, long adGroupTimeUs) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = this.adGroups[adjustedIndex].withTimeUs(adGroupTimeUs); @@ -571,7 +574,7 @@ public final class AdPlaybackState implements Bundleable { * @return The updated ad playback state. */ @CheckResult - public AdPlaybackState withNewAdGroup(int adGroupIndex, long adGroupTimeUs) { + public AdPlaybackState withNewAdGroup(@IntRange(from = 0) int adGroupIndex, long adGroupTimeUs) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup newAdGroup = new AdGroup(adGroupTimeUs); AdGroup[] adGroups = Util.nullSafeArrayAppend(this.adGroups, newAdGroup); @@ -591,7 +594,8 @@ public final class AdPlaybackState implements Bundleable { * The ad count must be greater than zero. */ @CheckResult - public AdPlaybackState withAdCount(int adGroupIndex, int adCount) { + public AdPlaybackState withAdCount( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 1) int adCount) { checkArgument(adCount > 0); int adjustedIndex = adGroupIndex - removedAdGroupCount; if (adGroups[adjustedIndex].count == adCount) { @@ -605,7 +609,8 @@ public final class AdPlaybackState implements Bundleable { /** Returns an instance with the specified ad URI. */ @CheckResult - public AdPlaybackState withAdUri(int adGroupIndex, int adIndexInAdGroup, Uri uri) { + public AdPlaybackState withAdUri( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 0) int adIndexInAdGroup, Uri uri) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = adGroups[adjustedIndex].withAdUri(uri, adIndexInAdGroup); @@ -615,7 +620,8 @@ public final class AdPlaybackState implements Bundleable { /** Returns an instance with the specified ad marked as played. */ @CheckResult - public AdPlaybackState withPlayedAd(int adGroupIndex, int adIndexInAdGroup) { + public AdPlaybackState withPlayedAd( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 0) int adIndexInAdGroup) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = @@ -626,7 +632,8 @@ public final class AdPlaybackState implements Bundleable { /** Returns an instance with the specified ad marked as skipped. */ @CheckResult - public AdPlaybackState withSkippedAd(int adGroupIndex, int adIndexInAdGroup) { + public AdPlaybackState withSkippedAd( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 0) int adIndexInAdGroup) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = @@ -637,7 +644,8 @@ public final class AdPlaybackState implements Bundleable { /** Returns an instance with the specified ad marked as having a load error. */ @CheckResult - public AdPlaybackState withAdLoadError(int adGroupIndex, int adIndexInAdGroup) { + public AdPlaybackState withAdLoadError( + @IntRange(from = 0) int adGroupIndex, @IntRange(from = 0) int adIndexInAdGroup) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = adGroups[adjustedIndex].withAdState(AD_STATE_ERROR, adIndexInAdGroup); @@ -650,7 +658,7 @@ public final class AdPlaybackState implements Bundleable { * marked as played or in the error state). */ @CheckResult - public AdPlaybackState withSkippedAdGroup(int adGroupIndex) { + public AdPlaybackState withSkippedAdGroup(@IntRange(from = 0) int adGroupIndex) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = adGroups[adjustedIndex].withAllAdsSkipped(); @@ -679,7 +687,8 @@ public final class AdPlaybackState implements Bundleable { * group. */ @CheckResult - public AdPlaybackState withAdDurationsUs(int adGroupIndex, long... adDurationsUs) { + public AdPlaybackState withAdDurationsUs( + @IntRange(from = 0) int adGroupIndex, long... adDurationsUs) { int adjustedIndex = adGroupIndex - removedAdGroupCount; AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length); adGroups[adjustedIndex] = adGroups[adjustedIndex].withAdDurationsUs(adDurationsUs); @@ -720,7 +729,7 @@ public final class AdPlaybackState implements Bundleable { * (exclusive) will be empty and must not be modified by any of the {@code with*} methods. */ @CheckResult - public AdPlaybackState withRemovedAdGroupCount(int removedAdGroupCount) { + public AdPlaybackState withRemovedAdGroupCount(@IntRange(from = 0) int removedAdGroupCount) { if (this.removedAdGroupCount == removedAdGroupCount) { return this; } else { @@ -742,7 +751,8 @@ public final class AdPlaybackState implements Bundleable { * for the specified ad group. */ @CheckResult - public AdPlaybackState withContentResumeOffsetUs(int adGroupIndex, long contentResumeOffsetUs) { + public AdPlaybackState withContentResumeOffsetUs( + @IntRange(from = 0) int adGroupIndex, long contentResumeOffsetUs) { int adjustedIndex = adGroupIndex - removedAdGroupCount; if (adGroups[adjustedIndex].contentResumeOffsetUs == contentResumeOffsetUs) { return this; @@ -759,7 +769,8 @@ public final class AdPlaybackState implements Bundleable { * specified ad group. */ @CheckResult - public AdPlaybackState withIsServerSideInserted(int adGroupIndex, boolean isServerSideInserted) { + public AdPlaybackState withIsServerSideInserted( + @IntRange(from = 0) int adGroupIndex, boolean isServerSideInserted) { int adjustedIndex = adGroupIndex - removedAdGroupCount; if (adGroups[adjustedIndex].isServerSideInserted == isServerSideInserted) { return this; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index 95705a9caa..e957a39fc7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -33,6 +33,7 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import androidx.annotation.CheckResult; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.database.DatabaseProvider; @@ -378,7 +379,7 @@ public final class DownloadManager { * * @param maxParallelDownloads The maximum number of parallel downloads. Must be greater than 0. */ - public void setMaxParallelDownloads(int maxParallelDownloads) { + public void setMaxParallelDownloads(@IntRange(from = 1) int maxParallelDownloads) { Assertions.checkArgument(maxParallelDownloads > 0); if (this.maxParallelDownloads == maxParallelDownloads) { return; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java index 725100b583..93f3d7ac1a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source; import static java.lang.Math.min; import android.net.Uri; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; @@ -49,7 +50,7 @@ public final class SilenceMediaSource extends BaseMediaSource { * @param durationUs The duration of silent audio to output, in microseconds. * @return This factory, for convenience. */ - public Factory setDurationUs(long durationUs) { + public Factory setDurationUs(@IntRange(from = 1) long durationUs) { this.durationUs = durationUs; return this; } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index f6ccf5a77a..409fb16263 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -46,6 +46,7 @@ import android.os.Message; import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.DrawableRes; import androidx.annotation.IntDef; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; @@ -348,7 +349,7 @@ public class PlayerNotificationManager { * @param notificationId The id of the notification to be posted. Must be greater than 0. * @param channelId The id of the notification channel. */ - public Builder(Context context, int notificationId, String channelId) { + public Builder(Context context, @IntRange(from = 1) int notificationId, String channelId) { checkArgument(notificationId > 0); this.context = context; this.notificationId = notificationId; From b689fbd44ed505f9556731cf3c9b392ac4027c4f Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 17 Aug 2021 14:13:20 +0100 Subject: [PATCH 068/441] Rename DecryptionException to CryptoException PiperOrigin-RevId: 391272611 --- RELEASENOTES.md | 2 +- .../com/google/android/exoplayer2/ext/opus/OpusDecoder.java | 6 +++--- .../com/google/android/exoplayer2/ext/vp9/VpxDecoder.java | 5 ++--- .../{DecryptionException.java => CryptoException.java} | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) rename library/common/src/main/java/com/google/android/exoplayer2/decoder/{DecryptionException.java => CryptoException.java} (89%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5b16444420..bb679bccab 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -6,7 +6,7 @@ * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. * Move `com.google.android.exoplayer2.drm.DecryptionException` to - `com.google.android.exoplayer2.decoder.DecryptionException`. + `com.google.android.exoplayer2.decoder.CryptoException`. * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Android 12 compatibility: diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index 9005755cd6..cb81ea7f97 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -21,9 +21,9 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.audio.OpusUtil; +import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.decoder.DecryptionException; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.drm.ExoMediaCrypto; @@ -193,8 +193,8 @@ public final class OpusDecoder if (result < 0) { if (result == DRM_ERROR) { String message = "Drm error: " + opusGetErrorMessage(nativeDecoderContext); - DecryptionException cause = - new DecryptionException(opusGetErrorCode(nativeDecoderContext), message); + CryptoException cause = + new CryptoException(opusGetErrorCode(nativeDecoderContext), message); return new OpusDecoderException(message, cause); } else { return new OpusDecoderException("Decode error: " + opusGetErrorMessage(result)); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index 07c5a8700b..06d8020a2d 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -21,9 +21,9 @@ import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.decoder.DecryptionException; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; @@ -145,8 +145,7 @@ public final class VpxDecoder if (result != NO_ERROR) { if (result == DRM_ERROR) { String message = "Drm error: " + vpxGetErrorMessage(vpxDecContext); - DecryptionException cause = - new DecryptionException(vpxGetErrorCode(vpxDecContext), message); + CryptoException cause = new CryptoException(vpxGetErrorCode(vpxDecContext), message); return new VpxDecoderException(message, cause); } else { return new VpxDecoderException("Decode error: " + vpxGetErrorMessage(vpxDecContext)); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java similarity index 89% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java index 0737cc47a5..24ff6823ba 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecryptionException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2.decoder; /** Thrown when a non-platform component fails to decrypt data. */ -public class DecryptionException extends Exception { +public class CryptoException extends Exception { /** A component specific error code. */ public final int errorCode; @@ -25,7 +25,7 @@ public class DecryptionException extends Exception { * @param errorCode A component specific error code. * @param message The detail message. */ - public DecryptionException(int errorCode, String message) { + public CryptoException(int errorCode, String message) { super(message); this.errorCode = errorCode; } From cd297b048a044c471d80b5c4a09dfd1b8756bbe4 Mon Sep 17 00:00:00 2001 From: krocard Date: Tue, 17 Aug 2021 20:40:50 +0100 Subject: [PATCH 069/441] Make Track selection objects Bundleable Most of those objects needs to be sent to MediaControler. `TrackSelectior.Parameters` could have stayed Parcelable, but it needs to be `Bundleable` as it inherit from `TrackSelectionParameters` that is and needs to be serializable anyway for the demo app. As a result it has also been migrated to bundleable. PiperOrigin-RevId: 391353293 --- .../exoplayer2/demo/PlayerActivity.java | 8 +- .../com/google/android/exoplayer2/Format.java | 305 +++++++++----- .../android/exoplayer2/source/TrackGroup.java | 84 ++-- .../exoplayer2/source/TrackGroupArray.java | 76 ++-- .../TrackSelectionParameters.java | 301 +++++++++----- .../exoplayer2/util/BundleableUtils.java | 60 ++- .../android/exoplayer2/video/ColorInfo.java | 77 ++-- .../google/android/exoplayer2/FormatTest.java | 21 +- .../exoplayer2/ExoPlaybackException.java | 8 +- .../trackselection/DefaultTrackSelector.java | 388 ++++++++++++------ .../source/TrackGroupArrayTest.java | 15 +- .../exoplayer2/source/TrackGroupTest.java | 14 +- .../DefaultTrackSelectorTest.java | 43 +- 13 files changed, 899 insertions(+), 501 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index c918603931..a3e89cd753 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -98,7 +98,7 @@ public class PlayerActivity extends AppCompatActivity // Activity lifecycle. @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); dataSourceFactory = DemoUtil.getDataSourceFactory(/* context= */ this); @@ -114,7 +114,9 @@ public class PlayerActivity extends AppCompatActivity playerView.requestFocus(); if (savedInstanceState != null) { - trackSelectorParameters = savedInstanceState.getParcelable(KEY_TRACK_SELECTOR_PARAMETERS); + trackSelectorParameters = + DefaultTrackSelector.Parameters.CREATOR.fromBundle( + savedInstanceState.getBundle(KEY_TRACK_SELECTOR_PARAMETERS)); startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY); startWindow = savedInstanceState.getInt(KEY_WINDOW); startPosition = savedInstanceState.getLong(KEY_POSITION); @@ -207,7 +209,7 @@ public class PlayerActivity extends AppCompatActivity super.onSaveInstanceState(outState); updateTrackSelectorParameters(); updateStartPosition(); - outState.putParcelable(KEY_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters); + outState.putBundle(KEY_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters.toBundle()); outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay); outState.putInt(KEY_WINDOW, startWindow); outState.putLong(KEY_POSITION, startPosition); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index eba199299e..6fcc34b11f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -15,19 +15,21 @@ */ package com.google.android.exoplayer2; -import static com.google.android.exoplayer2.util.Assertions.checkNotNull; - -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Bundle; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.UnsupportedMediaCrypto; import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.ColorInfo; import com.google.common.base.Joiner; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -112,7 +114,7 @@ import java.util.UUID; *

    • {@link #accessibilityChannel} *
    */ -public final class Format implements Parcelable { +public final class Format implements Bundleable { /** * Builds {@link Format} instances. @@ -610,6 +612,8 @@ public final class Format implements Parcelable { */ public static final long OFFSET_SAMPLE_RELATIVE = Long.MAX_VALUE; + private static final Format DEFAULT = new Builder().build(); + /** An identifier for the format, or null if unknown or not applicable. */ @Nullable public final String id; /** The human readable label, or null if unknown or not applicable. */ @@ -968,54 +972,6 @@ public final class Format implements Parcelable { } } - // Some fields are deprecated but they're still assigned below. - @SuppressWarnings({"ResourceType"}) - /* package */ Format(Parcel in) { - id = in.readString(); - label = in.readString(); - language = in.readString(); - selectionFlags = in.readInt(); - roleFlags = in.readInt(); - averageBitrate = in.readInt(); - peakBitrate = in.readInt(); - bitrate = peakBitrate != NO_VALUE ? peakBitrate : averageBitrate; - codecs = in.readString(); - metadata = in.readParcelable(Metadata.class.getClassLoader()); - // Container specific. - containerMimeType = in.readString(); - // Sample specific. - sampleMimeType = in.readString(); - maxInputSize = in.readInt(); - int initializationDataSize = in.readInt(); - initializationData = new ArrayList<>(initializationDataSize); - for (int i = 0; i < initializationDataSize; i++) { - initializationData.add(checkNotNull(in.createByteArray())); - } - drmInitData = in.readParcelable(DrmInitData.class.getClassLoader()); - subsampleOffsetUs = in.readLong(); - // Video specific. - width = in.readInt(); - height = in.readInt(); - frameRate = in.readFloat(); - rotationDegrees = in.readInt(); - pixelWidthHeightRatio = in.readFloat(); - boolean hasProjectionData = Util.readBoolean(in); - projectionData = hasProjectionData ? in.createByteArray() : null; - stereoMode = in.readInt(); - colorInfo = in.readParcelable(ColorInfo.class.getClassLoader()); - // Audio specific. - channelCount = in.readInt(); - sampleRate = in.readInt(); - pcmEncoding = in.readInt(); - encoderDelay = in.readInt(); - encoderPadding = in.readInt(); - // Text specific. - accessibilityChannel = in.readInt(); - // Provided by source. - // Encrypted content must always have a non-null exoMediaCryptoType. - exoMediaCryptoType = drmInitData != null ? UnsupportedMediaCrypto.class : null; - } - /** Returns a {@link Format.Builder} initialized with the values of this instance. */ public Builder buildUpon() { return new Builder(this); @@ -1371,69 +1327,208 @@ public final class Format implements Parcelable { return builder.toString(); } - // Parcelable implementation. + // Bundleable implementation. + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_ID, + FIELD_LABEL, + FIELD_LANGUAGE, + FIELD_SELECTION_FLAGS, + FIELD_ROLE_FLAGS, + FIELD_AVERAGE_BITRATE, + FIELD_PEAK_BITRATE, + FIELD_CODECS, + FIELD_METADATA, + FIELD_CONTAINER_MIME_TYPE, + FIELD_SAMPLE_MIME_TYPE, + FIELD_MAX_INPUT_SIZE, + FIELD_INITIALIZATION_DATA, + FIELD_DRM_INIT_DATA, + FIELD_SUBSAMPLE_OFFSET_US, + FIELD_WIDTH, + FIELD_HEIGHT, + FIELD_FRAME_RATE, + FIELD_ROTATION_DEGREES, + FIELD_PIXEL_WIDTH_HEIGHT_RATIO, + FIELD_PROJECTION_DATA, + FIELD_STEREO_MODE, + FIELD_COLOR_INFO, + FIELD_CHANNEL_COUNT, + FIELD_SAMPLE_RATE, + FIELD_PCM_ENCODING, + FIELD_ENCODER_DELAY, + FIELD_ENCODER_PADDING, + FIELD_ACCESSIBILITY_CHANNEL, + }) + private @interface FieldNumber {} - @Override - public int describeContents() { - return 0; - } + private static final int FIELD_ID = 0; + private static final int FIELD_LABEL = 1; + private static final int FIELD_LANGUAGE = 2; + private static final int FIELD_SELECTION_FLAGS = 3; + private static final int FIELD_ROLE_FLAGS = 4; + private static final int FIELD_AVERAGE_BITRATE = 5; + private static final int FIELD_PEAK_BITRATE = 6; + private static final int FIELD_CODECS = 7; + private static final int FIELD_METADATA = 8; + private static final int FIELD_CONTAINER_MIME_TYPE = 9; + private static final int FIELD_SAMPLE_MIME_TYPE = 10; + private static final int FIELD_MAX_INPUT_SIZE = 11; + private static final int FIELD_INITIALIZATION_DATA = 12; + private static final int FIELD_DRM_INIT_DATA = 13; + private static final int FIELD_SUBSAMPLE_OFFSET_US = 14; + private static final int FIELD_WIDTH = 15; + private static final int FIELD_HEIGHT = 16; + private static final int FIELD_FRAME_RATE = 17; + private static final int FIELD_ROTATION_DEGREES = 18; + private static final int FIELD_PIXEL_WIDTH_HEIGHT_RATIO = 19; + private static final int FIELD_PROJECTION_DATA = 20; + private static final int FIELD_STEREO_MODE = 21; + private static final int FIELD_COLOR_INFO = 22; + private static final int FIELD_CHANNEL_COUNT = 23; + private static final int FIELD_SAMPLE_RATE = 24; + private static final int FIELD_PCM_ENCODING = 25; + private static final int FIELD_ENCODER_DELAY = 26; + private static final int FIELD_ENCODER_PADDING = 27; + private static final int FIELD_ACCESSIBILITY_CHANNEL = 28; + /** + * {@inheritDoc} + * + *

    Omits the {@link #exoMediaCryptoType} field. The {@link #exoMediaCryptoType} of an instance + * restored by {@link #CREATOR} will always be {@link UnsupportedMediaCrypto}. + */ @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - dest.writeString(label); - dest.writeString(language); - dest.writeInt(selectionFlags); - dest.writeInt(roleFlags); - dest.writeInt(averageBitrate); - dest.writeInt(peakBitrate); - dest.writeString(codecs); - dest.writeParcelable(metadata, 0); + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putString(keyForField(FIELD_ID), id); + bundle.putString(keyForField(FIELD_LABEL), label); + bundle.putString(keyForField(FIELD_LANGUAGE), language); + bundle.putInt(keyForField(FIELD_SELECTION_FLAGS), selectionFlags); + bundle.putInt(keyForField(FIELD_ROLE_FLAGS), roleFlags); + bundle.putInt(keyForField(FIELD_AVERAGE_BITRATE), averageBitrate); + bundle.putInt(keyForField(FIELD_PEAK_BITRATE), peakBitrate); + bundle.putString(keyForField(FIELD_CODECS), codecs); + // Metadata is currently not Bundleable because Metadata.Entry is an Interface, + // which would be difficult to unbundle in a backward compatible way. + // The entries are additionally of limited usefulness to remote processes. + bundle.putParcelable(keyForField(FIELD_METADATA), metadata); // Container specific. - dest.writeString(containerMimeType); + bundle.putString(keyForField(FIELD_CONTAINER_MIME_TYPE), containerMimeType); // Sample specific. - dest.writeString(sampleMimeType); - dest.writeInt(maxInputSize); - int initializationDataSize = initializationData.size(); - dest.writeInt(initializationDataSize); - for (int i = 0; i < initializationDataSize; i++) { - dest.writeByteArray(initializationData.get(i)); + bundle.putString(keyForField(FIELD_SAMPLE_MIME_TYPE), sampleMimeType); + bundle.putInt(keyForField(FIELD_MAX_INPUT_SIZE), maxInputSize); + for (int i = 0; i < initializationData.size(); i++) { + bundle.putByteArray(keyForInitializationData(i), initializationData.get(i)); } - dest.writeParcelable(drmInitData, 0); - dest.writeLong(subsampleOffsetUs); + // DrmInitData doesn't need to be Bundleable as it's only used in the playing process to + // initialize the decoder. + bundle.putParcelable(keyForField(FIELD_DRM_INIT_DATA), drmInitData); + bundle.putLong(keyForField(FIELD_SUBSAMPLE_OFFSET_US), subsampleOffsetUs); // Video specific. - dest.writeInt(width); - dest.writeInt(height); - dest.writeFloat(frameRate); - dest.writeInt(rotationDegrees); - dest.writeFloat(pixelWidthHeightRatio); - Util.writeBoolean(dest, projectionData != null); - if (projectionData != null) { - dest.writeByteArray(projectionData); - } - dest.writeInt(stereoMode); - dest.writeParcelable(colorInfo, flags); + bundle.putInt(keyForField(FIELD_WIDTH), width); + bundle.putInt(keyForField(FIELD_HEIGHT), height); + bundle.putFloat(keyForField(FIELD_FRAME_RATE), frameRate); + bundle.putInt(keyForField(FIELD_ROTATION_DEGREES), rotationDegrees); + bundle.putFloat(keyForField(FIELD_PIXEL_WIDTH_HEIGHT_RATIO), pixelWidthHeightRatio); + bundle.putByteArray(keyForField(FIELD_PROJECTION_DATA), projectionData); + bundle.putInt(keyForField(FIELD_STEREO_MODE), stereoMode); + bundle.putBundle(keyForField(FIELD_COLOR_INFO), BundleableUtils.toNullableBundle(colorInfo)); // Audio specific. - dest.writeInt(channelCount); - dest.writeInt(sampleRate); - dest.writeInt(pcmEncoding); - dest.writeInt(encoderDelay); - dest.writeInt(encoderPadding); + bundle.putInt(keyForField(FIELD_CHANNEL_COUNT), channelCount); + bundle.putInt(keyForField(FIELD_SAMPLE_RATE), sampleRate); + bundle.putInt(keyForField(FIELD_PCM_ENCODING), pcmEncoding); + bundle.putInt(keyForField(FIELD_ENCODER_DELAY), encoderDelay); + bundle.putInt(keyForField(FIELD_ENCODER_PADDING), encoderPadding); // Text specific. - dest.writeInt(accessibilityChannel); + bundle.putInt(keyForField(FIELD_ACCESSIBILITY_CHANNEL), accessibilityChannel); + return bundle; } - public static final Creator CREATOR = - new Creator() { + /** Object that can restore {@code Format} from a {@link Bundle}. */ + public static final Creator CREATOR = Format::fromBundle; - @Override - public Format createFromParcel(Parcel in) { - return new Format(in); - } + private static Format fromBundle(Bundle bundle) { + Builder builder = new Builder(); + BundleableUtils.ensureClassLoader(bundle); + builder + .setId(defaultIfNull(bundle.getString(keyForField(FIELD_ID)), DEFAULT.id)) + .setLabel(defaultIfNull(bundle.getString(keyForField(FIELD_LABEL)), DEFAULT.label)) + .setLanguage(defaultIfNull(bundle.getString(keyForField(FIELD_LANGUAGE)), DEFAULT.language)) + .setSelectionFlags( + bundle.getInt(keyForField(FIELD_SELECTION_FLAGS), DEFAULT.selectionFlags)) + .setRoleFlags(bundle.getInt(keyForField(FIELD_ROLE_FLAGS), DEFAULT.roleFlags)) + .setAverageBitrate( + bundle.getInt(keyForField(FIELD_AVERAGE_BITRATE), DEFAULT.averageBitrate)) + .setPeakBitrate(bundle.getInt(keyForField(FIELD_PEAK_BITRATE), DEFAULT.peakBitrate)) + .setCodecs(defaultIfNull(bundle.getString(keyForField(FIELD_CODECS)), DEFAULT.codecs)) + .setMetadata( + defaultIfNull(bundle.getParcelable(keyForField(FIELD_METADATA)), DEFAULT.metadata)) + // Container specific. + .setContainerMimeType( + defaultIfNull( + bundle.getString(keyForField(FIELD_CONTAINER_MIME_TYPE)), + DEFAULT.containerMimeType)) + // Sample specific. + .setSampleMimeType( + defaultIfNull( + bundle.getString(keyForField(FIELD_SAMPLE_MIME_TYPE)), DEFAULT.sampleMimeType)) + .setMaxInputSize(bundle.getInt(keyForField(FIELD_MAX_INPUT_SIZE), DEFAULT.maxInputSize)); - @Override - public Format[] newArray(int size) { - return new Format[size]; - } - }; + List initializationData = new ArrayList<>(); + for (int i = 0; ; i++) { + @Nullable byte[] data = bundle.getByteArray(keyForInitializationData(i)); + if (data == null) { + break; + } + initializationData.add(data); + } + builder + .setInitializationData(initializationData) + .setDrmInitData(bundle.getParcelable(keyForField(FIELD_DRM_INIT_DATA))) + .setSubsampleOffsetUs( + bundle.getLong(keyForField(FIELD_SUBSAMPLE_OFFSET_US), DEFAULT.subsampleOffsetUs)) + // Video specific. + .setWidth(bundle.getInt(keyForField(FIELD_WIDTH), DEFAULT.width)) + .setHeight(bundle.getInt(keyForField(FIELD_HEIGHT), DEFAULT.height)) + .setFrameRate(bundle.getFloat(keyForField(FIELD_FRAME_RATE), DEFAULT.frameRate)) + .setRotationDegrees( + bundle.getInt(keyForField(FIELD_ROTATION_DEGREES), DEFAULT.rotationDegrees)) + .setPixelWidthHeightRatio( + bundle.getFloat( + keyForField(FIELD_PIXEL_WIDTH_HEIGHT_RATIO), DEFAULT.pixelWidthHeightRatio)) + .setProjectionData(bundle.getByteArray(keyForField(FIELD_PROJECTION_DATA))) + .setStereoMode(bundle.getInt(keyForField(FIELD_STEREO_MODE), DEFAULT.stereoMode)) + .setColorInfo( + BundleableUtils.fromNullableBundle( + ColorInfo.CREATOR, bundle.getBundle(keyForField(FIELD_COLOR_INFO)))) + // Audio specific. + .setChannelCount(bundle.getInt(keyForField(FIELD_CHANNEL_COUNT), DEFAULT.channelCount)) + .setSampleRate(bundle.getInt(keyForField(FIELD_SAMPLE_RATE), DEFAULT.sampleRate)) + .setPcmEncoding(bundle.getInt(keyForField(FIELD_PCM_ENCODING), DEFAULT.pcmEncoding)) + .setEncoderDelay(bundle.getInt(keyForField(FIELD_ENCODER_DELAY), DEFAULT.encoderDelay)) + .setEncoderPadding( + bundle.getInt(keyForField(FIELD_ENCODER_PADDING), DEFAULT.encoderPadding)) + // Text specific. + .setAccessibilityChannel( + bundle.getInt(keyForField(FIELD_ACCESSIBILITY_CHANNEL), DEFAULT.accessibilityChannel)); + + return builder.build(); + } + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } + + private static String keyForInitializationData(int initialisationDataIndex) { + return keyForField(FIELD_INITIALIZATION_DATA) + + "_" + + Integer.toString(initialisationDataIndex, Character.MAX_RADIX); + } + + @Nullable + private static T defaultIfNull(@Nullable T value, @Nullable T defaultValue) { + return value != null ? value : defaultValue; + } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java index 0888f3fa96..4f9f93fc33 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java @@ -15,17 +15,26 @@ */ package com.google.android.exoplayer2.source; -import android.os.Parcel; -import android.os.Parcelable; +import static com.google.android.exoplayer2.util.Assertions.checkArgument; + +import android.os.Bundle; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.Log; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; +import java.util.List; /** Defines an immutable group of tracks identified by their format identity. */ -public final class TrackGroup implements Parcelable { +public final class TrackGroup implements Bundleable { private static final String TAG = "TrackGroup"; @@ -37,22 +46,18 @@ public final class TrackGroup implements Parcelable { // Lazily initialized hashcode. private int hashCode; - /** @param formats The track formats. At least one {@link Format} must be provided. */ + /** + * Constructs an instance {@code TrackGroup} containing the provided {@code formats}. + * + * @param formats Non empty array of format. + */ public TrackGroup(Format... formats) { - Assertions.checkState(formats.length > 0); + checkArgument(formats.length > 0); this.formats = formats; this.length = formats.length; verifyCorrectness(); } - /* package */ TrackGroup(Parcel in) { - length = in.readInt(); - formats = new Format[length]; - for (int i = 0; i < length; i++) { - formats[i] = in.readParcelable(Format.class.getClassLoader()); - } - } - /** * Returns the format of the track at a given index. * @@ -103,35 +108,40 @@ public final class TrackGroup implements Parcelable { return length == other.length && Arrays.equals(formats, other.formats); } - // Parcelable implementation. + // Bundleable implementation. + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_FORMATS, + }) + private @interface FieldNumber {} + + private static final int FIELD_FORMATS = 0; @Override - public int describeContents() { - return 0; + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList( + keyForField(FIELD_FORMATS), BundleableUtils.toBundleArrayList(Lists.newArrayList(formats))); + return bundle; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(length); - for (int i = 0; i < length; i++) { - dest.writeParcelable(formats[i], 0); - } - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - - @Override - public TrackGroup createFromParcel(Parcel in) { - return new TrackGroup(in); - } - - @Override - public TrackGroup[] newArray(int size) { - return new TrackGroup[size]; - } + /** Object that can restore {@code TrackGroup} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + List formats = + BundleableUtils.fromBundleNullableList( + Format.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_FORMATS)), + ImmutableList.of()); + return new TrackGroup(formats.toArray(new Format[0])); }; + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } + private void verifyCorrectness() { // TrackGroups should only contain tracks with exactly the same content (but in different // qualities). We only log an error instead of throwing to not break backwards-compatibility for diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java index 8db7b9c385..0af14a5fdc 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java @@ -15,14 +15,22 @@ */ package com.google.android.exoplayer2.source; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Bundle; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; +import java.util.List; /** An immutable array of {@link TrackGroup}s. */ -public final class TrackGroupArray implements Parcelable { +public final class TrackGroupArray implements Bundleable { /** The empty array. */ public static final TrackGroupArray EMPTY = new TrackGroupArray(); @@ -35,20 +43,12 @@ public final class TrackGroupArray implements Parcelable { // Lazily initialized hashcode. private int hashCode; - /** @param trackGroups The groups. May be empty. */ + /** Construct a {@code TrackGroupArray} from an array of (possibly empty) trackGroups. */ public TrackGroupArray(TrackGroup... trackGroups) { this.trackGroups = trackGroups; this.length = trackGroups.length; } - /* package */ TrackGroupArray(Parcel in) { - length = in.readInt(); - trackGroups = new TrackGroup[length]; - for (int i = 0; i < length; i++) { - trackGroups[i] = in.readParcelable(TrackGroup.class.getClassLoader()); - } - } - /** * Returns the group at a given index. * @@ -102,32 +102,38 @@ public final class TrackGroupArray implements Parcelable { return length == other.length && Arrays.equals(trackGroups, other.trackGroups); } - // Parcelable implementation. + // Bundleable implementation. + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_TRACK_GROUPS, + }) + private @interface FieldNumber {} + + private static final int FIELD_TRACK_GROUPS = 0; @Override - public int describeContents() { - return 0; + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList( + keyForField(FIELD_TRACK_GROUPS), + BundleableUtils.toBundleArrayList(Lists.newArrayList(trackGroups))); + return bundle; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(length); - for (int i = 0; i < length; i++) { - dest.writeParcelable(trackGroups[i], 0); - } - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - - @Override - public TrackGroupArray createFromParcel(Parcel in) { - return new TrackGroupArray(in); - } - - @Override - public TrackGroupArray[] newArray(int size) { - return new TrackGroupArray[size]; - } + /** Object that can restores a TrackGroupArray from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + List trackGroups = + BundleableUtils.fromBundleNullableList( + TrackGroup.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)), + /* defaultValue= */ ImmutableList.of()); + return new TrackGroupArray(trackGroups.toArray(new TrackGroup[0])); }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index bb8fce5fa4..e62e93893b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -16,23 +16,28 @@ package com.google.android.exoplayer2.trackselection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.common.base.MoreObjects.firstNonNull; import android.content.Context; import android.graphics.Point; +import android.os.Bundle; import android.os.Looper; -import android.os.Parcel; -import android.os.Parcelable; import android.view.accessibility.CaptioningManager; +import androidx.annotation.CallSuper; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; -import java.util.ArrayList; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Locale; /** Constraint parameters for track selection. */ -public class TrackSelectionParameters implements Parcelable { +public class TrackSelectionParameters implements Bundleable { /** * A builder for {@link TrackSelectionParameters}. See the {@link TrackSelectionParameters} @@ -108,10 +113,7 @@ public class TrackSelectionParameters implements Parcelable { setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true); } - /** - * @param initialValues The {@link TrackSelectionParameters} from which the initial values of - * the builder are obtained. - */ + /** Creates a builder with the initial values specified in {@code initialValues}. */ protected Builder(TrackSelectionParameters initialValues) { // Video maxVideoWidth = initialValues.maxVideoWidth; @@ -141,6 +143,89 @@ public class TrackSelectionParameters implements Parcelable { forceHighestSupportedBitrate = initialValues.forceHighestSupportedBitrate; } + /** Creates a builder with the initial values specified in {@code bundle}. */ + protected Builder(Bundle bundle) { + // Video + maxVideoWidth = + bundle.getInt(keyForField(FIELD_MAX_VIDEO_WIDTH), DEFAULT_WITHOUT_CONTEXT.maxVideoWidth); + maxVideoHeight = + bundle.getInt( + keyForField(FIELD_MAX_VIDEO_HEIGHT), DEFAULT_WITHOUT_CONTEXT.maxVideoHeight); + maxVideoFrameRate = + bundle.getInt( + keyForField(FIELD_MAX_VIDEO_FRAMERATE), DEFAULT_WITHOUT_CONTEXT.maxVideoFrameRate); + maxVideoBitrate = + bundle.getInt( + keyForField(FIELD_MAX_VIDEO_BITRATE), DEFAULT_WITHOUT_CONTEXT.maxVideoBitrate); + minVideoWidth = + bundle.getInt(keyForField(FIELD_MIN_VIDEO_WIDTH), DEFAULT_WITHOUT_CONTEXT.minVideoWidth); + minVideoHeight = + bundle.getInt( + keyForField(FIELD_MIN_VIDEO_HEIGHT), DEFAULT_WITHOUT_CONTEXT.minVideoHeight); + minVideoFrameRate = + bundle.getInt( + keyForField(FIELD_MIN_VIDEO_FRAMERATE), DEFAULT_WITHOUT_CONTEXT.minVideoFrameRate); + minVideoBitrate = + bundle.getInt( + keyForField(FIELD_MIN_VIDEO_BITRATE), DEFAULT_WITHOUT_CONTEXT.minVideoBitrate); + viewportWidth = + bundle.getInt(keyForField(FIELD_VIEWPORT_WIDTH), DEFAULT_WITHOUT_CONTEXT.viewportWidth); + viewportHeight = + bundle.getInt(keyForField(FIELD_VIEWPORT_HEIGHT), DEFAULT_WITHOUT_CONTEXT.viewportHeight); + viewportOrientationMayChange = + bundle.getBoolean( + keyForField(FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE), + DEFAULT_WITHOUT_CONTEXT.viewportOrientationMayChange); + preferredVideoMimeTypes = + ImmutableList.copyOf( + firstNonNull( + bundle.getStringArray(keyForField(FIELD_PREFERRED_VIDEO_MIMETYPES)), + new String[0])); + // Audio + String[] preferredAudioLanguages1 = + firstNonNull( + bundle.getStringArray(keyForField(FIELD_PREFERRED_AUDIO_LANGUAGES)), new String[0]); + preferredAudioLanguages = normalizeLanguageCodes(preferredAudioLanguages1); + preferredAudioRoleFlags = + bundle.getInt( + keyForField(FIELD_PREFERRED_AUDIO_ROLE_FLAGS), + DEFAULT_WITHOUT_CONTEXT.preferredAudioRoleFlags); + maxAudioChannelCount = + bundle.getInt( + keyForField(FIELD_MAX_AUDIO_CHANNEL_COUNT), + DEFAULT_WITHOUT_CONTEXT.maxAudioChannelCount); + maxAudioBitrate = + bundle.getInt( + keyForField(FIELD_MAX_AUDIO_BITRATE), DEFAULT_WITHOUT_CONTEXT.maxAudioBitrate); + preferredAudioMimeTypes = + ImmutableList.copyOf( + firstNonNull( + bundle.getStringArray(keyForField(FIELD_PREFERRED_AUDIO_MIME_TYPES)), + new String[0])); + // Text + preferredTextLanguages = + normalizeLanguageCodes( + firstNonNull( + bundle.getStringArray(keyForField(FIELD_PREFERRED_TEXT_LANGUAGES)), + new String[0])); + preferredTextRoleFlags = + bundle.getInt( + keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS), + DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags); + selectUndeterminedTextLanguage = + bundle.getBoolean( + keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE), + DEFAULT_WITHOUT_CONTEXT.selectUndeterminedTextLanguage); + // General + forceLowestBitrate = + bundle.getBoolean( + keyForField(FIELD_FORCE_LOWEST_BITRATE), DEFAULT_WITHOUT_CONTEXT.forceLowestBitrate); + forceHighestSupportedBitrate = + bundle.getBoolean( + keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), + DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); + } + // Video /** @@ -322,11 +407,7 @@ public class TrackSelectionParameters implements Parcelable { * @return This builder. */ public Builder setPreferredAudioLanguages(String... preferredAudioLanguages) { - ImmutableList.Builder listBuilder = ImmutableList.builder(); - for (String language : checkNotNull(preferredAudioLanguages)) { - listBuilder.add(Util.normalizeLanguageCode(checkNotNull(language))); - } - this.preferredAudioLanguages = listBuilder.build(); + this.preferredAudioLanguages = normalizeLanguageCodes(preferredAudioLanguages); return this; } @@ -427,11 +508,7 @@ public class TrackSelectionParameters implements Parcelable { * @return This builder. */ public Builder setPreferredTextLanguages(String... preferredTextLanguages) { - ImmutableList.Builder listBuilder = ImmutableList.builder(); - for (String language : checkNotNull(preferredTextLanguages)) { - listBuilder.add(Util.normalizeLanguageCode(checkNotNull(language))); - } - this.preferredTextLanguages = listBuilder.build(); + this.preferredTextLanguages = normalizeLanguageCodes(preferredTextLanguages); return this; } @@ -512,6 +589,14 @@ public class TrackSelectionParameters implements Parcelable { preferredTextLanguages = ImmutableList.of(Util.getLocaleLanguageTag(preferredLocale)); } } + + private static ImmutableList normalizeLanguageCodes(String[] preferredTextLanguages) { + ImmutableList.Builder listBuilder = ImmutableList.builder(); + for (String language : checkNotNull(preferredTextLanguages)) { + listBuilder.add(Util.normalizeLanguageCode(checkNotNull(language))); + } + return listBuilder.build(); + } } /** @@ -537,20 +622,6 @@ public class TrackSelectionParameters implements Parcelable { */ @Deprecated public static final TrackSelectionParameters DEFAULT = DEFAULT_WITHOUT_CONTEXT; - public static final Creator CREATOR = - new Creator() { - - @Override - public TrackSelectionParameters createFromParcel(Parcel in) { - return new TrackSelectionParameters(in); - } - - @Override - public TrackSelectionParameters[] newArray(int size) { - return new TrackSelectionParameters[size]; - } - }; - /** Returns an instance configured with default values. */ public static TrackSelectionParameters getDefaults(Context context) { return new Builder(context).build(); @@ -707,42 +778,6 @@ public class TrackSelectionParameters implements Parcelable { this.forceHighestSupportedBitrate = builder.forceHighestSupportedBitrate; } - /* package */ TrackSelectionParameters(Parcel in) { - ArrayList preferredAudioLanguages = new ArrayList<>(); - in.readList(preferredAudioLanguages, /* loader= */ null); - this.preferredAudioLanguages = ImmutableList.copyOf(preferredAudioLanguages); - this.preferredAudioRoleFlags = in.readInt(); - ArrayList preferredTextLanguages1 = new ArrayList<>(); - in.readList(preferredTextLanguages1, /* loader= */ null); - this.preferredTextLanguages = ImmutableList.copyOf(preferredTextLanguages1); - this.preferredTextRoleFlags = in.readInt(); - this.selectUndeterminedTextLanguage = Util.readBoolean(in); - // Video - this.maxVideoWidth = in.readInt(); - this.maxVideoHeight = in.readInt(); - this.maxVideoFrameRate = in.readInt(); - this.maxVideoBitrate = in.readInt(); - this.minVideoWidth = in.readInt(); - this.minVideoHeight = in.readInt(); - this.minVideoFrameRate = in.readInt(); - this.minVideoBitrate = in.readInt(); - this.viewportWidth = in.readInt(); - this.viewportHeight = in.readInt(); - this.viewportOrientationMayChange = Util.readBoolean(in); - ArrayList preferredVideoMimeTypes = new ArrayList<>(); - in.readList(preferredVideoMimeTypes, /* loader= */ null); - this.preferredVideoMimeTypes = ImmutableList.copyOf(preferredVideoMimeTypes); - // Audio - this.maxAudioChannelCount = in.readInt(); - this.maxAudioBitrate = in.readInt(); - ArrayList preferredAudioMimeTypes = new ArrayList<>(); - in.readList(preferredAudioMimeTypes, /* loader= */ null); - this.preferredAudioMimeTypes = ImmutableList.copyOf(preferredAudioMimeTypes); - // General - this.forceLowestBitrate = Util.readBoolean(in); - this.forceHighestSupportedBitrate = Util.readBoolean(in); - } - /** Creates a new {@link Builder}, copying the initial values from this instance. */ public Builder buildUpon() { return new Builder(this); @@ -817,39 +852,109 @@ public class TrackSelectionParameters implements Parcelable { return result; } - // Parcelable implementation. + // Bundleable implementation + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_PREFERRED_AUDIO_LANGUAGES, + FIELD_PREFERRED_AUDIO_ROLE_FLAGS, + FIELD_PREFERRED_TEXT_LANGUAGES, + FIELD_PREFERRED_TEXT_ROLE_FLAGS, + FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, + FIELD_MAX_VIDEO_WIDTH, + FIELD_MAX_VIDEO_HEIGHT, + FIELD_MAX_VIDEO_FRAMERATE, + FIELD_MAX_VIDEO_BITRATE, + FIELD_MIN_VIDEO_WIDTH, + FIELD_MIN_VIDEO_HEIGHT, + FIELD_MIN_VIDEO_FRAMERATE, + FIELD_MIN_VIDEO_BITRATE, + FIELD_VIEWPORT_WIDTH, + FIELD_VIEWPORT_HEIGHT, + FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, + FIELD_PREFERRED_VIDEO_MIMETYPES, + FIELD_MAX_AUDIO_CHANNEL_COUNT, + FIELD_MAX_AUDIO_BITRATE, + FIELD_PREFERRED_AUDIO_MIME_TYPES, + FIELD_FORCE_LOWEST_BITRATE, + FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, + }) + private @interface FieldNumber {} + + private static final int FIELD_PREFERRED_AUDIO_LANGUAGES = 1; + private static final int FIELD_PREFERRED_AUDIO_ROLE_FLAGS = 2; + private static final int FIELD_PREFERRED_TEXT_LANGUAGES = 3; + private static final int FIELD_PREFERRED_TEXT_ROLE_FLAGS = 4; + private static final int FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE = 5; + private static final int FIELD_MAX_VIDEO_WIDTH = 6; + private static final int FIELD_MAX_VIDEO_HEIGHT = 7; + private static final int FIELD_MAX_VIDEO_FRAMERATE = 8; + private static final int FIELD_MAX_VIDEO_BITRATE = 9; + private static final int FIELD_MIN_VIDEO_WIDTH = 10; + private static final int FIELD_MIN_VIDEO_HEIGHT = 11; + private static final int FIELD_MIN_VIDEO_FRAMERATE = 12; + private static final int FIELD_MIN_VIDEO_BITRATE = 13; + private static final int FIELD_VIEWPORT_WIDTH = 14; + private static final int FIELD_VIEWPORT_HEIGHT = 15; + private static final int FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE = 16; + private static final int FIELD_PREFERRED_VIDEO_MIMETYPES = 17; + private static final int FIELD_MAX_AUDIO_CHANNEL_COUNT = 18; + private static final int FIELD_MAX_AUDIO_BITRATE = 19; + private static final int FIELD_PREFERRED_AUDIO_MIME_TYPES = 20; + private static final int FIELD_FORCE_LOWEST_BITRATE = 21; + private static final int FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE = 22; @Override - public int describeContents() { - return 0; + @CallSuper + public Bundle toBundle() { + Bundle bundle = new Bundle(); + + // Video + bundle.putInt(keyForField(FIELD_MAX_VIDEO_WIDTH), maxVideoWidth); + bundle.putInt(keyForField(FIELD_MAX_VIDEO_HEIGHT), maxVideoHeight); + bundle.putInt(keyForField(FIELD_MAX_VIDEO_FRAMERATE), maxVideoFrameRate); + bundle.putInt(keyForField(FIELD_MAX_VIDEO_BITRATE), maxVideoBitrate); + bundle.putInt(keyForField(FIELD_MIN_VIDEO_WIDTH), minVideoWidth); + bundle.putInt(keyForField(FIELD_MIN_VIDEO_HEIGHT), minVideoHeight); + bundle.putInt(keyForField(FIELD_MIN_VIDEO_FRAMERATE), minVideoFrameRate); + bundle.putInt(keyForField(FIELD_MIN_VIDEO_BITRATE), minVideoBitrate); + bundle.putInt(keyForField(FIELD_VIEWPORT_WIDTH), viewportWidth); + bundle.putInt(keyForField(FIELD_VIEWPORT_HEIGHT), viewportHeight); + bundle.putBoolean( + keyForField(FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE), viewportOrientationMayChange); + bundle.putStringArray( + keyForField(FIELD_PREFERRED_VIDEO_MIMETYPES), + preferredVideoMimeTypes.toArray(new String[0])); + // Audio + bundle.putStringArray( + keyForField(FIELD_PREFERRED_AUDIO_LANGUAGES), + preferredAudioLanguages.toArray(new String[0])); + bundle.putInt(keyForField(FIELD_PREFERRED_AUDIO_ROLE_FLAGS), preferredAudioRoleFlags); + bundle.putInt(keyForField(FIELD_MAX_AUDIO_CHANNEL_COUNT), maxAudioChannelCount); + bundle.putInt(keyForField(FIELD_MAX_AUDIO_BITRATE), maxAudioBitrate); + bundle.putStringArray( + keyForField(FIELD_PREFERRED_AUDIO_MIME_TYPES), + preferredAudioMimeTypes.toArray(new String[0])); + // Text + bundle.putStringArray( + keyForField(FIELD_PREFERRED_TEXT_LANGUAGES), preferredTextLanguages.toArray(new String[0])); + bundle.putInt(keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS), preferredTextRoleFlags); + bundle.putBoolean( + keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE), selectUndeterminedTextLanguage); + // General + bundle.putBoolean(keyForField(FIELD_FORCE_LOWEST_BITRATE), forceLowestBitrate); + bundle.putBoolean( + keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), forceHighestSupportedBitrate); + + return bundle; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeList(preferredAudioLanguages); - dest.writeInt(preferredAudioRoleFlags); - dest.writeList(preferredTextLanguages); - dest.writeInt(preferredTextRoleFlags); - Util.writeBoolean(dest, selectUndeterminedTextLanguage); - // Video - dest.writeInt(maxVideoWidth); - dest.writeInt(maxVideoHeight); - dest.writeInt(maxVideoFrameRate); - dest.writeInt(maxVideoBitrate); - dest.writeInt(minVideoWidth); - dest.writeInt(minVideoHeight); - dest.writeInt(minVideoFrameRate); - dest.writeInt(minVideoBitrate); - dest.writeInt(viewportWidth); - dest.writeInt(viewportHeight); - Util.writeBoolean(dest, viewportOrientationMayChange); - dest.writeList(preferredVideoMimeTypes); - // Audio - dest.writeInt(maxAudioChannelCount); - dest.writeInt(maxAudioBitrate); - dest.writeList(preferredAudioMimeTypes); - // General - Util.writeBoolean(dest, forceLowestBitrate); - Util.writeBoolean(dest, forceHighestSupportedBitrate); + /** Object that can restore {@code TrackSelectionParameters} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> new Builder(bundle).build(); + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java index adc9514f7d..1a29691dd8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java @@ -15,7 +15,11 @@ */ package com.google.android.exoplayer2.util; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Util.castNonNull; + import android.os.Bundle; +import android.util.SparseArray; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.common.collect.ImmutableList; @@ -68,13 +72,41 @@ public final class BundleableUtils { Bundleable.Creator creator, List bundleList) { ImmutableList.Builder builder = ImmutableList.builder(); for (int i = 0; i < bundleList.size(); i++) { - Bundle bundle = bundleList.get(i); + Bundle bundle = checkNotNull(bundleList.get(i)); // Fail fast during parsing. T bundleable = creator.fromBundle(bundle); builder.add(bundleable); } return builder.build(); } + /** + * Converts a list of {@link Bundle} to a list of {@link Bundleable}. Returns {@code defaultValue} + * if {@code bundleList} is null. + */ + public static List fromBundleNullableList( + Bundleable.Creator creator, @Nullable List bundleList, List defaultValue) { + return (bundleList == null) ? defaultValue : fromBundleList(creator, bundleList); + } + + /** + * Converts a {@link SparseArray} of {@link Bundle} to a {@link SparseArray} of {@link + * Bundleable}. Returns {@code defaultValue} if {@code bundleSparseArray} is null. + */ + public static SparseArray fromBundleNullableSparseArray( + Bundleable.Creator creator, + @Nullable SparseArray bundleSparseArray, + SparseArray defaultValue) { + if (bundleSparseArray == null) { + return defaultValue; + } + // Can't use ImmutableList as it doesn't support null elements. + SparseArray result = new SparseArray<>(bundleSparseArray.size()); + for (int i = 0; i < bundleSparseArray.size(); i++) { + result.put(bundleSparseArray.keyAt(i), creator.fromBundle(bundleSparseArray.valueAt(i))); + } + return result; + } + /** * Converts a list of {@link Bundleable} to an {@link ArrayList} of {@link Bundle} so that the * returned list can be put to {@link Bundle} using {@link Bundle#putParcelableArrayList} @@ -88,5 +120,31 @@ public final class BundleableUtils { return arrayList; } + /** + * Converts a {@link SparseArray} of {@link Bundleable} to an {@link SparseArray} of {@link + * Bundle} so that the returned {@link SparseArray} can be put to {@link Bundle} using {@link + * Bundle#putSparseParcelableArray} conveniently. + */ + public static SparseArray toBundleSparseArray( + SparseArray bundleableSparseArray) { + SparseArray sparseArray = new SparseArray<>(bundleableSparseArray.size()); + for (int i = 0; i < bundleableSparseArray.size(); i++) { + sparseArray.put(bundleableSparseArray.keyAt(i), bundleableSparseArray.valueAt(i).toBundle()); + } + return sparseArray; + } + + /** + * Set the application class loader to the given {@link Bundle} if no class loader is present. + * + *

    This assumes that all classes unparceled from {@code bundle} are sharing the class loader of + * {@code BundleableUtils}. + */ + public static void ensureClassLoader(@Nullable Bundle bundle) { + if (bundle != null) { + bundle.setClassLoader(castNonNull(BundleableUtils.class.getClassLoader())); + } + } + private BundleableUtils() {} } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/video/ColorInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/video/ColorInfo.java index 38fe968668..17ca09a747 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/video/ColorInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/video/ColorInfo.java @@ -15,17 +15,20 @@ */ package com.google.android.exoplayer2.video; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Bundle; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.util.Util; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import org.checkerframework.dataflow.qual.Pure; /** Stores color info. */ -public final class ColorInfo implements Parcelable { +public final class ColorInfo implements Bundleable { /** * Returns the {@link C.ColorSpace} corresponding to the given ISO color primary code, as per @@ -116,16 +119,6 @@ public final class ColorInfo implements Parcelable { this.hdrStaticInfo = hdrStaticInfo; } - @SuppressWarnings("ResourceType") - /* package */ ColorInfo(Parcel in) { - colorSpace = in.readInt(); - colorRange = in.readInt(); - colorTransfer = in.readInt(); - boolean hasHdrStaticInfo = Util.readBoolean(in); - hdrStaticInfo = hasHdrStaticInfo ? in.createByteArray() : null; - } - - // Parcelable implementation. @Override public boolean equals(@Nullable Object obj) { if (this == obj) { @@ -167,32 +160,42 @@ public final class ColorInfo implements Parcelable { return hashCode; } - @Override - public int describeContents() { - return 0; - } + // Bundleable implementation + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_COLOR_SPACE, + FIELD_COLOR_RANGE, + FIELD_COLOR_TRANSFER, + FIELD_HDR_STATIC_INFO, + }) + private @interface FieldNumber {} + + private static final int FIELD_COLOR_SPACE = 0; + private static final int FIELD_COLOR_RANGE = 1; + private static final int FIELD_COLOR_TRANSFER = 2; + private static final int FIELD_HDR_STATIC_INFO = 3; @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(colorSpace); - dest.writeInt(colorRange); - dest.writeInt(colorTransfer); - Util.writeBoolean(dest, hdrStaticInfo != null); - if (hdrStaticInfo != null) { - dest.writeByteArray(hdrStaticInfo); - } + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putInt(keyForField(FIELD_COLOR_SPACE), colorSpace); + bundle.putInt(keyForField(FIELD_COLOR_RANGE), colorRange); + bundle.putInt(keyForField(FIELD_COLOR_TRANSFER), colorTransfer); + bundle.putByteArray(keyForField(FIELD_HDR_STATIC_INFO), hdrStaticInfo); + return bundle; } - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public ColorInfo createFromParcel(Parcel in) { - return new ColorInfo(in); - } + public static final Creator CREATOR = + bundle -> + new ColorInfo( + bundle.getInt(keyForField(FIELD_COLOR_SPACE), Format.NO_VALUE), + bundle.getInt(keyForField(FIELD_COLOR_RANGE), Format.NO_VALUE), + bundle.getInt(keyForField(FIELD_COLOR_TRANSFER), Format.NO_VALUE), + bundle.getByteArray(keyForField(FIELD_HDR_STATIC_INFO))); - @Override - public ColorInfo[] newArray(int size) { - return new ColorInfo[size]; - } - }; + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java index 1ad888c868..87fc725029 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java @@ -20,7 +20,6 @@ import static com.google.android.exoplayer2.util.MimeTypes.VIDEO_MP4; import static com.google.android.exoplayer2.util.MimeTypes.VIDEO_WEBM; import static com.google.common.truth.Truth.assertThat; -import android.os.Parcel; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.ExoMediaCrypto; @@ -46,21 +45,15 @@ public final class FormatTest { } @Test - public void parcelFormat_createsEqualFormat_exceptExoMediaCryptoType() { - Format formatToParcel = createTestFormat(); + public void roundTripViaBundle_ofParameters_yieldsEqualInstanceExceptExoMediaCryptoType() { + Format formatToBundle = createTestFormat(); - Parcel parcel = Parcel.obtain(); - formatToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); + Format formatFromBundle = Format.CREATOR.fromBundle(formatToBundle.toBundle()); - Format formatFromParcel = Format.CREATOR.createFromParcel(parcel); - Format expectedFormat = - formatToParcel.buildUpon().setExoMediaCryptoType(UnsupportedMediaCrypto.class).build(); - - assertThat(formatFromParcel.exoMediaCryptoType).isEqualTo(UnsupportedMediaCrypto.class); - assertThat(formatFromParcel).isEqualTo(expectedFormat); - - parcel.recycle(); + assertThat(formatFromBundle.exoMediaCryptoType).isEqualTo(UnsupportedMediaCrypto.class); + assertThat(formatFromBundle) + .isEqualTo( + formatToBundle.buildUpon().setExoMediaCryptoType(UnsupportedMediaCrypto.class).build()); } private static Format createTestFormat() { 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 2d78d4409d..778999d2cb 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 @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.C.FormatSupport; import com.google.android.exoplayer2.source.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Documented; @@ -234,7 +235,9 @@ public final class ExoPlaybackException extends PlaybackException { rendererName = bundle.getString(keyForField(FIELD_RENDERER_NAME)); rendererIndex = bundle.getInt(keyForField(FIELD_RENDERER_INDEX), /* defaultValue= */ C.INDEX_UNSET); - rendererFormat = bundle.getParcelable(keyForField(FIELD_RENDERER_FORMAT)); + rendererFormat = + BundleableUtils.fromNullableBundle( + Format.CREATOR, bundle.getBundle(keyForField(FIELD_RENDERER_FORMAT))); rendererFormatSupport = bundle.getInt( keyForField(FIELD_RENDERER_FORMAT_SUPPORT), /* defaultValue= */ C.FORMAT_HANDLED); @@ -396,7 +399,8 @@ public final class ExoPlaybackException extends PlaybackException { bundle.putInt(keyForField(FIELD_TYPE), type); bundle.putString(keyForField(FIELD_RENDERER_NAME), rendererName); bundle.putInt(keyForField(FIELD_RENDERER_INDEX), rendererIndex); - bundle.putParcelable(keyForField(FIELD_RENDERER_FORMAT), rendererFormat); + bundle.putBundle( + keyForField(FIELD_RENDERER_FORMAT), BundleableUtils.toNullableBundle(rendererFormat)); bundle.putInt(keyForField(FIELD_RENDERER_FORMAT_SUPPORT), rendererFormatSupport); bundle.putBoolean(keyForField(FIELD_IS_RECOVERABLE), isRecoverable); return bundle; 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 91c4a79d3a..cca7bc1873 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 @@ -17,13 +17,14 @@ package com.google.android.exoplayer2.trackselection; import android.content.Context; import android.graphics.Point; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.Bundle; import android.text.TextUtils; import android.util.Pair; import android.util.SparseArray; import android.util.SparseBooleanArray; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.FormatSupport; import com.google.android.exoplayer2.ExoPlaybackException; @@ -39,11 +40,15 @@ import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; import com.google.common.primitives.Ints; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -239,6 +244,66 @@ public class DefaultTrackSelector extends MappingTrackSelector { rendererDisabledFlags = initialValues.rendererDisabledFlags.clone(); } + @SuppressWarnings("method.invocation") // Only setter are invoked. + private ParametersBuilder(Bundle bundle) { + super(bundle); + Parameters defaultValue = Parameters.DEFAULT_WITHOUT_CONTEXT; + // Video + setExceedVideoConstraintsIfNecessary( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY), + defaultValue.exceedVideoConstraintsIfNecessary)); + setAllowVideoMixedMimeTypeAdaptiveness( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS), + defaultValue.allowVideoMixedMimeTypeAdaptiveness)); + setAllowVideoNonSeamlessAdaptiveness( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS), + defaultValue.allowVideoNonSeamlessAdaptiveness)); + // Audio + setExceedAudioConstraintsIfNecessary( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY), + defaultValue.exceedAudioConstraintsIfNecessary)); + setAllowAudioMixedMimeTypeAdaptiveness( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS), + defaultValue.allowAudioMixedMimeTypeAdaptiveness)); + setAllowAudioMixedSampleRateAdaptiveness( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS), + defaultValue.allowAudioMixedSampleRateAdaptiveness)); + setAllowAudioMixedChannelCountAdaptiveness( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS), + defaultValue.allowAudioMixedChannelCountAdaptiveness)); + // Text + setDisabledTextTrackSelectionFlags( + bundle.getInt( + Parameters.keyForField(Parameters.FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS), + defaultValue.disabledTextTrackSelectionFlags)); + // General + setExceedRendererCapabilitiesIfNecessary( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY), + defaultValue.exceedRendererCapabilitiesIfNecessary)); + setTunnelingEnabled( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_TUNNELING_ENABLED), + defaultValue.tunnelingEnabled)); + setAllowMultipleAdaptiveSelections( + bundle.getBoolean( + Parameters.keyForField(Parameters.FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS), + defaultValue.allowMultipleAdaptiveSelections)); + + selectionOverrides = new SparseArray<>(); + setSelectionOverridesFromBundle(bundle); + + rendererDisabledFlags = new SparseBooleanArray(); + setRendererDisableFlagsFromBundle(bundle); + } + // Video @Override @@ -724,12 +789,52 @@ public class DefaultTrackSelector extends MappingTrackSelector { } return clone; } + + private void setSelectionOverridesFromBundle(Bundle bundle) { + @Nullable + int[] rendererIndexes = + bundle.getIntArray( + Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES)); + List trackGroupArrays = + BundleableUtils.fromBundleNullableList( + TrackGroupArray.CREATOR, + bundle.getParcelableArrayList( + Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS)), + /* defaultValue= */ ImmutableList.of()); + SparseArray selectionOverrides = + BundleableUtils.fromBundleNullableSparseArray( + SelectionOverride.CREATOR, + bundle.getSparseParcelableArray( + Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES)), + /* defaultValue= */ new SparseArray<>()); + + if (rendererIndexes == null || rendererIndexes.length != trackGroupArrays.size()) { + return; // Incorrect format, ignore all overrides. + } + for (int i = 0; i < rendererIndexes.length; i++) { + int rendererIndex = rendererIndexes[i]; + TrackGroupArray groups = trackGroupArrays.get(i); + @Nullable SelectionOverride selectionOverride = selectionOverrides.get(i); + setSelectionOverride(rendererIndex, groups, selectionOverride); + } + } + + private void setRendererDisableFlagsFromBundle(Bundle bundle) { + int[] rendererIndexes = + bundle.getIntArray(Parameters.keyForField(Parameters.FIELD_RENDERER_DISABLED_INDEXES)); + if (rendererIndexes == null) { + return; + } + for (int rendererIndex : rendererIndexes) { + setRendererDisabled(rendererIndex, true); + } + } } /** * Extends {@link Parameters} by adding fields that are specific to {@link DefaultTrackSelector}. */ - public static final class Parameters extends TrackSelectionParameters implements Parcelable { + public static final class Parameters extends TrackSelectionParameters implements Bundleable { /** * An instance with default values, except those obtained from the {@link Context}. @@ -755,19 +860,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { */ @Deprecated public static final Parameters DEFAULT = DEFAULT_WITHOUT_CONTEXT; - public static final Creator CREATOR = - new Creator() { - - @Override - public Parameters createFromParcel(Parcel in) { - return new Parameters(in); - } - - @Override - public Parameters[] newArray(int size) { - return new Parameters[size]; - } - }; /** * Bitmask of selection flags that are disabled for text track selections. See {@link * C.SelectionFlags}. The default value is {@code 0} (i.e. no flags). @@ -868,28 +960,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { rendererDisabledFlags = builder.rendererDisabledFlags; } - /* package */ Parameters(Parcel in) { - super(in); - // Video - this.exceedVideoConstraintsIfNecessary = Util.readBoolean(in); - this.allowVideoMixedMimeTypeAdaptiveness = Util.readBoolean(in); - this.allowVideoNonSeamlessAdaptiveness = Util.readBoolean(in); - // Audio - this.exceedAudioConstraintsIfNecessary = Util.readBoolean(in); - this.allowAudioMixedMimeTypeAdaptiveness = Util.readBoolean(in); - this.allowAudioMixedSampleRateAdaptiveness = Util.readBoolean(in); - this.allowAudioMixedChannelCountAdaptiveness = Util.readBoolean(in); - // Text - this.disabledTextTrackSelectionFlags = in.readInt(); - // General - this.exceedRendererCapabilitiesIfNecessary = Util.readBoolean(in); - this.tunnelingEnabled = Util.readBoolean(in); - this.allowMultipleAdaptiveSelections = Util.readBoolean(in); - // Overrides - this.selectionOverrides = readSelectionOverrides(in); - this.rendererDisabledFlags = Util.castNonNull(in.readSparseBooleanArray()); - } - /** * Returns whether the renderer is disabled. * @@ -928,6 +998,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { } /** Creates a new {@link ParametersBuilder}, copying the initial values from this instance. */ + @Override public ParametersBuilder buildUpon() { return new ParametersBuilder(this); } @@ -987,80 +1058,141 @@ public class DefaultTrackSelector extends MappingTrackSelector { return result; } - // Parcelable implementation. + // Bundleable implementation. + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY, + FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS, + FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS, + FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY, + FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS, + FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS, + FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS, + FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS, + FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY, + FIELD_TUNNELING_ENABLED, + FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS, + FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES, + FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS, + FIELD_SELECTION_OVERRIDES, + FIELD_RENDERER_DISABLED_INDEXES, + }) + private @interface FieldNumber {} + + // Start at 1000 to avoid conflict with the base class fields. + private static final int FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY = 1000; + private static final int FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS = 1001; + private static final int FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS = 1002; + private static final int FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY = 1003; + private static final int FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS = 1004; + private static final int FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS = 1005; + private static final int FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS = 1006; + private static final int FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS = 1007; + private static final int FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY = 1008; + private static final int FIELD_TUNNELING_ENABLED = 1009; + private static final int FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS = 1010; + private static final int FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES = 1011; + private static final int FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS = 1012; + private static final int FIELD_SELECTION_OVERRIDES = 1013; + private static final int FIELD_RENDERER_DISABLED_INDEXES = 1014; @Override - public int describeContents() { - return 0; - } + public Bundle toBundle() { + Bundle bundle = super.toBundle(); - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); // Video - Util.writeBoolean(dest, exceedVideoConstraintsIfNecessary); - Util.writeBoolean(dest, allowVideoMixedMimeTypeAdaptiveness); - Util.writeBoolean(dest, allowVideoNonSeamlessAdaptiveness); + bundle.putBoolean( + keyForField(FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY), + exceedVideoConstraintsIfNecessary); + bundle.putBoolean( + keyForField(FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS), + allowVideoMixedMimeTypeAdaptiveness); + bundle.putBoolean( + keyForField(FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS), + allowVideoNonSeamlessAdaptiveness); // Audio - Util.writeBoolean(dest, exceedAudioConstraintsIfNecessary); - Util.writeBoolean(dest, allowAudioMixedMimeTypeAdaptiveness); - Util.writeBoolean(dest, allowAudioMixedSampleRateAdaptiveness); - Util.writeBoolean(dest, allowAudioMixedChannelCountAdaptiveness); + bundle.putBoolean( + keyForField(FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY), + exceedAudioConstraintsIfNecessary); + bundle.putBoolean( + keyForField(FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS), + allowAudioMixedMimeTypeAdaptiveness); + bundle.putBoolean( + keyForField(FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS), + allowAudioMixedSampleRateAdaptiveness); + bundle.putBoolean( + keyForField(FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS), + allowAudioMixedChannelCountAdaptiveness); // Text - dest.writeInt(disabledTextTrackSelectionFlags); + bundle.putInt( + keyForField(FIELD_DISABLED_TEXT_TRACK_SELECTION_FLAGS), disabledTextTrackSelectionFlags); // General - Util.writeBoolean(dest, exceedRendererCapabilitiesIfNecessary); - Util.writeBoolean(dest, tunnelingEnabled); - Util.writeBoolean(dest, allowMultipleAdaptiveSelections); - // Overrides - writeSelectionOverridesToParcel(dest, selectionOverrides); - dest.writeSparseBooleanArray(rendererDisabledFlags); + bundle.putBoolean( + keyForField(FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY), + exceedRendererCapabilitiesIfNecessary); + bundle.putBoolean(keyForField(FIELD_TUNNELING_ENABLED), tunnelingEnabled); + bundle.putBoolean( + keyForField(FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS), allowMultipleAdaptiveSelections); + + putSelectionOverridesToBundle(bundle, selectionOverrides); + putRendererDisabledFlagsToBundle(bundle, rendererDisabledFlags); + + return bundle; } - // Static utility methods. + /** Object that can restore {@code Parameters} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> new ParametersBuilder(bundle).build(); - private static SparseArray> - readSelectionOverrides(Parcel in) { - int renderersWithOverridesCount = in.readInt(); - SparseArray> selectionOverrides = - new SparseArray<>(renderersWithOverridesCount); - for (int i = 0; i < renderersWithOverridesCount; i++) { - int rendererIndex = in.readInt(); - int overrideCount = in.readInt(); - Map overrides = - new HashMap<>(overrideCount); - for (int j = 0; j < overrideCount; j++) { - TrackGroupArray trackGroups = - Assertions.checkNotNull(in.readParcelable(TrackGroupArray.class.getClassLoader())); - @Nullable - SelectionOverride override = in.readParcelable(SelectionOverride.class.getClassLoader()); - overrides.put(trackGroups, override); - } - selectionOverrides.put(rendererIndex, overrides); - } - return selectionOverrides; + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); } - private static void writeSelectionOverridesToParcel( - Parcel dest, + /** + * Bundles selection overrides in 3 arrays of equal length. Each triplet of matching index is - + * the selection override (stored in a sparse array as they can be null) - the trackGroupArray + * of that override - the rendererIndex of that override + */ + private static void putSelectionOverridesToBundle( + Bundle bundle, SparseArray> selectionOverrides) { - int renderersWithOverridesCount = selectionOverrides.size(); - dest.writeInt(renderersWithOverridesCount); - for (int i = 0; i < renderersWithOverridesCount; i++) { + ArrayList rendererIndexes = new ArrayList<>(); + ArrayList trackGroupArrays = new ArrayList<>(); + SparseArray selections = new SparseArray<>(); + + for (int i = 0; i < selectionOverrides.size(); i++) { int rendererIndex = selectionOverrides.keyAt(i); - Map overrides = - selectionOverrides.valueAt(i); - int overrideCount = overrides.size(); - dest.writeInt(rendererIndex); - dest.writeInt(overrideCount); for (Map.Entry override : - overrides.entrySet()) { - dest.writeParcelable(override.getKey(), /* parcelableFlags= */ 0); - dest.writeParcelable(override.getValue(), /* parcelableFlags= */ 0); + selectionOverrides.valueAt(i).entrySet()) { + @Nullable SelectionOverride selection = override.getValue(); + if (selection != null) { + selections.put(trackGroupArrays.size(), selection); + } + trackGroupArrays.add(override.getKey()); + rendererIndexes.add(rendererIndex); } + bundle.putIntArray( + keyForField(FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES), Ints.toArray(rendererIndexes)); + bundle.putParcelableArrayList( + keyForField(FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS), + BundleableUtils.toBundleArrayList(trackGroupArrays)); + bundle.putSparseParcelableArray( + keyForField(FIELD_SELECTION_OVERRIDES), + BundleableUtils.toBundleSparseArray(selections)); } } + private static void putRendererDisabledFlagsToBundle( + Bundle bundle, SparseBooleanArray rendererDisabledFlags) { + int[] rendererIndexes = new int[rendererDisabledFlags.size()]; + for (int i = 0; i < rendererDisabledFlags.size(); i++) { + rendererIndexes[i] = rendererDisabledFlags.keyAt(i); + } + bundle.putIntArray(keyForField(FIELD_RENDERER_DISABLED_INDEXES), rendererIndexes); + } + private static boolean areRendererDisabledFlagsEqual( SparseBooleanArray first, SparseBooleanArray second) { int firstSize = first.size(); @@ -1113,7 +1245,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { } /** A track selection override. */ - public static final class SelectionOverride implements Parcelable { + public static final class SelectionOverride implements Bundleable { public final int groupIndex; public final int[] tracks; @@ -1121,6 +1253,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { public final int type; /** + * Constructs a {@code SelectionOverride} to override tracks of a group. + * * @param groupIndex The overriding track group index. * @param tracks The overriding track indices within the track group. */ @@ -1129,6 +1263,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { } /** + * Constructs a {@code SelectionOverride} of the given type to override tracks of a group. + * * @param groupIndex The overriding track group index. * @param tracks The overriding track indices within the track group. * @param type The type that will be returned from {@link TrackSelection#getType()}. @@ -1141,14 +1277,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { Arrays.sort(this.tracks); } - /* package */ SelectionOverride(Parcel in) { - groupIndex = in.readInt(); - length = in.readByte(); - tracks = new int[length]; - in.readIntArray(tracks); - type = in.readInt(); - } - /** Returns whether this override contains the specified track index. */ public boolean containsTrack(int track) { for (int overrideTrack : tracks) { @@ -1179,34 +1307,44 @@ public class DefaultTrackSelector extends MappingTrackSelector { && type == other.type; } - // Parcelable implementation. + // Bundleable implementation. + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_GROUP_INDEX, + FIELD_TRACKS, + FIELD_TRACK_TYPE, + }) + private @interface FieldNumber {} + + private static final int FIELD_GROUP_INDEX = 0; + private static final int FIELD_TRACKS = 1; + private static final int FIELD_TRACK_TYPE = 2; @Override - public int describeContents() { - return 0; + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putInt(keyForField(FIELD_GROUP_INDEX), groupIndex); + bundle.putIntArray(keyForField(FIELD_TRACKS), tracks); + bundle.putInt(keyForField(FIELD_TRACK_TYPE), type); + return bundle; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(groupIndex); - dest.writeInt(tracks.length); - dest.writeIntArray(tracks); - dest.writeInt(type); - } - - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - - @Override - public SelectionOverride createFromParcel(Parcel in) { - return new SelectionOverride(in); - } - - @Override - public SelectionOverride[] newArray(int size) { - return new SelectionOverride[size]; - } + /** Object that can restore {@code SelectionOverride} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + int groupIndex = bundle.getInt(keyForField(FIELD_GROUP_INDEX), -1); + @Nullable int[] tracks = bundle.getIntArray(keyForField(FIELD_TRACKS)); + int trackType = bundle.getInt(keyForField(FIELD_TRACK_TYPE), -1); + Assertions.checkArgument(groupIndex >= 0 && trackType >= 0); + Assertions.checkNotNull(tracks); + return new SelectionOverride(groupIndex, tracks, trackType); }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } } /** diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java index 75653e86b6..c6794d06e6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.source; import static com.google.common.truth.Truth.assertThat; -import android.os.Parcel; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.MimeTypes; @@ -29,7 +28,7 @@ import org.junit.runner.RunWith; public final class TrackGroupArrayTest { @Test - public void parcelable() { + public void roundTripViaBundle_ofTrackGroupArray_yieldsEqualInstance() { Format.Builder formatBuilder = new Format.Builder(); Format format1 = formatBuilder.setSampleMimeType(MimeTypes.VIDEO_H264).build(); Format format2 = formatBuilder.setSampleMimeType(MimeTypes.AUDIO_AAC).build(); @@ -38,15 +37,11 @@ public final class TrackGroupArrayTest { TrackGroup trackGroup1 = new TrackGroup(format1, format2); TrackGroup trackGroup2 = new TrackGroup(format3); - TrackGroupArray trackGroupArrayToParcel = new TrackGroupArray(trackGroup1, trackGroup2); + TrackGroupArray trackGroupArrayToBundle = new TrackGroupArray(trackGroup1, trackGroup2); - Parcel parcel = Parcel.obtain(); - trackGroupArrayToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); + TrackGroupArray trackGroupArrayFromBundle = + TrackGroupArray.CREATOR.fromBundle(trackGroupArrayToBundle.toBundle()); - TrackGroupArray trackGroupArrayFromParcel = TrackGroupArray.CREATOR.createFromParcel(parcel); - assertThat(trackGroupArrayFromParcel).isEqualTo(trackGroupArrayToParcel); - - parcel.recycle(); + assertThat(trackGroupArrayFromBundle).isEqualTo(trackGroupArrayToBundle); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java index ba42463279..1644c4dfaa 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.source; import static com.google.common.truth.Truth.assertThat; -import android.os.Parcel; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.MimeTypes; @@ -29,20 +28,15 @@ import org.junit.runner.RunWith; public final class TrackGroupTest { @Test - public void parcelable() { + public void roundTripViaBundle_ofTrackGroup_yieldsEqualInstance() { Format.Builder formatBuilder = new Format.Builder(); Format format1 = formatBuilder.setSampleMimeType(MimeTypes.VIDEO_H264).build(); Format format2 = formatBuilder.setSampleMimeType(MimeTypes.AUDIO_AAC).build(); - TrackGroup trackGroupToParcel = new TrackGroup(format1, format2); + TrackGroup trackGroupToBundle = new TrackGroup(format1, format2); - Parcel parcel = Parcel.obtain(); - trackGroupToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); + TrackGroup trackGroupFromBundle = TrackGroup.CREATOR.fromBundle(trackGroupToBundle.toBundle()); - TrackGroup trackGroupFromParcel = TrackGroup.CREATOR.createFromParcel(parcel); - assertThat(trackGroupFromParcel).isEqualTo(trackGroupToParcel); - - parcel.recycle(); + assertThat(trackGroupFromBundle).isEqualTo(trackGroupToBundle); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 81959d35d8..eb2a052d87 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -29,9 +29,9 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import android.content.Context; -import android.os.Parcel; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; @@ -139,37 +139,26 @@ public final class DefaultTrackSelectorTest { assertThat(parameters.buildUpon().build()).isEqualTo(parameters); } - /** Tests {@link Parameters} {@link android.os.Parcelable} implementation. */ + /** Tests {@link Parameters} {@link Bundleable} implementation. */ @Test - public void parameters_parcelAndUnParcelable() { - Parameters parametersToParcel = buildParametersForEqualsTest(); + public void roundTripViaBundle_ofParameters_yieldsEqualInstance() { + Parameters parametersToBundle = buildParametersForEqualsTest(); - Parcel parcel = Parcel.obtain(); - parametersToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); + Parameters parametersFromBundle = Parameters.CREATOR.fromBundle(parametersToBundle.toBundle()); - Parameters parametersFromParcel = Parameters.CREATOR.createFromParcel(parcel); - assertThat(parametersFromParcel).isEqualTo(parametersToParcel); - - parcel.recycle(); + assertThat(parametersFromBundle).isEqualTo(parametersToBundle); } - /** Tests {@link SelectionOverride}'s {@link android.os.Parcelable} implementation. */ + /** Tests {@link SelectionOverride}'s {@link Bundleable} implementation. */ @Test - public void selectionOverrideParcelable() { - int[] tracks = new int[] {2, 3}; - SelectionOverride selectionOverrideToParcel = - new SelectionOverride(/* groupIndex= */ 1, tracks); + public void roundTripViaBundle_ofSelectionOverride_yieldsEqualInstance() { + SelectionOverride selectionOverrideToBundle = + new SelectionOverride(/* groupIndex= */ 1, /* tracks...= */ 2, 3); - Parcel parcel = Parcel.obtain(); - selectionOverrideToParcel.writeToParcel(parcel, 0); - parcel.setDataPosition(0); + SelectionOverride selectionOverrideFromBundle = + SelectionOverride.CREATOR.fromBundle(selectionOverrideToBundle.toBundle()); - SelectionOverride selectionOverrideFromParcel = - SelectionOverride.CREATOR.createFromParcel(parcel); - assertThat(selectionOverrideFromParcel).isEqualTo(selectionOverrideToParcel); - - parcel.recycle(); + assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle); } /** Tests that a null override clears a track selection. */ @@ -1764,7 +1753,13 @@ public final class DefaultTrackSelectorTest { /* rendererIndex= */ 2, new TrackGroupArray(VIDEO_TRACK_GROUP), new SelectionOverride(0, 1)) + .setSelectionOverride( + /* rendererIndex= */ 2, new TrackGroupArray(AUDIO_TRACK_GROUP), /* override= */ null) + .setSelectionOverride( + /* rendererIndex= */ 5, new TrackGroupArray(VIDEO_TRACK_GROUP), /* override= */ null) + .setRendererDisabled(1, true) .setRendererDisabled(3, true) + .setRendererDisabled(5, false) .build(); } From 85142be9a4e3643f28b491f637489fa453d38d04 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 18 Aug 2021 00:28:53 +0100 Subject: [PATCH 070/441] DRM refactor / cleanup PiperOrigin-RevId: 391403236 --- .../ext/av1/Libgav1VideoRenderer.java | 6 +- .../ext/ffmpeg/FfmpegAudioRenderer.java | 6 +- .../ext/ffmpeg/FfmpegVideoRenderer.java | 4 +- .../ext/flac/LibflacAudioRenderer.java | 6 +- .../ext/opus/LibopusAudioRenderer.java | 10 ++-- .../exoplayer2/ext/opus/OpusDecoder.java | 18 +++--- .../exoplayer2/ext/opus/OpusLibrary.java | 26 ++++---- .../ext/vp9/LibvpxVideoRenderer.java | 10 ++-- .../exoplayer2/ext/vp9/VpxDecoder.java | 18 +++--- .../exoplayer2/ext/vp9/VpxLibrary.java | 26 ++++---- .../java/com/google/android/exoplayer2/C.java | 28 +++++++++ .../com/google/android/exoplayer2/Format.java | 59 +++++++++---------- .../CryptoConfig.java} | 11 +++- .../exoplayer2/decoder/CryptoInfo.java | 6 +- .../google/android/exoplayer2/FormatTest.java | 14 ++--- .../audio/DecoderAudioRenderer.java | 16 ++--- .../audio/MediaCodecAudioRenderer.java | 2 +- .../exoplayer2/drm/DefaultDrmSession.java | 15 +++-- .../drm/DefaultDrmSessionManager.java | 21 +++---- .../android/exoplayer2/drm/DrmSession.java | 7 ++- .../exoplayer2/drm/DrmSessionManager.java | 32 +++++----- .../exoplayer2/drm/DummyExoMediaDrm.java | 9 ++- .../exoplayer2/drm/ErrorStateDrmSession.java | 3 +- .../android/exoplayer2/drm/ExoMediaDrm.java | 19 ++++-- ...Crypto.java => FrameworkCryptoConfig.java} | 12 ++-- .../exoplayer2/drm/FrameworkMediaDrm.java | 9 +-- .../mediacodec/MediaCodecRenderer.java | 42 ++++++------- .../exoplayer2/metadata/MetadataRenderer.java | 2 +- .../source/ProgressiveMediaPeriod.java | 4 +- .../exoplayer2/source/SampleQueue.java | 3 +- .../android/exoplayer2/text/TextRenderer.java | 2 +- .../video/DecoderVideoRenderer.java | 14 ++--- .../audio/DecoderAudioRendererTest.java | 4 +- .../exoplayer2/source/SampleQueueTest.java | 16 +++-- .../video/DecoderVideoRendererTest.java | 4 +- .../source/dash/DashMediaPeriod.java | 3 +- .../source/hls/HlsSampleStreamWrapper.java | 3 +- .../source/smoothstreaming/SsMediaPeriod.java | 3 +- .../exoplayer2/testutil/FakeCryptoConfig.java | 13 ++-- .../exoplayer2/testutil/FakeExoMediaDrm.java | 14 ++--- 40 files changed, 274 insertions(+), 246 deletions(-) rename library/common/src/main/java/com/google/android/exoplayer2/{drm/ExoMediaCrypto.java => decoder/CryptoConfig.java} (70%) rename library/core/src/main/java/com/google/android/exoplayer2/drm/{FrameworkMediaCrypto.java => FrameworkCryptoConfig.java} (81%) rename library/common/src/main/java/com/google/android/exoplayer2/drm/UnsupportedMediaCrypto.java => testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeCryptoConfig.java (61%) diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java index a083cd8414..fc7d6b6091 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java @@ -23,8 +23,8 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; @@ -132,7 +132,7 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer { || !Gav1Library.isAvailable()) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE); } - if (format.exoMediaCryptoType != null) { + if (format.cryptoType != C.CRYPTO_TYPE_NONE) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_DRM); } return RendererCapabilities.create( @@ -140,7 +140,7 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer { } @Override - protected Gav1Decoder createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) + protected Gav1Decoder createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws Gav1DecoderException { TraceUtil.beginSection("createGav1Decoder"); int initialInputBufferSize = diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java index 3991f53a38..a124c679c4 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java @@ -29,7 +29,7 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport; import com.google.android.exoplayer2.audio.DecoderAudioRenderer; import com.google.android.exoplayer2.audio.DefaultAudioSink; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; @@ -97,7 +97,7 @@ public final class FfmpegAudioRenderer extends DecoderAudioRenderer - createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) + createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws FfmpegDecoderException { TraceUtil.beginSection("createFfmpegVideoDecoder"); // TODO: Implement, remove the SuppressWarnings annotation, and update the return type to use diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java index 7b74d3bfd7..4c6d9f4c5b 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java @@ -23,7 +23,7 @@ import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.DecoderAudioRenderer; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.extractor.FlacStreamMetadata; import com.google.android.exoplayer2.util.FlacConstants; import com.google.android.exoplayer2.util.MimeTypes; @@ -100,7 +100,7 @@ public final class LibflacAudioRenderer extends DecoderAudioRenderer { @Override @C.FormatSupport protected int supportsFormatInternal(Format format) { - boolean drmIsSupported = - format.exoMediaCryptoType == null - || OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType); + boolean drmIsSupported = OpusLibrary.supportsCryptoType(format.cryptoType); if (!OpusLibrary.isAvailable() || !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) { return C.FORMAT_UNSUPPORTED_TYPE; @@ -98,7 +96,7 @@ public class LibopusAudioRenderer extends DecoderAudioRenderer { } @Override - protected OpusDecoder createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) + protected OpusDecoder createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws OpusDecoderException { TraceUtil.beginSection("createOpusDecoder"); @SinkFormatSupport @@ -115,7 +113,7 @@ public class LibopusAudioRenderer extends DecoderAudioRenderer { NUM_BUFFERS, initialInputBufferSize, format.initializationData, - mediaCrypto, + cryptoConfig, outputFloat); TraceUtil.endSection(); diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index cb81ea7f97..2cea08df14 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -21,12 +21,12 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.audio.OpusUtil; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; @@ -44,7 +44,7 @@ public final class OpusDecoder public final boolean outputFloat; public final int channelCount; - @Nullable private final ExoMediaCrypto exoMediaCrypto; + @Nullable private final CryptoConfig cryptoConfig; private final int preSkipSamples; private final int seekPreRollSamples; private final long nativeDecoderContext; @@ -60,8 +60,8 @@ public final class OpusDecoder * @param initializationData Codec-specific initialization data. The first element must contain an * opus header. Optionally, the list may contain two additional buffers, which must contain * the encoder delay and seek pre roll values in nanoseconds, encoded as longs. - * @param exoMediaCrypto The {@link ExoMediaCrypto} object required for decoding encrypted - * content. Maybe null and can be ignored if decoder does not handle encrypted content. + * @param cryptoConfig The {@link CryptoConfig} object required for decoding encrypted content. + * May be null and can be ignored if decoder does not handle encrypted content. * @param outputFloat Forces the decoder to output float PCM samples when set * @throws OpusDecoderException Thrown if an exception occurs when initializing the decoder. */ @@ -70,15 +70,15 @@ public final class OpusDecoder int numOutputBuffers, int initialInputBufferSize, List initializationData, - @Nullable ExoMediaCrypto exoMediaCrypto, + @Nullable CryptoConfig cryptoConfig, boolean outputFloat) throws OpusDecoderException { super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]); if (!OpusLibrary.isAvailable()) { throw new OpusDecoderException("Failed to load decoder native libraries"); } - this.exoMediaCrypto = exoMediaCrypto; - if (exoMediaCrypto != null && !OpusLibrary.opusIsSecureDecodeSupported()) { + this.cryptoConfig = cryptoConfig; + if (cryptoConfig != null && !OpusLibrary.opusIsSecureDecodeSupported()) { throw new OpusDecoderException("Opus decoder does not support secure decode"); } int initializationDataSize = initializationData.size(); @@ -177,7 +177,7 @@ public final class OpusDecoder inputData.limit(), outputBuffer, OpusUtil.SAMPLE_RATE, - exoMediaCrypto, + cryptoConfig, cryptoInfo.mode, Assertions.checkNotNull(cryptoInfo.key), Assertions.checkNotNull(cryptoInfo.iv), @@ -248,7 +248,7 @@ public final class OpusDecoder int inputSize, SimpleOutputBuffer outputBuffer, int sampleRate, - @Nullable ExoMediaCrypto mediaCrypto, + @Nullable CryptoConfig mediaCrypto, int inputMode, byte[] key, byte[] iv, diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java index 47b1cef657..01162bf365 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusLibrary.java @@ -16,10 +16,9 @@ package com.google.android.exoplayer2.ext.opus; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.LibraryLoader; -import com.google.android.exoplayer2.util.Util; /** Configures and queries the underlying native library. */ public final class OpusLibrary { @@ -29,7 +28,7 @@ public final class OpusLibrary { } private static final LibraryLoader LOADER = new LibraryLoader("opusV2JNI"); - @Nullable private static Class exoMediaCryptoType; + @C.CryptoType private static int cryptoType = C.CRYPTO_TYPE_UNSUPPORTED; private OpusLibrary() {} @@ -38,14 +37,14 @@ public final class OpusLibrary { * it must do so before calling any other method defined by this class, and before instantiating a * {@link LibopusAudioRenderer} instance. * - * @param exoMediaCryptoType The {@link ExoMediaCrypto} type expected for decoding protected - * content. + * @param cryptoType The {@link C.CryptoType} for which the decoder library supports decrypting + * protected content, or {@link C#CRYPTO_TYPE_UNSUPPORTED} if the library does not support + * decryption. * @param libraries The names of the Opus native libraries. */ - public static void setLibraries( - Class exoMediaCryptoType, String... libraries) { + public static void setLibraries(@C.CryptoType int cryptoType, String... libraries) { + OpusLibrary.cryptoType = cryptoType; LOADER.setLibraries(libraries); - OpusLibrary.exoMediaCryptoType = exoMediaCryptoType; } /** Returns whether the underlying library is available, loading it if necessary. */ @@ -59,13 +58,10 @@ public final class OpusLibrary { return isAvailable() ? opusGetVersion() : null; } - /** - * Returns whether the given {@link ExoMediaCrypto} type matches the one required for decoding - * protected content. - */ - public static boolean matchesExpectedExoMediaCryptoType( - Class exoMediaCryptoType) { - return Util.areEqual(OpusLibrary.exoMediaCryptoType, exoMediaCryptoType); + /** Returns whether the library supports the given {@link C.CryptoType}. */ + public static boolean supportsCryptoType(@C.CryptoType int cryptoType) { + return cryptoType == C.CRYPTO_TYPE_NONE + || (cryptoType != C.CRYPTO_TYPE_UNSUPPORTED && cryptoType == OpusLibrary.cryptoType); } public static native String opusGetVersion(); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index 610f2f84e4..218b3b779e 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -24,8 +24,8 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.video.DecoderVideoRenderer; @@ -129,9 +129,7 @@ public class LibvpxVideoRenderer extends DecoderVideoRenderer { if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE); } - boolean drmIsSupported = - format.exoMediaCryptoType == null - || VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType); + boolean drmIsSupported = VpxLibrary.supportsCryptoType(format.cryptoType); if (!drmIsSupported) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_DRM); } @@ -140,14 +138,14 @@ public class LibvpxVideoRenderer extends DecoderVideoRenderer { } @Override - protected VpxDecoder createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) + protected VpxDecoder createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws VpxDecoderException { TraceUtil.beginSection("createVpxDecoder"); int initialInputBufferSize = format.maxInputSize != Format.NO_VALUE ? format.maxInputSize : DEFAULT_INPUT_BUFFER_SIZE; VpxDecoder decoder = new VpxDecoder( - numInputBuffers, numOutputBuffers, initialInputBufferSize, mediaCrypto, threads); + numInputBuffers, numOutputBuffers, initialInputBufferSize, cryptoConfig, threads); this.decoder = decoder; TraceUtil.endSection(); return decoder; diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index 06d8020a2d..78b9c96e37 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -21,11 +21,11 @@ import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; @@ -43,7 +43,7 @@ public final class VpxDecoder private static final int DECODE_ERROR = -1; private static final int DRM_ERROR = -2; - @Nullable private final ExoMediaCrypto exoMediaCrypto; + @Nullable private final CryptoConfig cryptoConfig; private final long vpxDecContext; @Nullable private ByteBuffer lastSupplementalData; @@ -56,8 +56,8 @@ public final class VpxDecoder * @param numInputBuffers The number of input buffers. * @param numOutputBuffers The number of output buffers. * @param initialInputBufferSize The initial size of each input buffer. - * @param exoMediaCrypto The {@link ExoMediaCrypto} object required for decoding encrypted - * content. Maybe null and can be ignored if decoder does not handle encrypted content. + * @param cryptoConfig The {@link CryptoConfig} object required for decoding encrypted content. + * May be null and can be ignored if decoder does not handle encrypted content. * @param threads Number of threads libvpx will use to decode. * @throws VpxDecoderException Thrown if an exception occurs when initializing the decoder. */ @@ -65,7 +65,7 @@ public final class VpxDecoder int numInputBuffers, int numOutputBuffers, int initialInputBufferSize, - @Nullable ExoMediaCrypto exoMediaCrypto, + @Nullable CryptoConfig cryptoConfig, int threads) throws VpxDecoderException { super( @@ -74,8 +74,8 @@ public final class VpxDecoder if (!VpxLibrary.isAvailable()) { throw new VpxDecoderException("Failed to load decoder native libraries."); } - this.exoMediaCrypto = exoMediaCrypto; - if (exoMediaCrypto != null && !VpxLibrary.vpxIsSecureDecodeSupported()) { + this.cryptoConfig = cryptoConfig; + if (cryptoConfig != null && !VpxLibrary.vpxIsSecureDecodeSupported()) { throw new VpxDecoderException("Vpx decoder does not support secure decode."); } vpxDecContext = @@ -134,7 +134,7 @@ public final class VpxDecoder vpxDecContext, inputData, inputSize, - exoMediaCrypto, + cryptoConfig, cryptoInfo.mode, Assertions.checkNotNull(cryptoInfo.key), Assertions.checkNotNull(cryptoInfo.iv), @@ -215,7 +215,7 @@ public final class VpxDecoder long context, ByteBuffer encoded, int length, - @Nullable ExoMediaCrypto mediaCrypto, + @Nullable CryptoConfig mediaCrypto, int inputMode, byte[] key, byte[] iv, diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java index 8325265685..ebaa16fa73 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxLibrary.java @@ -16,10 +16,9 @@ package com.google.android.exoplayer2.ext.vp9; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.LibraryLoader; -import com.google.android.exoplayer2.util.Util; /** Configures and queries the underlying native library. */ public final class VpxLibrary { @@ -29,7 +28,7 @@ public final class VpxLibrary { } private static final LibraryLoader LOADER = new LibraryLoader("vpx", "vpxV2JNI"); - @Nullable private static Class exoMediaCryptoType; + @C.CryptoType private static int cryptoType = C.CRYPTO_TYPE_UNSUPPORTED; private VpxLibrary() {} @@ -38,14 +37,14 @@ public final class VpxLibrary { * it must do so before calling any other method defined by this class, and before instantiating a * {@link LibvpxVideoRenderer} instance. * - * @param exoMediaCryptoType The {@link ExoMediaCrypto} type required for decoding protected - * content. + * @param cryptoType The {@link C.CryptoType} for which the decoder library supports decrypting + * protected content, or {@link C#CRYPTO_TYPE_UNSUPPORTED} if the library does not support + * decryption. * @param libraries The names of the Vpx native libraries. */ - public static void setLibraries( - Class exoMediaCryptoType, String... libraries) { + public static void setLibraries(@C.CryptoType int cryptoType, String... libraries) { + VpxLibrary.cryptoType = cryptoType; LOADER.setLibraries(libraries); - VpxLibrary.exoMediaCryptoType = exoMediaCryptoType; } /** Returns whether the underlying library is available, loading it if necessary. */ @@ -75,13 +74,10 @@ public final class VpxLibrary { return indexHbd >= 0; } - /** - * Returns whether the given {@link ExoMediaCrypto} type matches the one required for decoding - * protected content. - */ - public static boolean matchesExpectedExoMediaCryptoType( - Class exoMediaCryptoType) { - return Util.areEqual(VpxLibrary.exoMediaCryptoType, exoMediaCryptoType); + /** Returns whether the library supports the given {@link C.CryptoType}. */ + public static boolean supportsCryptoType(@C.CryptoType int cryptoType) { + return cryptoType == C.CRYPTO_TYPE_NONE + || (cryptoType != C.CRYPTO_TYPE_UNSUPPORTED && cryptoType == VpxLibrary.cryptoType); } private static native String vpxGetVersion(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 5c7cdca992..35c61faf81 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -20,6 +20,7 @@ import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioManager; import android.media.MediaCodec; +import android.media.MediaCrypto; import android.media.MediaFormat; import android.view.Surface; import androidx.annotation.IntDef; @@ -116,6 +117,33 @@ public final class C { /** The name of the sans-serif font family. */ public static final String SANS_SERIF_NAME = "sans-serif"; + /** + * Types of crypto implementation. May be one of {@link #CRYPTO_TYPE_NONE}, {@link + * #CRYPTO_TYPE_UNSUPPORTED} or {@link #CRYPTO_TYPE_FRAMEWORK}. May also be an app-defined value + * (see {@link #CRYPTO_TYPE_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + open = true, + value = { + CRYPTO_TYPE_UNSUPPORTED, + CRYPTO_TYPE_NONE, + CRYPTO_TYPE_FRAMEWORK, + }) + public @interface CryptoType {} + /** No crypto. */ + public static final int CRYPTO_TYPE_NONE = 0; + /** An unsupported crypto type. */ + public static final int CRYPTO_TYPE_UNSUPPORTED = 1; + /** Framework crypto in which a {@link MediaCodec} is configured with a {@link MediaCrypto}. */ + public static final int CRYPTO_TYPE_FRAMEWORK = 2; + /** + * Applications or extensions may define custom {@code CRYPTO_TYPE_*} constants greater than or + * equal to this value. + */ + public static final int CRYPTO_TYPE_CUSTOM_BASE = 10000; + /** * Crypto modes for a codec. One of {@link #CRYPTO_MODE_UNENCRYPTED}, {@link #CRYPTO_MODE_AES_CTR} * or {@link #CRYPTO_MODE_AES_CBC}. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index 6fcc34b11f..18f2c5b0b8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -19,8 +19,6 @@ import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.drm.DrmInitData; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; -import com.google.android.exoplayer2.drm.UnsupportedMediaCrypto; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.MimeTypes; @@ -174,7 +172,7 @@ public final class Format implements Bundleable { // Provided by the source. - @Nullable private Class exoMediaCryptoType; + @C.CryptoType private int cryptoType; /** Creates a new instance with default values. */ public Builder() { @@ -195,6 +193,8 @@ public final class Format implements Bundleable { pcmEncoding = NO_VALUE; // Text specific. accessibilityChannel = NO_VALUE; + // Provided by the source. + cryptoType = C.CRYPTO_TYPE_NONE; } /** @@ -238,7 +238,7 @@ public final class Format implements Bundleable { // Text specific. this.accessibilityChannel = format.accessibilityChannel; // Provided by the source. - this.exoMediaCryptoType = format.exoMediaCryptoType; + this.cryptoType = format.cryptoType; } /** @@ -585,14 +585,13 @@ public final class Format implements Bundleable { // Provided by source. /** - * Sets {@link Format#exoMediaCryptoType}. The default value is {@code null}. + * Sets {@link Format#cryptoType}. The default value is {@link C#CRYPTO_TYPE_NONE}. * - * @param exoMediaCryptoType The {@link Format#exoMediaCryptoType}. + * @param cryptoType The {@link C.CryptoType}. * @return The builder. */ - public Builder setExoMediaCryptoType( - @Nullable Class exoMediaCryptoType) { - this.exoMediaCryptoType = exoMediaCryptoType; + public Builder setCryptoType(@C.CryptoType int cryptoType) { + this.cryptoType = cryptoType; return this; } @@ -756,11 +755,12 @@ public final class Format implements Bundleable { // Provided by source. /** - * The type of {@link ExoMediaCrypto} that will be associated with the content this format - * describes, or {@code null} if the content is not encrypted. Cannot be null if {@link - * #drmInitData} is non-null. + * The type of crypto that must be used to decode samples associated with this format, or {@link + * C#CRYPTO_TYPE_NONE} if the content is not encrypted. Cannot be {@link C#CRYPTO_TYPE_NONE} if + * {@link #drmInitData} is non-null, but may be {@link C#CRYPTO_TYPE_UNSUPPORTED} to indicate that + * the samples are encrypted using an unsupported crypto type. */ - @Nullable public final Class exoMediaCryptoType; + @C.CryptoType public final int cryptoType; // Lazily initialized hashcode. private int hashCode; @@ -964,11 +964,11 @@ public final class Format implements Bundleable { // Text specific. accessibilityChannel = builder.accessibilityChannel; // Provided by source. - if (builder.exoMediaCryptoType == null && drmInitData != null) { - // Encrypted content must always have a non-null exoMediaCryptoType. - exoMediaCryptoType = UnsupportedMediaCrypto.class; + if (builder.cryptoType == C.CRYPTO_TYPE_NONE && drmInitData != null) { + // Encrypted content cannot use CRYPTO_TYPE_NONE. + cryptoType = C.CRYPTO_TYPE_UNSUPPORTED; } else { - exoMediaCryptoType = builder.exoMediaCryptoType; + cryptoType = builder.cryptoType; } } @@ -1113,10 +1113,9 @@ public final class Format implements Bundleable { return buildUpon().setWidth(width).setHeight(height).build(); } - /** Returns a copy of this format with the specified {@link #exoMediaCryptoType}. */ - public Format copyWithExoMediaCryptoType( - @Nullable Class exoMediaCryptoType) { - return buildUpon().setExoMediaCryptoType(exoMediaCryptoType).build(); + /** Returns a copy of this format with the specified {@link #cryptoType}. */ + public Format copyWithCryptoType(@C.CryptoType int cryptoType) { + return buildUpon().setCryptoType(cryptoType).build(); } /** @@ -1197,7 +1196,7 @@ public final class Format implements Bundleable { // Text specific. result = 31 * result + accessibilityChannel; // Provided by the source. - result = 31 * result + (exoMediaCryptoType == null ? 0 : exoMediaCryptoType.hashCode()); + result = 31 * result + cryptoType; hashCode = result; } return hashCode; @@ -1232,9 +1231,9 @@ public final class Format implements Bundleable { && encoderDelay == other.encoderDelay && encoderPadding == other.encoderPadding && accessibilityChannel == other.accessibilityChannel + && cryptoType == other.cryptoType && Float.compare(frameRate, other.frameRate) == 0 && Float.compare(pixelWidthHeightRatio, other.pixelWidthHeightRatio) == 0 - && Util.areEqual(exoMediaCryptoType, other.exoMediaCryptoType) && Util.areEqual(id, other.id) && Util.areEqual(label, other.label) && Util.areEqual(codecs, other.codecs) @@ -1360,6 +1359,7 @@ public final class Format implements Bundleable { FIELD_ENCODER_DELAY, FIELD_ENCODER_PADDING, FIELD_ACCESSIBILITY_CHANNEL, + FIELD_CRYPTO_TYPE, }) private @interface FieldNumber {} @@ -1392,13 +1392,8 @@ public final class Format implements Bundleable { private static final int FIELD_ENCODER_DELAY = 26; private static final int FIELD_ENCODER_PADDING = 27; private static final int FIELD_ACCESSIBILITY_CHANNEL = 28; + private static final int FIELD_CRYPTO_TYPE = 29; - /** - * {@inheritDoc} - * - *

    Omits the {@link #exoMediaCryptoType} field. The {@link #exoMediaCryptoType} of an instance - * restored by {@link #CREATOR} will always be {@link UnsupportedMediaCrypto}. - */ @Override public Bundle toBundle() { Bundle bundle = new Bundle(); @@ -1443,6 +1438,8 @@ public final class Format implements Bundleable { bundle.putInt(keyForField(FIELD_ENCODER_PADDING), encoderPadding); // Text specific. bundle.putInt(keyForField(FIELD_ACCESSIBILITY_CHANNEL), accessibilityChannel); + // Source specific. + bundle.putInt(keyForField(FIELD_CRYPTO_TYPE), cryptoType); return bundle; } @@ -1512,7 +1509,9 @@ public final class Format implements Bundleable { bundle.getInt(keyForField(FIELD_ENCODER_PADDING), DEFAULT.encoderPadding)) // Text specific. .setAccessibilityChannel( - bundle.getInt(keyForField(FIELD_ACCESSIBILITY_CHANNEL), DEFAULT.accessibilityChannel)); + bundle.getInt(keyForField(FIELD_ACCESSIBILITY_CHANNEL), DEFAULT.accessibilityChannel)) + // Source specific. + .setCryptoType(bundle.getInt(keyForField(FIELD_CRYPTO_TYPE), DEFAULT.cryptoType)); return builder.build(); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/drm/ExoMediaCrypto.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java similarity index 70% rename from library/common/src/main/java/com/google/android/exoplayer2/drm/ExoMediaCrypto.java rename to library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java index 27730c14b3..bc592b26a1 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/drm/ExoMediaCrypto.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java @@ -13,7 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.drm; +package com.google.android.exoplayer2.decoder; -/** Enables decoding of encrypted data using keys in a DRM session. */ -public interface ExoMediaCrypto {} +import com.google.android.exoplayer2.C; + +/** + * Configuration for a decoder to allow it to decode encrypted media data. The configuration is + * {@link C.CryptoType} specific. + */ +public interface CryptoConfig {} diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java index b4e04afe42..f4c57f061c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java @@ -21,7 +21,11 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; -/** Compatibility wrapper for {@link android.media.MediaCodec.CryptoInfo}. */ +/** + * Metadata describing the structure of an encrypted input sample. + * + *

    This class is a compatibility wrapper for {@link android.media.MediaCodec.CryptoInfo}. + */ public final class CryptoInfo { /** diff --git a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java index 87fc725029..fbc40afd12 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java @@ -22,8 +22,6 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.drm.DrmInitData; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; -import com.google.android.exoplayer2.drm.UnsupportedMediaCrypto; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.id3.TextInformationFrame; import com.google.android.exoplayer2.util.MimeTypes; @@ -45,15 +43,11 @@ public final class FormatTest { } @Test - public void roundTripViaBundle_ofParameters_yieldsEqualInstanceExceptExoMediaCryptoType() { + public void roundTripViaBundle_ofParameters_yieldsEqualInstance() { Format formatToBundle = createTestFormat(); - Format formatFromBundle = Format.CREATOR.fromBundle(formatToBundle.toBundle()); - assertThat(formatFromBundle.exoMediaCryptoType).isEqualTo(UnsupportedMediaCrypto.class); - assertThat(formatFromBundle) - .isEqualTo( - formatToBundle.buildUpon().setExoMediaCryptoType(UnsupportedMediaCrypto.class).build()); + assertThat(formatFromBundle).isEqualTo(formatToBundle); } private static Format createTestFormat() { @@ -93,7 +87,7 @@ public final class FormatTest { .setPeakBitrate(2048) .setCodecs("codec") .setMetadata(metadata) - .setContainerMimeType(MimeTypes.VIDEO_MP4) + .setContainerMimeType(VIDEO_MP4) .setSampleMimeType(MimeTypes.VIDEO_H264) .setMaxInputSize(5000) .setInitializationData(initializationData) @@ -113,7 +107,7 @@ public final class FormatTest { .setEncoderDelay(1001) .setEncoderPadding(1002) .setAccessibilityChannel(2) - .setExoMediaCryptoType(ExoMediaCrypto.class) + .setCryptoType(C.CRYPTO_TYPE_CUSTOM_BASE) .build(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index 3c8d25e70f..e5b306aff1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.Decoder; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderException; @@ -46,7 +47,6 @@ import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -330,12 +330,12 @@ public abstract class DecoderAudioRenderer< * Creates a decoder for the given format. * * @param format The format for which a decoder is required. - * @param mediaCrypto The {@link ExoMediaCrypto} object required for decoding encrypted content. - * Maybe null and can be ignored if decoder does not handle encrypted content. + * @param cryptoConfig The {@link CryptoConfig} object required for decoding encrypted content. + * May be null and can be ignored if decoder does not handle encrypted content. * @return The decoder. * @throws DecoderException If an error occurred creating a suitable decoder. */ - protected abstract T createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) + protected abstract T createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws DecoderException; /** @@ -603,10 +603,10 @@ public abstract class DecoderAudioRenderer< setDecoderDrmSession(sourceDrmSession); - ExoMediaCrypto mediaCrypto = null; + CryptoConfig cryptoConfig = null; if (decoderDrmSession != null) { - mediaCrypto = decoderDrmSession.getMediaCrypto(); - if (mediaCrypto == null) { + cryptoConfig = decoderDrmSession.getCryptoConfig(); + if (cryptoConfig == null) { DrmSessionException drmError = decoderDrmSession.getError(); if (drmError != null) { // Continue for now. We may be able to avoid failure if a new input format causes the @@ -621,7 +621,7 @@ public abstract class DecoderAudioRenderer< try { long codecInitializingTimestamp = SystemClock.elapsedRealtime(); TraceUtil.beginSection("createAudioDecoder"); - decoder = createDecoder(inputFormat, mediaCrypto); + decoder = createDecoder(inputFormat, cryptoConfig); TraceUtil.endSection(); long codecInitializedTimestamp = SystemClock.elapsedRealtime(); eventDispatcher.decoderInitialized( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index db00fd1121..b3de393abb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -272,7 +272,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } @TunnelingSupport int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; - boolean formatHasDrm = format.exoMediaCryptoType != null; + boolean formatHasDrm = format.cryptoType != C.CRYPTO_TYPE_NONE; boolean supportsFormatDrm = supportsFormatDrm(format); // In direct mode, if the format has DRM then we need to use a decoder that only decrypts. // Else we don't don't need a decoder at all. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index 47483a027d..5e5bce8340 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -31,6 +31,7 @@ import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest; import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest; @@ -141,7 +142,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private int referenceCount; @Nullable private HandlerThread requestHandlerThread; @Nullable private RequestHandler requestHandler; - @Nullable private ExoMediaCrypto mediaCrypto; + @Nullable private CryptoConfig cryptoConfig; @Nullable private DrmSessionException lastException; @Nullable private byte[] sessionId; private byte @MonotonicNonNull [] offlineLicenseKeySetId; @@ -260,7 +261,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public final @Nullable DrmSessionException getError() { + @Nullable + public final DrmSessionException getError() { return state == STATE_ERROR ? lastException : null; } @@ -270,8 +272,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public final @Nullable ExoMediaCrypto getMediaCrypto() { - return mediaCrypto; + @Nullable + public final CryptoConfig getCryptoConfig() { + return cryptoConfig; } @Override @@ -326,7 +329,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; requestHandler = null; Util.castNonNull(requestHandlerThread).quit(); requestHandlerThread = null; - mediaCrypto = null; + cryptoConfig = null; lastException = null; currentKeyRequest = null; currentProvisionRequest = null; @@ -361,7 +364,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; try { sessionId = mediaDrm.openSession(); - mediaCrypto = mediaDrm.createMediaCrypto(sessionId); + cryptoConfig = mediaDrm.createCryptoConfig(sessionId); state = STATE_OPENED; // Capture state into a local so a consistent value is seen by the lambda. int localState = state; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index 774e91eee8..1ea5fed05e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -579,19 +579,16 @@ public class DefaultDrmSessionManager implements DrmSessionManager { } @Override - @Nullable - public Class getExoMediaCryptoType(Format format) { - Class exoMediaCryptoType = - checkNotNull(exoMediaDrm).getExoMediaCryptoType(); + @C.CryptoType + public int getCryptoType(Format format) { + @C.CryptoType int cryptoType = checkNotNull(exoMediaDrm).getCryptoType(); if (format.drmInitData == null) { int trackType = MimeTypes.getTrackType(format.sampleMimeType); return Util.linearSearch(useDrmSessionsForClearContentTrackTypes, trackType) != C.INDEX_UNSET - ? exoMediaCryptoType - : null; + ? cryptoType + : C.CRYPTO_TYPE_NONE; } else { - return canAcquireSession(format.drmInitData) - ? exoMediaCryptoType - : UnsupportedMediaCrypto.class; + return canAcquireSession(format.drmInitData) ? cryptoType : C.CRYPTO_TYPE_UNSUPPORTED; } } @@ -602,12 +599,12 @@ public class DefaultDrmSessionManager implements DrmSessionManager { int trackType, boolean shouldReleasePreacquiredSessionsBeforeRetrying) { ExoMediaDrm exoMediaDrm = checkNotNull(this.exoMediaDrm); boolean avoidPlaceholderDrmSessions = - FrameworkMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType()) - && FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC; + exoMediaDrm.getCryptoType() == C.CRYPTO_TYPE_FRAMEWORK + && FrameworkCryptoConfig.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC; // Avoid attaching a session to sparse formats. if (avoidPlaceholderDrmSessions || Util.linearSearch(useDrmSessionsForClearContentTrackTypes, trackType) == C.INDEX_UNSET - || UnsupportedMediaCrypto.class.equals(exoMediaDrm.getExoMediaCryptoType())) { + || exoMediaDrm.getCryptoType() == C.CRYPTO_TYPE_UNSUPPORTED) { return null; } if (placeholderDrmSession == null) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java index 7f07fd9c66..7582b0c848 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSession.java @@ -19,6 +19,7 @@ import android.media.MediaDrm; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.decoder.CryptoConfig; import java.io.IOException; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -109,11 +110,11 @@ public interface DrmSession { UUID getSchemeUuid(); /** - * Returns an {@link ExoMediaCrypto} for the open session, or null if called before the session - * has been opened or after it's been released. + * Returns a {@link CryptoConfig} for the open session, or null if called before the session has + * been opened or after it's been released. */ @Nullable - ExoMediaCrypto getMediaCrypto(); + CryptoConfig getCryptoConfig(); /** * Returns a map describing the key status for the session, or null if called before the session diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java index b056f6ab0d..59f9a37982 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmSessionManager.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.drm; import android.os.Looper; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackException; @@ -61,9 +62,9 @@ public interface DrmSessionManager { } @Override - @Nullable - public Class getExoMediaCryptoType(Format format) { - return format.drmInitData != null ? UnsupportedMediaCrypto.class : null; + @C.CryptoType + public int getCryptoType(Format format) { + return format.drmInitData != null ? C.CRYPTO_TYPE_UNSUPPORTED : C.CRYPTO_TYPE_NONE; } }; @@ -171,19 +172,18 @@ public interface DrmSessionManager { Format format); /** - * Returns the {@link ExoMediaCrypto} type associated to sessions acquired for the given {@link - * Format}. Returns the {@link UnsupportedMediaCrypto} type if this DRM session manager does not - * support any of the DRM schemes defined in the given {@link Format}. Returns null if {@link - * Format#drmInitData} is null and {@link #acquireSession} would return null for the given {@link - * Format}. + * Returns the {@link C.CryptoType} that the DRM session manager will use for a given {@link + * Format}. Returns {@link C#CRYPTO_TYPE_UNSUPPORTED} if the manager does not support any of the + * DRM schemes defined in the {@link Format}. Returns {@link C#CRYPTO_TYPE_NONE} if {@link + * Format#drmInitData} is null and {@link #acquireSession} will return {@code null} for the given + * {@link Format}. * - * @param format The {@link Format} for which to return the {@link ExoMediaCrypto} type. - * @return The {@link ExoMediaCrypto} type associated to sessions acquired using the given {@link - * Format}, or {@link UnsupportedMediaCrypto} if this DRM session manager does not support any - * of the DRM schemes defined in the given {@link Format}. May be null if {@link - * Format#drmInitData} is null and {@link #acquireSession} would return null for the given - * {@link Format}. + * @param format The {@link Format}. + * @return The {@link C.CryptoType} that the manager will use, or @link C#CRYPTO_TYPE_UNSUPPORTED} + * if the manager does not support any of the DRM schemes defined in the {@link Format}. Will + * be {@link C#CRYPTO_TYPE_NONE} if {@link Format#drmInitData} is null and {@link + * #acquireSession} will return null for the given {@link Format}. */ - @Nullable - Class getExoMediaCryptoType(Format format); + @C.CryptoType + int getCryptoType(Format format); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java index b5c7692ab8..796ea15169 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DummyExoMediaDrm.java @@ -19,6 +19,8 @@ import android.media.MediaDrmException; import android.os.PersistableBundle; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.util.Util; import java.util.HashMap; import java.util.List; @@ -142,13 +144,14 @@ public final class DummyExoMediaDrm implements ExoMediaDrm { } @Override - public ExoMediaCrypto createMediaCrypto(byte[] sessionId) { + public CryptoConfig createCryptoConfig(byte[] sessionId) { // Should not be invoked. No session should exist. throw new IllegalStateException(); } @Override - public Class getExoMediaCryptoType() { - return UnsupportedMediaCrypto.class; + @C.CryptoType + public int getCryptoType() { + return C.CRYPTO_TYPE_UNSUPPORTED; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java index 51cb019432..239a62327d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ErrorStateDrmSession.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.drm; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.util.Assertions; import java.util.Map; import java.util.UUID; @@ -53,7 +54,7 @@ public final class ErrorStateDrmSession implements DrmSession { @Override @Nullable - public ExoMediaCrypto getMediaCrypto() { + public CryptoConfig getCryptoConfig() { return null; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java index 583fcf979a..6d6a0a821a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/ExoMediaDrm.java @@ -25,6 +25,8 @@ import android.os.Handler; import android.os.PersistableBundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -538,14 +540,19 @@ public interface ExoMediaDrm { void setPropertyByteArray(String propertyName, byte[] value); /** - * Creates an {@link ExoMediaCrypto} for a given session. + * Creates a {@link CryptoConfig} that can be passed to a compatible decoder to allow decryption + * of protected content using the specified session. * * @param sessionId The ID of the session. - * @return An {@link ExoMediaCrypto} for the given session. - * @throws MediaCryptoException If an {@link ExoMediaCrypto} could not be created. + * @return A {@link CryptoConfig} for the given session. + * @throws MediaCryptoException If a {@link CryptoConfig} could not be created. */ - ExoMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException; + CryptoConfig createCryptoConfig(byte[] sessionId) throws MediaCryptoException; - /** Returns the {@link ExoMediaCrypto} type created by {@link #createMediaCrypto(byte[])}. */ - Class getExoMediaCryptoType(); + /** + * Returns the {@link C.CryptoType type} of {@link CryptoConfig} instances returned by {@link + * #createCryptoConfig}. + */ + @C.CryptoType + int getCryptoType(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaCrypto.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkCryptoConfig.java similarity index 81% rename from library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaCrypto.java rename to library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkCryptoConfig.java index c139b522e9..4d824bec22 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaCrypto.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkCryptoConfig.java @@ -15,15 +15,19 @@ */ package com.google.android.exoplayer2.drm; +import android.media.MediaCodec; import android.media.MediaCrypto; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.util.Util; import java.util.UUID; /** - * An {@link ExoMediaCrypto} implementation that contains the necessary information to build or - * update a framework {@link MediaCrypto}. + * A {@link CryptoConfig} for {@link C#CRYPTO_TYPE_FRAMEWORK}. Contains the necessary information to + * build or update a framework {@link MediaCrypto} that can be used to configure a {@link + * MediaCodec}. */ -public final class FrameworkMediaCrypto implements ExoMediaCrypto { +public final class FrameworkCryptoConfig implements CryptoConfig { /** * Whether the device needs keys to have been loaded into the {@link DrmSession} before codec @@ -50,7 +54,7 @@ public final class FrameworkMediaCrypto implements ExoMediaCrypto { * @param forceAllowInsecureDecoderComponents Whether to allow use of insecure decoder components * even if the underlying platform says otherwise. */ - public FrameworkMediaCrypto( + public FrameworkCryptoConfig( UUID uuid, byte[] sessionId, boolean forceAllowInsecureDecoderComponents) { this.uuid = uuid; this.sessionId = sessionId; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java index 8c2b1c3a62..e4ccaf1853 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java @@ -314,20 +314,21 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { } @Override - public FrameworkMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException { + public FrameworkCryptoConfig createCryptoConfig(byte[] sessionId) throws MediaCryptoException { // Work around a bug prior to Lollipop where L1 Widevine forced into L3 mode would still // indicate that it required secure video decoders [Internal ref: b/11428937]. boolean forceAllowInsecureDecoderComponents = Util.SDK_INT < 21 && C.WIDEVINE_UUID.equals(uuid) && "L3".equals(getPropertyString("securityLevel")); - return new FrameworkMediaCrypto( + return new FrameworkCryptoConfig( adjustUuid(uuid), sessionId, forceAllowInsecureDecoderComponents); } @Override - public Class getExoMediaCryptoType() { - return FrameworkMediaCrypto.class; + @C.CryptoType + public int getCryptoType() { + return C.CRYPTO_TYPE_FRAMEWORK; } private static SchemeData getSchemeData(UUID uuid, List schemeDatas) { 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 2100847c7b..ead65ded66 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 @@ -50,6 +50,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer.InsufficientCapacityException; @@ -57,8 +58,7 @@ import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.DecoderDiscardReasons; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; +import com.google.android.exoplayer2.drm.FrameworkCryptoConfig; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.SampleStream; @@ -545,8 +545,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { if (codecDrmSession != null) { if (mediaCrypto == null) { @Nullable - FrameworkMediaCrypto sessionMediaCrypto = getFrameworkMediaCrypto(codecDrmSession); - if (sessionMediaCrypto == null) { + FrameworkCryptoConfig sessionCryptoConfig = getFrameworkCryptoConfig(codecDrmSession); + if (sessionCryptoConfig == null) { @Nullable DrmSessionException drmError = codecDrmSession.getError(); if (drmError != null) { // Continue for now. We may be able to avoid failure if a new input format causes the @@ -557,17 +557,17 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } } else { try { - mediaCrypto = new MediaCrypto(sessionMediaCrypto.uuid, sessionMediaCrypto.sessionId); + mediaCrypto = new MediaCrypto(sessionCryptoConfig.uuid, sessionCryptoConfig.sessionId); } catch (MediaCryptoException e) { throw createRendererException( e, inputFormat, PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR); } mediaCryptoRequiresSecureDecoder = - !sessionMediaCrypto.forceAllowInsecureDecoderComponents + !sessionCryptoConfig.forceAllowInsecureDecoderComponents && mediaCrypto.requiresSecureDecoderComponent(mimeType); } } - if (FrameworkMediaCrypto.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC) { + if (FrameworkCryptoConfig.WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC) { @DrmSession.State int drmSessionState = codecDrmSession.getState(); if (drmSessionState == DrmSession.STATE_ERROR) { DrmSessionException drmSessionException = @@ -1074,11 +1074,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { return codecInfos; } - /** - * Configures rendering where no codec is used. Called instead of {@link - * #configureCodec(MediaCodecInfo, MediaCodecAdapter, Format, MediaCrypto, float)} when no codec - * is used to render. - */ + /** Configures rendering where no codec is used. */ private void initBypass(Format format) { disableBypass(); // In case of transition between 2 bypass formats. @@ -2047,8 +2043,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { /** Returns whether this renderer supports the given {@link Format Format's} DRM scheme. */ protected static boolean supportsFormatDrm(Format format) { - return format.exoMediaCryptoType == null - || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType); + return format.cryptoType == C.CRYPTO_TYPE_NONE || format.cryptoType == C.CRYPTO_TYPE_FRAMEWORK; } /** @@ -2088,8 +2083,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { // TODO: Add an API check once [Internal ref: b/128835874] is fixed. return true; } - @Nullable FrameworkMediaCrypto newMediaCrypto = getFrameworkMediaCrypto(newSession); - if (newMediaCrypto == null) { + @Nullable FrameworkCryptoConfig newCryptoConfig = getFrameworkCryptoConfig(newSession); + if (newCryptoConfig == null) { // We'd only expect this to happen if the CDM from which newSession is obtained needs // provisioning. This is unlikely to happen (it probably requires a switch from one DRM scheme // to another, where the new CDM hasn't been used before and needs provisioning). It would be @@ -2101,7 +2096,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } boolean requiresSecureDecoder; - if (newMediaCrypto.forceAllowInsecureDecoderComponents) { + if (newCryptoConfig.forceAllowInsecureDecoderComponents) { requiresSecureDecoder = false; } else { requiresSecureDecoder = newSession.requiresSecureDecoder(newFormat.sampleMimeType); @@ -2136,7 +2131,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { @RequiresApi(23) private void updateDrmSessionV23() throws ExoPlaybackException { try { - mediaCrypto.setMediaDrmSession(getFrameworkMediaCrypto(sourceDrmSession).sessionId); + mediaCrypto.setMediaDrmSession(getFrameworkCryptoConfig(sourceDrmSession).sessionId); } catch (MediaCryptoException e) { throw createRendererException(e, inputFormat, PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR); } @@ -2146,18 +2141,19 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } @Nullable - private FrameworkMediaCrypto getFrameworkMediaCrypto(DrmSession drmSession) + private FrameworkCryptoConfig getFrameworkCryptoConfig(DrmSession drmSession) throws ExoPlaybackException { - @Nullable ExoMediaCrypto mediaCrypto = drmSession.getMediaCrypto(); - if (mediaCrypto != null && !(mediaCrypto instanceof FrameworkMediaCrypto)) { + @Nullable CryptoConfig cryptoConfig = drmSession.getCryptoConfig(); + if (cryptoConfig != null && !(cryptoConfig instanceof FrameworkCryptoConfig)) { // This should not happen if the track went through a supportsFormatDrm() check, during track // selection. throw createRendererException( - new IllegalArgumentException("Expecting FrameworkMediaCrypto but found: " + mediaCrypto), + new IllegalArgumentException( + "Expecting FrameworkCryptoConfig but found: " + cryptoConfig), inputFormat, PlaybackException.ERROR_CODE_DRM_SCHEME_UNSUPPORTED); } - return (FrameworkMediaCrypto) mediaCrypto; + return (FrameworkCryptoConfig) cryptoConfig; } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java index afb32ee211..491bb59939 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java @@ -93,7 +93,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { public int supportsFormat(Format format) { if (decoderFactory.supportsFormat(format)) { return RendererCapabilities.create( - format.exoMediaCryptoType == null ? C.FORMAT_HANDLED : C.FORMAT_UNSUPPORTED_DRM); + format.cryptoType == C.CRYPTO_TYPE_NONE ? C.FORMAT_HANDLED : C.FORMAT_UNSUPPORTED_DRM); } else { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index 2ffe134fa4..654b2212ec 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -783,9 +783,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; trackFormat = trackFormat.buildUpon().setAverageBitrate(icyHeaders.bitrate).build(); } } - trackFormat = - trackFormat.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(trackFormat)); + trackFormat = trackFormat.copyWithCryptoType(drmSessionManager.getCryptoType(trackFormat)); trackArray[i] = new TrackGroup(trackFormat); } trackState = new TrackState(new TrackGroupArray(trackArray), trackIsAudioVideoFlags); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index 7b5c6a35f7..4207fcfbae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -899,8 +899,7 @@ public class SampleQueue implements TrackOutput { outputFormatHolder.format = drmSessionManager != null - ? newFormat.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(newFormat)) + ? newFormat.copyWithCryptoType(drmSessionManager.getCryptoType(newFormat)) : newFormat; outputFormatHolder.drmSession = currentDrmSession; if (drmSessionManager == null) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java index 5a27d5bb3a..71cb716ca8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java @@ -134,7 +134,7 @@ public final class TextRenderer extends BaseRenderer implements Callback { public int supportsFormat(Format format) { if (decoderFactory.supportsFormat(format)) { return RendererCapabilities.create( - format.exoMediaCryptoType == null ? C.FORMAT_HANDLED : C.FORMAT_UNSUPPORTED_DRM); + format.cryptoType == C.CRYPTO_TYPE_NONE ? C.FORMAT_HANDLED : C.FORMAT_UNSUPPORTED_DRM); } else if (MimeTypes.isText(format.sampleMimeType)) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE); } else { 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 6628330338..30630bf878 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 @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlayerMessage.Target; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.Decoder; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderException; @@ -43,7 +44,6 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -529,14 +529,14 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { * Creates a decoder for the given format. * * @param format The format for which a decoder is required. - * @param mediaCrypto The {@link ExoMediaCrypto} object required for decoding encrypted content. + * @param cryptoConfig The {@link CryptoConfig} object required for decoding encrypted content. * May be null and can be ignored if decoder does not handle encrypted content. * @return The decoder. * @throws DecoderException If an error occurred creating a suitable decoder. */ protected abstract Decoder< VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> - createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) throws DecoderException; + createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws DecoderException; /** * Renders the specified output buffer. @@ -664,10 +664,10 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { setDecoderDrmSession(sourceDrmSession); - ExoMediaCrypto mediaCrypto = null; + CryptoConfig cryptoConfig = null; if (decoderDrmSession != null) { - mediaCrypto = decoderDrmSession.getMediaCrypto(); - if (mediaCrypto == null) { + cryptoConfig = decoderDrmSession.getCryptoConfig(); + if (cryptoConfig == null) { DrmSessionException drmError = decoderDrmSession.getError(); if (drmError != null) { // Continue for now. We may be able to avoid failure if a new input format causes the @@ -681,7 +681,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { try { long decoderInitializingTimestamp = SystemClock.elapsedRealtime(); - decoder = createDecoder(inputFormat, mediaCrypto); + decoder = createDecoder(inputFormat, cryptoConfig); setDecoderOutputMode(outputMode); long decoderInitializedTimestamp = SystemClock.elapsedRealtime(); eventDispatcher.decoderInitialized( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java index 7a6fe531af..23161aef05 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java @@ -30,13 +30,13 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.upstream.DefaultAllocator; import com.google.android.exoplayer2.util.MimeTypes; @@ -75,7 +75,7 @@ public class DecoderAudioRendererTest { } @Override - protected FakeDecoder createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) { + protected FakeDecoder createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) { return new FakeDecoder(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java index 0b812ba14f..132be88688 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/SampleQueueTest.java @@ -41,8 +41,8 @@ import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.extractor.TrackOutput; +import com.google.android.exoplayer2.testutil.FakeCryptoConfig; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DefaultAllocator; @@ -73,7 +73,7 @@ public final class SampleQueueTest { private static final Format FORMAT_ENCRYPTED = new Format.Builder().setId(/* id= */ "encrypted").setDrmInitData(new DrmInitData()).build(); private static final Format FORMAT_ENCRYPTED_WITH_EXO_MEDIA_CRYPTO_TYPE = - FORMAT_ENCRYPTED.copyWithExoMediaCryptoType(MockExoMediaCrypto.class); + FORMAT_ENCRYPTED.copyWithCryptoType(FakeCryptoConfig.TYPE); private static final byte[] DATA = TestUtil.buildTestData(ALLOCATION_SIZE * 10); /* @@ -1761,8 +1761,6 @@ public final class SampleQueueTest { return format.buildUpon().setLabel(label).build(); } - private static final class MockExoMediaCrypto implements ExoMediaCrypto {} - private static final class MockDrmSessionManager implements DrmSessionManager { private final DrmSession mockDrmSession; @@ -1772,8 +1770,8 @@ public final class SampleQueueTest { this.mockDrmSession = mockDrmSession; } - @Nullable @Override + @Nullable public DrmSession acquireSession( Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, @@ -1781,12 +1779,12 @@ public final class SampleQueueTest { return format.drmInitData != null ? mockDrmSession : mockPlaceholderDrmSession; } - @Nullable @Override - public Class getExoMediaCryptoType(Format format) { + @C.CryptoType + public int getCryptoType(Format format) { return mockPlaceholderDrmSession != null || format.drmInitData != null - ? MockExoMediaCrypto.class - : null; + ? FakeCryptoConfig.TYPE + : C.CRYPTO_TYPE_NONE; } } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java index cf37eed42f..fcaf93bd7e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java @@ -34,12 +34,12 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.upstream.DefaultAllocator; import com.google.android.exoplayer2.util.MimeTypes; @@ -128,7 +128,7 @@ public final class DecoderVideoRendererTest { VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> - createDecoder(Format format, @Nullable ExoMediaCrypto mediaCrypto) { + createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) { return new SimpleDecoder< VideoDecoderInputBuffer, VideoDecoderOutputBuffer, DecoderException>( new VideoDecoderInputBuffer[10], new VideoDecoderOutputBuffer[10]) { diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index 38205a4621..058fca8aa8 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -667,8 +667,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; Format[] formats = new Format[representations.size()]; for (int j = 0; j < formats.length; j++) { Format format = representations.get(j).format; - formats[j] = - format.copyWithExoMediaCryptoType(drmSessionManager.getExoMediaCryptoType(format)); + formats[j] = format.copyWithCryptoType(drmSessionManager.getCryptoType(format)); } AdaptationSet firstAdaptationSet = adaptationSets.get(adaptationSetIndices[0]); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 05f7a7f8cc..afe6cdd34f 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -1411,8 +1411,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; Format[] exposedFormats = new Format[trackGroup.length]; for (int j = 0; j < trackGroup.length; j++) { Format format = trackGroup.getFormat(j); - exposedFormats[j] = - format.copyWithExoMediaCryptoType(drmSessionManager.getExoMediaCryptoType(format)); + exposedFormats[j] = format.copyWithCryptoType(drmSessionManager.getCryptoType(format)); } trackGroups[i] = new TrackGroup(exposedFormats); } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java index ae96b941d2..cc3b17cf99 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java @@ -261,8 +261,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; for (int j = 0; j < manifestFormats.length; j++) { Format manifestFormat = manifestFormats[j]; exposedFormats[j] = - manifestFormat.copyWithExoMediaCryptoType( - drmSessionManager.getExoMediaCryptoType(manifestFormat)); + manifestFormat.copyWithCryptoType(drmSessionManager.getCryptoType(manifestFormat)); } trackGroups[i] = new TrackGroup(exposedFormats); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/drm/UnsupportedMediaCrypto.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeCryptoConfig.java similarity index 61% rename from library/common/src/main/java/com/google/android/exoplayer2/drm/UnsupportedMediaCrypto.java rename to testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeCryptoConfig.java index e8e6d6074b..dfcbee3484 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/drm/UnsupportedMediaCrypto.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeCryptoConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Android Open Source Project + * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.drm; +package com.google.android.exoplayer2.testutil; -/** {@link ExoMediaCrypto} type that cannot be used to handle any type of protected content. */ -public final class UnsupportedMediaCrypto implements ExoMediaCrypto {} +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; + +/** Fake {@link CryptoConfig}. */ +public final class FakeCryptoConfig implements CryptoConfig { + public static final int TYPE = C.CRYPTO_TYPE_CUSTOM_BASE; +} diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index 0f8d3dc348..fef3f67b10 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -26,8 +26,9 @@ import android.os.Parcelable; import android.os.PersistableBundle; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.drm.DrmInitData; -import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaDrm; import com.google.android.exoplayer2.drm.MediaDrmCallback; import com.google.android.exoplayer2.drm.MediaDrmCallbackException; @@ -334,15 +335,16 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { } @Override - public ExoMediaCrypto createMediaCrypto(byte[] sessionId) throws MediaCryptoException { + public CryptoConfig createCryptoConfig(byte[] sessionId) throws MediaCryptoException { Assertions.checkState(referenceCount > 0); Assertions.checkState(openSessionIds.contains(toByteList(sessionId))); - return new FakeExoMediaCrypto(); + return new FakeCryptoConfig(); } @Override - public Class getExoMediaCryptoType() { - return FakeExoMediaCrypto.class; + @C.CryptoType + public int getCryptoType() { + return FakeCryptoConfig.TYPE; } // Methods to facilitate testing @@ -389,8 +391,6 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { return ImmutableList.copyOf(Bytes.asList(byteArray)); } - private static class FakeExoMediaCrypto implements ExoMediaCrypto {} - /** An license server implementation to interact with {@link FakeExoMediaDrm}. */ public static class LicenseServer implements MediaDrmCallback { From 061d8ee193ddb3b87594226077576319c710d76c Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 18 Aug 2021 10:54:11 +0100 Subject: [PATCH 071/441] Remove qualifier in link tag PiperOrigin-RevId: 391485174 --- .../google/android/exoplayer2/audio/TeeAudioProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java index 9ea230d38d..17eb8ed381 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java @@ -34,8 +34,8 @@ import java.nio.ByteOrder; *

    This audio processor can be inserted into the audio processor chain to access audio data * before/after particular processing steps have been applied. For example, to get audio output * after playback speed adjustment and silence skipping have been applied it is necessary to pass a - * custom {@link com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain} when - * creating the audio sink, and include this audio processor after all other audio processors. + * custom {@link DefaultAudioSink.AudioProcessorChain} when creating the audio sink, and include + * this audio processor after all other audio processors. */ public final class TeeAudioProcessor extends BaseAudioProcessor { From 2e2e5e9febd780d5455c9448b8a6a56b3875a9ec Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 18 Aug 2021 12:44:55 +0100 Subject: [PATCH 072/441] Remove the ExoPlayerImpl implementation of ExoPlayer. PiperOrigin-RevId: 391498621 --- .../android/exoplayer2/ExoPlayerImpl.java | 56 +------------------ 1 file changed, 2 insertions(+), 54 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 06e4a99571..f97544fd75 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -30,6 +30,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.TextureView; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -59,7 +60,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArraySet; /** An {@link ExoPlayer} implementation. */ -/* package */ final class ExoPlayerImpl extends BasePlayer implements ExoPlayer { +/* package */ final class ExoPlayerImpl extends BasePlayer { private static final String TAG = "ExoPlayerImpl"; @@ -263,41 +264,14 @@ import java.util.concurrent.CopyOnWriteArraySet; internalPlayer.experimentalSetForegroundModeTimeoutMs(timeoutMs); } - @Override public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { internalPlayer.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled); } - @Override public boolean experimentalIsSleepingForOffload() { return playbackInfo.sleepingForOffload; } - @Override - @Nullable - public AudioComponent getAudioComponent() { - return null; - } - - @Override - @Nullable - public VideoComponent getVideoComponent() { - return null; - } - - @Override - @Nullable - public TextComponent getTextComponent() { - return null; - } - - @Override - @Nullable - public DeviceComponent getDeviceComponent() { - return null; - } - - @Override public Looper getPlaybackLooper() { return internalPlayer.getPlaybackLooper(); } @@ -307,7 +281,6 @@ import java.util.concurrent.CopyOnWriteArraySet; return applicationLooper; } - @Override public Clock getClock() { return clock; } @@ -334,12 +307,10 @@ import java.util.concurrent.CopyOnWriteArraySet; listeners.remove(listener); } - @Override public void addAudioOffloadListener(AudioOffloadListener listener) { audioOffloadListeners.add(listener); } - @Override public void removeAudioOffloadListener(AudioOffloadListener listener) { audioOffloadListeners.remove(listener); } @@ -369,7 +340,6 @@ import java.util.concurrent.CopyOnWriteArraySet; /** @deprecated Use {@link #prepare()} instead. */ @Deprecated - @Override public void retry() { prepare(); } @@ -404,7 +374,6 @@ import java.util.concurrent.CopyOnWriteArraySet; * @deprecated Use {@link #setMediaSource(MediaSource)} and {@link ExoPlayer#prepare()} instead. */ @Deprecated - @Override public void prepare(MediaSource mediaSource) { setMediaSource(mediaSource); prepare(); @@ -415,7 +384,6 @@ import java.util.concurrent.CopyOnWriteArraySet; * instead. */ @Deprecated - @Override public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { setMediaSource(mediaSource, resetPosition); prepare(); @@ -432,28 +400,23 @@ import java.util.concurrent.CopyOnWriteArraySet; setMediaSources(createMediaSources(mediaItems), startWindowIndex, startPositionMs); } - @Override public void setMediaSource(MediaSource mediaSource) { setMediaSources(Collections.singletonList(mediaSource)); } - @Override public void setMediaSource(MediaSource mediaSource, long startPositionMs) { setMediaSources( Collections.singletonList(mediaSource), /* startWindowIndex= */ 0, startPositionMs); } - @Override public void setMediaSource(MediaSource mediaSource, boolean resetPosition) { setMediaSources(Collections.singletonList(mediaSource), resetPosition); } - @Override public void setMediaSources(List mediaSources) { setMediaSources(mediaSources, /* resetPosition= */ true); } - @Override public void setMediaSources(List mediaSources, boolean resetPosition) { setMediaSourcesInternal( mediaSources, @@ -462,7 +425,6 @@ import java.util.concurrent.CopyOnWriteArraySet; /* resetToDefaultPosition= */ resetPosition); } - @Override public void setMediaSources( List mediaSources, int startWindowIndex, long startPositionMs) { setMediaSourcesInternal( @@ -475,22 +437,18 @@ import java.util.concurrent.CopyOnWriteArraySet; addMediaSources(index, createMediaSources(mediaItems)); } - @Override public void addMediaSource(MediaSource mediaSource) { addMediaSources(Collections.singletonList(mediaSource)); } - @Override public void addMediaSource(int index, MediaSource mediaSource) { addMediaSources(index, Collections.singletonList(mediaSource)); } - @Override public void addMediaSources(List mediaSources) { addMediaSources(/* index= */ mediaSourceHolderSnapshots.size(), mediaSources); } - @Override public void addMediaSources(int index, List mediaSources) { Assertions.checkArgument(index >= 0); Timeline oldTimeline = getCurrentTimeline(); @@ -560,7 +518,6 @@ import java.util.concurrent.CopyOnWriteArraySet; /* ignored */ C.INDEX_UNSET); } - @Override public void setShuffleOrder(ShuffleOrder shuffleOrder) { Timeline timeline = createMaskingTimeline(); PlaybackInfo newPlaybackInfo = @@ -591,7 +548,6 @@ import java.util.concurrent.CopyOnWriteArraySet; PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST); } - @Override public void setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { if (this.pauseAtEndOfMediaItems == pauseAtEndOfMediaItems) { return; @@ -600,7 +556,6 @@ import java.util.concurrent.CopyOnWriteArraySet; internalPlayer.setPauseAtEndOfWindow(pauseAtEndOfMediaItems); } - @Override public boolean getPauseAtEndOfMediaItems() { return pauseAtEndOfMediaItems; } @@ -755,7 +710,6 @@ import java.util.concurrent.CopyOnWriteArraySet; return playbackInfo.playbackParameters; } - @Override public void setSeekParameters(@Nullable SeekParameters seekParameters) { if (seekParameters == null) { seekParameters = SeekParameters.DEFAULT; @@ -766,12 +720,10 @@ import java.util.concurrent.CopyOnWriteArraySet; } } - @Override public SeekParameters getSeekParameters() { return seekParameters; } - @Override public void setForegroundMode(boolean foregroundMode) { if (this.foregroundMode != foregroundMode) { this.foregroundMode = foregroundMode; @@ -863,7 +815,6 @@ import java.util.concurrent.CopyOnWriteArraySet; playbackInfo.totalBufferedDurationUs = 0; } - @Override public PlayerMessage createMessage(Target target) { return new PlayerMessage( internalPlayer, @@ -971,17 +922,14 @@ import java.util.concurrent.CopyOnWriteArraySet; playbackInfo.timeline, playbackInfo.loadingMediaPeriodId, contentBufferedPositionUs)); } - @Override public int getRendererCount() { return renderers.length; } - @Override public int getRendererType(int index) { return renderers[index].getTrackType(); } - @Override @Nullable public TrackSelector getTrackSelector() { return trackSelector; From dfb9ac11e972a48b58d89d71fac00e2088baf5db Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 18 Aug 2021 12:55:11 +0100 Subject: [PATCH 073/441] Deprecate ExoPlayer DeviceComponent. PiperOrigin-RevId: 391499955 --- .../google/android/exoplayer2/ExoPlayer.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 588dc49866..0e08742bcd 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -394,42 +394,39 @@ public interface ExoPlayer extends Player { List getCurrentCues(); } - /** The device component of an {@link ExoPlayer}. */ + /** + * @deprecated Use {@link Player} instead, as the {@link DeviceComponent} methods are a part of + * the {@link Player} interface. + */ + @Deprecated interface DeviceComponent { - /** Gets the device information. */ + /** @deprecated Use {@link Player#getDeviceInfo()} instead. */ + @Deprecated DeviceInfo getDeviceInfo(); - /** - * Gets the current volume of the device. - * - *

    For devices with {@link DeviceInfo#PLAYBACK_TYPE_LOCAL local playback}, the volume - * returned by this method varies according to the current {@link C.StreamType stream type}. The - * stream type is determined by {@link AudioAttributes#usage} which can be converted to stream - * type with {@link Util#getStreamTypeForAudioUsage(int)}. - * - *

    For devices with {@link DeviceInfo#PLAYBACK_TYPE_REMOTE remote playback}, the volume of - * the remote device is returned. - */ + /** @deprecated Use {@link Player#getDeviceVolume()} instead. */ + @Deprecated int getDeviceVolume(); - /** Gets whether the device is muted or not. */ + /** @deprecated Use {@link Player#isDeviceMuted()} instead. */ + @Deprecated boolean isDeviceMuted(); - /** - * Sets the volume of the device. - * - * @param volume The volume to set. - */ + /** @deprecated Use {@link Player#setDeviceVolume(int)} instead. */ + @Deprecated void setDeviceVolume(int volume); - /** Increases the volume of the device. */ + /** @deprecated Use {@link Player#increaseDeviceVolume()} instead. */ + @Deprecated void increaseDeviceVolume(); - /** Decreases the volume of the device. */ + /** @deprecated Use {@link Player#decreaseDeviceVolume()} instead. */ + @Deprecated void decreaseDeviceVolume(); - /** Sets the mute state of the device. */ + /** @deprecated Use {@link Player#setDeviceMuted(boolean)} instead. */ + @Deprecated void setDeviceMuted(boolean muted); } From afc549fba40eda8ca958fa878099aa3d861ba91b Mon Sep 17 00:00:00 2001 From: apodob Date: Wed, 18 Aug 2021 14:09:30 +0100 Subject: [PATCH 074/441] Release subtitle outputBuffer after decoding. PiperOrigin-RevId: 391509443 --- .../exoplayer2/extractor/subtitle/SubtitleExtractor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index 805b1fb434..d7ee336f4f 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -181,8 +181,8 @@ public class SubtitleExtractor implements Extractor { try { @Nullable SubtitleInputBuffer inputBuffer = subtitleDecoder.dequeueInputBuffer(); while (inputBuffer == null) { - inputBuffer = subtitleDecoder.dequeueInputBuffer(); Thread.sleep(5); + inputBuffer = subtitleDecoder.dequeueInputBuffer(); } inputBuffer.ensureSpaceForWrite(bytesRead); inputBuffer.data.put(subtitleData.getData(), /* offset= */ 0, bytesRead); @@ -200,8 +200,8 @@ public class SubtitleExtractor implements Extractor { try { @Nullable SubtitleOutputBuffer outputBuffer = subtitleDecoder.dequeueOutputBuffer(); while (outputBuffer == null) { - outputBuffer = subtitleDecoder.dequeueOutputBuffer(); Thread.sleep(5); + outputBuffer = subtitleDecoder.dequeueOutputBuffer(); } for (int i = 0; i < outputBuffer.getEventTimeCount(); i++) { @@ -215,6 +215,7 @@ public class SubtitleExtractor implements Extractor { /* offset= */ 0, /* cryptoData= */ null); } + outputBuffer.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new InterruptedIOException(); From cbd6527926eac8028263c3858a511a61141d141b Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 19 Aug 2021 14:00:09 +0100 Subject: [PATCH 075/441] Set format.sampleMimeType to TEXT_EXOPLAYER_CUES in SubtitleExtractor. Samples are serialized using our custom CueEncoder. Information in which format samples are encoded is needed by Renderer to decide which decoder to use. Extractor receives Format object in the constructor and prepares new Format object with sampleMimeType moved to codecs field and new sampleMimeType set to "custom serialized exoplayer Cue". PiperOrigin-RevId: 391739866 --- .../com/google/android/exoplayer2/util/MimeTypes.java | 2 ++ .../exoplayer2/extractor/subtitle/SubtitleExtractor.java | 8 +++++++- .../extractor/subtitle/SubtitleExtractorTest.java | 7 ++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 044dbf13a9..7922e93447 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -96,6 +96,8 @@ public final class MimeTypes { public static final String TEXT_VTT = BASE_TYPE_TEXT + "/vtt"; public static final String TEXT_SSA = BASE_TYPE_TEXT + "/x-ssa"; + public static final String TEXT_EXOPLAYER_CUES = BASE_TYPE_TEXT + "/x-exoplayer-cues"; + // application/ MIME types public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4"; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index d7ee336f4f..eee12e4810 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.text.SubtitleDecoder; import com.google.android.exoplayer2.text.SubtitleDecoderException; import com.google.android.exoplayer2.text.SubtitleInputBuffer; import com.google.android.exoplayer2.text.SubtitleOutputBuffer; +import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.common.primitives.Ints; import java.io.IOException; @@ -94,7 +95,12 @@ public class SubtitleExtractor implements Extractor { this.subtitleDecoder = subtitleDecoder; cueEncoder = new CueEncoder(); subtitleData = new ParsableByteArray(); - this.format = format; + this.format = + format + .buildUpon() + .setSampleMimeType(MimeTypes.TEXT_EXOPLAYER_CUES) + .setCodecs(format.sampleMimeType) + .build(); state = STATE_CREATED; } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java index 9d516d2e2a..9366d3db43 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.CueDecoder; import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; +import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.util.List; import org.junit.Test; @@ -56,12 +57,16 @@ public class SubtitleExtractorTest { .setSimulatePartialReads(true) .build(); SubtitleExtractor extractor = - new SubtitleExtractor(new WebvttDecoder(), new Format.Builder().build()); + new SubtitleExtractor( + new WebvttDecoder(), + new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).build()); extractor.init(output); while (extractor.read(input, null) != Extractor.RESULT_END_OF_INPUT) {} FakeTrackOutput trackOutput = output.trackOutputs.get(0); + assertThat(trackOutput.lastFormat.sampleMimeType).isEqualTo(MimeTypes.TEXT_EXOPLAYER_CUES); + assertThat(trackOutput.lastFormat.codecs).isEqualTo(MimeTypes.TEXT_VTT); assertThat(trackOutput.getSampleCount()).isEqualTo(6); // Check sample timestamps. assertThat(trackOutput.getSampleTimeUs(0)).isEqualTo(0L); From 1ae879788a932fd54bde0bd3abc5d09573c6789e Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 19 Aug 2021 17:27:18 +0100 Subject: [PATCH 076/441] Fix issue caused by using ForwardingPlayer and StyledPlayerControlView StyledPlayerControlView was checking whether the player is an ExoPlayer instance to set the track selector. This means that, if apps were wrapping an ExoPlayer in a ForwardingPlayer (to replace a ControlDispatcher for example), the track selector wasn't set anymore. #minor-release PiperOrigin-RevId: 391776305 --- RELEASENOTES.md | 2 ++ .../java/com/google/android/exoplayer2/ForwardingPlayer.java | 5 +++++ .../android/exoplayer2/ui/StyledPlayerControlView.java | 3 +++ 3 files changed, 10 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bb679bccab..4540f9634c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -9,6 +9,8 @@ `com.google.android.exoplayer2.decoder.CryptoException`. * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. + * Fix track selection in `StyledPlayerControlView` when using + `ForwardingPlayer`. * Android 12 compatibility: * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 59329088f8..f4467a180b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -619,6 +619,11 @@ public class ForwardingPlayer implements Player { player.setDeviceMuted(muted); } + /** Returns the {@link Player} to which operations are forwarded. */ + public Player getWrappedPlayer() { + return player; + } + @SuppressWarnings("deprecation") // Use of deprecated type for backwards compatibility. private static class ForwardingEventListener implements EventListener { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 45786b1eaa..277faca145 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -756,6 +756,9 @@ public class StyledPlayerControlView extends FrameLayout { if (player != null) { player.addListener(componentListener); } + if (player instanceof ForwardingPlayer) { + player = ((ForwardingPlayer) player).getWrappedPlayer(); + } if (player instanceof ExoPlayer) { TrackSelector trackSelector = ((ExoPlayer) player).getTrackSelector(); if (trackSelector instanceof DefaultTrackSelector) { From 0848188a4352a9d31ebc07ee2836eaa81916adbf Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 19 Aug 2021 21:56:12 +0100 Subject: [PATCH 077/441] Move TrackGroupTest and TrackGroupArrayTest to lib-common PiperOrigin-RevId: 391837747 --- .../com/google/android/exoplayer2/source/TrackGroupArrayTest.java | 0 .../java/com/google/android/exoplayer2/source/TrackGroupTest.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java (100%) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java b/library/common/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/source/TrackGroupArrayTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java b/library/common/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/source/TrackGroupTest.java From 557a1833f7e36ef3bb8cdaeab3ba2c74a536d3b9 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Fri, 20 Aug 2021 10:34:51 +0100 Subject: [PATCH 078/441] Avoid adding spy to list in DataSourceContractTests After the fix in https://github.com/mockito/mockito/issues/2331, the calls to equals on the fake transfer listener (due to its use in a list of listeners) are treated as interactions with it, meaning that the current verification of 'no more interactions' will fail. This change makes the transfer listener used for testing count bytes then delegate to another (mock) transfer listener that's passed in to avoid the problem. PiperOrigin-RevId: 391949619 --- .../testutil/DataSourceContractTest.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java index 4bce4a11ab..c785145a53 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java @@ -24,7 +24,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -391,8 +390,10 @@ public abstract class DataSourceContractTest { for (int i = 0; i < resources.size(); i++) { additionalFailureInfo.setInfo(getFailureLabel(resources, i)); DataSource dataSource = createDataSource(); - FakeTransferListener listener = spy(new FakeTransferListener()); - dataSource.addTransferListener(listener); + TransferListener listener = mock(TransferListener.class); + ByteCountingTransferListener byteCountingTransferListener = + new ByteCountingTransferListener(listener); + dataSource.addTransferListener(byteCountingTransferListener); InOrder inOrder = Mockito.inOrder(listener); @Nullable DataSource callbackSource = getTransferListenerDataSource(); if (callbackSource == null) { @@ -430,7 +431,8 @@ public abstract class DataSourceContractTest { } // Verify sufficient onBytesTransferred() callbacks have been triggered before closing the // DataSource. - assertThat(listener.bytesTransferred).isAtLeast(resource.getExpectedBytes().length); + assertThat(byteCountingTransferListener.bytesTransferred) + .isAtLeast(resource.getExpectedBytes().length); } finally { dataSource.close(); @@ -615,23 +617,37 @@ public abstract class DataSourceContractTest { } } - /** A {@link TransferListener} that only keeps track of the transferred bytes. */ - public static class FakeTransferListener implements TransferListener { + /** A {@link TransferListener} that keeps track of the transferred bytes. */ + private static final class ByteCountingTransferListener implements TransferListener { + + private final TransferListener transferListener; + private int bytesTransferred; - @Override - public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) {} + public ByteCountingTransferListener(TransferListener transferListener) { + this.transferListener = transferListener; + } @Override - public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) {} + public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) { + transferListener.onTransferInitializing(source, dataSpec, isNetwork); + } + + @Override + public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) { + transferListener.onTransferStart(source, dataSpec, isNetwork); + } @Override public void onBytesTransferred( DataSource source, DataSpec dataSpec, boolean isNetwork, int bytesTransferred) { + transferListener.onBytesTransferred(source, dataSpec, isNetwork, bytesTransferred); this.bytesTransferred += bytesTransferred; } @Override - public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) {} + public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) { + transferListener.onTransferEnd(source, dataSpec, isNetwork); + } } } From 082542c152d6ba711792cdb21c208c7f2dc2489a Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 20 Aug 2021 10:55:15 +0100 Subject: [PATCH 079/441] Add note that isLastBuffer is best-effort only PiperOrigin-RevId: 391952144 --- .../android/exoplayer2/mediacodec/MediaCodecRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 ead65ded66..75ac662ff3 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 @@ -1968,7 +1968,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer { * @param bufferPresentationTimeUs The presentation time of the output buffer in microseconds. * @param isDecodeOnlyBuffer Whether the buffer was marked with {@link C#BUFFER_FLAG_DECODE_ONLY} * by the source. - * @param isLastBuffer Whether the buffer is the last sample of the current stream. + * @param isLastBuffer Whether the buffer is known to contain the last sample of the current + * stream. This flag is set on a best effort basis, and any logic relying on it should degrade + * gracefully to handle cases where it's not set. * @param format The {@link Format} associated with the buffer. * @return Whether the output buffer was fully processed (for example, rendered or skipped). * @throws ExoPlaybackException If an error occurs processing the output buffer. From 03d0b34ab954d3318fa7375467fae98faa2d3e21 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 20 Aug 2021 12:47:58 +0100 Subject: [PATCH 080/441] Size dolby vision buffers for H265 by default PiperOrigin-RevId: 391965200 --- RELEASENOTES.md | 8 +++- .../video/MediaCodecVideoRenderer.java | 44 ++++++++++++------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4540f9634c..e24920dd54 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,8 +17,10 @@ calls from the player to `Surface.setFrameRate`. This is useful for applications wanting to call `Surface.setFrameRate` directly from application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. -* GVR extension: - * Remove `GvrAudioProcessor`, which has been deprecated since 2.11.0. +* Video + * Request smaller decoder input buffers for Dolby Vision. This fixes an + issue that could cause UHD Dolby Vision playbacks to fail on some + devices, including Amazon Fire TV 4K. * UI * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with @@ -41,6 +43,8 @@ `VideoListener`. Use `Player.addListener` and `Player.Listener` instead. * Remove `DefaultHttpDataSourceFactory`. Use `DefaultHttpDataSource.Factory` instead. + * Remove `GvrAudioProcessor` and the GVR extension, which has been + deprecated since 2.11.0. ### 2.15.0 (2021-08-10) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index e5e1af9408..1848950a96 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -1364,8 +1364,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { // The single entry in streamFormats must correspond to the format for which the codec is // being configured. if (maxInputSize != Format.NO_VALUE) { - int codecMaxInputSize = - getCodecMaxInputSize(codecInfo, format.sampleMimeType, format.width, format.height); + int codecMaxInputSize = getCodecMaxInputSize(codecInfo, format); if (codecMaxInputSize != Format.NO_VALUE) { // Scale up the initial video decoder maximum input size so playlist item transitions with // small increases in maximum sample size don't require reinitialization. This only makes @@ -1402,7 +1401,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { maxInputSize = max( maxInputSize, - getCodecMaxInputSize(codecInfo, format.sampleMimeType, maxWidth, maxHeight)); + getCodecMaxInputSize( + codecInfo, format.buildUpon().setWidth(maxWidth).setHeight(maxHeight).build())); Log.w(TAG, "Codec max resolution adjusted to: " + maxWidth + "x" + maxHeight); } } @@ -1481,29 +1481,46 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } return format.maxInputSize + totalInitializationDataSize; } else { - // Calculated maximum input sizes are overestimates, so it's not necessary to add the size of - // initialization data. - return getCodecMaxInputSize(codecInfo, format.sampleMimeType, format.width, format.height); + return getCodecMaxInputSize(codecInfo, format); } } /** - * Returns a maximum input size for a given codec, MIME type, width and height. + * Returns a maximum input size for a given codec and format. * * @param codecInfo Information about the {@link MediaCodec} being configured. - * @param sampleMimeType The format mime type. - * @param width The width in pixels. - * @param height The height in pixels. + * @param format The format. * @return A maximum input size in bytes, or {@link Format#NO_VALUE} if a maximum could not be * determined. */ - private static int getCodecMaxInputSize( - MediaCodecInfo codecInfo, String sampleMimeType, int width, int height) { + private static int getCodecMaxInputSize(MediaCodecInfo codecInfo, Format format) { + int width = format.width; + int height = format.height; if (width == Format.NO_VALUE || height == Format.NO_VALUE) { // We can't infer a maximum input size without video dimensions. return Format.NO_VALUE; } + String sampleMimeType = format.sampleMimeType; + if (MimeTypes.VIDEO_DOLBY_VISION.equals(sampleMimeType)) { + // Dolby vision can be a wrapper around H264 or H265. We assume it's wrapping H265 by default + // because it's the common case, and because some devices may fail to allocate the codec when + // the larger buffer size required for H264 is requested. We size buffers for H264 only if the + // format contains sufficient information for us to determine unambiguously that it's a H264 + // profile. + sampleMimeType = MimeTypes.VIDEO_H265; + @Nullable + Pair codecProfileAndLevel = MediaCodecUtil.getCodecProfileAndLevel(format); + if (codecProfileAndLevel != null) { + int profile = codecProfileAndLevel.first; + if (profile == CodecProfileLevel.DolbyVisionProfileDvavSe + || profile == CodecProfileLevel.DolbyVisionProfileDvavPer + || profile == CodecProfileLevel.DolbyVisionProfileDvavPen) { + sampleMimeType = MimeTypes.VIDEO_H264; + } + } + } + // Attempt to infer a maximum input size from the format. int maxPixels; int minCompressionRatio; @@ -1513,9 +1530,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { maxPixels = width * height; minCompressionRatio = 2; break; - case MimeTypes.VIDEO_DOLBY_VISION: - // Dolby vision can be a wrapper around H264 or H265. We assume H264 here because the - // minimum compression ratio is lower, meaning we overestimate the maximum input size. case MimeTypes.VIDEO_H264: if ("BRAVIA 4K 2015".equals(Util.MODEL) // Sony Bravia 4K || ("Amazon".equals(Util.MANUFACTURER) From 3f16730763dab6d16fe751b16187e70c31bbe34c Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 20 Aug 2021 13:26:08 +0100 Subject: [PATCH 081/441] Support generating notifications for paused downloads - Android 12 will not allow our download service to be restarted from the background when conditions that allow downloads to continue are met. As an interim (and possibly permanent) solution, we'll keep the service in the foreground if there are unfinished downloads that would continue if conditions were met. - Keeping the service in the foreground requires a foreground notification. Hence we need to be able to generate a meaningful notification for this state. PiperOrigin-RevId: 391969986 --- .../exoplayer2/demo/DemoDownloadService.java | 7 +- .../exoplayer2/offline/DownloadService.java | 10 +- .../dash/offline/DownloadServiceDashTest.java | 5 +- .../ui/DownloadNotificationHelper.java | 113 +++++++++++++----- library/ui/src/main/res/values/strings.xml | 6 + 5 files changed, 105 insertions(+), 36 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java index c462c14c75..87d45148fe 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.offline.Download; import com.google.android.exoplayer2.offline.DownloadManager; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.scheduler.PlatformScheduler; +import com.google.android.exoplayer2.scheduler.Requirements; import com.google.android.exoplayer2.ui.DownloadNotificationHelper; import com.google.android.exoplayer2.util.NotificationUtil; import com.google.android.exoplayer2.util.Util; @@ -66,14 +67,16 @@ public class DemoDownloadService extends DownloadService { @Override @NonNull - protected Notification getForegroundNotification(@NonNull List downloads) { + protected Notification getForegroundNotification( + @NonNull List downloads, @Requirements.RequirementFlags int notMetRequirements) { return DemoUtil.getDownloadNotificationHelper(/* context= */ this) .buildProgressNotification( /* context= */ this, R.drawable.ic_download, /* contentIntent= */ null, /* message= */ null, - downloads); + downloads, + notMetRequirements); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index 527c51ea83..25ca27bdce 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -747,13 +747,15 @@ public abstract class DownloadService extends Service { * be implemented to throw {@link UnsupportedOperationException}. * * @param downloads The current downloads. + * @param notMetRequirements Any requirements for downloads that are not currently met. * @return The foreground notification to display. */ - protected abstract Notification getForegroundNotification(List downloads); + protected abstract Notification getForegroundNotification( + List downloads, @Requirements.RequirementFlags int notMetRequirements); /** * Invalidates the current foreground notification and causes {@link - * #getForegroundNotification(List)} to be invoked again if the service isn't stopped. + * #getForegroundNotification(List, int)} to be invoked again if the service isn't stopped. */ protected final void invalidateForegroundNotification() { if (foregroundNotificationUpdater != null && !isDestroyed) { @@ -908,7 +910,9 @@ public abstract class DownloadService extends Service { private void update() { List downloads = Assertions.checkNotNull(downloadManager).getCurrentDownloads(); - startForeground(notificationId, getForegroundNotification(downloads)); + @Requirements.RequirementFlags + int notMetRequirements = downloadManager.getNotMetRequirements(); + startForeground(notificationId, getForegroundNotification(downloads, notMetRequirements)); notificationDisplayed = true; if (periodicUpdatesStarted) { handler.removeCallbacksAndMessages(null); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java index 98a7f6e887..e8a71798be 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadServiceDashTest.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.robolectric.TestDownloadManagerListener; +import com.google.android.exoplayer2.scheduler.Requirements; import com.google.android.exoplayer2.scheduler.Scheduler; import com.google.android.exoplayer2.testutil.DummyMainThread; import com.google.android.exoplayer2.testutil.FakeDataSet; @@ -139,7 +140,9 @@ public class DownloadServiceDashTest { } @Override - protected Notification getForegroundNotification(List downloads) { + protected Notification getForegroundNotification( + List downloads, + @Requirements.RequirementFlags int notMetRequirements) { throw new UnsupportedOperationException(); } }; diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java index 83da4d54a8..fa7244b250 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java @@ -24,6 +24,7 @@ import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.offline.Download; +import com.google.android.exoplayer2.scheduler.Requirements; import java.util.List; /** Helper for creating download notifications. */ @@ -42,6 +43,21 @@ public final class DownloadNotificationHelper { new NotificationCompat.Builder(context.getApplicationContext(), channelId); } + /** + * @deprecated Use {@link #buildProgressNotification(Context, int, PendingIntent, String, List, + * int)}. + */ + @Deprecated + public Notification buildProgressNotification( + Context context, + @DrawableRes int smallIcon, + @Nullable PendingIntent contentIntent, + @Nullable String message, + List downloads) { + return buildProgressNotification( + context, smallIcon, contentIntent, message, downloads, /* notMetRequirements= */ 0); + } + /** * Returns a progress notification for the given downloads. * @@ -50,6 +66,7 @@ public final class DownloadNotificationHelper { * @param contentIntent An optional content intent to send when the notification is clicked. * @param message An optional message to display on the notification. * @param downloads The downloads. + * @param notMetRequirements Any requirements for downloads that are not currently met. * @return The notification. */ public Notification buildProgressNotification( @@ -57,52 +74,88 @@ public final class DownloadNotificationHelper { @DrawableRes int smallIcon, @Nullable PendingIntent contentIntent, @Nullable String message, - List downloads) { + List downloads, + @Requirements.RequirementFlags int notMetRequirements) { float totalPercentage = 0; int downloadTaskCount = 0; boolean allDownloadPercentagesUnknown = true; boolean haveDownloadedBytes = false; - boolean haveDownloadTasks = false; - boolean haveRemoveTasks = false; + boolean haveDownloadingTasks = false; + boolean haveQueuedTasks = false; + boolean haveRemovingTasks = false; for (int i = 0; i < downloads.size(); i++) { Download download = downloads.get(i); - if (download.state == Download.STATE_REMOVING) { - haveRemoveTasks = true; - continue; + switch (download.state) { + case Download.STATE_REMOVING: + haveRemovingTasks = true; + break; + case Download.STATE_QUEUED: + haveQueuedTasks = true; + break; + case Download.STATE_RESTARTING: + case Download.STATE_DOWNLOADING: + haveDownloadingTasks = true; + float downloadPercentage = download.getPercentDownloaded(); + if (downloadPercentage != C.PERCENTAGE_UNSET) { + allDownloadPercentagesUnknown = false; + totalPercentage += downloadPercentage; + } + haveDownloadedBytes |= download.getBytesDownloaded() > 0; + downloadTaskCount++; + break; + // Terminal states aren't expected, but if we encounter them we do nothing. + case Download.STATE_STOPPED: + case Download.STATE_COMPLETED: + case Download.STATE_FAILED: + default: + break; } - if (download.state != Download.STATE_RESTARTING - && download.state != Download.STATE_DOWNLOADING) { - continue; - } - haveDownloadTasks = true; - float downloadPercentage = download.getPercentDownloaded(); - if (downloadPercentage != C.PERCENTAGE_UNSET) { - allDownloadPercentagesUnknown = false; - totalPercentage += downloadPercentage; - } - haveDownloadedBytes |= download.getBytesDownloaded() > 0; - downloadTaskCount++; } - int titleStringId = - haveDownloadTasks - ? R.string.exo_download_downloading - : (haveRemoveTasks ? R.string.exo_download_removing : NULL_STRING_ID); - int progress = 0; - boolean indeterminate = true; - if (haveDownloadTasks) { - progress = (int) (totalPercentage / downloadTaskCount); - indeterminate = allDownloadPercentagesUnknown && haveDownloadedBytes; + int titleStringId; + boolean showProgress = true; + if (haveDownloadingTasks) { + titleStringId = R.string.exo_download_downloading; + } else if (haveQueuedTasks && notMetRequirements != 0) { + showProgress = false; + if ((notMetRequirements & Requirements.NETWORK_UNMETERED) != 0) { + // Note: This assumes that "unmetered" == "WiFi", since it provides a clearer message that's + // correct in the majority of cases. + titleStringId = R.string.exo_download_paused_for_wifi; + } else if ((notMetRequirements & Requirements.NETWORK) != 0) { + titleStringId = R.string.exo_download_paused_for_network; + } else { + titleStringId = R.string.exo_download_paused; + } + } else if (haveRemovingTasks) { + titleStringId = R.string.exo_download_removing; + } else { + // There are either no downloads, or all downloads are in terminal states. + titleStringId = NULL_STRING_ID; } + + int maxProgress = 0; + int currentProgress = 0; + boolean indeterminateProgress = false; + if (showProgress) { + maxProgress = 100; + if (haveDownloadingTasks) { + currentProgress = (int) (totalPercentage / downloadTaskCount); + indeterminateProgress = allDownloadPercentagesUnknown && haveDownloadedBytes; + } else { + indeterminateProgress = true; + } + } + return buildNotification( context, smallIcon, contentIntent, message, titleStringId, - /* maxProgress= */ 100, - progress, - indeterminate, + maxProgress, + currentProgress, + indeterminateProgress, /* ongoing= */ true, /* showWhen= */ false); } diff --git a/library/ui/src/main/res/values/strings.xml b/library/ui/src/main/res/values/strings.xml index a11d04073f..0dde445c16 100644 --- a/library/ui/src/main/res/values/strings.xml +++ b/library/ui/src/main/res/values/strings.xml @@ -91,6 +91,12 @@ Download failed Removing downloads + + Downloads paused + + Downloads waiting for network + + Downloads waiting for WiFi Video From 2f09ecef53bed88cf16ca259d44266ebe0388f97 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 20 Aug 2021 18:43:15 +0100 Subject: [PATCH 082/441] Make constructor of PlayerNotificationManager protected Issue: #9303 #minor-release PiperOrigin-RevId: 392022613 --- .../ui/PlayerNotificationManager.java | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 409fb16263..7fa3563629 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -308,25 +308,25 @@ public class PlayerNotificationManager { /** A builder for {@link PlayerNotificationManager} instances. */ public static class Builder { - private final Context context; - private final int notificationId; - private final String channelId; + protected final Context context; + protected final int notificationId; + protected final String channelId; - @Nullable private NotificationListener notificationListener; - @Nullable private CustomActionReceiver customActionReceiver; - private MediaDescriptionAdapter mediaDescriptionAdapter; - private int channelNameResourceId; - private int channelDescriptionResourceId; - private int channelImportance; - private int smallIconResourceId; - private int rewindActionIconResourceId; - private int playActionIconResourceId; - private int pauseActionIconResourceId; - private int stopActionIconResourceId; - private int fastForwardActionIconResourceId; - private int previousActionIconResourceId; - private int nextActionIconResourceId; - @Nullable private String groupKey; + @Nullable protected NotificationListener notificationListener; + @Nullable protected CustomActionReceiver customActionReceiver; + protected MediaDescriptionAdapter mediaDescriptionAdapter; + protected int channelNameResourceId; + protected int channelDescriptionResourceId; + protected int channelImportance; + protected int smallIconResourceId; + protected int rewindActionIconResourceId; + protected int playActionIconResourceId; + protected int pauseActionIconResourceId; + protected int stopActionIconResourceId; + protected int fastForwardActionIconResourceId; + protected int previousActionIconResourceId; + protected int nextActionIconResourceId; + @Nullable protected String groupKey; /** * @deprecated Use {@link #Builder(Context, int, String)} instead, then call {@link @@ -708,7 +708,7 @@ public class PlayerNotificationManager { private boolean useChronometer; @Nullable private String groupKey; - private PlayerNotificationManager( + protected PlayerNotificationManager( Context context, String channelId, int notificationId, @@ -837,7 +837,7 @@ public class PlayerNotificationManager { * * @param useNextAction Whether to use the next action. */ - public void setUseNextAction(boolean useNextAction) { + public final void setUseNextAction(boolean useNextAction) { if (this.useNextAction != useNextAction) { this.useNextAction = useNextAction; invalidate(); @@ -849,7 +849,7 @@ public class PlayerNotificationManager { * * @param usePreviousAction Whether to use the previous action. */ - public void setUsePreviousAction(boolean usePreviousAction) { + public final void setUsePreviousAction(boolean usePreviousAction) { if (this.usePreviousAction != usePreviousAction) { this.usePreviousAction = usePreviousAction; invalidate(); @@ -866,7 +866,7 @@ public class PlayerNotificationManager { * * @param useNextActionInCompactView Whether to use the next action in compact view. */ - public void setUseNextActionInCompactView(boolean useNextActionInCompactView) { + public final void setUseNextActionInCompactView(boolean useNextActionInCompactView) { if (this.useNextActionInCompactView != useNextActionInCompactView) { this.useNextActionInCompactView = useNextActionInCompactView; if (useNextActionInCompactView) { @@ -886,7 +886,7 @@ public class PlayerNotificationManager { * * @param usePreviousActionInCompactView Whether to use the previous action in compact view. */ - public void setUsePreviousActionInCompactView(boolean usePreviousActionInCompactView) { + public final void setUsePreviousActionInCompactView(boolean usePreviousActionInCompactView) { if (this.usePreviousActionInCompactView != usePreviousActionInCompactView) { this.usePreviousActionInCompactView = usePreviousActionInCompactView; if (usePreviousActionInCompactView) { @@ -901,7 +901,7 @@ public class PlayerNotificationManager { * * @param useFastForwardAction Whether to use the fast forward action. */ - public void setUseFastForwardAction(boolean useFastForwardAction) { + public final void setUseFastForwardAction(boolean useFastForwardAction) { if (this.useFastForwardAction != useFastForwardAction) { this.useFastForwardAction = useFastForwardAction; invalidate(); @@ -913,7 +913,7 @@ public class PlayerNotificationManager { * * @param useRewindAction Whether to use the rewind action. */ - public void setUseRewindAction(boolean useRewindAction) { + public final void setUseRewindAction(boolean useRewindAction) { if (this.useRewindAction != useRewindAction) { this.useRewindAction = useRewindAction; invalidate(); @@ -930,7 +930,8 @@ public class PlayerNotificationManager { * @param useFastForwardActionInCompactView Whether to use the fast forward action in compact * view. */ - public void setUseFastForwardActionInCompactView(boolean useFastForwardActionInCompactView) { + public final void setUseFastForwardActionInCompactView( + boolean useFastForwardActionInCompactView) { if (this.useFastForwardActionInCompactView != useFastForwardActionInCompactView) { this.useFastForwardActionInCompactView = useFastForwardActionInCompactView; if (useFastForwardActionInCompactView) { @@ -949,7 +950,7 @@ public class PlayerNotificationManager { * * @param useRewindActionInCompactView Whether to use the rewind action in compact view. */ - public void setUseRewindActionInCompactView(boolean useRewindActionInCompactView) { + public final void setUseRewindActionInCompactView(boolean useRewindActionInCompactView) { if (this.useRewindActionInCompactView != useRewindActionInCompactView) { this.useRewindActionInCompactView = useRewindActionInCompactView; if (useRewindActionInCompactView) { @@ -1160,7 +1161,7 @@ public class PlayerNotificationManager { } /** Forces an update of the notification if already started. */ - public void invalidate() { + public final void invalidate() { if (isNotificationStarted) { postStartOrUpdateNotification(); } From 60681b97839d3c1f5ec950c6453dc2f502c3615c Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 23 Aug 2021 18:47:10 +0100 Subject: [PATCH 083/441] Add onReset implementation to TransformerTranscodingVideoRenderer PiperOrigin-RevId: 392468554 --- .../TransformerTranscodingVideoRenderer.java | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 6fd210fa8b..a7adae8535 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -37,7 +37,7 @@ import java.nio.ByteBuffer; private static final String TAG = "TransformerTranscodingVideoRenderer"; - private final DecoderInputBuffer buffer; + private final DecoderInputBuffer decoderInputBuffer; /** The format the encoder is configured to output, may differ from the actual output format. */ private final Format encoderConfigurationOutputFormat; @@ -57,7 +57,7 @@ import java.nio.ByteBuffer; Format encoderConfigurationOutputFormat) { super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); - buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + decoderInputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); surface = MediaCodec.createPersistentInputSurface(); this.encoderConfigurationOutputFormat = encoderConfigurationOutputFormat; } @@ -89,6 +89,23 @@ import java.nio.ByteBuffer; return muxerWrapperTrackEnded; } + @Override + protected void onReset() { + decoderInputBuffer.clear(); + decoderInputBuffer.data = null; + surface.release(); + if (decoder != null) { + decoder.release(); + decoder = null; + } + if (encoder != null) { + encoder.release(); + encoder = null; + } + hasEncoderActualOutputFormat = false; + muxerWrapperTrackEnded = false; + } + private boolean ensureDecoderConfigured() throws ExoPlaybackException { if (decoder != null) { return true; @@ -97,7 +114,8 @@ import java.nio.ByteBuffer; FormatHolder formatHolder = getFormatHolder(); @SampleStream.ReadDataResult int result = - readSource(formatHolder, buffer, /* readFlags= */ SampleStream.FLAG_REQUIRE_FORMAT); + readSource( + formatHolder, decoderInputBuffer, /* readFlags= */ SampleStream.FLAG_REQUIRE_FORMAT); if (result != C.RESULT_FORMAT_READ) { return false; } @@ -133,23 +151,23 @@ import java.nio.ByteBuffer; private boolean feedDecoderFromInput() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); - if (!decoder.maybeDequeueInputBuffer(buffer)) { + if (!decoder.maybeDequeueInputBuffer(decoderInputBuffer)) { return false; } - buffer.clear(); + decoderInputBuffer.clear(); @SampleStream.ReadDataResult - int result = readSource(getFormatHolder(), buffer, /* readFlags= */ 0); + int result = readSource(getFormatHolder(), decoderInputBuffer, /* readFlags= */ 0); switch (result) { case C.RESULT_FORMAT_READ: throw new IllegalStateException("Format changes are not supported."); case C.RESULT_BUFFER_READ: - mediaClock.updateTimeForTrackType(getTrackType(), buffer.timeUs); - ByteBuffer data = checkNotNull(buffer.data); + mediaClock.updateTimeForTrackType(getTrackType(), decoderInputBuffer.timeUs); + ByteBuffer data = checkNotNull(decoderInputBuffer.data); data.flip(); - decoder.queueInputBuffer(buffer); - return !buffer.isEndOfStream(); + decoder.queueInputBuffer(decoderInputBuffer); + return !decoderInputBuffer.isEndOfStream(); case C.RESULT_NOTHING_READ: default: return false; From 3d5e32dc2ccad99cc222080b0c4fad2563dff2f9 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 24 Aug 2021 14:20:05 +0100 Subject: [PATCH 084/441] Update references to ShadowBaseLooper to use ShadowLooper ShadowBaseLooper is deprecated and will be removed in a forthcoming CL. Tested: TAP --sample ran all affected tests and none failed http://test/OCL:391922969:BASE:391896312:1629439874303:285a1989 PiperOrigin-RevId: 392647041 --- .../google/android/exoplayer2/offline/DownloadHelperTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java index 6700f0de7a..5a042310a1 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java @@ -17,7 +17,7 @@ package com.google.android.exoplayer2.offline; import static com.google.common.truth.Truth.assertThat; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.robolectric.shadows.ShadowBaseLooper.shadowMainLooper; +import static org.robolectric.shadows.ShadowLooper.shadowMainLooper; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; From d3cc98d36868a16c29b55aede35c5e4d74f4d757 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 24 Aug 2021 15:04:17 +0100 Subject: [PATCH 085/441] Deprecate ExoPlayer AudioComponent. PiperOrigin-RevId: 392655598 --- .../google/android/exoplayer2/ExoPlayer.java | 137 +++++++++++------- .../exoplayer2/testutil/StubExoPlayer.java | 39 +++++ 2 files changed, 121 insertions(+), 55 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 0e08742bcd..2c8684f2f2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -140,78 +140,48 @@ import java.util.List; */ public interface ExoPlayer extends Player { - /** The audio component of an {@link ExoPlayer}. */ + /** @deprecated Use the methods in {@link ExoPlayer} instead. */ + @Deprecated interface AudioComponent { - /** - * Sets the attributes for audio playback, used by the underlying audio track. If not set, the - * default audio attributes will be used. They are suitable for general media playback. - * - *

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

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

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

    If audio focus should be handled, the {@link AudioAttributes#usage} must be {@link - * C#USAGE_MEDIA} or {@link C#USAGE_GAME}. Other usages will throw an {@link - * IllegalArgumentException}. - * - * @param audioAttributes The attributes to use for audio playback. - * @param handleAudioFocus True if the player should handle audio focus, false otherwise. - */ + /** @deprecated Use {@link ExoPlayer#setAudioAttributes(AudioAttributes, boolean)} instead. */ + @Deprecated void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus); - /** Returns the attributes for audio playback. */ + /** @deprecated Use {@link Player#getAudioAttributes()} instead. */ + @Deprecated AudioAttributes getAudioAttributes(); - /** - * Sets the ID of the audio session to attach to the underlying {@link - * android.media.AudioTrack}. - * - *

    The audio session ID can be generated using {@link C#generateAudioSessionIdV21(Context)} - * for API 21+. - * - * @param audioSessionId The audio session ID, or {@link C#AUDIO_SESSION_ID_UNSET} if it should - * be generated by the framework. - */ + /** @deprecated Use {@link ExoPlayer#setAudioSessionId(int)} instead. */ + @Deprecated void setAudioSessionId(int audioSessionId); - /** Returns the audio session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} if not set. */ + /** @deprecated Use {@link ExoPlayer#getAudioSessionId()} instead. */ + @Deprecated int getAudioSessionId(); - /** Sets information on an auxiliary audio effect to attach to the underlying audio track. */ + /** @deprecated Use {@link ExoPlayer#setAuxEffectInfo(AuxEffectInfo)} instead. */ + @Deprecated void setAuxEffectInfo(AuxEffectInfo auxEffectInfo); - /** Detaches any previously attached auxiliary audio effect from the underlying audio track. */ + /** @deprecated Use {@link ExoPlayer#clearAuxEffectInfo()} instead. */ + @Deprecated void clearAuxEffectInfo(); - /** - * Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). - * - * @param audioVolume Linear output gain to apply to all audio channels. - */ + /** @deprecated Use {@link Player#setVolume(float)} instead. */ + @Deprecated void setVolume(float audioVolume); - /** - * Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). - * - * @return The linear gain applied to all audio channels. - */ + /** @deprecated Use {@link Player#getVolume()} instead. */ + @Deprecated float getVolume(); - /** - * Sets whether skipping silences in the audio stream is enabled. - * - * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. - */ + /** @deprecated Use {@link ExoPlayer#setSkipSilenceEnabled(boolean)} instead. */ + @Deprecated void setSkipSilenceEnabled(boolean skipSilenceEnabled); - /** Returns whether skipping silences in the audio stream is enabled. */ + /** @deprecated Use {@link ExoPlayer#getSkipSilenceEnabled()} instead. */ + @Deprecated boolean getSkipSilenceEnabled(); } @@ -944,8 +914,12 @@ public interface ExoPlayer extends Player { @Override ExoPlaybackException getPlayerError(); - /** Returns the component of this player for audio output, or null if audio is not supported. */ + /** + * @deprecated Use {@link ExoPlayer}, as the {@link AudioComponent} methods are part of the + * interface. + */ @Nullable + @Deprecated AudioComponent getAudioComponent(); /** Returns the component of this player for video output, or null if video is not supported. */ @@ -953,8 +927,8 @@ public interface ExoPlayer extends Player { VideoComponent getVideoComponent(); /** - * @deprecated Use {@link Player} instead, as the {@link TextComponent} methods are a part of the - * {@link Player interface}. + * @deprecated Use {@link Player}, as the {@link TextComponent} methods are a part of the {@link + * Player interface}. */ @Nullable @Deprecated @@ -1112,6 +1086,59 @@ public interface ExoPlayer extends Player { */ void setShuffleOrder(ShuffleOrder shuffleOrder); + /** + * Sets the attributes for audio playback, used by the underlying audio track. If not set, the + * default audio attributes will be used. They are suitable for general media playback. + * + *

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

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

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

    If audio focus should be handled, the {@link AudioAttributes#usage} must be {@link + * C#USAGE_MEDIA} or {@link C#USAGE_GAME}. Other usages will throw an {@link + * IllegalArgumentException}. + * + * @param audioAttributes The attributes to use for audio playback. + * @param handleAudioFocus True if the player should handle audio focus, false otherwise. + */ + void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus); + + /** + * Sets the ID of the audio session to attach to the underlying {@link android.media.AudioTrack}. + * + *

    The audio session ID can be generated using {@link C#generateAudioSessionIdV21(Context)} for + * API 21+. + * + * @param audioSessionId The audio session ID, or {@link C#AUDIO_SESSION_ID_UNSET} if it should be + * generated by the framework. + */ + void setAudioSessionId(int audioSessionId); + + /** Returns the audio session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} if not set. */ + int getAudioSessionId(); + + /** Sets information on an auxiliary audio effect to attach to the underlying audio track. */ + void setAuxEffectInfo(AuxEffectInfo auxEffectInfo); + + /** Detaches any previously attached auxiliary audio effect from the underlying audio track. */ + void clearAuxEffectInfo(); + + /** + * Sets whether skipping silences in the audio stream is enabled. + * + * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. + */ + void setSkipSilenceEnabled(boolean skipSilenceEnabled); + + /** Returns whether skipping silences in the audio stream is enabled. */ + boolean getSkipSilenceEnabled(); + /** * Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message * will be delivered immediately without blocking on the playback thread. The default {@link diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index eab86983d5..3cca960e3a 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -33,6 +33,7 @@ import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; +import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; @@ -51,6 +52,7 @@ import java.util.List; public class StubExoPlayer extends BasePlayer implements ExoPlayer { @Override + @Deprecated public AudioComponent getAudioComponent() { throw new UnsupportedOperationException(); } @@ -61,11 +63,13 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override + @Deprecated public TextComponent getTextComponent() { throw new UnsupportedOperationException(); } @Override + @Deprecated public DeviceComponent getDeviceComponent() { throw new UnsupportedOperationException(); } @@ -274,6 +278,41 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { + throw new UnsupportedOperationException(); + } + + @Override + public void setAudioSessionId(int audioSessionId) { + throw new UnsupportedOperationException(); + } + + @Override + public int getAudioSessionId() { + throw new UnsupportedOperationException(); + } + + @Override + public void setAuxEffectInfo(AuxEffectInfo auxEffectInfo) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearAuxEffectInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public void setSkipSilenceEnabled(boolean skipSilenceEnabled) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getSkipSilenceEnabled() { + throw new UnsupportedOperationException(); + } + @Override public void setShuffleModeEnabled(boolean shuffleModeEnabled) { throw new UnsupportedOperationException(); From 628e744e266896af7d088160fd142f98b3db3b4f Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 24 Aug 2021 16:28:12 +0100 Subject: [PATCH 086/441] Deprecate ExoPlayer VideoComponent. PiperOrigin-RevId: 392668736 --- .../google/android/exoplayer2/ExoPlayer.java | 235 +++++++++--------- .../exoplayer2/testutil/StubExoPlayer.java | 43 ++++ 2 files changed, 158 insertions(+), 120 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 2c8684f2f2..9df0d71fd4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -185,170 +185,94 @@ public interface ExoPlayer extends Player { boolean getSkipSilenceEnabled(); } - /** The video component of an {@link ExoPlayer}. */ + /** + * @deprecated Use {@link ExoPlayer}, as the {@link VideoComponent} methods are defined by that + * interface. + */ + @Deprecated interface VideoComponent { - /** - * Sets the {@link C.VideoScalingMode}. - * - *

    The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is - * enabled and if the output surface is owned by a {@link SurfaceView}. - * - * @param videoScalingMode The {@link C.VideoScalingMode}. - */ + /** @deprecated Use {@link ExoPlayer#setVideoScalingMode(int)} instead. */ + @Deprecated void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode); - /** Returns the {@link C.VideoScalingMode}. */ + /** @deprecated Use {@link ExoPlayer#getVideoScalingMode()} instead. */ + @Deprecated @C.VideoScalingMode int getVideoScalingMode(); - /** - * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided - * with a video output {@link Surface}. - * - *

    The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. - * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to - * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link - * Surface#setFrameRate} from ExoPlayer, and should then call {@link Surface#setFrameRate} - * directly from application code. - * - * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. - */ + /** @deprecated Use {@link ExoPlayer#setVideoChangeFrameRateStrategy(int)} instead. */ + @Deprecated void setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy); - /** Returns the {@link C.VideoChangeFrameRateStrategy}. */ + /** @deprecated Use {@link ExoPlayer#getVideoChangeFrameRateStrategy()} instead. */ + @Deprecated @C.VideoChangeFrameRateStrategy int getVideoChangeFrameRateStrategy(); /** - * Sets a listener to receive video frame metadata events. - * - *

    This method is intended to be called by the same component that sets the {@link Surface} - * onto which video will be rendered. If using ExoPlayer's standard UI components, this method - * should not be called directly from application code. - * - * @param listener The listener. + * @deprecated Use {@link ExoPlayer#setVideoFrameMetadataListener(VideoFrameMetadataListener)} + * instead. */ + @Deprecated void setVideoFrameMetadataListener(VideoFrameMetadataListener listener); /** - * Clears the listener which receives video frame metadata events if it matches the one passed. - * Else does nothing. - * - * @param listener The listener to clear. + * @deprecated Use {@link ExoPlayer#clearVideoFrameMetadataListener(VideoFrameMetadataListener)} + * instead. */ + @Deprecated void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener); - /** - * Sets a listener of camera motion events. - * - * @param listener The listener. - */ + /** @deprecated Use {@link ExoPlayer#setCameraMotionListener(CameraMotionListener)} instead. */ + @Deprecated void setCameraMotionListener(CameraMotionListener listener); /** - * Clears the listener which receives camera motion events if it matches the one passed. Else - * does nothing. - * - * @param listener The listener to clear. + * @deprecated Use {@link ExoPlayer#clearCameraMotionListener(CameraMotionListener)} instead. */ + @Deprecated void clearCameraMotionListener(CameraMotionListener listener); - /** - * Clears any {@link Surface}, {@link SurfaceHolder}, {@link SurfaceView} or {@link TextureView} - * currently set on the player. - */ + /** @deprecated Use {@link Player#clearVideoSurface()} instead. */ + @Deprecated void clearVideoSurface(); - /** - * Clears the {@link Surface} onto which video is being rendered if it matches the one passed. - * Else does nothing. - * - * @param surface The surface to clear. - */ + /** @deprecated Use {@link Player#clearVideoSurface(Surface)} instead. */ + @Deprecated void clearVideoSurface(@Nullable Surface surface); - /** - * Sets the {@link Surface} onto which video will be rendered. The caller is responsible for - * tracking the lifecycle of the surface, and must clear the surface by calling {@code - * setVideoSurface(null)} if the surface is destroyed. - * - *

    If the surface is held by a {@link SurfaceView}, {@link TextureView} or {@link - * SurfaceHolder} then it's recommended to use {@link #setVideoSurfaceView(SurfaceView)}, {@link - * #setVideoTextureView(TextureView)} or {@link #setVideoSurfaceHolder(SurfaceHolder)} rather - * than this method, since passing the holder allows the player to track the lifecycle of the - * surface automatically. - * - * @param surface The {@link Surface}. - */ + /** @deprecated Use {@link Player#setVideoSurface(Surface)} instead. */ + @Deprecated void setVideoSurface(@Nullable Surface surface); - /** - * Sets the {@link SurfaceHolder} that holds the {@link Surface} onto which video will be - * rendered. The player will track the lifecycle of the surface automatically. - * - *

    The thread that calls the {@link SurfaceHolder.Callback} methods must be the thread - * associated with {@link #getApplicationLooper()}. - * - * @param surfaceHolder The surface holder. - */ + /** @deprecated Use {@link Player#setVideoSurfaceHolder(SurfaceHolder)} instead. */ + @Deprecated void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder); - /** - * Clears the {@link SurfaceHolder} that holds the {@link Surface} onto which video is being - * rendered if it matches the one passed. Else does nothing. - * - * @param surfaceHolder The surface holder to clear. - */ + /** @deprecated Use {@link Player#clearVideoSurfaceHolder(SurfaceHolder)} instead. */ + @Deprecated void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder); - /** - * Sets the {@link SurfaceView} onto which video will be rendered. The player will track the - * lifecycle of the surface automatically. - * - *

    The thread that calls the {@link SurfaceHolder.Callback} methods must be the thread - * associated with {@link #getApplicationLooper()}. - * - * @param surfaceView The surface view. - */ + /** @deprecated Use {@link Player#setVideoSurfaceView(SurfaceView)} instead. */ + @Deprecated void setVideoSurfaceView(@Nullable SurfaceView surfaceView); - /** - * Clears the {@link SurfaceView} onto which video is being rendered if it matches the one - * passed. Else does nothing. - * - * @param surfaceView The texture view to clear. - */ + /** @deprecated Use {@link Player#clearVideoSurfaceView(SurfaceView)} instead. */ + @Deprecated void clearVideoSurfaceView(@Nullable SurfaceView surfaceView); - /** - * Sets the {@link TextureView} onto which video will be rendered. The player will track the - * lifecycle of the surface automatically. - * - *

    The thread that calls the {@link TextureView.SurfaceTextureListener} methods must be the - * thread associated with {@link #getApplicationLooper()}. - * - * @param textureView The texture view. - */ + /** @deprecated Use {@link Player#setVideoTextureView(TextureView)} instead. */ + @Deprecated void setVideoTextureView(@Nullable TextureView textureView); - /** - * Clears the {@link TextureView} onto which video is being rendered if it matches the one - * passed. Else does nothing. - * - * @param textureView The texture view to clear. - */ + /** @deprecated Use {@link Player#clearVideoTextureView(TextureView)} instead. */ + @Deprecated void clearVideoTextureView(@Nullable TextureView textureView); - /** - * Gets the size of the video. - * - *

    The width and height of size could be 0 if there is no video or the size has not been - * determined yet. - * - * @see Listener#onVideoSizeChanged(VideoSize) - */ + /** @deprecated Use {@link Player#getVideoSize()} instead. */ + @Deprecated VideoSize getVideoSize(); } @@ -922,8 +846,12 @@ public interface ExoPlayer extends Player { @Deprecated AudioComponent getAudioComponent(); - /** Returns the component of this player for video output, or null if video is not supported. */ + /** + * @deprecated Use {@link ExoPlayer}, as the {@link VideoComponent} methods are part of the + * interface. + */ @Nullable + @Deprecated VideoComponent getVideoComponent(); /** @@ -1139,6 +1067,73 @@ public interface ExoPlayer extends Player { /** Returns whether skipping silences in the audio stream is enabled. */ boolean getSkipSilenceEnabled(); + /** + * Sets the {@link C.VideoScalingMode}. + * + *

    The scaling mode only applies if a {@link MediaCodec}-based video {@link Renderer} is + * enabled and if the output surface is owned by a {@link SurfaceView}. + * + * @param videoScalingMode The {@link C.VideoScalingMode}. + */ + void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode); + + /** Returns the {@link C.VideoScalingMode}. */ + @C.VideoScalingMode + int getVideoScalingMode(); + + /** + * Sets a {@link C.VideoChangeFrameRateStrategy} that will be used by the player when provided + * with a video output {@link Surface}. + * + *

    The strategy only applies if a {@link MediaCodec}-based video {@link Renderer} is enabled. + * Applications wishing to use {@link Surface#CHANGE_FRAME_RATE_ALWAYS} should set the mode to + * {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF} to disable calls to {@link Surface#setFrameRate} + * from ExoPlayer, and should then call {@link Surface#setFrameRate} directly from application + * code. + * + * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. + */ + void setVideoChangeFrameRateStrategy( + @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy); + + /** Returns the {@link C.VideoChangeFrameRateStrategy}. */ + @C.VideoChangeFrameRateStrategy + int getVideoChangeFrameRateStrategy(); + + /** + * Sets a listener to receive video frame metadata events. + * + *

    This method is intended to be called by the same component that sets the {@link Surface} + * onto which video will be rendered. If using ExoPlayer's standard UI components, this method + * should not be called directly from application code. + * + * @param listener The listener. + */ + void setVideoFrameMetadataListener(VideoFrameMetadataListener listener); + + /** + * Clears the listener which receives video frame metadata events if it matches the one passed. + * Else does nothing. + * + * @param listener The listener to clear. + */ + void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener); + + /** + * Sets a listener of camera motion events. + * + * @param listener The listener. + */ + void setCameraMotionListener(CameraMotionListener listener); + + /** + * Clears the listener which receives camera motion events if it matches the one passed. Else does + * nothing. + * + * @param listener The listener to clear. + */ + void clearCameraMotionListener(CameraMotionListener listener); + /** * Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message * will be delivered immediately without blocking on the playback thread. The default {@link diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 3cca960e3a..c9bb661cab 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -42,7 +42,9 @@ import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; +import com.google.android.exoplayer2.video.spherical.CameraMotionListener; import java.util.List; /** @@ -58,6 +60,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override + @Deprecated public VideoComponent getVideoComponent() { throw new UnsupportedOperationException(); } @@ -313,6 +316,46 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public void setVideoScalingMode(int videoScalingMode) { + throw new UnsupportedOperationException(); + } + + @Override + public int getVideoScalingMode() { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoChangeFrameRateStrategy(int videoChangeFrameRateStrategy) { + throw new UnsupportedOperationException(); + } + + @Override + public int getVideoChangeFrameRateStrategy() { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoFrameMetadataListener(VideoFrameMetadataListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void setCameraMotionListener(CameraMotionListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearCameraMotionListener(CameraMotionListener listener) { + throw new UnsupportedOperationException(); + } + @Override public void setShuffleModeEnabled(boolean shuffleModeEnabled) { throw new UnsupportedOperationException(); From 654a320792e22638ee4fb4da510961afec616102 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 25 Aug 2021 08:36:57 +0100 Subject: [PATCH 087/441] Remove stray symlinks These are unneeded for the external project #minor-release PiperOrigin-RevId: 392835942 --- library/extractor/src/main/proguard-rules.txt | 1 - library/ui/src/main/proguard-rules.txt | 1 - 2 files changed, 2 deletions(-) delete mode 120000 library/extractor/src/main/proguard-rules.txt delete mode 120000 library/ui/src/main/proguard-rules.txt diff --git a/library/extractor/src/main/proguard-rules.txt b/library/extractor/src/main/proguard-rules.txt deleted file mode 120000 index 499fb08b36..0000000000 --- a/library/extractor/src/main/proguard-rules.txt +++ /dev/null @@ -1 +0,0 @@ -../../proguard-rules.txt \ No newline at end of file diff --git a/library/ui/src/main/proguard-rules.txt b/library/ui/src/main/proguard-rules.txt deleted file mode 120000 index 499fb08b36..0000000000 --- a/library/ui/src/main/proguard-rules.txt +++ /dev/null @@ -1 +0,0 @@ -../../proguard-rules.txt \ No newline at end of file From 97466ab779fd730f7fa71f1a6a0c1b2590f01c0c Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 25 Aug 2021 09:44:27 +0100 Subject: [PATCH 088/441] TsExtractor: handle packets without PTS #minor-release Issue: #9294 PiperOrigin-RevId: 392844983 --- RELEASENOTES.md | 3 +++ .../android/exoplayer2/extractor/CeaUtil.java | 14 ++++++++------ .../android/exoplayer2/extractor/ts/Ac3Reader.java | 12 +++++++++--- .../android/exoplayer2/extractor/ts/Ac4Reader.java | 12 +++++++++--- .../exoplayer2/extractor/ts/AdtsReader.java | 12 +++++++++--- .../android/exoplayer2/extractor/ts/DtsReader.java | 12 +++++++++--- .../exoplayer2/extractor/ts/DvbSubtitleReader.java | 12 +++++++++--- .../exoplayer2/extractor/ts/H262Reader.java | 10 ++++++++-- .../exoplayer2/extractor/ts/H263Reader.java | 11 +++++++++-- .../exoplayer2/extractor/ts/H264Reader.java | 9 ++++++++- .../exoplayer2/extractor/ts/H265Reader.java | 9 ++++++++- .../android/exoplayer2/extractor/ts/Id3Reader.java | 10 ++++++++-- .../exoplayer2/extractor/ts/LatmReader.java | 12 +++++++++--- .../exoplayer2/extractor/ts/MpegAudioReader.java | 12 +++++++++--- 14 files changed, 115 insertions(+), 35 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e24920dd54..8e5a3406c5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,9 @@ * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Fix track selection in `StyledPlayerControlView` when using `ForwardingPlayer`. +* Extractors: + * Support TS packets without PTS flag + ([#9294](https://github.com/google/ExoPlayer/issues/9294)). * Android 12 compatibility: * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java index caf72df415..38e4ce1289 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java @@ -102,12 +102,14 @@ public final class CeaUtil { for (TrackOutput output : outputs) { ccDataBuffer.setPosition(sampleStartPosition); output.sampleData(ccDataBuffer, sampleLength); - output.sampleMetadata( - presentationTimeUs, - C.BUFFER_FLAG_KEY_FRAME, - sampleLength, - /* offset= */ 0, - /* encryptionData= */ null); + if (presentationTimeUs != C.TIME_UNSET) { + output.sampleMetadata( + presentationTimeUs, + C.BUFFER_FLAG_KEY_FRAME, + sampleLength, + /* offset= */ 0, + /* cryptoData= */ null); + } } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java index 262dab358c..1b40f0466a 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java @@ -85,6 +85,7 @@ public final class Ac3Reader implements ElementaryStreamReader { headerScratchBits = new ParsableBitArray(new byte[HEADER_SIZE]); headerScratchBytes = new ParsableByteArray(headerScratchBits.data); state = STATE_FINDING_SYNC; + timeUs = C.TIME_UNSET; this.language = language; } @@ -93,6 +94,7 @@ public final class Ac3Reader implements ElementaryStreamReader { state = STATE_FINDING_SYNC; bytesRead = 0; lastByteWas0B = false; + timeUs = C.TIME_UNSET; } @Override @@ -104,7 +106,9 @@ public final class Ac3Reader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -133,8 +137,10 @@ public final class Ac3Reader implements ElementaryStreamReader { output.sampleData(data, bytesToRead); bytesRead += bytesToRead; if (bytesRead == sampleSize) { - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); - timeUs += sampleDurationUs; + if (timeUs != C.TIME_UNSET) { + output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + timeUs += sampleDurationUs; + } state = STATE_FINDING_SYNC; } break; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java index 6581ecefdb..7b301c5864 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java @@ -87,6 +87,7 @@ public final class Ac4Reader implements ElementaryStreamReader { bytesRead = 0; lastByteWasAC = false; hasCRC = false; + timeUs = C.TIME_UNSET; this.language = language; } @@ -96,6 +97,7 @@ public final class Ac4Reader implements ElementaryStreamReader { bytesRead = 0; lastByteWasAC = false; hasCRC = false; + timeUs = C.TIME_UNSET; } @Override @@ -107,7 +109,9 @@ public final class Ac4Reader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -136,8 +140,10 @@ public final class Ac4Reader implements ElementaryStreamReader { output.sampleData(data, bytesToRead); bytesRead += bytesToRead; if (bytesRead == sampleSize) { - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); - timeUs += sampleDurationUs; + if (timeUs != C.TIME_UNSET) { + output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + timeUs += sampleDurationUs; + } state = STATE_FINDING_SYNC; } break; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java index 0e1a1ed783..6750f9f4e7 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java @@ -114,6 +114,7 @@ public final class AdtsReader implements ElementaryStreamReader { firstFrameVersion = VERSION_UNSET; firstFrameSampleRateIndex = C.INDEX_UNSET; sampleDurationUs = C.TIME_UNSET; + timeUs = C.TIME_UNSET; this.exposeId3 = exposeId3; this.language = language; } @@ -125,6 +126,7 @@ public final class AdtsReader implements ElementaryStreamReader { @Override public void seek() { + timeUs = C.TIME_UNSET; resetSync(); } @@ -149,7 +151,9 @@ public final class AdtsReader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -529,8 +533,10 @@ public final class AdtsReader implements ElementaryStreamReader { currentOutput.sampleData(data, bytesToRead); bytesRead += bytesToRead; if (bytesRead == sampleSize) { - currentOutput.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); - timeUs += currentSampleDuration; + if (timeUs != C.TIME_UNSET) { + currentOutput.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + timeUs += currentSampleDuration; + } setFindingSampleState(); } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DtsReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DtsReader.java index 0a10aa7790..5fb5eb9a9b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DtsReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DtsReader.java @@ -66,6 +66,7 @@ public final class DtsReader implements ElementaryStreamReader { public DtsReader(@Nullable String language) { headerScratchBytes = new ParsableByteArray(new byte[HEADER_SIZE]); state = STATE_FINDING_SYNC; + timeUs = C.TIME_UNSET; this.language = language; } @@ -74,6 +75,7 @@ public final class DtsReader implements ElementaryStreamReader { state = STATE_FINDING_SYNC; bytesRead = 0; syncBytes = 0; + timeUs = C.TIME_UNSET; } @Override @@ -85,7 +87,9 @@ public final class DtsReader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -111,8 +115,10 @@ public final class DtsReader implements ElementaryStreamReader { output.sampleData(data, bytesToRead); bytesRead += bytesToRead; if (bytesRead == sampleSize) { - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); - timeUs += sampleDurationUs; + if (timeUs != C.TIME_UNSET) { + output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + timeUs += sampleDurationUs; + } state = STATE_FINDING_SYNC; } break; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitleReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitleReader.java index 34552c3089..b2a54a0ec8 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitleReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitleReader.java @@ -43,11 +43,13 @@ public final class DvbSubtitleReader implements ElementaryStreamReader { public DvbSubtitleReader(List subtitleInfos) { this.subtitleInfos = subtitleInfos; outputs = new TrackOutput[subtitleInfos.size()]; + sampleTimeUs = C.TIME_UNSET; } @Override public void seek() { writingSample = false; + sampleTimeUs = C.TIME_UNSET; } @Override @@ -73,7 +75,9 @@ public final class DvbSubtitleReader implements ElementaryStreamReader { return; } writingSample = true; - sampleTimeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + sampleTimeUs = pesTimeUs; + } sampleBytesWritten = 0; bytesToCheck = 2; } @@ -81,8 +85,10 @@ public final class DvbSubtitleReader implements ElementaryStreamReader { @Override public void packetFinished() { if (writingSample) { - for (TrackOutput output : outputs) { - output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleBytesWritten, 0, null); + if (sampleTimeUs != C.TIME_UNSET) { + for (TrackOutput output : outputs) { + output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleBytesWritten, 0, null); + } } writingSample = false; } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java index c42c3557e8..99b9ec722a 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java @@ -87,6 +87,8 @@ public final class H262Reader implements ElementaryStreamReader { userData = null; userDataParsable = null; } + pesTimeUs = C.TIME_UNSET; + sampleTimeUs = C.TIME_UNSET; } @Override @@ -98,6 +100,8 @@ public final class H262Reader implements ElementaryStreamReader { } totalBytesWritten = 0; startedFirstSample = false; + pesTimeUs = C.TIME_UNSET; + sampleTimeUs = C.TIME_UNSET; } @Override @@ -182,7 +186,7 @@ public final class H262Reader implements ElementaryStreamReader { } if (startCodeValue == START_PICTURE || startCodeValue == START_SEQUENCE_HEADER) { int bytesWrittenPastStartCode = limit - startCodeOffset; - if (startedFirstSample && sampleHasPicture && hasOutputFormat) { + if (sampleHasPicture && hasOutputFormat && sampleTimeUs != C.TIME_UNSET) { // Output the sample. @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; int size = (int) (totalBytesWritten - samplePosition) - bytesWrittenPastStartCode; @@ -194,7 +198,9 @@ public final class H262Reader implements ElementaryStreamReader { sampleTimeUs = pesTimeUs != C.TIME_UNSET ? pesTimeUs - : (startedFirstSample ? (sampleTimeUs + frameDurationUs) : 0); + : (sampleTimeUs != C.TIME_UNSET + ? (sampleTimeUs + frameDurationUs) + : C.TIME_UNSET); sampleIsKeyframe = false; pesTimeUs = C.TIME_UNSET; startedFirstSample = true; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java index 4db898553c..39660c106e 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java @@ -87,6 +87,7 @@ public final class H263Reader implements ElementaryStreamReader { this.userDataReader = userDataReader; prefixFlags = new boolean[4]; csdBuffer = new CsdBuffer(128); + pesTimeUs = C.TIME_UNSET; if (userDataReader != null) { userData = new NalUnitTargetBuffer(START_CODE_VALUE_USER_DATA, 128); userDataParsable = new ParsableByteArray(); @@ -107,6 +108,7 @@ public final class H263Reader implements ElementaryStreamReader { userData.reset(); } totalBytesWritten = 0; + pesTimeUs = C.TIME_UNSET; } @Override @@ -123,7 +125,9 @@ public final class H263Reader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { // TODO (Internal b/32267012): Consider using random access indicator. - this.pesTimeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + this.pesTimeUs = pesTimeUs; + } } @Override @@ -462,7 +466,10 @@ public final class H263Reader implements ElementaryStreamReader { } public void onDataEnd(long position, int bytesWrittenPastPosition, boolean hasOutputFormat) { - if (startCodeValue == START_CODE_VALUE_VOP && hasOutputFormat && readingSample) { + if (startCodeValue == START_CODE_VALUE_VOP + && hasOutputFormat + && readingSample + && sampleTimeUs != C.TIME_UNSET) { int size = (int) (position - samplePosition); @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; output.sampleMetadata( diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java index 6790747ac9..1f8469ef52 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java @@ -86,6 +86,7 @@ public final class H264Reader implements ElementaryStreamReader { sps = new NalUnitTargetBuffer(NAL_UNIT_TYPE_SPS, 128); pps = new NalUnitTargetBuffer(NAL_UNIT_TYPE_PPS, 128); sei = new NalUnitTargetBuffer(NAL_UNIT_TYPE_SEI, 128); + pesTimeUs = C.TIME_UNSET; seiWrapper = new ParsableByteArray(); } @@ -93,6 +94,7 @@ public final class H264Reader implements ElementaryStreamReader { public void seek() { totalBytesWritten = 0; randomAccessIndicator = false; + pesTimeUs = C.TIME_UNSET; NalUnitUtil.clearPrefixFlags(prefixFlags); sps.reset(); pps.reset(); @@ -113,7 +115,9 @@ public final class H264Reader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - this.pesTimeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + this.pesTimeUs = pesTimeUs; + } randomAccessIndicator |= (flags & FLAG_RANDOM_ACCESS_INDICATOR) != 0; } @@ -495,6 +499,9 @@ public final class H264Reader implements ElementaryStreamReader { } private void outputSample(int offset) { + if (sampleTimeUs == C.TIME_UNSET) { + return; + } @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; int size = (int) (nalUnitStartPosition - samplePosition); output.sampleMetadata(sampleTimeUs, flags, size, offset, null); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java index 9dccd88280..b47878c868 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java @@ -85,12 +85,14 @@ public final class H265Reader implements ElementaryStreamReader { pps = new NalUnitTargetBuffer(PPS_NUT, 128); prefixSei = new NalUnitTargetBuffer(PREFIX_SEI_NUT, 128); suffixSei = new NalUnitTargetBuffer(SUFFIX_SEI_NUT, 128); + pesTimeUs = C.TIME_UNSET; seiWrapper = new ParsableByteArray(); } @Override public void seek() { totalBytesWritten = 0; + pesTimeUs = C.TIME_UNSET; NalUnitUtil.clearPrefixFlags(prefixFlags); vps.reset(); sps.reset(); @@ -114,7 +116,9 @@ public final class H265Reader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { // TODO (Internal b/32267012): Consider using random access indicator. - this.pesTimeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + this.pesTimeUs = pesTimeUs; + } } @Override @@ -536,6 +540,9 @@ public final class H265Reader implements ElementaryStreamReader { } private void outputSample(int offset) { + if (sampleTimeUs == C.TIME_UNSET) { + return; + } @C.BufferFlags int flags = sampleIsKeyframe ? C.BUFFER_FLAG_KEY_FRAME : 0; int size = (int) (nalUnitPosition - samplePosition); output.sampleMetadata(sampleTimeUs, flags, size, offset, null); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Id3Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Id3Reader.java index 74937ddce9..4f6915f6b1 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Id3Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Id3Reader.java @@ -49,11 +49,13 @@ public final class Id3Reader implements ElementaryStreamReader { public Id3Reader() { id3Header = new ParsableByteArray(ID3_HEADER_LENGTH); + sampleTimeUs = C.TIME_UNSET; } @Override public void seek() { writingSample = false; + sampleTimeUs = C.TIME_UNSET; } @Override @@ -73,7 +75,9 @@ public final class Id3Reader implements ElementaryStreamReader { return; } writingSample = true; - sampleTimeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + sampleTimeUs = pesTimeUs; + } sampleSize = 0; sampleBytesRead = 0; } @@ -120,7 +124,9 @@ public final class Id3Reader implements ElementaryStreamReader { if (!writingSample || sampleSize == 0 || sampleBytesRead != sampleSize) { return; } - output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + if (sampleTimeUs != C.TIME_UNSET) { + output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); + } writingSample = false; } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java index 8cd33f2851..b03c91ab32 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java @@ -78,11 +78,13 @@ public final class LatmReader implements ElementaryStreamReader { this.language = language; sampleDataBuffer = new ParsableByteArray(INITIAL_BUFFER_SIZE); sampleBitArray = new ParsableBitArray(sampleDataBuffer.getData()); + timeUs = C.TIME_UNSET; } @Override public void seek() { state = STATE_FINDING_SYNC_1; + timeUs = C.TIME_UNSET; streamMuxRead = false; } @@ -95,7 +97,9 @@ public final class LatmReader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -306,8 +310,10 @@ public final class LatmReader implements ElementaryStreamReader { sampleDataBuffer.setPosition(0); } output.sampleData(sampleDataBuffer, muxLengthBytes); - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, muxLengthBytes, 0, null); - timeUs += sampleDurationUs; + if (timeUs != C.TIME_UNSET) { + output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, muxLengthBytes, 0, null); + timeUs += sampleDurationUs; + } } private void resetBufferForSize(int newSize) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/MpegAudioReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/MpegAudioReader.java index a3e0712332..db02d9f697 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/MpegAudioReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/MpegAudioReader.java @@ -69,6 +69,7 @@ public final class MpegAudioReader implements ElementaryStreamReader { headerScratch = new ParsableByteArray(4); headerScratch.getData()[0] = (byte) 0xFF; header = new MpegAudioUtil.Header(); + timeUs = C.TIME_UNSET; this.language = language; } @@ -77,6 +78,7 @@ public final class MpegAudioReader implements ElementaryStreamReader { state = STATE_FINDING_HEADER; frameBytesRead = 0; lastByteWasFF = false; + timeUs = C.TIME_UNSET; } @Override @@ -88,7 +90,9 @@ public final class MpegAudioReader implements ElementaryStreamReader { @Override public void packetStarted(long pesTimeUs, @TsPayloadReader.Flags int flags) { - timeUs = pesTimeUs; + if (pesTimeUs != C.TIME_UNSET) { + timeUs = pesTimeUs; + } } @Override @@ -227,8 +231,10 @@ public final class MpegAudioReader implements ElementaryStreamReader { return; } - output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, frameSize, 0, null); - timeUs += frameDurationUs; + if (timeUs != C.TIME_UNSET) { + output.sampleMetadata(timeUs, C.BUFFER_FLAG_KEY_FRAME, frameSize, 0, null); + timeUs += frameDurationUs; + } frameBytesRead = 0; state = STATE_FINDING_HEADER; } From 66c85245e6c346975730ed31a10cbb0c3475a253 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 25 Aug 2021 11:52:08 +0100 Subject: [PATCH 089/441] Improve javadoc deprecation for ExoPlayer Components. PiperOrigin-RevId: 392861577 --- .../google/android/exoplayer2/ExoPlayer.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 9df0d71fd4..62b5347ece 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -140,7 +140,10 @@ import java.util.List; */ public interface ExoPlayer extends Player { - /** @deprecated Use the methods in {@link ExoPlayer} instead. */ + /** + * @deprecated Use {@link ExoPlayer}, as the {@link AudioComponent} methods are defined by that + * interface. + */ @Deprecated interface AudioComponent { @@ -277,8 +280,8 @@ public interface ExoPlayer extends Player { } /** - * @deprecated Use {@link Player} instead, as the {@link TextComponent} methods are a part of the - * {@link Player interface}. + * @deprecated Use {@link Player}, as the {@link TextComponent} methods are defined by that + * interface. */ @Deprecated interface TextComponent { @@ -289,8 +292,8 @@ public interface ExoPlayer extends Player { } /** - * @deprecated Use {@link Player} instead, as the {@link DeviceComponent} methods are a part of - * the {@link Player} interface. + * @deprecated Use {@link Player}, as the {@link DeviceComponent} methods are defined by that + * interface. */ @Deprecated interface DeviceComponent { @@ -839,7 +842,7 @@ public interface ExoPlayer extends Player { ExoPlaybackException getPlayerError(); /** - * @deprecated Use {@link ExoPlayer}, as the {@link AudioComponent} methods are part of the + * @deprecated Use {@link ExoPlayer}, as the {@link AudioComponent} methods are defined by that * interface. */ @Nullable @@ -847,7 +850,7 @@ public interface ExoPlayer extends Player { AudioComponent getAudioComponent(); /** - * @deprecated Use {@link ExoPlayer}, as the {@link VideoComponent} methods are part of the + * @deprecated Use {@link ExoPlayer}, as the {@link VideoComponent} methods are defined by that * interface. */ @Nullable @@ -855,15 +858,19 @@ public interface ExoPlayer extends Player { VideoComponent getVideoComponent(); /** - * @deprecated Use {@link Player}, as the {@link TextComponent} methods are a part of the {@link - * Player interface}. + * @deprecated Use {@link Player}, as the {@link TextComponent} methods are defined by that + * interface. */ @Nullable @Deprecated TextComponent getTextComponent(); - /** Returns the component of this player for playback device, or null if it's not supported. */ + /** + * @deprecated Use {@link Player}, as the {@link DeviceComponent} methods are defined by that + * interface. + */ @Nullable + @Deprecated DeviceComponent getDeviceComponent(); /** From 9fad5f41300861978337e1020f09805cc11e33ab Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 25 Aug 2021 16:17:07 +0100 Subject: [PATCH 090/441] Add Track selection to the Player API This cl doesn't implement completely the API for `ExoPlayerImpl` as `onTrackSelectionParametersChanged` is not called. The follow up cl adds `TrackSelectionParameters` in PlaybackInfo to correctly propagate the change event and mask it. Additionally `TrackSelectionParameters` is serialized as a Parcelable for now. It is transitioned to bundleable in a follow up cl. PiperOrigin-RevId: 392899918 --- .../exoplayer2/ext/cast/CastPlayer.java | 9 ++ .../exoplayer2/ext/ima/FakePlayer.java | 9 ++ .../android/exoplayer2/ForwardingPlayer.java | 16 +++ .../com/google/android/exoplayer2/Player.java | 49 ++++++++- .../TrackSelectionParameters.java | 91 +++++++++++----- .../android/exoplayer2/ExoPlayerImpl.java | 19 ++++ .../android/exoplayer2/SimpleExoPlayer.java | 13 +++ .../trackselection/DefaultTrackSelector.java | 101 +++++++++++------- .../trackselection/TrackSelector.java | 26 +++++ .../android/exoplayer2/ExoPlayerTest.java | 5 +- .../exoplayer2/testutil/StubExoPlayer.java | 11 ++ 11 files changed, 277 insertions(+), 72 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 246c69e8da..13155478e4 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -44,6 +44,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ListenerSet; @@ -542,6 +543,14 @@ public final class CastPlayer extends BasePlayer { return currentTrackGroups; } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) {} + @Deprecated @Override public ImmutableList getCurrentStaticMetadata() { diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index 0582423a91..152292168e 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.testutil.StubExoPlayer; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ListenerSet; @@ -231,6 +232,14 @@ import com.google.android.exoplayer2.util.ListenerSet; return new TrackSelectionArray(); } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) {} + @Override public Timeline getCurrentTimeline() { return timeline; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index f4467a180b..b0b9eff834 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.video.VideoSize; import java.util.List; @@ -371,6 +372,16 @@ public class ForwardingPlayer implements Player { return player.getCurrentTrackSelections(); } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + return player.getTrackSelectionParameters(); + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + player.setTrackSelectionParameters(parameters); + } + @Deprecated @Override public List getCurrentStaticMetadata() { @@ -683,6 +694,11 @@ public class ForwardingPlayer implements Player { eventListener.onAvailableCommandsChanged(availableCommands); } + @Override + public void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) { + eventListener.onTrackSelectionParametersChanged(parameters); + } + @Override public void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) { eventListener.onPlayerStateChanged(playWhenReady, playbackState); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 591f67288f..1bd4e690c4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.util.FlagSet; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -175,6 +176,16 @@ public interface Player { */ default void onAvailableCommandsChanged(Commands availableCommands) {} + /** + * Called when the value returned from {@link #getTrackSelectionParameters()} changes. + * + *

    {@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * + * @param parameters The new {@link TrackSelectionParameters}. + */ + default void onTrackSelectionParametersChanged(TrackSelectionParameters parameters) {} + /** * @deprecated Use {@link #onPlaybackStateChanged(int)} and {@link * #onPlayWhenReadyChanged(boolean, int)} instead. @@ -648,7 +659,8 @@ public interface Player { COMMAND_SET_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_SET_VIDEO_SURFACE, - COMMAND_GET_TEXT + COMMAND_GET_TEXT, + COMMAND_SET_TRACK_SELECTION_PARAMETERS, }; private final FlagSet.Builder flagsBuilder; @@ -1226,7 +1238,8 @@ public interface Player { EVENT_PLAYLIST_METADATA_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, - EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED + EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, + EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, }) @interface Event {} /** {@link #getCurrentTimeline()} changed. */ @@ -1272,6 +1285,8 @@ public interface Player { int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 18; /** {@link #getMaxSeekToPreviousPosition()} changed. */ int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 19; + /** {@link #getTrackSelectionParameters()} changed. */ + int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 20; /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link @@ -1286,7 +1301,8 @@ public interface Player { * #COMMAND_CHANGE_MEDIA_ITEMS}, {@link #COMMAND_GET_AUDIO_ATTRIBUTES}, {@link * #COMMAND_GET_VOLUME}, {@link #COMMAND_GET_DEVICE_VOLUME}, {@link #COMMAND_SET_VOLUME}, {@link * #COMMAND_SET_DEVICE_VOLUME}, {@link #COMMAND_ADJUST_DEVICE_VOLUME}, {@link - * #COMMAND_SET_VIDEO_SURFACE} or {@link #COMMAND_GET_TEXT}. + * #COMMAND_SET_VIDEO_SURFACE}, {@link #COMMAND_GET_TEXT} or {@link + * #COMMAND_SET_TRACK_SELECTION_PARAMETERS}. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -1318,7 +1334,8 @@ public interface Player { COMMAND_SET_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_SET_VIDEO_SURFACE, - COMMAND_GET_TEXT + COMMAND_GET_TEXT, + COMMAND_SET_TRACK_SELECTION_PARAMETERS, }) @interface Command {} /** Command to start, pause or resume playback. */ @@ -1375,6 +1392,8 @@ public interface Player { int COMMAND_SET_VIDEO_SURFACE = 26; /** Command to get the text that should currently be displayed by the player. */ int COMMAND_GET_TEXT = 27; + /** Command to set the player's track selection parameters. */ + int COMMAND_SET_TRACK_SELECTION_PARAMETERS = 28; /** Represents an invalid {@link Command}. */ int COMMAND_INVALID = -1; @@ -1951,6 +1970,28 @@ public interface Player { */ TrackSelectionArray getCurrentTrackSelections(); + /** Returns the parameters constraining the track selection. */ + TrackSelectionParameters getTrackSelectionParameters(); + + /** + * Sets the parameters constraining the track selection. + * + *

    Unsupported parameters will be silently ignored. + * + *

    Use {@link #getTrackSelectionParameters()} to retrieve the current parameters. For example, + * the following snippet restricts video to SD whilst keep other track selection parameters + * unchanged: + * + *

    {@code
    +   * player.setTrackSelectionParameters(
    +   *   player.getTrackSelectionParameters()
    +   *         .buildUpon()
    +   *         .setMaxVideoSizeSd()
    +   *         .build())
    +   * }
    + */ + void setTrackSelectionParameters(TrackSelectionParameters parameters); + /** * @deprecated Use {@link #getMediaMetadata()} and {@link * Listener#onMediaMetadataChanged(MediaMetadata)} for access to structured metadata, or diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index e62e93893b..53b52af133 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -35,8 +35,28 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Locale; +import org.checkerframework.checker.initialization.qual.UnknownInitialization; +import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -/** Constraint parameters for track selection. */ +/** + * Constraint parameters for track selection. + * + *

    For example the following code modifies the parameters to restrict video track selections to + * SD, and to select a German audio track if there is one: + * + *

    {@code
    + * // Build on the current parameters.
    + * TrackSelectionParameters currentParameters = player.getTrackSelectionParameters()
    + * // Build the resulting parameters.
    + * TrackSelectionParameters newParameters = currentParameters
    + *     .buildUpon()
    + *     .setMaxVideoSizeSd()
    + *     .setPreferredAudioLanguage("deu")
    + *     .build();
    + * // Set the new parameters.
    + * player.setTrackSelectionParameters(newParameters);
    + * }
    + */ public class TrackSelectionParameters implements Bundleable { /** @@ -115,32 +135,7 @@ public class TrackSelectionParameters implements Bundleable { /** Creates a builder with the initial values specified in {@code initialValues}. */ protected Builder(TrackSelectionParameters initialValues) { - // Video - maxVideoWidth = initialValues.maxVideoWidth; - maxVideoHeight = initialValues.maxVideoHeight; - maxVideoFrameRate = initialValues.maxVideoFrameRate; - maxVideoBitrate = initialValues.maxVideoBitrate; - minVideoWidth = initialValues.minVideoWidth; - minVideoHeight = initialValues.minVideoHeight; - minVideoFrameRate = initialValues.minVideoFrameRate; - minVideoBitrate = initialValues.minVideoBitrate; - viewportWidth = initialValues.viewportWidth; - viewportHeight = initialValues.viewportHeight; - viewportOrientationMayChange = initialValues.viewportOrientationMayChange; - preferredVideoMimeTypes = initialValues.preferredVideoMimeTypes; - // Audio - preferredAudioLanguages = initialValues.preferredAudioLanguages; - preferredAudioRoleFlags = initialValues.preferredAudioRoleFlags; - maxAudioChannelCount = initialValues.maxAudioChannelCount; - maxAudioBitrate = initialValues.maxAudioBitrate; - preferredAudioMimeTypes = initialValues.preferredAudioMimeTypes; - // Text - preferredTextLanguages = initialValues.preferredTextLanguages; - preferredTextRoleFlags = initialValues.preferredTextRoleFlags; - selectUndeterminedTextLanguage = initialValues.selectUndeterminedTextLanguage; - // General - forceLowestBitrate = initialValues.forceLowestBitrate; - forceHighestSupportedBitrate = initialValues.forceHighestSupportedBitrate; + init(initialValues); } /** Creates a builder with the initial values specified in {@code bundle}. */ @@ -226,6 +221,48 @@ public class TrackSelectionParameters implements Bundleable { DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); } + /** Overrides the value of the builder with the value of {@link TrackSelectionParameters}. */ + @EnsuresNonNull({ + "preferredVideoMimeTypes", + "preferredAudioLanguages", + "preferredAudioMimeTypes", + "preferredTextLanguages" + }) + private void init(@UnknownInitialization Builder this, TrackSelectionParameters parameters) { + // Video + maxVideoWidth = parameters.maxVideoWidth; + maxVideoHeight = parameters.maxVideoHeight; + maxVideoFrameRate = parameters.maxVideoFrameRate; + maxVideoBitrate = parameters.maxVideoBitrate; + minVideoWidth = parameters.minVideoWidth; + minVideoHeight = parameters.minVideoHeight; + minVideoFrameRate = parameters.minVideoFrameRate; + minVideoBitrate = parameters.minVideoBitrate; + viewportWidth = parameters.viewportWidth; + viewportHeight = parameters.viewportHeight; + viewportOrientationMayChange = parameters.viewportOrientationMayChange; + preferredVideoMimeTypes = parameters.preferredVideoMimeTypes; + // Audio + preferredAudioLanguages = parameters.preferredAudioLanguages; + preferredAudioRoleFlags = parameters.preferredAudioRoleFlags; + maxAudioChannelCount = parameters.maxAudioChannelCount; + maxAudioBitrate = parameters.maxAudioBitrate; + preferredAudioMimeTypes = parameters.preferredAudioMimeTypes; + // Text + preferredTextLanguages = parameters.preferredTextLanguages; + preferredTextRoleFlags = parameters.preferredTextRoleFlags; + selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage; + // General + forceLowestBitrate = parameters.forceLowestBitrate; + forceHighestSupportedBitrate = parameters.forceHighestSupportedBitrate; + } + + /** Overrides the value of the builder with the value of {@link TrackSelectionParameters}. */ + protected Builder set(TrackSelectionParameters parameters) { + init(parameters); + return this; + } + // Video /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index f97544fd75..204485ae58 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -43,6 +43,7 @@ import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelectorResult; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -210,6 +211,7 @@ import java.util.concurrent.CopyOnWriteArraySet; COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_CHANGE_MEDIA_ITEMS) + .addIf(COMMAND_SET_TRACK_SELECTION_PARAMETERS, trackSelector.isSetParametersSupported()) .addAll(additionalPermanentAvailableCommands) .build(); availableCommands = @@ -951,6 +953,23 @@ import java.util.concurrent.CopyOnWriteArraySet; return playbackInfo.staticMetadata; } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + return trackSelector.getParameters(); + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + if (!trackSelector.isSetParametersSupported() + || parameters.equals(trackSelector.getParameters())) { + return; + } + trackSelector.setParameters(parameters); + listeners.queueEvent( + EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, + listener -> listener.onTrackSelectionParametersChanged(parameters)); + } + @Override public MediaMetadata getMediaMetadata() { return mediaMetadata; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index b822761f88..f5c122e7a3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -65,6 +65,7 @@ import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; @@ -1449,6 +1450,18 @@ public class SimpleExoPlayer extends BasePlayer return player.getCurrentTrackSelections(); } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + verifyApplicationThread(); + return player.getTrackSelectionParameters(); + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + verifyApplicationThread(); + player.setTrackSelectionParameters(parameters); + } + @Deprecated @Override public List getCurrentStaticMetadata() { 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 cca7bc1873..abc32232a7 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 @@ -61,7 +61,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; /** * A default {@link TrackSelector} suitable for most use cases. Track selections are made according * to configurable {@link Parameters}, which can be set by calling {@link - * #setParameters(Parameters)}. + * Player#setTrackSelectionParameters}. * *

    Modifying parameters

    * @@ -73,25 +73,26 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; * *
    {@code
      * // Build on the current parameters.
    - * Parameters currentParameters = trackSelector.getParameters();
    + * TrackSelectionParameters currentParameters = player.getTrackSelectionParameters();
      * // Build the resulting parameters.
    - * Parameters newParameters = currentParameters
    + * TrackSelectionParameters newParameters = currentParameters
      *     .buildUpon()
      *     .setMaxVideoSizeSd()
      *     .setPreferredAudioLanguage("deu")
      *     .build();
      * // Set the new parameters.
    - * trackSelector.setParameters(newParameters);
    + * player.setTrackSelectionParameters(newParameters);
      * }
    * * Convenience methods and chaining allow this to be written more concisely as: * *
    {@code
    - * trackSelector.setParameters(
    - *     trackSelector
    - *         .buildUponParameters()
    + * player.setTrackSelectionParameters(
    + *     player.getTrackSelectionParameters()
    + *         .buildUpon()
      *         .setMaxVideoSizeSd()
    - *         .setPreferredAudioLanguage("deu"));
    + *         .setPreferredAudioLanguage("deu")
    + *         .build());
      * }
    * * Selection {@link Parameters} support many different options, some of which are described below. @@ -117,10 +118,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; * *
    {@code
      * SelectionOverride selectionOverride = new SelectionOverride(groupIndex, trackIndices);
    - * trackSelector.setParameters(
    - *     trackSelector
    - *         .buildUponParameters()
    - *         .setSelectionOverride(rendererIndex, rendererTrackGroups, selectionOverride));
    + * player.setTrackSelectionParameters(
    + *     ((Parameters)player.getTrackSelectionParameters())
    + *         .buildUpon()
    + *         .setSelectionOverride(rendererIndex, rendererTrackGroups, selectionOverride)
    + *         .build());
      * }
    * *

    Constraint based track selection

    @@ -132,11 +134,12 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; * a simpler and more flexible approach is to specify these constraints directly: * *
    {@code
    - * trackSelector.setParameters(
    - *     trackSelector
    - *         .buildUponParameters()
    + * player.setTrackSelectionParameters(
    + *     player.getTrackSelectionParameters()
    + *         .buildUpon()
      *         .setMaxVideoSizeSd()
    - *         .setPreferredAudioLanguage("deu"));
    + *         .setPreferredAudioLanguage("deu")
    + *         .build());
      * }
    * * There are several benefits to using constraint based track selection instead of specific track @@ -301,7 +304,13 @@ public class DefaultTrackSelector extends MappingTrackSelector { setSelectionOverridesFromBundle(bundle); rendererDisabledFlags = new SparseBooleanArray(); - setRendererDisableFlagsFromBundle(bundle); + setRendererDisabledFlagsFromBundle(bundle); + } + + @Override + protected ParametersBuilder set(TrackSelectionParameters parameters) { + super.set(parameters); + return this; } // Video @@ -819,7 +828,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { } } - private void setRendererDisableFlagsFromBundle(Bundle bundle) { + private void setRendererDisabledFlagsFromBundle(Bundle bundle) { int[] rendererIndexes = bundle.getIntArray(Parameters.keyForField(Parameters.FIELD_RENDERER_DISABLED_INDEXES)); if (rendererIndexes == null) { @@ -1151,9 +1160,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { } /** - * Bundles selection overrides in 3 arrays of equal length. Each triplet of matching index is - - * the selection override (stored in a sparse array as they can be null) - the trackGroupArray - * of that override - the rendererIndex of that override + * Bundles selection overrides in 3 arrays of equal length. Each triplet of matching indices is: + * the selection override (stored in a sparse array as they can be null), the trackGroupArray of + * that override, the rendererIndex of that override. */ private static void putSelectionOverridesToBundle( Bundle bundle, @@ -1403,16 +1412,25 @@ public class DefaultTrackSelector extends MappingTrackSelector { parametersReference = new AtomicReference<>(parameters); } - /** - * Atomically sets the provided parameters for track selection. - * - * @param parameters The parameters for track selection. - */ - public void setParameters(Parameters parameters) { - Assertions.checkNotNull(parameters); - if (!parametersReference.getAndSet(parameters).equals(parameters)) { - invalidate(); + @Override + public Parameters getParameters() { + return parametersReference.get(); + } + + @Override + public boolean isSetParametersSupported() { + return true; + } + + @Override + public void setParameters(TrackSelectionParameters parameters) { + if (parameters instanceof Parameters) { + setParametersInternal((Parameters) parameters); } + // Only add the fields of `TrackSelectionParameters` to `parameters`. + Parameters mergedParameters = + new ParametersBuilder(parametersReference.get()).set(parameters).build(); + setParametersInternal(mergedParameters); } /** @@ -1421,16 +1439,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * @param parametersBuilder A builder from which to obtain the parameters for track selection. */ public void setParameters(ParametersBuilder parametersBuilder) { - setParameters(parametersBuilder.build()); - } - - /** - * Gets the current selection parameters. - * - * @return The current selection parameters. - */ - public Parameters getParameters() { - return parametersReference.get(); + setParametersInternal(parametersBuilder.build()); } /** Returns a new {@link ParametersBuilder} initialized with the current selection parameters. */ @@ -1438,6 +1447,18 @@ public class DefaultTrackSelector extends MappingTrackSelector { return getParameters().buildUpon(); } + /** + * Atomically sets the provided {@link Parameters} for track selection. + * + * @param parameters The parameters for track selection. + */ + private void setParametersInternal(Parameters parameters) { + Assertions.checkNotNull(parameters); + if (!parametersReference.getAndSet(parameters).equals(parameters)) { + invalidate(); + } + } + // MappingTrackSelector implementation. @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java index 88736c0a1c..3758798302 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java @@ -136,6 +136,32 @@ public abstract class TrackSelector { */ public abstract void onSelectionActivated(@Nullable Object info); + /** Returns the current parameters for track selection. */ + public TrackSelectionParameters getParameters() { + return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; + } + + /** + * Called by the player to provide parameters for track selection. + * + *

    Only supported if {@link #isSetParametersSupported()} returns true. + * + * @param parameters The parameters for track selection. + */ + public void setParameters(TrackSelectionParameters parameters) { + // Default implementation doesn't support this method. + } + + /** + * Returns if this {@code TrackSelector} supports {@link + * #setParameters(TrackSelectionParameters)}. + * + *

    The same value is always returned for a given {@code TrackSelector} instance. + */ + public boolean isSetParametersSupported() { + return false; + } + /** * Calls {@link InvalidationListener#onTrackSelectionsInvalidated()} to invalidate all previously * generated track selections. diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 69483fe91c..cefe878377 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -40,6 +40,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SET_MEDIA_ITEMS_METAD import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE; import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH; +import static com.google.android.exoplayer2.Player.COMMAND_SET_TRACK_SELECTION_PARAMETERS; import static com.google.android.exoplayer2.Player.COMMAND_SET_VIDEO_SURFACE; import static com.google.android.exoplayer2.Player.COMMAND_SET_VOLUME; import static com.google.android.exoplayer2.Player.STATE_ENDED; @@ -8203,6 +8204,7 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SET_VIDEO_SURFACE)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_GET_TEXT)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SET_TRACK_SELECTION_PARAMETERS)).isTrue(); } @Test @@ -10886,7 +10888,8 @@ public final class ExoPlayerTest { COMMAND_SET_DEVICE_VOLUME, COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_SET_VIDEO_SURFACE, - COMMAND_GET_TEXT); + COMMAND_GET_TEXT, + COMMAND_SET_TRACK_SELECTION_PARAMETERS); if (!isTimelineEmpty) { builder.add(COMMAND_SEEK_TO_PREVIOUS); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index c9bb661cab..beac8467b6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -40,6 +40,7 @@ import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; @@ -452,6 +453,16 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + throw new UnsupportedOperationException(); + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + throw new UnsupportedOperationException(); + } + @Deprecated @Override public List getCurrentStaticMetadata() { From e5a39eca1e7e186d4ee31822c123c62b01873155 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 25 Aug 2021 17:27:14 +0100 Subject: [PATCH 091/441] Fix incorrect DataSourceContractTest test names These should have been updated as part of https://github.com/google/ExoPlayer/commit/1affbf9357c061149b3cb287972ea0157d1b6735 #minor-release PiperOrigin-RevId: 392913561 --- .../exoplayer2/upstream/UdpDataSourceContractTest.java | 4 ++-- .../android/exoplayer2/testutil/DataSourceContractTest.java | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java index 4b2115da50..fb01300de6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java @@ -91,12 +91,12 @@ public class UdpDataSourceContractTest extends DataSourceContractTest { @Test @Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]") @Override - public void dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException() {} + public void dataSpecWithPositionAtEnd_readsZeroBytes() {} @Test @Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]") @Override - public void dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException() {} + public void dataSpecWithPositionAtEndAndLength_readsZeroBytes() {} @Test @Ignore("UdpDataSource doesn't support DataSpec's position or length [internal: b/175856954]") diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java index c785145a53..78bb5ff4cc 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java @@ -217,7 +217,7 @@ public abstract class DataSourceContractTest { } @Test - public void dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException() throws Exception { + public void dataSpecWithPositionAtEnd_readsZeroBytes() throws Exception { ImmutableList resources = getTestResources(); Assertions.checkArgument(!resources.isEmpty(), "Must provide at least one test resource."); @@ -248,8 +248,7 @@ public abstract class DataSourceContractTest { } @Test - public void dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException() - throws Exception { + public void dataSpecWithPositionAtEndAndLength_readsZeroBytes() throws Exception { ImmutableList resources = getTestResources(); Assertions.checkArgument(!resources.isEmpty(), "Must provide at least one test resource."); From a9913e54107b48138770d9a32279edf593035b13 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 25 Aug 2021 17:31:47 +0100 Subject: [PATCH 092/441] Add the media item to PositionInfo PiperOrigin-RevId: 392914515 --- .../exoplayer2/ext/cast/CastPlayer.java | 21 +- .../exoplayer2/ext/cast/CastPlayerTest.java | 21 ++ .../exoplayer2/ext/ima/FakePlayer.java | 6 + .../exoplayer2/ext/ima/ImaAdsLoaderTest.java | 3 + .../com/google/android/exoplayer2/Player.java | 59 +++++- .../android/exoplayer2/PositionInfoTest.java | 3 + .../android/exoplayer2/ExoPlayerImpl.java | 6 + .../android/exoplayer2/ExoPlayerTest.java | 184 +++++++++++++++++- .../testutil/FakeMediaSourceFactory.java | 89 +++++++++ .../testutil/TestExoPlayerBuilder.java | 48 +++-- .../testutil/FakeMediaSourceFactoryTest.java | 50 +++++ 11 files changed, 452 insertions(+), 38 deletions(-) create mode 100644 testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java create mode 100644 testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 13155478e4..82213920af 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -790,6 +790,7 @@ public final class CastPlayer extends BasePlayer { new PositionInfo( window.uid, period.windowIndex, + window.mediaItem, period.uid, period.windowIndex, /* positionMs= */ windowDurationMs, @@ -802,6 +803,7 @@ public final class CastPlayer extends BasePlayer { new PositionInfo( window.uid, period.windowIndex, + window.mediaItem, period.uid, period.windowIndex, /* positionMs= */ window.getDefaultPositionMs(), @@ -904,6 +906,7 @@ public final class CastPlayer extends BasePlayer { new PositionInfo( window.uid, period.windowIndex, + window.mediaItem, period.uid, period.windowIndex, getCurrentPosition(), @@ -1082,17 +1085,19 @@ public final class CastPlayer extends BasePlayer { private PositionInfo getCurrentPositionInfo() { Timeline currentTimeline = getCurrentTimeline(); - @Nullable - Object newPeriodUid = - !currentTimeline.isEmpty() - ? currentTimeline.getPeriod(getCurrentPeriodIndex(), period, /* setIds= */ true).uid - : null; - @Nullable - Object newWindowUid = - newPeriodUid != null ? currentTimeline.getWindow(period.windowIndex, window).uid : null; + @Nullable Object newPeriodUid = null; + @Nullable Object newWindowUid = null; + @Nullable MediaItem newMediaItem = null; + if (!currentTimeline.isEmpty()) { + newPeriodUid = + currentTimeline.getPeriod(getCurrentPeriodIndex(), period, /* setIds= */ true).uid; + newWindowUid = currentTimeline.getWindow(period.windowIndex, window).uid; + newMediaItem = window.mediaItem; + } return new PositionInfo( newWindowUid, getCurrentWindowIndex(), + newMediaItem, newPeriodUid, getCurrentPeriodIndex(), getCurrentPosition(), diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index 58c6eaf10d..ff1fc998c7 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -380,6 +380,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 2, /* windowIndex= */ 1, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */ 2, /* periodIndex= */ 1, /* positionMs= */ 2000, @@ -390,6 +391,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 3, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(3).build(), /* periodUid= */ 3, /* periodIndex= */ 0, /* positionMs= */ 1000, @@ -660,6 +662,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 1234, @@ -670,6 +673,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ null, /* windowIndex= */ 0, + /* mediaItem= */ null, /* periodUid= */ null, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -744,6 +748,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 1234, @@ -754,6 +759,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 2, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */ 2, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -825,6 +831,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 0, // position at which we receive the timeline change @@ -835,6 +842,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 2, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */ 2, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -937,6 +945,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -947,6 +956,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 2, /* windowIndex= */ 1, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */ 2, /* periodIndex= */ 1, /* positionMs= */ 1234, @@ -992,10 +1002,12 @@ public class CastPlayerTest { updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */ 1); castPlayer.seekTo(/* windowIndex= */ 0, /* positionMs= */ 1234); + MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(); Player.PositionInfo oldPosition = new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -1006,6 +1018,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 1234, @@ -1076,6 +1089,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 12500, @@ -1086,6 +1100,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 2, /* windowIndex= */ 1, + new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */ 2, /* periodIndex= */ 1, /* positionMs= */ 0, @@ -1120,10 +1135,12 @@ public class CastPlayerTest { mediaItems, mediaQueueItemIds, currentItemId, streamTypes, durationsMs, positionMs); castPlayer.seekBack(); + MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(); Player.PositionInfo oldPosition = new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 2 * C.DEFAULT_SEEK_BACK_INCREMENT_MS, @@ -1134,6 +1151,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ C.DEFAULT_SEEK_BACK_INCREMENT_MS, @@ -1166,10 +1184,12 @@ public class CastPlayerTest { mediaItems, mediaQueueItemIds, currentItemId, streamTypes, durationsMs, positionMs); castPlayer.seekForward(); + MediaItem mediaItem = new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(); Player.PositionInfo oldPosition = new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ 0, @@ -1180,6 +1200,7 @@ public class CastPlayerTest { new Player.PositionInfo( /* windowUid= */ 1, /* windowIndex= */ 0, + mediaItem, /* periodUid= */ 1, /* periodIndex= */ 0, /* positionMs= */ C.DEFAULT_SEEK_FORWARD_INCREMENT_MS, diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index 152292168e..3e1cbc128b 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.ext.ima; import android.os.Looper; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.testutil.StubExoPlayer; @@ -32,6 +33,7 @@ import com.google.android.exoplayer2.util.ListenerSet; private final Timeline.Period period; private final Object windowUid = new Object(); private final Object periodUid = new Object(); + private final MediaItem mediaItem = MediaItem.fromUri("http://google.com/0"); private Timeline timeline; @Player.State private int state; @@ -72,6 +74,7 @@ import com.google.android.exoplayer2.util.ListenerSet; new PositionInfo( windowUid, /* windowIndex= */ 0, + mediaItem, periodUid, /* periodIndex= */ 0, this.positionMs, @@ -89,6 +92,7 @@ import com.google.android.exoplayer2.util.ListenerSet; new PositionInfo( windowUid, /* windowIndex= */ 0, + mediaItem, periodUid, /* periodIndex= */ 0, positionMs, @@ -119,6 +123,7 @@ import com.google.android.exoplayer2.util.ListenerSet; new PositionInfo( windowUid, /* windowIndex= */ 0, + mediaItem, periodUid, /* periodIndex= */ 0, this.positionMs, @@ -136,6 +141,7 @@ import com.google.android.exoplayer2.util.ListenerSet; new PositionInfo( windowUid, /* windowIndex= */ 0, + mediaItem, periodUid, /* periodIndex= */ 0, positionMs, diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java index b26321757f..24c3574257 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java @@ -56,6 +56,7 @@ import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer; import com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; @@ -281,6 +282,7 @@ public final class ImaAdsLoaderTest { new Player.PositionInfo( /* windowUid= */ new Object(), /* windowIndex= */ 0, + /* mediaItem= */ MediaItem.fromUri("http://google.com/0"), /* periodUid= */ new Object(), /* periodIndex= */ 0, /* positionMs= */ 10_000, @@ -290,6 +292,7 @@ public final class ImaAdsLoaderTest { new Player.PositionInfo( /* windowUid= */ new Object(), /* windowIndex= */ 1, + /* mediaItem= */ MediaItem.fromUri("http://google.com/1"), /* periodUid= */ new Object(), /* periodIndex= */ 0, /* positionMs= */ 20_000, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 1bd4e690c4..8bf9fbdf20 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -32,6 +32,7 @@ import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; +import com.google.android.exoplayer2.util.BundleableUtils; import com.google.android.exoplayer2.util.FlagSet; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -468,13 +469,15 @@ public interface Player { final class PositionInfo implements Bundleable { /** - * The UID of the window, or {@code null}, if the timeline is {@link Timeline#isEmpty() empty}. + * The UID of the window, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final Object windowUid; /** The window index. */ public final int windowIndex; + /** The media item, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ + @Nullable public final MediaItem mediaItem; /** - * The UID of the period, or {@code null}, if the timeline is {@link Timeline#isEmpty() empty}. + * The UID of the period, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final Object periodUid; /** The period index. */ @@ -498,7 +501,11 @@ public interface Player { */ public final int adIndexInAdGroup; - /** Creates an instance. */ + /** + * @deprecated Use {@link #PositionInfo(Object, int, MediaItem, Object, int, long, long, int, + * int)} instead. + */ + @Deprecated public PositionInfo( @Nullable Object windowUid, int windowIndex, @@ -508,8 +515,32 @@ public interface Player { long contentPositionMs, int adGroupIndex, int adIndexInAdGroup) { + this( + windowUid, + windowIndex, + MediaItem.EMPTY, + periodUid, + periodIndex, + positionMs, + contentPositionMs, + adGroupIndex, + adIndexInAdGroup); + } + + /** Creates an instance. */ + public PositionInfo( + @Nullable Object windowUid, + int windowIndex, + @Nullable MediaItem mediaItem, + @Nullable Object periodUid, + int periodIndex, + long positionMs, + long contentPositionMs, + int adGroupIndex, + int adIndexInAdGroup) { this.windowUid = windowUid; this.windowIndex = windowIndex; + this.mediaItem = mediaItem; this.periodUid = periodUid; this.periodIndex = periodIndex; this.positionMs = positionMs; @@ -534,7 +565,8 @@ public interface Player { && adGroupIndex == that.adGroupIndex && adIndexInAdGroup == that.adIndexInAdGroup && Objects.equal(windowUid, that.windowUid) - && Objects.equal(periodUid, that.periodUid); + && Objects.equal(periodUid, that.periodUid) + && Objects.equal(mediaItem, that.mediaItem); } @Override @@ -542,6 +574,7 @@ public interface Player { return Objects.hashCode( windowUid, windowIndex, + mediaItem, periodUid, periodIndex, windowIndex, @@ -556,6 +589,7 @@ public interface Player { @Retention(RetentionPolicy.SOURCE) @IntDef({ FIELD_WINDOW_INDEX, + FIELD_MEDIA_ITEM, FIELD_PERIOD_INDEX, FIELD_POSITION_MS, FIELD_CONTENT_POSITION_MS, @@ -565,11 +599,12 @@ public interface Player { private @interface FieldNumber {} private static final int FIELD_WINDOW_INDEX = 0; - private static final int FIELD_PERIOD_INDEX = 1; - private static final int FIELD_POSITION_MS = 2; - private static final int FIELD_CONTENT_POSITION_MS = 3; - private static final int FIELD_AD_GROUP_INDEX = 4; - private static final int FIELD_AD_INDEX_IN_AD_GROUP = 5; + private static final int FIELD_MEDIA_ITEM = 1; + private static final int FIELD_PERIOD_INDEX = 2; + private static final int FIELD_POSITION_MS = 3; + private static final int FIELD_CONTENT_POSITION_MS = 4; + private static final int FIELD_AD_GROUP_INDEX = 5; + private static final int FIELD_AD_INDEX_IN_AD_GROUP = 6; /** * {@inheritDoc} @@ -581,6 +616,7 @@ public interface Player { public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putInt(keyForField(FIELD_WINDOW_INDEX), windowIndex); + bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), BundleableUtils.toNullableBundle(mediaItem)); bundle.putInt(keyForField(FIELD_PERIOD_INDEX), periodIndex); bundle.putLong(keyForField(FIELD_POSITION_MS), positionMs); bundle.putLong(keyForField(FIELD_CONTENT_POSITION_MS), contentPositionMs); @@ -595,6 +631,10 @@ public interface Player { private static PositionInfo fromBundle(Bundle bundle) { int windowIndex = bundle.getInt(keyForField(FIELD_WINDOW_INDEX), /* defaultValue= */ C.INDEX_UNSET); + @Nullable + MediaItem mediaItem = + BundleableUtils.fromNullableBundle( + MediaItem.CREATOR, bundle.getBundle(keyForField(FIELD_MEDIA_ITEM))); int periodIndex = bundle.getInt(keyForField(FIELD_PERIOD_INDEX), /* defaultValue= */ C.INDEX_UNSET); long positionMs = @@ -608,6 +648,7 @@ public interface Player { return new PositionInfo( /* windowUid= */ null, windowIndex, + mediaItem, /* periodUid= */ null, periodIndex, positionMs, diff --git a/library/common/src/test/java/com/google/android/exoplayer2/PositionInfoTest.java b/library/common/src/test/java/com/google/android/exoplayer2/PositionInfoTest.java index 7b7cfb0f37..9e2e08521a 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/PositionInfoTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/PositionInfoTest.java @@ -32,6 +32,7 @@ public class PositionInfoTest { new PositionInfo( /* windowUid= */ null, /* windowIndex= */ 23, + new MediaItem.Builder().setMediaId("1234").build(), /* periodUid= */ null, /* periodIndex= */ 11, /* positionMs= */ 8787L, @@ -48,6 +49,7 @@ public class PositionInfoTest { new PositionInfo( /* windowUid= */ new Object(), /* windowIndex= */ 23, + MediaItem.fromUri("https://exoplayer.dev"), /* periodUid= */ null, /* periodIndex= */ 11, /* positionMs= */ 8787L, @@ -65,6 +67,7 @@ public class PositionInfoTest { new PositionInfo( /* windowUid= */ null, /* windowIndex= */ 23, + MediaItem.fromUri("https://exoplayer.dev"), /* periodUid= */ new Object(), /* periodIndex= */ 11, /* positionMs= */ 8787L, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 204485ae58..8863c9259f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -1360,6 +1360,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @Nullable Object oldPeriodUid = null; int oldWindowIndex = oldMaskingWindowIndex; int oldPeriodIndex = C.INDEX_UNSET; + @Nullable MediaItem oldMediaItem = null; Timeline.Period oldPeriod = new Timeline.Period(); if (!oldPlaybackInfo.timeline.isEmpty()) { oldPeriodUid = oldPlaybackInfo.periodId.periodUid; @@ -1367,6 +1368,7 @@ import java.util.concurrent.CopyOnWriteArraySet; oldWindowIndex = oldPeriod.windowIndex; oldPeriodIndex = oldPlaybackInfo.timeline.getIndexOfPeriod(oldPeriodUid); oldWindowUid = oldPlaybackInfo.timeline.getWindow(oldWindowIndex, window).uid; + oldMediaItem = window.mediaItem; } long oldPositionUs; long oldContentPositionUs; @@ -1397,6 +1399,7 @@ import java.util.concurrent.CopyOnWriteArraySet; return new PositionInfo( oldWindowUid, oldWindowIndex, + oldMediaItem, oldPeriodUid, oldPeriodIndex, C.usToMs(oldPositionUs), @@ -1410,16 +1413,19 @@ import java.util.concurrent.CopyOnWriteArraySet; @Nullable Object newPeriodUid = null; int newWindowIndex = getCurrentWindowIndex(); int newPeriodIndex = C.INDEX_UNSET; + @Nullable MediaItem newMediaItem = null; if (!playbackInfo.timeline.isEmpty()) { newPeriodUid = playbackInfo.periodId.periodUid; playbackInfo.timeline.getPeriodByUid(newPeriodUid, period); newPeriodIndex = playbackInfo.timeline.getIndexOfPeriod(newPeriodUid); newWindowUid = playbackInfo.timeline.getWindow(newWindowIndex, window).uid; + newMediaItem = window.mediaItem; } long positionMs = C.usToMs(discontinuityWindowStartPositionUs); return new PositionInfo( newWindowUid, newWindowIndex, + newMediaItem, newPeriodUid, newPeriodIndex, positionMs, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index cefe878377..8ec85152fd 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -85,6 +85,8 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.Player.DiscontinuityReason; +import com.google.android.exoplayer2.Player.Listener; +import com.google.android.exoplayer2.Player.PositionInfo; import com.google.android.exoplayer2.Timeline.Window; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -120,6 +122,7 @@ import com.google.android.exoplayer2.testutil.FakeDataSource; import com.google.android.exoplayer2.testutil.FakeMediaClockRenderer; import com.google.android.exoplayer2.testutil.FakeMediaPeriod; import com.google.android.exoplayer2.testutil.FakeMediaSource; +import com.google.android.exoplayer2.testutil.FakeMediaSourceFactory; import com.google.android.exoplayer2.testutil.FakeRenderer; import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem; @@ -142,7 +145,6 @@ import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Range; import java.io.IOException; import java.util.ArrayList; @@ -9580,6 +9582,7 @@ public final class ExoPlayerTest { assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); + assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000); @@ -9601,6 +9604,7 @@ public final class ExoPlayerTest { assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); + assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000); @@ -9620,6 +9624,7 @@ public final class ExoPlayerTest { oldPositionInfo = oldPosition.getValue(); newPositionInfo = newPosition.getValue(); assertThat(oldPositionInfo.windowIndex).isEqualTo(1); + assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(2); assertThat(oldPositionInfo.windowUid).isNotEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(20_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(20_000); @@ -9881,7 +9886,7 @@ public final class ExoPlayerTest { TimelineWindowDefinition postRollWindow = new TimelineWindowDefinition( /* periodCount= */ 1, - /* id= */ 0, + /* id= */ "id-2", /* isSeekable= */ true, /* isDynamic= */ false, /* isLive= */ false, @@ -9895,7 +9900,7 @@ public final class ExoPlayerTest { TimelineWindowDefinition preRollWindow = new TimelineWindowDefinition( /* periodCount= */ 1, - /* id= */ 0, + /* id= */ "id-3", /* isSeekable= */ true, /* isDynamic= */ false, /* isLive= */ false, @@ -9905,11 +9910,13 @@ public final class ExoPlayerTest { /* windowOffsetInFirstPeriodUs= */ 0, preRollAdPlaybackState); player.setMediaSources( - Lists.newArrayList( - new FakeMediaSource(), + ImmutableList.of( + createFakeMediaSource(/* id= */ "id-0"), new FakeMediaSource( new FakeTimeline( new TimelineWindowDefinition( + /* periodCount= */ 1, + /* id= */ "id-1", /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 15 * C.MICROS_PER_SECOND))), @@ -9939,6 +9946,7 @@ public final class ExoPlayerTest { assertThat(oldPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(0, window).uid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(0); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-0"); assertThat(oldPosition.getValue().positionMs).isEqualTo(10_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(10_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -9946,6 +9954,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); assertThat(newPosition.getValue().windowIndex).isEqualTo(1); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-1"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -9965,11 +9974,13 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(2, window).uid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(1); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-1"); assertThat(oldPosition.getValue().positionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -9983,12 +9994,14 @@ public final class ExoPlayerTest { newPosition.capture(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); @@ -10003,12 +10016,14 @@ public final class ExoPlayerTest { eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(19_999); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(19_999); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10026,12 +10041,14 @@ public final class ExoPlayerTest { .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowUid).isNotEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(3); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); @@ -10046,12 +10063,14 @@ public final class ExoPlayerTest { eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(3); + assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(3); + assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10093,7 +10112,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); - player.setMediaSources(Lists.newArrayList(secondMediaSource, secondMediaSource)); + player.setMediaSources(ImmutableList.of(secondMediaSource, secondMediaSource)); player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); @@ -10120,6 +10139,73 @@ public final class ExoPlayerTest { player.release(); } + @Test + public void onPositionDiscontinuity_recursiveStateChange_mediaItemMaskingCorrect() + throws Exception { + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + Player.Listener listener = mock(Player.Listener.class); + MediaItem[] currentMediaItems = new MediaItem[2]; + int[] mediaItemCount = new int[2]; + player.addListener( + new Listener() { + @Override + public void onPositionDiscontinuity( + PositionInfo oldPosition, PositionInfo newPosition, int reason) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { + mediaItemCount[0] = player.getMediaItemCount(); + currentMediaItems[0] = player.getCurrentMediaItem(); + // This is called before the second listener is called. + player.removeMediaItem(/* index= */ 1); + } + } + }); + player.addListener( + new Listener() { + @Override + public void onPositionDiscontinuity( + PositionInfo oldPosition, PositionInfo newPosition, int reason) { + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) { + mediaItemCount[1] = player.getMediaItemCount(); + currentMediaItems[1] = player.getCurrentMediaItem(); + } + } + }); + player.addListener(listener); + player.setMediaSources( + ImmutableList.of( + createFakeMediaSource(/* id= */ "id-0"), createFakeMediaSource(/* id= */ "id-1"))); + + player.prepare(); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); + + ArgumentCaptor newPositionArgumentCaptor = + ArgumentCaptor.forClass(PositionInfo.class); + InOrder inOrder = inOrder(listener); + inOrder + .verify(listener) + .onPositionDiscontinuity( + any(), + newPositionArgumentCaptor.capture(), + eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); + inOrder + .verify(listener) + .onPositionDiscontinuity( + any(), newPositionArgumentCaptor.capture(), eq(Player.DISCONTINUITY_REASON_REMOVE)); + // The state at auto-transition event time. + assertThat(mediaItemCount[0]).isEqualTo(2); + assertThat(currentMediaItems[0].playbackProperties.tag).isEqualTo("id-1"); + // The masked state after id-1 has been removed. + assertThat(mediaItemCount[1]).isEqualTo(1); + assertThat(currentMediaItems[1].playbackProperties.tag).isEqualTo("id-0"); + // PositionInfo reports the media item at event time. + assertThat(newPositionArgumentCaptor.getAllValues().get(0).mediaItem.playbackProperties.tag) + .isEqualTo("id-1"); + assertThat(newPositionArgumentCaptor.getAllValues().get(1).mediaItem.playbackProperties.tag) + .isEqualTo("id-0"); + player.release(); + } + @Test public void removeMediaItems_removesPlayingPeriod_callsOnPositionDiscontinuity() throws Exception { @@ -10127,7 +10213,7 @@ public final class ExoPlayerTest { Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); player.setMediaSources( - Lists.newArrayList( + ImmutableList.of( new FakeMediaSource( new FakeTimeline( new TimelineWindowDefinition( @@ -10354,12 +10440,76 @@ public final class ExoPlayerTest { player.release(); } + @Test + public void setMediaItems_callsListenersWithSameInstanceOfMediaItem() throws Exception { + ArgumentCaptor timeline = ArgumentCaptor.forClass(Timeline.class); + ArgumentCaptor oldPosition = + ArgumentCaptor.forClass(Player.PositionInfo.class); + ArgumentCaptor newPosition = + ArgumentCaptor.forClass(Player.PositionInfo.class); + ArgumentCaptor currentMediaItem = ArgumentCaptor.forClass(MediaItem.class); + Window window = new Timeline.Window(); + ExoPlayer player = + new TestExoPlayerBuilder(context) + .setMediaSourceFactory(new FakeMediaSourceFactory()) + .build(); + Player.Listener listener = mock(Player.Listener.class); + player.addListener(listener); + List playlist = + ImmutableList.of( + MediaItem.fromUri("http://item-0.com/"), MediaItem.fromUri("http://item-1.com/")); + player.setMediaItems(playlist); + + player.prepare(); + player.seekTo(/* positionMs= */ 2000); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); + + InOrder inOrder = inOrder(listener); + inOrder + .verify(listener) + .onTimelineChanged(timeline.capture(), eq(Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED)); + inOrder + .verify(listener) + .onMediaItemTransition( + currentMediaItem.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)); + inOrder + .verify(listener) + .onPositionDiscontinuity( + oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_SEEK)); + inOrder + .verify(listener) + .onPositionDiscontinuity( + oldPosition.capture(), + newPosition.capture(), + eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); + inOrder + .verify(listener) + .onMediaItemTransition( + currentMediaItem.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); + inOrder.verify(listener, never()).onPositionDiscontinuity(any(), any(), anyInt()); + inOrder.verify(listener, never()).onMediaItemTransition(any(), anyInt()); + assertThat(timeline.getValue().getWindow(0, window).mediaItem) + .isSameInstanceAs(playlist.get(0)); + assertThat(timeline.getValue().getWindow(1, window).mediaItem) + .isSameInstanceAs(playlist.get(1)); + assertThat(oldPosition.getAllValues().get(0).mediaItem).isSameInstanceAs(playlist.get(0)); + assertThat(newPosition.getAllValues().get(0).mediaItem).isSameInstanceAs(playlist.get(0)); + assertThat(oldPosition.getAllValues().get(1).mediaItem).isSameInstanceAs(playlist.get(0)); + assertThat(newPosition.getAllValues().get(1).mediaItem).isSameInstanceAs(playlist.get(1)); + assertThat(currentMediaItem.getAllValues().get(0)).isSameInstanceAs(playlist.get(0)); + assertThat(currentMediaItem.getAllValues().get(1)).isSameInstanceAs(playlist.get(1)); + player.release(); + } + @Test public void seekTo_callsOnPositionDiscontinuity() throws Exception { ExoPlayer player = new TestExoPlayerBuilder(context).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); - player.setMediaSources(Lists.newArrayList(new FakeMediaSource(), new FakeMediaSource())); + player.setMediaSources( + ImmutableList.of( + createFakeMediaSource(/* id= */ "id-0"), createFakeMediaSource(/* id= */ "id-1"))); player.prepare(); TestPlayerRunHelper.playUntilPosition( @@ -10382,16 +10532,20 @@ public final class ExoPlayerTest { List newPositions = newPosition.getAllValues(); assertThat(oldPositions.get(0).windowUid).isEqualTo(newPositions.get(0).windowUid); assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo("id-0"); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo("id-0"); assertThat(newPositions.get(0).positionMs).isEqualTo(7_000); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(7_000); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); assertThat(oldPositions.get(1).windowUid).isNotEqualTo(newPositions.get(1).windowUid); + assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItem.playbackProperties.tag).isEqualTo("id-0"); assertThat(oldPositions.get(1).positionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(7_000); assertThat(newPositions.get(1).windowIndex).isEqualTo(1); + assertThat(newPositions.get(1).mediaItem.playbackProperties.tag).isEqualTo("id-1"); assertThat(newPositions.get(1).positionMs).isEqualTo(1_000); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1_000); player.release(); @@ -10421,6 +10575,7 @@ public final class ExoPlayerTest { // a seek from initial state to masked seek position assertThat(oldPositions.get(0).windowUid).isNull(); assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItem).isNull(); assertThat(oldPositions.get(0).positionMs).isEqualTo(0); assertThat(oldPositions.get(0).contentPositionMs).isEqualTo(0); assertThat(newPositions.get(0).windowIndex).isEqualTo(0); @@ -10430,6 +10585,7 @@ public final class ExoPlayerTest { // a seek from masked seek position to another masked position across windows assertThat(oldPositions.get(1).windowUid).isNull(); assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItem).isNull(); assertThat(oldPositions.get(1).positionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(7_000); assertThat(newPositions.get(1).windowUid).isNull(); @@ -10439,6 +10595,7 @@ public final class ExoPlayerTest { // a seek from masked seek position to another masked position within window assertThat(oldPositions.get(2).windowUid).isNull(); assertThat(oldPositions.get(2).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(2).mediaItem).isNull(); assertThat(oldPositions.get(2).positionMs).isEqualTo(1_000); assertThat(oldPositions.get(2).contentPositionMs).isEqualTo(1_000); assertThat(newPositions.get(2).windowUid).isNull(); @@ -10671,7 +10828,7 @@ public final class ExoPlayerTest { ExoPlayer player = new TestExoPlayerBuilder(context).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); - player.setMediaSource(new FakeMediaSource()); + player.setMediaSource(createFakeMediaSource(/* id= */ 123)); player.prepare(); TestPlayerRunHelper.playUntilPosition( @@ -10690,10 +10847,12 @@ public final class ExoPlayerTest { List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo(123); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); assertThat(newPositions.get(0).windowUid).isNull(); assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItem).isNull(); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); player.release(); @@ -10851,6 +11010,11 @@ public final class ExoPlayerTest { }); } + private static FakeMediaSource createFakeMediaSource(Object id) { + return new FakeMediaSource( + new FakeTimeline(new TimelineWindowDefinition(/* periodCount= */ 1, id))); + } + private static void deliverBroadcast(Intent intent) { ApplicationProvider.getApplicationContext().sendBroadcast(intent); shadowOf(Looper.getMainLooper()).idle(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java new file mode 100644 index 0000000000..dc77ccccb6 --- /dev/null +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java @@ -0,0 +1,89 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.testutil; + +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.drm.DrmSessionManager; +import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.MediaSourceFactory; +import com.google.android.exoplayer2.source.ads.AdPlaybackState; +import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition; +import com.google.android.exoplayer2.upstream.HttpDataSource; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; + +/** Fake {@link MediaSourceFactory} that creates a {@link FakeMediaSource}. */ +public class FakeMediaSourceFactory implements MediaSourceFactory { + + /** The window UID used by media sources that are created by the factory. */ + public static final Object DEFAULT_WINDOW_UID = new Object(); + + @Override + public MediaSourceFactory setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public MediaSourceFactory setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public MediaSourceFactory setDrmHttpDataSourceFactory( + @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public MediaSourceFactory setDrmUserAgent(@Nullable String userAgent) { + throw new UnsupportedOperationException(); + } + + @Override + public MediaSourceFactory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + throw new UnsupportedOperationException(); + } + + @Override + public int[] getSupportedTypes() { + return new int[] {C.TYPE_OTHER}; + } + + @Override + public MediaSource createMediaSource(MediaItem mediaItem) { + TimelineWindowDefinition timelineWindowDefinition = + new TimelineWindowDefinition( + /* periodCount= */ 1, + /* id= */ DEFAULT_WINDOW_UID, + /* isSeekable= */ true, + /* isDynamic= */ false, + /* isLive= */ false, + /* isPlaceholder= */ false, + /* durationUs= */ 1000 * C.MICROS_PER_SECOND, + /* defaultPositionUs= */ 2 * C.MICROS_PER_SECOND, + /* windowOffsetInFirstPeriodUs= */ C.msToUs(123456789), + AdPlaybackState.NONE, + mediaItem); + return new FakeMediaSource(new FakeTimeline(timelineWindowDefinition)); + } +} diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index 654218e1a5..c7089dcc9d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -28,6 +28,7 @@ import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; @@ -45,6 +46,7 @@ public class TestExoPlayerBuilder { private BandwidthMeter bandwidthMeter; @Nullable private Renderer[] renderers; @Nullable private RenderersFactory renderersFactory; + @Nullable private MediaSourceFactory mediaSourceFactory; private boolean useLazyPreparation; private @MonotonicNonNull Looper looper; private long seekBackIncrementMs; @@ -219,6 +221,26 @@ public class TestExoPlayerBuilder { return looper; } + /** + * Returns the {@link MediaSourceFactory} that will be used by the player, or null if no {@link + * MediaSourceFactory} has been set yet and no default is available. + */ + @Nullable + public MediaSourceFactory getMediaSourceFactory() { + return mediaSourceFactory; + } + + /** + * Sets the {@link MediaSourceFactory} to be used by the player. + * + * @param mediaSourceFactory The {@link MediaSourceFactory} to be used by the player. + * @return This builder. + */ + public TestExoPlayerBuilder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { + this.mediaSourceFactory = mediaSourceFactory; + return this; + } + /** * Sets the seek back increment to be used by the player. * @@ -277,16 +299,20 @@ public class TestExoPlayerBuilder { }; } - return new ExoPlayer.Builder(context, playerRenderersFactory) - .setTrackSelector(trackSelector) - .setLoadControl(loadControl) - .setBandwidthMeter(bandwidthMeter) - .setAnalyticsCollector(new AnalyticsCollector(clock)) - .setClock(clock) - .setUseLazyPreparation(useLazyPreparation) - .setLooper(looper) - .setSeekBackIncrementMs(seekBackIncrementMs) - .setSeekForwardIncrementMs(seekForwardIncrementMs) - .build(); + ExoPlayer.Builder builder = + new ExoPlayer.Builder(context, playerRenderersFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setBandwidthMeter(bandwidthMeter) + .setAnalyticsCollector(new AnalyticsCollector(clock)) + .setClock(clock) + .setUseLazyPreparation(useLazyPreparation) + .setLooper(looper) + .setSeekBackIncrementMs(seekBackIncrementMs) + .setSeekForwardIncrementMs(seekForwardIncrementMs); + if (mediaSourceFactory != null) { + builder.setMediaSourceFactory(mediaSourceFactory); + } + return builder.build(); } } diff --git a/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java new file mode 100644 index 0000000000..c9f9a5a7b6 --- /dev/null +++ b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactoryTest.java @@ -0,0 +1,50 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.testutil; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.annotation.Nullable; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Timeline.Window; +import com.google.android.exoplayer2.source.MediaSource; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit test for {@link FakeMediaSourceFactory}. */ +@RunWith(AndroidJUnit4.class) +public class FakeMediaSourceFactoryTest { + + @Test + public void createMediaSource_mediaItemIsSameInstance() { + FakeMediaSourceFactory fakeMediaSourceFactory = new FakeMediaSourceFactory(); + MediaItem mediaItem = MediaItem.fromUri("http://google.com/0"); + @Nullable AtomicReference reportedMediaItem = new AtomicReference<>(); + + MediaSource mediaSource = fakeMediaSourceFactory.createMediaSource(mediaItem); + mediaSource.prepareSource( + (source, timeline) -> { + int firstWindowIndex = timeline.getFirstWindowIndex(/* shuffleModeEnabled= */ false); + reportedMediaItem.set(timeline.getWindow(firstWindowIndex, new Window()).mediaItem); + }, + /* mediaTransferListener= */ null); + + assertThat(reportedMediaItem.get()).isSameInstanceAs(mediaItem); + assertThat(mediaSource.getMediaItem()).isSameInstanceAs(mediaItem); + } +} From 3710446b9dad9645edab4821ecfcc6774a6c3e98 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 25 Aug 2021 18:33:02 +0100 Subject: [PATCH 093/441] Test DefaultDrmSession with NotProvisionedException from getKeyRequest PiperOrigin-RevId: 392927795 --- .../drm/DefaultDrmSessionManagerTest.java | 50 +++++++++++++++-- .../exoplayer2/testutil/FakeExoMediaDrm.java | 55 ++++++++++++++----- 2 files changed, 86 insertions(+), 19 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java index 4dac826ce2..d5bfc5f663 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java @@ -575,7 +575,8 @@ public class DefaultDrmSessionManagerTest { } @Test - public void deviceNotProvisioned_provisioningDoneAndOpenSessionRetried() { + public void + deviceNotProvisioned_exceptionThrownFromOpenSession_provisioningDoneAndOpenSessionRetried() { FakeExoMediaDrm.LicenseServer licenseServer = FakeExoMediaDrm.LicenseServer.allowingSchemeDatas(DRM_SCHEME_DATAS); @@ -592,13 +593,47 @@ public class DefaultDrmSessionManagerTest { /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); - // Confirm the device isn't provisioned (otherwise state would be OPENED) + // Confirm that opening the session threw NotProvisionedException (otherwise state would be + // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); waitForOpenedWithKeys(drmSession); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.queryKeyStatus()) .containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE); + assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(1); + } + + @Test + public void + deviceNotProvisioned_exceptionThrownFromGetKeyRequest_provisioningDoneAndOpenSessionRetried() { + FakeExoMediaDrm.LicenseServer licenseServer = + FakeExoMediaDrm.LicenseServer.allowingSchemeDatas(DRM_SCHEME_DATAS); + + DefaultDrmSessionManager drmSessionManager = + new DefaultDrmSessionManager.Builder() + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, + uuid -> + new FakeExoMediaDrm.Builder() + .setProvisionsRequired(1) + .throwNotProvisionedExceptionFromGetKeyRequest() + .build()) + .build(/* mediaDrmCallback= */ licenseServer); + drmSessionManager.prepare(); + DrmSession drmSession = + checkNotNull( + drmSessionManager.acquireSession( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + FORMAT_WITH_DRM_INIT_DATA)); + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); + waitForOpenedWithKeys(drmSession); + + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); + assertThat(drmSession.queryKeyStatus()) + .containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE); + assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(1); } @Test @@ -619,13 +654,15 @@ public class DefaultDrmSessionManagerTest { /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); - // Confirm the device isn't provisioned (otherwise state would be OPENED) + // Confirm that opening the session threw NotProvisionedException (otherwise state would be + // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); waitForOpenedWithKeys(drmSession); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.queryKeyStatus()) .containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE); + assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(2); } @Test @@ -646,7 +683,8 @@ public class DefaultDrmSessionManagerTest { /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); - // Confirm the device isn't provisioned (otherwise state would be OPENED) + // Confirm that opening the session threw NotProvisionedException (otherwise state would be + // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); waitForOpenedWithKeys(drmSession); drmSession.release(/* eventDispatcher= */ null); @@ -659,9 +697,11 @@ public class DefaultDrmSessionManagerTest { /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA)); - // Confirm the device isn't provisioned (otherwise state would be OPENED) + // Confirm that opening the session threw NotProvisionedException (otherwise state would be + // OPENED) assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); waitForOpenedWithKeys(drmSession); + assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(4); } @Test diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index fef3f67b10..9e5d1498b6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -66,6 +66,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { /** Builder for {@link FakeExoMediaDrm} instances. */ public static class Builder { private int provisionsRequired; + private boolean throwNotProvisionedExceptionFromGetKeyRequest; private int maxConcurrentSessions; /** Constructs an instance. */ @@ -89,6 +90,16 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { return this; } + /** + * Configures the {@link FakeExoMediaDrm} to throw any {@link NotProvisionedException} from + * {@link #getKeyRequest(byte[], List, int, HashMap)} instead of the default behaviour of + * throwing from {@link #openSession()}. + */ + public Builder throwNotProvisionedExceptionFromGetKeyRequest() { + this.throwNotProvisionedExceptionFromGetKeyRequest = true; + return this; + } + /** * Sets the maximum number of concurrent sessions the {@link FakeExoMediaDrm} will support. * @@ -108,7 +119,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { * instance. */ public FakeExoMediaDrm build() { - return new FakeExoMediaDrm(provisionsRequired, maxConcurrentSessions); + return new FakeExoMediaDrm( + provisionsRequired, throwNotProvisionedExceptionFromGetKeyRequest, maxConcurrentSessions); } } @@ -129,6 +141,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { private final int provisionsRequired; private final int maxConcurrentSessions; + private final boolean throwNotProvisionedExceptionFromGetKeyRequest; private final Map byteProperties; private final Map stringProperties; private final Set> openSessionIds; @@ -148,12 +161,20 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { /** @deprecated Use {@link Builder} instead. */ @Deprecated public FakeExoMediaDrm(int maxConcurrentSessions) { - this(/* provisionsRequired= */ 0, maxConcurrentSessions); + this( + /* provisionsRequired= */ 0, + /* throwNotProvisionedExceptionFromGetKeyRequest= */ false, + maxConcurrentSessions); } - private FakeExoMediaDrm(int provisionsRequired, int maxConcurrentSessions) { + private FakeExoMediaDrm( + int provisionsRequired, + boolean throwNotProvisionedExceptionFromGetKeyRequest, + int maxConcurrentSessions) { this.provisionsRequired = provisionsRequired; this.maxConcurrentSessions = maxConcurrentSessions; + this.throwNotProvisionedExceptionFromGetKeyRequest = + throwNotProvisionedExceptionFromGetKeyRequest; byteProperties = new HashMap<>(); stringProperties = new HashMap<>(); openSessionIds = new HashSet<>(); @@ -183,7 +204,9 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { @Override public byte[] openSession() throws MediaDrmException { Assertions.checkState(referenceCount > 0); - assertProvisioned(); + if (!throwNotProvisionedExceptionFromGetKeyRequest && provisionsReceived < provisionsRequired) { + throw new NotProvisionedException("Not provisioned."); + } if (openSessionIds.size() >= maxConcurrentSessions) { throw new ResourceBusyException("Too many sessions open. max=" + maxConcurrentSessions); } @@ -217,7 +240,9 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { throw new UnsupportedOperationException("Offline key requests are not supported."); } Assertions.checkArgument(keyType == KEY_TYPE_STREAMING, "Unrecognised keyType: " + keyType); - assertProvisioned(); + if (throwNotProvisionedExceptionFromGetKeyRequest && provisionsReceived < provisionsRequired) { + throw new NotProvisionedException("Not provisioned."); + } Assertions.checkState(openSessionIds.contains(toByteList(scope))); Assertions.checkNotNull(schemeDatas); KeyRequestData requestData = @@ -238,7 +263,6 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { public byte[] provideKeyResponse(byte[] scope, byte[] response) throws NotProvisionedException, DeniedByServerException { Assertions.checkState(referenceCount > 0); - assertProvisioned(); List responseAsList = Bytes.asList(response); if (responseAsList.equals(VALID_KEY_RESPONSE)) { sessionIdsWithValidKeys.add(Bytes.asList(scope)); @@ -381,12 +405,6 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { provisionsReceived = 0; } - private void assertProvisioned() throws NotProvisionedException { - if (provisionsReceived < provisionsRequired) { - throw new NotProvisionedException("Not provisioned."); - } - } - private static ImmutableList toByteList(byte[] byteArray) { return ImmutableList.copyOf(Bytes.asList(byteArray)); } @@ -394,9 +412,11 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { /** An license server implementation to interact with {@link FakeExoMediaDrm}. */ public static class LicenseServer implements MediaDrmCallback { - private final List> receivedSchemeDatas; private final ImmutableSet> allowedSchemeDatas; + private final List> receivedProvisionRequests; + private final List> receivedSchemeDatas; + @SafeVarargs public static LicenseServer allowingSchemeDatas(List... schemeDatas) { ImmutableSet.Builder> schemeDatasBuilder = @@ -408,8 +428,14 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { } private LicenseServer(ImmutableSet> allowedSchemeDatas) { - receivedSchemeDatas = new ArrayList<>(); this.allowedSchemeDatas = allowedSchemeDatas; + + receivedProvisionRequests = new ArrayList<>(); + receivedSchemeDatas = new ArrayList<>(); + } + + public ImmutableList> getReceivedProvisionRequests() { + return ImmutableList.copyOf(receivedProvisionRequests); } public ImmutableList> getReceivedSchemeDatas() { @@ -419,6 +445,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { @Override public byte[] executeProvisionRequest(UUID uuid, ProvisionRequest request) throws MediaDrmCallbackException { + receivedProvisionRequests.add(ImmutableList.copyOf(Bytes.asList(request.getData()))); if (Arrays.equals(request.getData(), FAKE_PROVISION_REQUEST.getData())) { return Bytes.toArray(VALID_PROVISION_RESPONSE); } else { From b42aa4c8dd84fc140fb71f6b1636f5dd9d03457b Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 26 Aug 2021 09:50:15 +0100 Subject: [PATCH 094/441] Rename TransformerVideoRenderer The new name indicates the difference with the TransformerTranscodingVideoRenderer. PiperOrigin-RevId: 393074749 --- .../google/android/exoplayer2/transformer/Transformer.java | 3 ++- ...ideoRenderer.java => TransformerMuxingVideoRenderer.java} | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) rename library/transformer/src/main/java/com/google/android/exoplayer2/transformer/{TransformerVideoRenderer.java => TransformerMuxingVideoRenderer.java} (95%) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index bb36733a48..33b49ae1ca 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -589,7 +589,8 @@ public final class Transformer { index++; } if (!transformation.removeVideo) { - renderers[index] = new TransformerVideoRenderer(muxerWrapper, mediaClock, transformation); + renderers[index] = + new TransformerMuxingVideoRenderer(muxerWrapper, mediaClock, transformation); index++; } return renderers; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java similarity index 95% rename from library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerVideoRenderer.java rename to library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java index bbc135448d..0be02ecdee 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java @@ -28,8 +28,9 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; import java.nio.ByteBuffer; +/** A video renderer that doesn't re-encoder the samples. */ @RequiresApi(18) -/* package */ final class TransformerVideoRenderer extends TransformerBaseRenderer { +/* package */ final class TransformerMuxingVideoRenderer extends TransformerBaseRenderer { private static final String TAG = "TransformerVideoRenderer"; @@ -41,7 +42,7 @@ import java.nio.ByteBuffer; private boolean isBufferPending; private boolean isInputStreamEnded; - public TransformerVideoRenderer( + public TransformerMuxingVideoRenderer( MuxerWrapper muxerWrapper, TransformerMediaClock mediaClock, Transformation transformation) { super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); From 1d36083e2543dd4be9e9e38a8f08bee2a3a3d3da Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 26 Aug 2021 10:46:28 +0100 Subject: [PATCH 095/441] Replace fully qualified link annotation PiperOrigin-RevId: 393081803 --- .../android/exoplayer2/transformer/Transformer.java | 9 +++++---- .../exoplayer2/testutil/FakeMediaChunkIterator.java | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 33b49ae1ca..d79aae40af 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -51,6 +51,7 @@ import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; +import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.TextOutput; @@ -407,8 +408,8 @@ public final class Transformer { *

    Concurrent transformations on the same Transformer object are not allowed. * *

    The output can contain at most one video track and one audio track. Other track types are - * ignored. For adaptive bitrate {@link com.google.android.exoplayer2.source.MediaSource media - * sources}, the highest bitrate video and audio streams are selected. + * ignored. For adaptive bitrate {@link MediaSource media sources}, the highest bitrate video and + * audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are @@ -432,8 +433,8 @@ public final class Transformer { *

    Concurrent transformations on the same Transformer object are not allowed. * *

    The output can contain at most one video track and one audio track. Other track types are - * ignored. For adaptive bitrate {@link com.google.android.exoplayer2.source.MediaSource media - * sources}, the highest bitrate video and audio streams are selected. + * ignored. For adaptive bitrate {@link MediaSource media sources}, the highest bitrate video and + * audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunkIterator.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunkIterator.java index 2e9fdeb546..cf6916c4f5 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunkIterator.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunkIterator.java @@ -19,16 +19,17 @@ package com.google.android.exoplayer2.testutil; import android.net.Uri; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; +import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.upstream.DataSpec; -/** Fake {@link com.google.android.exoplayer2.source.chunk.MediaChunkIterator}. */ +/** Fake {@link MediaChunkIterator}. */ public final class FakeMediaChunkIterator extends BaseMediaChunkIterator { private final long[] chunkTimeBoundariesSec; private final long[] chunkLengths; /** - * Creates a fake {@link com.google.android.exoplayer2.source.chunk.MediaChunkIterator}. + * Creates a fake {@link MediaChunkIterator}. * * @param chunkTimeBoundariesSec An array containing the time boundaries where one chunk ends and * the next one starts. The first value is the start time of the first chunk and the last From c90d4fd371c42ba780a39e961251ea28d3fd2621 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 26 Aug 2021 12:23:06 +0100 Subject: [PATCH 096/441] Rollback of https://github.com/google/ExoPlayer/commit/557a1833f7e36ef3bb8cdaeab3ba2c74a536d3b9 *** Original commit *** Avoid adding spy to list in DataSourceContractTests After the fix in https://github.com/mockito/mockito/issues/2331, the calls to equals on the fake transfer listener (due to its use in a list of listeners) are treated as interactions with it, meaning that the current verification of 'no more interactions' will fail. This change makes the transfer listener used for testing count bytes then delegate to another (mock) transfer listener that's passed in to avoid the problem. *** PiperOrigin-RevId: 393093785 --- .../testutil/DataSourceContractTest.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java index 78bb5ff4cc..12117e121b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java @@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -389,10 +390,8 @@ public abstract class DataSourceContractTest { for (int i = 0; i < resources.size(); i++) { additionalFailureInfo.setInfo(getFailureLabel(resources, i)); DataSource dataSource = createDataSource(); - TransferListener listener = mock(TransferListener.class); - ByteCountingTransferListener byteCountingTransferListener = - new ByteCountingTransferListener(listener); - dataSource.addTransferListener(byteCountingTransferListener); + FakeTransferListener listener = spy(new FakeTransferListener()); + dataSource.addTransferListener(listener); InOrder inOrder = Mockito.inOrder(listener); @Nullable DataSource callbackSource = getTransferListenerDataSource(); if (callbackSource == null) { @@ -430,8 +429,7 @@ public abstract class DataSourceContractTest { } // Verify sufficient onBytesTransferred() callbacks have been triggered before closing the // DataSource. - assertThat(byteCountingTransferListener.bytesTransferred) - .isAtLeast(resource.getExpectedBytes().length); + assertThat(listener.bytesTransferred).isAtLeast(resource.getExpectedBytes().length); } finally { dataSource.close(); @@ -616,37 +614,23 @@ public abstract class DataSourceContractTest { } } - /** A {@link TransferListener} that keeps track of the transferred bytes. */ - private static final class ByteCountingTransferListener implements TransferListener { - - private final TransferListener transferListener; - + /** A {@link TransferListener} that only keeps track of the transferred bytes. */ + public static class FakeTransferListener implements TransferListener { private int bytesTransferred; - public ByteCountingTransferListener(TransferListener transferListener) { - this.transferListener = transferListener; - } + @Override + public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) {} @Override - public void onTransferInitializing(DataSource source, DataSpec dataSpec, boolean isNetwork) { - transferListener.onTransferInitializing(source, dataSpec, isNetwork); - } - - @Override - public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) { - transferListener.onTransferStart(source, dataSpec, isNetwork); - } + public void onTransferStart(DataSource source, DataSpec dataSpec, boolean isNetwork) {} @Override public void onBytesTransferred( DataSource source, DataSpec dataSpec, boolean isNetwork, int bytesTransferred) { - transferListener.onBytesTransferred(source, dataSpec, isNetwork, bytesTransferred); this.bytesTransferred += bytesTransferred; } @Override - public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) { - transferListener.onTransferEnd(source, dataSpec, isNetwork); - } + public void onTransferEnd(DataSource source, DataSpec dataSpec, boolean isNetwork) {} } } From f574ec952ab622c6640c192c744299944e3902c0 Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 26 Aug 2021 13:13:22 +0100 Subject: [PATCH 097/441] Make TransformerTranscodingVideoRenderer support API < 23 PiperOrigin-RevId: 393100075 --- .../AsynchronousMediaCodecAdapter.java | 19 ++++++++- .../mediacodec/MediaCodecAdapter.java | 30 ++++++++++++-- .../SynchronousMediaCodecAdapter.java | 41 ++++++++++++------- .../transformer/MediaCodecAdapterWrapper.java | 19 +++++---- .../TransformerTranscodingVideoRenderer.java | 16 +++----- .../testutil/CapturingRenderersFactory.java | 6 +++ 6 files changed, 93 insertions(+), 38 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index dffdef4280..9cc9382238 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -118,7 +118,8 @@ import java.nio.ByteBuffer; configuration.mediaFormat, configuration.surface, configuration.crypto, - configuration.flags); + configuration.flags, + configuration.createInputSurface); return codecAdapter; } catch (Exception e) { if (codecAdapter != null) { @@ -146,6 +147,7 @@ import java.nio.ByteBuffer; private final boolean synchronizeCodecInteractionsWithQueueing; private boolean codecReleased; @State private int state; + @Nullable private Surface inputSurface; private AsynchronousMediaCodecAdapter( MediaCodec codec, @@ -166,11 +168,15 @@ import java.nio.ByteBuffer; @Nullable MediaFormat mediaFormat, @Nullable Surface surface, @Nullable MediaCrypto crypto, - int flags) { + int flags, + boolean createInputSurface) { asynchronousMediaCodecCallback.initialize(codec); TraceUtil.beginSection("configureCodec"); codec.configure(mediaFormat, surface, crypto, flags); TraceUtil.endSection(); + if (createInputSurface) { + inputSurface = codec.createInputSurface(); + } bufferEnqueuer.start(); TraceUtil.beginSection("startCodec"); codec.start(); @@ -226,6 +232,12 @@ import java.nio.ByteBuffer; return codec.getInputBuffer(index); } + @Override + @Nullable + public Surface getInputSurface() { + return inputSurface; + } + @Override @Nullable public ByteBuffer getOutputBuffer(int index) { @@ -253,6 +265,9 @@ import java.nio.ByteBuffer; } state = STATE_SHUT_DOWN; } finally { + if (inputSurface != null) { + inputSurface.release(); + } if (!codecReleased) { codec.release(); codecReleased = true; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index 183adfc417..c620e0e4a2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -45,10 +45,7 @@ public interface MediaCodecAdapter { public final MediaFormat mediaFormat; /** The {@link Format} for which the codec is being configured. */ public final Format format; - /** - * For video decoding, the output where the object will render the decoded frames; for video - * encoding, this is the input surface from which the decoded frames are retrieved. - */ + /** For video decoding, the output where the object will render the decoded frames. */ @Nullable public final Surface surface; /** For DRM protected playbacks, a {@link MediaCrypto} to use for decryption. */ @Nullable public final MediaCrypto crypto; @@ -58,6 +55,11 @@ public interface MediaCodecAdapter { * @see MediaCodec#configure */ public final int flags; + /** + * Whether to request a {@link Surface} and use it as to the input to an encoder. This can only + * be set to {@code true} on API 18+. + */ + public final boolean createInputSurface; public Configuration( MediaCodecInfo codecInfo, @@ -66,12 +68,24 @@ public interface MediaCodecAdapter { @Nullable Surface surface, @Nullable MediaCrypto crypto, int flags) { + this(codecInfo, mediaFormat, format, surface, crypto, flags, /* createInputSurface= */ false); + } + + public Configuration( + MediaCodecInfo codecInfo, + MediaFormat mediaFormat, + Format format, + @Nullable Surface surface, + @Nullable MediaCrypto crypto, + int flags, + boolean createInputSurface) { this.codecInfo = codecInfo; this.mediaFormat = mediaFormat; this.format = format; this.surface = surface; this.crypto = crypto; this.flags = flags; + this.createInputSurface = createInputSurface; } } @@ -129,6 +143,14 @@ public interface MediaCodecAdapter { @Nullable ByteBuffer getInputBuffer(int index); + /** + * Returns the input {@link Surface}, or null if the input is not a surface. + * + * @see MediaCodec#createInputSurface() + */ + @Nullable + Surface getInputSurface(); + /** * Returns a read-only ByteBuffer for a dequeued output buffer index. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index d74e41b2cf..4150592a39 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java @@ -21,7 +21,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.media.MediaCodec; import android.media.MediaFormat; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.Surface; @@ -47,31 +46,34 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { @RequiresApi(16) public MediaCodecAdapter createAdapter(Configuration configuration) throws IOException { @Nullable MediaCodec codec = null; - boolean isEncoder = configuration.flags == MediaCodec.CONFIGURE_FLAG_ENCODE; - @Nullable Surface decoderOutputSurface = isEncoder ? null : configuration.surface; + @Nullable Surface inputSurface = null; try { codec = createCodec(configuration); TraceUtil.beginSection("configureCodec"); codec.configure( configuration.mediaFormat, - decoderOutputSurface, + configuration.surface, configuration.crypto, configuration.flags); TraceUtil.endSection(); - if (isEncoder && configuration.surface != null) { - if (Build.VERSION.SDK_INT >= 23) { - Api23.setCodecInputSurface(codec, configuration.surface); + + if (configuration.createInputSurface) { + if (Util.SDK_INT >= 18) { + inputSurface = Api18.createCodecInputSurface(codec); } else { throw new IllegalStateException( - "Encoding from a surface is only supported on API 23 and up"); + "Encoding from a surface is only supported on API 18 and up."); } } TraceUtil.beginSection("startCodec"); codec.start(); TraceUtil.endSection(); - return new SynchronousMediaCodecAdapter(codec); + return new SynchronousMediaCodecAdapter(codec, inputSurface); } catch (IOException | RuntimeException e) { + if (inputSurface != null) { + inputSurface.release(); + } if (codec != null) { codec.release(); } @@ -91,11 +93,13 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { } private final MediaCodec codec; + @Nullable private final Surface inputSurface; @Nullable private ByteBuffer[] inputByteBuffers; @Nullable private ByteBuffer[] outputByteBuffers; - private SynchronousMediaCodecAdapter(MediaCodec mediaCodec) { + private SynchronousMediaCodecAdapter(MediaCodec mediaCodec, @Nullable Surface inputSurface) { this.codec = mediaCodec; + this.inputSurface = inputSurface; if (Util.SDK_INT < 21) { inputByteBuffers = codec.getInputBuffers(); outputByteBuffers = codec.getOutputBuffers(); @@ -140,6 +144,12 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { } } + @Override + @Nullable + public Surface getInputSurface() { + return inputSurface; + } + @Override @Nullable public ByteBuffer getOutputBuffer(int index) { @@ -183,6 +193,9 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { public void release() { inputByteBuffers = null; outputByteBuffers = null; + if (inputSurface != null) { + inputSurface.release(); + } codec.release(); } @@ -213,11 +226,11 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { codec.setVideoScalingMode(scalingMode); } - @RequiresApi(23) - private static final class Api23 { + @RequiresApi(18) + private static final class Api18 { @DoNotInline - public static void setCodecInputSurface(MediaCodec codec, Surface surface) { - codec.setInputSurface(surface); + public static Surface createCodecInputSurface(MediaCodec codec) { + return codec.createInputSurface(); } } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 6e30f3f27e..30a2f94ff2 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -48,6 +48,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * through {@link MediaCodecAdapter}. This is done by simplifying the calls needed to queue and * dequeue buffers, removing the need to track buffer indices and codec events. */ +@RequiresApi(18) /* package */ final class MediaCodecAdapterWrapper { // MediaCodec decoders always output 16 bit PCM, unless configured to output PCM float. @@ -142,7 +143,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * @return A configured and started decoder wrapper. * @throws IOException If the underlying codec cannot be created. */ - @RequiresApi(23) public static MediaCodecAdapterWrapper createForVideoDecoding(Format format, Surface surface) throws IOException { @Nullable MediaCodecAdapter adapter = null; @@ -163,7 +163,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; surface, /* crypto= */ null, /* flags= */ 0)); - adapter.setOutputSurface(surface); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { @@ -217,13 +216,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * * @param format The {@link Format} (of the output data) used to determine the underlying {@link * MediaCodec} and its configuration values. - * @param surface The {@link Surface} from which the encoder obtains the frame input. * @return A configured and started encoder wrapper. * @throws IOException If the underlying codec cannot be created. */ - @RequiresApi(18) - public static MediaCodecAdapterWrapper createForVideoEncoding(Format format, Surface surface) - throws IOException { + public static MediaCodecAdapterWrapper createForVideoEncoding(Format format) throws IOException { @Nullable MediaCodecAdapter adapter = null; try { MediaFormat mediaFormat = @@ -242,9 +238,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; createPlaceholderMediaCodecInfo(), mediaFormat, format, - surface, + /* surface= */ null, /* crypto= */ null, - MediaCodec.CONFIGURE_FLAG_ENCODE)); + MediaCodec.CONFIGURE_FLAG_ENCODE, + /* createInputSurface= */ true)); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { @@ -261,6 +258,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; outputBufferIndex = C.INDEX_UNSET; } + /** Returns the input {@link Surface}, or null if the input is not a surface. */ + @Nullable + public Surface getInputSurface() { + return codec.getInputSurface(); + } + /** * Dequeues a writable input buffer, if available. * diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index a7adae8535..064142186d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -19,7 +19,6 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import android.media.MediaCodec; -import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -32,7 +31,7 @@ import com.google.android.exoplayer2.source.SampleStream; import java.io.IOException; import java.nio.ByteBuffer; -@RequiresApi(23) +@RequiresApi(18) /* package */ final class TransformerTranscodingVideoRenderer extends TransformerBaseRenderer { private static final String TAG = "TransformerTranscodingVideoRenderer"; @@ -41,8 +40,6 @@ import java.nio.ByteBuffer; /** The format the encoder is configured to output, may differ from the actual output format. */ private final Format encoderConfigurationOutputFormat; - private final Surface surface; - @Nullable private MediaCodecAdapterWrapper decoder; @Nullable private MediaCodecAdapterWrapper encoder; /** Whether encoder's actual output format is obtained. */ @@ -58,7 +55,6 @@ import java.nio.ByteBuffer; super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); decoderInputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); - surface = MediaCodec.createPersistentInputSurface(); this.encoderConfigurationOutputFormat = encoderConfigurationOutputFormat; } @@ -93,7 +89,6 @@ import java.nio.ByteBuffer; protected void onReset() { decoderInputBuffer.clear(); decoderInputBuffer.data = null; - surface.release(); if (decoder != null) { decoder.release(); decoder = null; @@ -121,8 +116,11 @@ import java.nio.ByteBuffer; } Format inputFormat = checkNotNull(formatHolder.format); + MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); try { - decoder = MediaCodecAdapterWrapper.createForVideoDecoding(inputFormat, surface); + decoder = + MediaCodecAdapterWrapper.createForVideoDecoding( + inputFormat, checkNotNull(encoder.getInputSurface())); } catch (IOException e) { throw createRendererException( e, formatHolder.format, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); @@ -136,9 +134,7 @@ import java.nio.ByteBuffer; } try { - encoder = - MediaCodecAdapterWrapper.createForVideoEncoding( - encoderConfigurationOutputFormat, surface); + encoder = MediaCodecAdapterWrapper.createForVideoEncoding(encoderConfigurationOutputFormat); } catch (IOException e) { throw createRendererException( // TODO(claincly): should be "ENCODER_INIT_FAILED" diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java index 86b4d508c4..0a2f5832ac 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java @@ -193,6 +193,12 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa return inputBuffer; } + @Nullable + @Override + public Surface getInputSurface() { + return delegate.getInputSurface(); + } + @Nullable @Override public ByteBuffer getOutputBuffer(int index) { From 84cf63a72f90a2a841fa5e233faf2e6935a77232 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 26 Aug 2021 16:45:03 +0100 Subject: [PATCH 098/441] Test DefaultDrmSession provisioning is requested by provideKeyResponse Follow-up to PiperOrigin-RevId: 393132950 --- .../drm/DefaultDrmSessionManagerTest.java | 27 +++++++++++++++ .../exoplayer2/testutil/FakeExoMediaDrm.java | 33 +++++++++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java index d5bfc5f663..e5375012f7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java @@ -665,6 +665,33 @@ public class DefaultDrmSessionManagerTest { assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(2); } + @Test + public void keyResponseIndicatesProvisioningRequired_provisioningDone() { + FakeExoMediaDrm.LicenseServer licenseServer = + FakeExoMediaDrm.LicenseServer.requiringProvisioningThenAllowingSchemeDatas( + DRM_SCHEME_DATAS); + + DefaultDrmSessionManager drmSessionManager = + new DefaultDrmSessionManager.Builder() + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm.Builder().build()) + .build(/* mediaDrmCallback= */ licenseServer); + drmSessionManager.prepare(); + DrmSession drmSession = + checkNotNull( + drmSessionManager.acquireSession( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + FORMAT_WITH_DRM_INIT_DATA)); + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); + waitForOpenedWithKeys(drmSession); + + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); + assertThat(drmSession.queryKeyStatus()) + .containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE); + assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(1); + } + @Test public void provisioningUndoneWhileManagerIsActive_deviceReprovisioned() { FakeExoMediaDrm.LicenseServer licenseServer = diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index 9e5d1498b6..a369984242 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -138,6 +138,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { private static final ImmutableList VALID_KEY_RESPONSE = TestUtil.createByteList(1, 2, 3); private static final ImmutableList KEY_DENIED_RESPONSE = TestUtil.createByteList(9, 8, 7); + private static final ImmutableList PROVISIONING_REQUIRED_RESPONSE = + TestUtil.createByteList(4, 5, 6); private final int provisionsRequired; private final int maxConcurrentSessions; @@ -258,7 +260,6 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { return new KeyRequest(requestData.toByteArray(), /* licenseServerUrl= */ "", requestType); } - @Nullable @Override public byte[] provideKeyResponse(byte[] scope, byte[] response) throws NotProvisionedException, DeniedByServerException { @@ -268,6 +269,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { sessionIdsWithValidKeys.add(Bytes.asList(scope)); } else if (responseAsList.equals(KEY_DENIED_RESPONSE)) { throw new DeniedByServerException("Key request denied"); + } else if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) { + throw new NotProvisionedException("Provisioning required"); } return Util.EMPTY_BYTE_ARRAY; } @@ -417,6 +420,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { private final List> receivedProvisionRequests; private final List> receivedSchemeDatas; + private boolean nextResponseIndicatesProvisioningRequired; + @SafeVarargs public static LicenseServer allowingSchemeDatas(List... schemeDatas) { ImmutableSet.Builder> schemeDatasBuilder = @@ -427,6 +432,19 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { return new LicenseServer(schemeDatasBuilder.build()); } + @SafeVarargs + public static LicenseServer requiringProvisioningThenAllowingSchemeDatas( + List... schemeDatas) { + ImmutableSet.Builder> schemeDatasBuilder = + ImmutableSet.builder(); + for (List schemeData : schemeDatas) { + schemeDatasBuilder.add(ImmutableList.copyOf(schemeData)); + } + LicenseServer licenseServer = new LicenseServer(schemeDatasBuilder.build()); + licenseServer.nextResponseIndicatesProvisioningRequired = true; + return licenseServer; + } + private LicenseServer(ImmutableSet> allowedSchemeDatas) { this.allowedSchemeDatas = allowedSchemeDatas; @@ -459,8 +477,17 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { ImmutableList schemeDatas = KeyRequestData.fromByteArray(request.getData()).schemeDatas; receivedSchemeDatas.add(schemeDatas); - return Bytes.toArray( - allowedSchemeDatas.contains(schemeDatas) ? VALID_KEY_RESPONSE : KEY_DENIED_RESPONSE); + + ImmutableList response; + if (nextResponseIndicatesProvisioningRequired) { + nextResponseIndicatesProvisioningRequired = false; + response = PROVISIONING_REQUIRED_RESPONSE; + } else if (allowedSchemeDatas.contains(schemeDatas)) { + response = VALID_KEY_RESPONSE; + } else { + response = KEY_DENIED_RESPONSE; + } + return Bytes.toArray(response); } } From 9c2b4b860b0729c0b55b21b90e064a488094700b Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 26 Aug 2021 16:49:05 +0100 Subject: [PATCH 099/441] Enforce valid key responses in FakeExoMediaDrm Make this behaviour optional, so it can be disabled for AnalyticsCollectorTest where we don't use FakeExoMediaDrm.LicenseServer. PiperOrigin-RevId: 393133721 --- .../analytics/AnalyticsCollectorTest.java | 12 ++++-- .../exoplayer2/testutil/FakeExoMediaDrm.java | 37 ++++++++++++++++--- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 8cd72a140f..2c8373d64a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -173,7 +173,9 @@ public final class AnalyticsCollectorTest { private final DrmSessionManager drmSessionManager = new DefaultDrmSessionManager.Builder() - .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, + uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build()) .setMultiSession(true) .build(new EmptyDrmCallback()); @@ -1452,7 +1454,9 @@ public final class AnalyticsCollectorTest { BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.returnsEmpty(); DrmSessionManager blockingDrmSessionManager = new DefaultDrmSessionManager.Builder() - .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, + uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build()) .setMultiSession(true) .build(mediaDrmCallback); MediaSource mediaSource = @@ -1518,7 +1522,9 @@ public final class AnalyticsCollectorTest { BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.alwaysFailing(); DrmSessionManager failingDrmSessionManager = new DefaultDrmSessionManager.Builder() - .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, + uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build()) .setMultiSession(true) .build(mediaDrmCallback); MediaSource mediaSource = diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java index a369984242..8d55c0e424 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.java @@ -65,16 +65,29 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { /** Builder for {@link FakeExoMediaDrm} instances. */ public static class Builder { + private boolean enforceValidKeyResponses; private int provisionsRequired; private boolean throwNotProvisionedExceptionFromGetKeyRequest; private int maxConcurrentSessions; /** Constructs an instance. */ public Builder() { + enforceValidKeyResponses = true; provisionsRequired = 0; maxConcurrentSessions = Integer.MAX_VALUE; } + /** + * Sets whether key responses passed to {@link #provideKeyResponse(byte[], byte[])} should be + * checked for validity (i.e. that they came from a {@link LicenseServer}). + * + *

    Defaults to true. + */ + public Builder setEnforceValidKeyResponses(boolean enforceValidKeyResponses) { + this.enforceValidKeyResponses = enforceValidKeyResponses; + return this; + } + /** * Sets how many successful provisioning round trips are needed for the {@link FakeExoMediaDrm} * to be provisioned. @@ -120,7 +133,10 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { */ public FakeExoMediaDrm build() { return new FakeExoMediaDrm( - provisionsRequired, throwNotProvisionedExceptionFromGetKeyRequest, maxConcurrentSessions); + enforceValidKeyResponses, + provisionsRequired, + throwNotProvisionedExceptionFromGetKeyRequest, + maxConcurrentSessions); } } @@ -141,6 +157,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { private static final ImmutableList PROVISIONING_REQUIRED_RESPONSE = TestUtil.createByteList(4, 5, 6); + private final boolean enforceValidKeyResponses; private final int provisionsRequired; private final int maxConcurrentSessions; private final boolean throwNotProvisionedExceptionFromGetKeyRequest; @@ -164,15 +181,18 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { @Deprecated public FakeExoMediaDrm(int maxConcurrentSessions) { this( + /* enforceValidKeyResponses= */ true, /* provisionsRequired= */ 0, /* throwNotProvisionedExceptionFromGetKeyRequest= */ false, maxConcurrentSessions); } private FakeExoMediaDrm( + boolean enforceValidKeyResponses, int provisionsRequired, boolean throwNotProvisionedExceptionFromGetKeyRequest, int maxConcurrentSessions) { + this.enforceValidKeyResponses = enforceValidKeyResponses; this.provisionsRequired = provisionsRequired; this.maxConcurrentSessions = maxConcurrentSessions; this.throwNotProvisionedExceptionFromGetKeyRequest = @@ -265,13 +285,20 @@ public final class FakeExoMediaDrm implements ExoMediaDrm { throws NotProvisionedException, DeniedByServerException { Assertions.checkState(referenceCount > 0); List responseAsList = Bytes.asList(response); - if (responseAsList.equals(VALID_KEY_RESPONSE)) { - sessionIdsWithValidKeys.add(Bytes.asList(scope)); - } else if (responseAsList.equals(KEY_DENIED_RESPONSE)) { + if (responseAsList.equals(KEY_DENIED_RESPONSE)) { throw new DeniedByServerException("Key request denied"); - } else if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) { + } + if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) { throw new NotProvisionedException("Provisioning required"); } + if (enforceValidKeyResponses && !responseAsList.equals(VALID_KEY_RESPONSE)) { + throw new IllegalArgumentException( + "Unrecognised response. scope=" + + Util.toHexString(scope) + + ", response=" + + Util.toHexString(response)); + } + sessionIdsWithValidKeys.add(Bytes.asList(scope)); return Util.EMPTY_BYTE_ARRAY; } From 58e5ed0afb4c92f7f8437d380949c8d6d44490c7 Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 27 Aug 2021 12:16:53 +0100 Subject: [PATCH 100/441] Fix transcoding drops a few frames. In the old version, the transcoder uses decoder.isEnded() alone as the criteria to stop the encoding/muxing process. It's rectified to: - On decoder ending, signal the encoder of EOS after writing all decoded frames to it. - On encoder ending, write end track to muxer. PiperOrigin-RevId: 393322114 --- .../mediacodec/AsynchronousMediaCodecAdapter.java | 5 +++++ .../exoplayer2/mediacodec/MediaCodecAdapter.java | 9 +++++++++ .../mediacodec/SynchronousMediaCodecAdapter.java | 11 +++++++++++ .../transformer/MediaCodecAdapterWrapper.java | 5 +++++ .../TransformerTranscodingVideoRenderer.java | 14 +++++++++----- .../testutil/CapturingRenderersFactory.java | 6 ++++++ 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index 9cc9382238..eef4441c92 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -303,6 +303,11 @@ import java.nio.ByteBuffer; codec.setVideoScalingMode(scalingMode); } + @Override + public void signalEndOfInputStream() { + codec.signalEndOfInputStream(); + } + @VisibleForTesting /* package */ void onError(MediaCodec.CodecException error) { asynchronousMediaCodecCallback.onError(codec, error); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index c620e0e4a2..7dd15954b1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -242,4 +242,13 @@ public interface MediaCodecAdapter { /** Whether the adapter needs to be reconfigured before it is used. */ boolean needsReconfiguration(); + + /** + * Signals the encoder of end-of-stream on input. The call can only be used when the encoder + * receives its input from a {@link Surface surface}. + * + * @see MediaCodec#signalEndOfInputStream() + */ + @RequiresApi(18) + void signalEndOfInputStream(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index 4150592a39..1af545c6d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java @@ -199,6 +199,12 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { codec.release(); } + @Override + @RequiresApi(18) + public void signalEndOfInputStream() { + Api18.signalEndOfInputStream(codec); + } + @Override @RequiresApi(23) public void setOnFrameRenderedListener(OnFrameRenderedListener listener, Handler handler) { @@ -232,5 +238,10 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { public static Surface createCodecInputSurface(MediaCodec codec) { return codec.createInputSurface(); } + + @DoNotInline + public static void signalEndOfInputStream(MediaCodec codec) { + codec.signalEndOfInputStream(); + } } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 30a2f94ff2..abe338cef0 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -311,6 +311,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; inputBuffer.data = null; } + @RequiresApi(18) + public void signalEndOfInputStream() { + codec.signalEndOfInputStream(); + } + /** Returns the current output format, if available. */ @Nullable public Format getOutputFormat() { diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 064142186d..545bbc6fc7 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -175,8 +175,15 @@ import java.nio.ByteBuffer; if (decoder.isEnded()) { return false; } + // Rendering the decoder output queues input to the encoder because they share the same surface. - return decoder.maybeDequeueRenderAndReleaseOutputBuffer(); + boolean hasProcessedOutputBuffer = decoder.maybeDequeueRenderAndReleaseOutputBuffer(); + if (decoder.isEnded()) { + checkNotNull(encoder).signalEndOfInputStream(); + // All decoded frames have been rendered to the encoder's input surface. + return false; + } + return hasProcessedOutputBuffer; } private boolean feedMuxerFromEncoder() { @@ -190,10 +197,7 @@ import java.nio.ByteBuffer; muxerWrapper.addTrackFormat(encoderOutputFormat); } - // TODO(claincly) May have to use inputStreamBuffer.isEndOfStream result to call - // decoder.signalEndOfInputStream(). - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); - if (decoder.isEnded()) { + if (encoder.isEnded()) { muxerWrapper.endTrack(getTrackType()); muxerWrapperTrackEnded = true; return false; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java index 0a2f5832ac..edb07348f3 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java @@ -268,6 +268,12 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa delegate.setVideoScalingMode(scalingMode); } + @RequiresApi(18) + @Override + public void signalEndOfInputStream() { + delegate.signalEndOfInputStream(); + } + // Dumpable implementation @Override From 9b2cd6a4e9ef20c81880d726685f098bbb67c95b Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 27 Aug 2021 15:42:20 +0100 Subject: [PATCH 101/441] Fix NPE in TransformerTranscodingVideoRenderer The NPE was caused by the fact that the encoder surface was passed to the decoder before configuring the encoder. PiperOrigin-RevId: 393349794 --- .../transformer/TransformerTranscodingVideoRenderer.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 545bbc6fc7..3122371b07 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -69,14 +69,12 @@ import java.nio.ByteBuffer; return; } - if (!ensureDecoderConfigured()) { + if (!ensureEncoderConfigured() || !ensureDecoderConfigured()) { return; } - if (ensureEncoderConfigured()) { - while (feedMuxerFromEncoder()) {} - while (feedEncoderFromDecoder()) {} - } + while (feedMuxerFromEncoder()) {} + while (feedEncoderFromDecoder()) {} while (feedDecoderFromInput()) {} } From 8861ab48534ddb5daccd9fc4c58bd1d3b6945190 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 27 Aug 2021 18:05:16 +0100 Subject: [PATCH 102/441] Implement setPlaybackParameters for CastPlayer Issue: #6784 PiperOrigin-RevId: 393374139 --- RELEASENOTES.md | 4 + .../exoplayer2/ext/cast/CastPlayer.java | 67 ++++++++++++-- .../exoplayer2/ext/cast/CastPlayerTest.java | 91 ++++++++++++++++++- 3 files changed, 155 insertions(+), 7 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8e5a3406c5..6cb050724d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -48,6 +48,10 @@ `DefaultHttpDataSource.Factory` instead. * Remove `GvrAudioProcessor` and the GVR extension, which has been deprecated since 2.11.0. +* Cast extension: + * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to + support setting the playback speed + ([#6784](https://github.com/google/ExoPlayer/issues/6784)). ### 2.15.0 (2021-08-10) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 82213920af..3e3d1fac56 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -97,6 +97,7 @@ public final class CastPlayer extends BasePlayer { COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_REPEAT_MODE, + COMMAND_SET_SPEED_AND_PITCH, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_TIMELINE, COMMAND_GET_MEDIA_ITEMS_METADATA, @@ -104,6 +105,9 @@ public final class CastPlayer extends BasePlayer { COMMAND_CHANGE_MEDIA_ITEMS) .build(); + public static final float MIN_SPEED_SUPPORTED = 0.5f; + public static final float MAX_SPEED_SUPPORTED = 2.0f; + private static final String TAG = "CastPlayer"; private static final int RENDERER_COUNT = 3; @@ -134,6 +138,7 @@ public final class CastPlayer extends BasePlayer { // Internal state. private final StateHolder playWhenReady; private final StateHolder repeatMode; + private final StateHolder playbackParameters; @Nullable private RemoteMediaClient remoteMediaClient; private CastTimeline currentTimeline; private TrackGroupArray currentTrackGroups; @@ -210,6 +215,7 @@ public final class CastPlayer extends BasePlayer { (listener, flags) -> listener.onEvents(/* player= */ this, new Events(flags))); playWhenReady = new StateHolder<>(false); repeatMode = new StateHolder<>(REPEAT_MODE_OFF); + playbackParameters = new StateHolder<>(PlaybackParameters.DEFAULT); playbackState = STATE_IDLE; currentTimeline = CastTimeline.EMPTY_CAST_TIMELINE; currentTrackGroups = TrackGroupArray.EMPTY; @@ -465,14 +471,9 @@ public final class CastPlayer extends BasePlayer { return C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS; } - @Override - public void setPlaybackParameters(PlaybackParameters playbackParameters) { - // Unsupported by the RemoteMediaClient API. Do nothing. - } - @Override public PlaybackParameters getPlaybackParameters() { - return PlaybackParameters.DEFAULT; + return playbackParameters.value; } @Override @@ -491,6 +492,32 @@ public final class CastPlayer extends BasePlayer { sessionManager.endCurrentSession(false); } + @Override + public void setPlaybackParameters(PlaybackParameters playbackParameters) { + if (remoteMediaClient == null) { + return; + } + PlaybackParameters actualPlaybackParameters = + new PlaybackParameters( + Util.constrainValue( + playbackParameters.speed, MIN_SPEED_SUPPORTED, MAX_SPEED_SUPPORTED)); + setPlaybackParametersAndNotifyIfChanged(actualPlaybackParameters); + listeners.flushEvents(); + PendingResult pendingResult = + remoteMediaClient.setPlaybackRate(actualPlaybackParameters.speed, /* customData= */ null); + this.playbackParameters.pendingResultCallback = + new ResultCallback() { + @Override + public void onResult(MediaChannelResult mediaChannelResult) { + if (remoteMediaClient != null) { + updatePlaybackRateAndNotifyIfChanged(this); + listeners.flushEvents(); + } + } + }; + pendingResult.setResultCallback(this.playbackParameters.pendingResultCallback); + } + @Override public void setRepeatMode(@RepeatMode int repeatMode) { if (remoteMediaClient == null) { @@ -771,6 +798,7 @@ public final class CastPlayer extends BasePlayer { Player.EVENT_IS_PLAYING_CHANGED, listener -> listener.onIsPlayingChanged(isPlaying)); } updateRepeatModeAndNotifyIfChanged(/* resultCallback= */ null); + updatePlaybackRateAndNotifyIfChanged(/* resultCallback= */ null); boolean playingPeriodChangedByTimelineChange = updateTimelineAndNotifyIfChanged(); Timeline currentTimeline = getCurrentTimeline(); currentWindowIndex = fetchCurrentWindowIndex(remoteMediaClient, currentTimeline); @@ -856,6 +884,22 @@ public final class CastPlayer extends BasePlayer { newPlayWhenReadyValue, playWhenReadyChangeReason, fetchPlaybackState(remoteMediaClient)); } + @RequiresNonNull("remoteMediaClient") + private void updatePlaybackRateAndNotifyIfChanged(@Nullable ResultCallback resultCallback) { + if (playbackParameters.acceptsUpdate(resultCallback)) { + @Nullable MediaStatus mediaStatus = remoteMediaClient.getMediaStatus(); + float speed = + mediaStatus != null + ? (float) mediaStatus.getPlaybackRate() + : PlaybackParameters.DEFAULT.speed; + if (speed > 0.0f) { + // Set the speed if not paused. + setPlaybackParametersAndNotifyIfChanged(new PlaybackParameters(speed)); + } + playbackParameters.clearPendingResultCallback(); + } + } + @RequiresNonNull("remoteMediaClient") private void updateRepeatModeAndNotifyIfChanged(@Nullable ResultCallback resultCallback) { if (repeatMode.acceptsUpdate(resultCallback)) { @@ -1115,6 +1159,17 @@ public final class CastPlayer extends BasePlayer { } } + private void setPlaybackParametersAndNotifyIfChanged(PlaybackParameters playbackParameters) { + if (this.playbackParameters.value.equals(playbackParameters)) { + return; + } + this.playbackParameters.value = playbackParameters; + listeners.queueEvent( + Player.EVENT_PLAYBACK_PARAMETERS_CHANGED, + listener -> listener.onPlaybackParametersChanged(playbackParameters)); + updateAvailableCommandsAndNotifyIfChanged(); + } + @SuppressWarnings("deprecation") private void setPlayerStateAndNotifyIfChanged( boolean playWhenReady, diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index ff1fc998c7..f07e975b1d 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -61,6 +61,7 @@ import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.Assertions; @@ -126,6 +127,7 @@ public class CastPlayerTest { // Make the remote media client present the same default values as ExoPlayer: when(mockRemoteMediaClient.isPaused()).thenReturn(true); when(mockMediaStatus.getQueueRepeatMode()).thenReturn(MediaStatus.REPEAT_MODE_REPEAT_OFF); + when(mockMediaStatus.getPlaybackRate()).thenReturn(1.0d); castPlayer = new CastPlayer(mockCastContext); castPlayer.addListener(mockListener); verify(mockRemoteMediaClient).registerCallback(callbackArgumentCaptor.capture()); @@ -208,6 +210,93 @@ public class CastPlayerTest { assertThat(castPlayer.getPlayWhenReady()).isTrue(); } + @Test + public void playbackParameters_defaultPlaybackSpeed_isUnitSpeed() { + assertThat(castPlayer.getPlaybackParameters()).isEqualTo(PlaybackParameters.DEFAULT); + } + + @Test + public void playbackParameters_onStatusUpdated_setsRemotePlaybackSpeed() { + PlaybackParameters expectedPlaybackParameters = new PlaybackParameters(/* speed= */ 1.234f); + when(mockMediaStatus.getPlaybackRate()).thenReturn(1.234d); + + remoteMediaClientCallback.onStatusUpdated(); + + assertThat(castPlayer.getPlaybackParameters()).isEqualTo(expectedPlaybackParameters); + verify(mockListener).onPlaybackParametersChanged(expectedPlaybackParameters); + } + + @Test + public void playbackParameters_onStatusUpdated_ignoreInPausedState() { + when(mockMediaStatus.getPlaybackRate()).thenReturn(0.0d); + + remoteMediaClientCallback.onStatusUpdated(); + + assertThat(castPlayer.getPlaybackParameters()).isEqualTo(PlaybackParameters.DEFAULT); + verifyNoMoreInteractions(mockListener); + } + + @Test + public void setPlaybackParameters_speedOutOfRange_valueIsConstraintToMinAndMax() { + when(mockRemoteMediaClient.setPlaybackRate(eq(2d), any())).thenReturn(mockPendingResult); + when(mockRemoteMediaClient.setPlaybackRate(eq(0.5d), any())).thenReturn(mockPendingResult); + PlaybackParameters expectedMaxValuePlaybackParameters = new PlaybackParameters(/* speed= */ 2f); + PlaybackParameters expectedMinValuePlaybackParameters = + new PlaybackParameters(/* speed= */ 0.5f); + + castPlayer.setPlaybackParameters(new PlaybackParameters(/* speed= */ 2.001f)); + verify(mockListener).onPlaybackParametersChanged(expectedMaxValuePlaybackParameters); + castPlayer.setPlaybackParameters(new PlaybackParameters(/* speed= */ 0.499f)); + verify(mockListener).onPlaybackParametersChanged(expectedMinValuePlaybackParameters); + } + + @Test + public void setPlaybackParameters_masksPendingState() { + PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 1.234f); + when(mockRemoteMediaClient.setPlaybackRate(eq((double) 1.234f), any())) + .thenReturn(mockPendingResult); + + castPlayer.setPlaybackParameters(playbackParameters); + + verify(mockPendingResult).setResultCallback(setResultCallbackArgumentCaptor.capture()); + assertThat(castPlayer.getPlaybackParameters().speed).isEqualTo(1.234f); + verify(mockListener).onPlaybackParametersChanged(playbackParameters); + + // Simulate a status update while the update is pending that must not override the masked speed. + when(mockMediaStatus.getPlaybackRate()).thenReturn(99.0d); + remoteMediaClientCallback.onStatusUpdated(); + assertThat(castPlayer.getPlaybackParameters().speed).isEqualTo(1.234f); + + // Call the captured result callback when the device responds. The listener must not be called. + when(mockMediaStatus.getPlaybackRate()).thenReturn(1.234d); + setResultCallbackArgumentCaptor + .getValue() + .onResult(mock(RemoteMediaClient.MediaChannelResult.class)); + assertThat(castPlayer.getPlaybackParameters().speed).isEqualTo(1.234f); + verifyNoMoreInteractions(mockListener); + } + + @Test + public void setPlaybackParameters_speedChangeNotSupported_resetOnResultCallback() { + when(mockRemoteMediaClient.setPlaybackRate(eq((double) 1.234f), any())) + .thenReturn(mockPendingResult); + PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 1.234f); + + // Change the playback speed and and capture the result callback. + castPlayer.setPlaybackParameters(playbackParameters); + verify(mockPendingResult).setResultCallback(setResultCallbackArgumentCaptor.capture()); + verify(mockListener).onPlaybackParametersChanged(new PlaybackParameters(/* speed= */ 1.234f)); + + // The device does not support speed changes and returns unit speed to the result callback. + when(mockMediaStatus.getPlaybackRate()).thenReturn(1.0d); + setResultCallbackArgumentCaptor + .getValue() + .onResult(mock(RemoteMediaClient.MediaChannelResult.class)); + assertThat(castPlayer.getPlaybackParameters()).isEqualTo(PlaybackParameters.DEFAULT); + verify(mockListener).onPlaybackParametersChanged(PlaybackParameters.DEFAULT); + verifyNoMoreInteractions(mockListener); + } + @Test public void setRepeatMode_masksRemoteState() { when(mockRemoteMediaClient.queueSetRepeatMode(anyInt(), any())).thenReturn(mockPendingResult); @@ -1236,7 +1325,7 @@ public class CastPlayerTest { assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_BACK)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_FORWARD)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE)).isFalse(); assertThat(castPlayer.isCommandAvailable(COMMAND_SET_REPEAT_MODE)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_GET_CURRENT_MEDIA_ITEM)).isTrue(); From a1ec56a1570a35a19cec3a70da30ec8ca60f5a55 Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 27 Aug 2021 18:40:11 +0100 Subject: [PATCH 103/441] Add basic shaders to Transformer PiperOrigin-RevId: 393381694 --- .../assets/shaders/blit_vertex_shader.glsl | 21 +++++++++++++++++++ .../copy_external_fragment_shader.glsl | 20 ++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 library/transformer/src/main/assets/shaders/blit_vertex_shader.glsl create mode 100644 library/transformer/src/main/assets/shaders/copy_external_fragment_shader.glsl diff --git a/library/transformer/src/main/assets/shaders/blit_vertex_shader.glsl b/library/transformer/src/main/assets/shaders/blit_vertex_shader.glsl new file mode 100644 index 0000000000..502a8c4493 --- /dev/null +++ b/library/transformer/src/main/assets/shaders/blit_vertex_shader.glsl @@ -0,0 +1,21 @@ +// Copyright 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +attribute vec4 a_position; +attribute vec4 a_texcoord; +uniform mat4 tex_transform; +varying vec2 v_texcoord; +void main() { + gl_Position = a_position; + v_texcoord = (tex_transform * a_texcoord).xy; +} diff --git a/library/transformer/src/main/assets/shaders/copy_external_fragment_shader.glsl b/library/transformer/src/main/assets/shaders/copy_external_fragment_shader.glsl new file mode 100644 index 0000000000..47da1ef8d3 --- /dev/null +++ b/library/transformer/src/main/assets/shaders/copy_external_fragment_shader.glsl @@ -0,0 +1,20 @@ +// Copyright 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#extension GL_OES_EGL_image_external : require +precision mediump float; +uniform samplerExternalOES tex_sampler; +varying vec2 v_texcoord; +void main() { + gl_FragColor = texture2D(tex_sampler, v_texcoord); +} From 75a69082065ff5980ce1901ca392589e6a313745 Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 27 Aug 2021 19:21:29 +0100 Subject: [PATCH 104/441] Add methods needed by Transformer to GlUtil This is to add a step to the Transformer transcoding video pipeline to copy from a surface to another using OpenGL. PiperOrigin-RevId: 393391005 --- RELEASENOTES.md | 2 + .../exoplayer2/ExoPlayerLibraryInfo.java | 3 - .../android/exoplayer2/util/GlUtil.java | 213 ++++++++++++++++-- 3 files changed, 202 insertions(+), 16 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6cb050724d..365efac3f2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,8 @@ * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Fix track selection in `StyledPlayerControlView` when using `ForwardingPlayer`. + * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use + `GlUtil.glAssertionsEnabled` instead. * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). 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 198ec23817..cafe4f5b04 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 @@ -57,9 +57,6 @@ public final class ExoPlayerLibraryInfo { */ public static final boolean ASSERTIONS_ENABLED = true; - /** Whether an exception should be thrown in case of an OpenGl error. */ - public static final boolean GL_ASSERTIONS_ENABLED = false; - /** * Whether the library was compiled with {@link com.google.android.exoplayer2.util.TraceUtil} * trace enabled. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index b41b6fd2b0..09fc24add7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -20,13 +20,17 @@ import static android.opengl.GLU.gluErrorString; import android.content.Context; import android.content.pm.PackageManager; import android.opengl.EGL14; +import android.opengl.EGLConfig; +import android.opengl.EGLContext; import android.opengl.EGLDisplay; +import android.opengl.EGLSurface; import android.opengl.GLES11Ext; import android.opengl.GLES20; import android.text.TextUtils; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -37,6 +41,17 @@ import javax.microedition.khronos.egl.EGL10; /** GL utilities. */ public final class GlUtil { + /** Thrown when an OpenGL error occurs and {@link #glAssertionsEnabled} is {@code true}. */ + public static final class GlException extends RuntimeException { + /** Creates an instance with the specified error message. */ + public GlException(String message) { + super(message); + } + } + + /** Thrown when the required EGL version is not supported by the device. */ + public static final class UnsupportedEglVersionException extends Exception {} + /** * GL attribute, which can be attached to a buffer with {@link Attribute#setBuffer(float[], int)}. */ @@ -185,7 +200,7 @@ public final class GlUtil { } if (texId == 0) { - throw new IllegalStateException("call setSamplerTexId before bind"); + throw new IllegalStateException("Call setSamplerTexId before bind."); } GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + unit); if (type == GLES11Ext.GL_SAMPLER_EXTERNAL_OES) { @@ -193,7 +208,7 @@ public final class GlUtil { } else if (type == GLES20.GL_SAMPLER_2D) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId); } else { - throw new IllegalStateException("unexpected uniform type: " + type); + throw new IllegalStateException("Unexpected uniform type: " + type); } GLES20.glUniform1i(location, unit); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); @@ -206,6 +221,9 @@ public final class GlUtil { } } + /** Whether to throw a {@link GlException} in case of an OpenGL error. */ + public static boolean glAssertionsEnabled = false; + private static final String TAG = "GlUtil"; private static final String EXTENSION_PROTECTED_CONTENT = "EGL_EXT_protected_content"; @@ -254,9 +272,38 @@ public final class GlUtil { return eglExtensions != null && eglExtensions.contains(EXTENSION_SURFACELESS_CONTEXT); } + /** Returns an initialized default {@link EGLDisplay}. */ + @RequiresApi(17) + public static EGLDisplay createEglDisplay() { + return Api17.createEglDisplay(); + } + /** - * If there is an OpenGl error, logs the error and if {@link - * ExoPlayerLibraryInfo#GL_ASSERTIONS_ENABLED} is true throws a {@link RuntimeException}. + * Returns a new {@link EGLContext} for the specified {@link EGLDisplay}. + * + * @throws UnsupportedEglVersionException If the device does not support EGL version 2. {@code + * eglDisplay} is terminated before the exception is thrown in this case. + */ + @RequiresApi(17) + public static EGLContext createEglContext(EGLDisplay eglDisplay) + throws UnsupportedEglVersionException { + return Api17.createEglContext(eglDisplay); + } + + /** + * Returns a new {@link EGLSurface} wrapping the specified {@code surface}. + * + * @param eglDisplay The {@link EGLDisplay} to attach the surface to. + * @param surface The surface to wrap; must be a surface, surface texture or surface holder. + */ + @RequiresApi(17) + public static EGLSurface getEglSurface(EGLDisplay eglDisplay, Object surface) { + return Api17.getEglSurface(eglDisplay, surface); + } + + /** + * If there is an OpenGl error, logs the error and if {@link #glAssertionsEnabled} is true throws + * a {@link GlException}. */ public static void checkGlError() { int lastError = GLES20.GL_NO_ERROR; @@ -265,11 +312,21 @@ public final class GlUtil { Log.e(TAG, "glError " + gluErrorString(error)); lastError = error; } - if (ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED && lastError != GLES20.GL_NO_ERROR) { - throw new RuntimeException("glError " + gluErrorString(lastError)); + if (lastError != GLES20.GL_NO_ERROR) { + throwGlException("glError " + gluErrorString(lastError)); } } + /** + * Makes the specified {@code surface} the render target, using a viewport of {@code width} by + * {@code height} pixels. + */ + @RequiresApi(17) + public static void focusSurface( + EGLDisplay eglDisplay, EGLContext eglContext, EGLSurface surface, int width, int height) { + Api17.focusSurface(eglDisplay, eglContext, surface, width, height); + } + /** * Builds a GL shader program from vertex and fragment shader code. * @@ -303,7 +360,7 @@ public final class GlUtil { int[] linkStatus = new int[] {GLES20.GL_FALSE}; GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); if (linkStatus[0] != GLES20.GL_TRUE) { - throwGlError("Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(program)); + throwGlException("Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(program)); } checkGlError(); @@ -315,7 +372,7 @@ public final class GlUtil { int[] attributeCount = new int[1]; GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); if (attributeCount[0] != 2) { - throw new IllegalStateException("expected two attributes"); + throw new IllegalStateException("Expected two attributes."); } Attribute[] attributes = new Attribute[attributeCount[0]]; @@ -338,6 +395,27 @@ public final class GlUtil { return uniforms; } + /** + * Deletes a GL texture. + * + * @param textureId The ID of the texture to delete. + */ + public static void deleteTexture(int textureId) { + int[] textures = new int[] {textureId}; + GLES20.glDeleteTextures(1, textures, 0); + checkGlError(); + } + + /** + * Destroys the {@link EGLContext} identified by the provided {@link EGLDisplay} and {@link + * EGLContext}. + */ + @RequiresApi(17) + public static void destroyEglContext( + @Nullable EGLDisplay eglDisplay, @Nullable EGLContext eglContext) { + Api17.destroyEglContext(eglDisplay, eglContext); + } + /** * Allocates a FloatBuffer with the given data. * @@ -385,7 +463,7 @@ public final class GlUtil { int[] result = new int[] {GLES20.GL_FALSE}; GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); if (result[0] != GLES20.GL_TRUE) { - throwGlError(GLES20.glGetShaderInfoLog(shader) + ", source: " + source); + throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + source); } GLES20.glAttachShader(program, shader); @@ -393,10 +471,16 @@ public final class GlUtil { checkGlError(); } - private static void throwGlError(String errorMsg) { + private static void throwGlException(String errorMsg) { Log.e(TAG, errorMsg); - if (ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED) { - throw new RuntimeException(errorMsg); + if (glAssertionsEnabled) { + throw new GlException(errorMsg); + } + } + + private static void checkEglException(boolean expression, String errorMessage) { + if (!expression) { + throwGlException(errorMessage); } } @@ -409,4 +493,107 @@ public final class GlUtil { } return strVal.length; } + + @RequiresApi(17) + private static final class Api17 { + private Api17() {} + + @DoNotInline + public static EGLDisplay createEglDisplay() { + EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + checkEglException(!eglDisplay.equals(EGL14.EGL_NO_DISPLAY), "No EGL display."); + int[] major = new int[1]; + int[] minor = new int[1]; + if (!EGL14.eglInitialize(eglDisplay, major, 0, minor, 0)) { + throwGlException("Error in eglInitialize."); + } + checkGlError(); + return eglDisplay; + } + + @DoNotInline + public static EGLContext createEglContext(EGLDisplay eglDisplay) + throws UnsupportedEglVersionException { + int[] contextAttributes = {EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE}; + EGLContext eglContext = + EGL14.eglCreateContext( + eglDisplay, getEglConfig(eglDisplay), EGL14.EGL_NO_CONTEXT, contextAttributes, 0); + if (eglContext == null) { + EGL14.eglTerminate(eglDisplay); + throw new UnsupportedEglVersionException(); + } + checkGlError(); + return eglContext; + } + + @DoNotInline + public static EGLSurface getEglSurface(EGLDisplay eglDisplay, Object surface) { + return EGL14.eglCreateWindowSurface( + eglDisplay, getEglConfig(eglDisplay), surface, new int[] {EGL14.EGL_NONE}, 0); + } + + @DoNotInline + public static void focusSurface( + EGLDisplay eglDisplay, EGLContext eglContext, EGLSurface surface, int width, int height) { + int[] fbos = new int[1]; + GLES20.glGetIntegerv(GLES20.GL_FRAMEBUFFER_BINDING, fbos, 0); + int noFbo = 0; + if (fbos[0] != noFbo) { + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, noFbo); + } + EGL14.eglMakeCurrent(eglDisplay, surface, surface, eglContext); + GLES20.glViewport(0, 0, width, height); + } + + @DoNotInline + public static void destroyEglContext( + @Nullable EGLDisplay eglDisplay, @Nullable EGLContext eglContext) { + if (eglDisplay == null) { + return; + } + EGL14.eglMakeCurrent( + eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); + int error = EGL14.eglGetError(); + checkEglException(error == EGL14.EGL_SUCCESS, "Error releasing context: " + error); + if (eglContext != null) { + EGL14.eglDestroyContext(eglDisplay, eglContext); + error = EGL14.eglGetError(); + checkEglException(error == EGL14.EGL_SUCCESS, "Error destroying context: " + error); + } + EGL14.eglReleaseThread(); + error = EGL14.eglGetError(); + checkEglException(error == EGL14.EGL_SUCCESS, "Error releasing thread: " + error); + EGL14.eglTerminate(eglDisplay); + error = EGL14.eglGetError(); + checkEglException(error == EGL14.EGL_SUCCESS, "Error terminating display: " + error); + } + + @DoNotInline + private static EGLConfig getEglConfig(EGLDisplay eglDisplay) { + int redSize = 8; + int greenSize = 8; + int blueSize = 8; + int alphaSize = 8; + int depthSize = 0; + int stencilSize = 0; + int[] defaultConfiguration = + new int[] { + EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, + EGL14.EGL_RED_SIZE, redSize, + EGL14.EGL_GREEN_SIZE, greenSize, + EGL14.EGL_BLUE_SIZE, blueSize, + EGL14.EGL_ALPHA_SIZE, alphaSize, + EGL14.EGL_DEPTH_SIZE, depthSize, + EGL14.EGL_STENCIL_SIZE, stencilSize, + EGL14.EGL_NONE + }; + int[] configsCount = new int[1]; + EGLConfig[] eglConfigs = new EGLConfig[1]; + if (!EGL14.eglChooseConfig( + eglDisplay, defaultConfiguration, 0, eglConfigs, 0, 1, configsCount, 0)) { + throwGlException("eglChooseConfig failed."); + } + return eglConfigs[0]; + } + } } From 3183183d54ea303eef12b951d7060084968279c9 Mon Sep 17 00:00:00 2001 From: apodob Date: Mon, 30 Aug 2021 09:43:01 +0100 Subject: [PATCH 105/441] Add ExoplayerCuesDecoder that decodes text/x-exoplayer-cues PiperOrigin-RevId: 393723394 --- .../exoplayer2/text/ExoplayerCuesDecoder.java | 160 +++++++++++++++ .../text/ExoplayerCuesDecoderTest.java | 182 ++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java create mode 100644 library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java new file mode 100644 index 0000000000..7a238ed9c5 --- /dev/null +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java @@ -0,0 +1,160 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.text; + +import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; + +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableList; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.List; + +/** + * A {@link SubtitleDecoder} that decodes subtitle samples of type {@link + * MimeTypes#TEXT_EXOPLAYER_CUES} + */ +public final class ExoplayerCuesDecoder implements SubtitleDecoder { + @IntDef(value = {INPUT_BUFFER_AVAILABLE, INPUT_BUFFER_DEQUEUED, INPUT_BUFFER_QUEUED}) + @Retention(RetentionPolicy.SOURCE) + private @interface InputBufferState {} + + private static final int INPUT_BUFFER_AVAILABLE = 0; + private static final int INPUT_BUFFER_DEQUEUED = 1; + private static final int INPUT_BUFFER_QUEUED = 2; + + private static final int OUTPUT_BUFFERS_COUNT = 2; + + private final CueDecoder cueDecoder; + private final SubtitleInputBuffer inputBuffer; + private final Deque availableOutputBuffers; + + @InputBufferState private int inputBufferState; + private boolean released; + + public ExoplayerCuesDecoder() { + cueDecoder = new CueDecoder(); + inputBuffer = new SubtitleInputBuffer(); + availableOutputBuffers = new ArrayDeque<>(); + for (int i = 0; i < OUTPUT_BUFFERS_COUNT; i++) { + availableOutputBuffers.addFirst(new SimpleSubtitleOutputBuffer(this::releaseOutputBuffer)); + } + inputBufferState = INPUT_BUFFER_AVAILABLE; + } + + @Override + public String getName() { + return "ExoplayerCuesDecoder"; + } + + @Nullable + @Override + public SubtitleInputBuffer dequeueInputBuffer() throws SubtitleDecoderException { + checkState(!released); + if (inputBufferState != INPUT_BUFFER_AVAILABLE) { + return null; + } + inputBufferState = INPUT_BUFFER_DEQUEUED; + return inputBuffer; + } + + @Override + public void queueInputBuffer(SubtitleInputBuffer inputBuffer) throws SubtitleDecoderException { + checkState(!released); + checkState(inputBufferState == INPUT_BUFFER_DEQUEUED); + checkArgument(this.inputBuffer == inputBuffer); + inputBufferState = INPUT_BUFFER_QUEUED; + } + + @Nullable + @Override + public SubtitleOutputBuffer dequeueOutputBuffer() throws SubtitleDecoderException { + checkState(!released); + if (inputBufferState != INPUT_BUFFER_QUEUED || availableOutputBuffers.isEmpty()) { + return null; + } + SingleEventSubtitle subtitle = + new SingleEventSubtitle( + inputBuffer.timeUs, cueDecoder.decode(checkNotNull(inputBuffer.data).array())); + SubtitleOutputBuffer outputBuffer = availableOutputBuffers.removeFirst(); + outputBuffer.setContent(inputBuffer.timeUs, subtitle, /* subsampleOffsetUs=*/ 0); + inputBuffer.clear(); + inputBufferState = INPUT_BUFFER_AVAILABLE; + return outputBuffer; + } + + @Override + public void flush() { + checkState(!released); + inputBuffer.clear(); + inputBufferState = INPUT_BUFFER_AVAILABLE; + } + + @Override + public void release() { + released = true; + } + + @Override + public void setPositionUs(long positionUs) { + // Do nothing + } + + private void releaseOutputBuffer(SubtitleOutputBuffer outputBuffer) { + checkState(availableOutputBuffers.size() < OUTPUT_BUFFERS_COUNT); + checkArgument(!availableOutputBuffers.contains(outputBuffer)); + outputBuffer.clear(); + availableOutputBuffers.addFirst(outputBuffer); + } + + private static final class SingleEventSubtitle implements Subtitle { + private final long timeUs; + private final ImmutableList cues; + + public SingleEventSubtitle(long timeUs, ImmutableList cues) { + this.timeUs = timeUs; + this.cues = cues; + } + + @Override + public int getNextEventTimeIndex(long timeUs) { + return this.timeUs > timeUs ? 0 : C.INDEX_UNSET; + } + + @Override + public int getEventTimeCount() { + return 1; + } + + @Override + public long getEventTime(int index) { + checkArgument(index == 0); + return timeUs; + } + + @Override + public List getCues(long timeUs) { + return (timeUs >= this.timeUs) ? cues : ImmutableList.of(); + } + } +} diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java new file mode 100644 index 0000000000..15ab964058 --- /dev/null +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java @@ -0,0 +1,182 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.text; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.common.collect.ImmutableList; +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Test for {@link ExoplayerCuesDecoder} */ +@RunWith(AndroidJUnit4.class) +public class ExoplayerCuesDecoderTest { + private ExoplayerCuesDecoder decoder; + private static final byte[] ENCODED_CUES = + new CueEncoder().encode(ImmutableList.of(new Cue.Builder().setText("text").build())); + + @Before + public void setUp() { + decoder = new ExoplayerCuesDecoder(); + } + + @After + public void tearDown() { + decoder.release(); + } + + @Test + public void decoder_outputsSubtitle() throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + + assertThat(outputBuffer.getCues(/* timeUs=*/ 999)).isEmpty(); + assertThat(outputBuffer.getCues(1001)).hasSize(1); + assertThat(outputBuffer.getCues(/* timeUs=*/ 1000)).hasSize(1); + assertThat(outputBuffer.getCues(/* timeUs=*/ 1000).get(0).text.toString()).isEqualTo("text"); + + outputBuffer.release(); + } + + @Test + public void dequeueOutputBuffer_returnsNullWhenInputBufferIsNotQueued() throws Exception { + // Returns null before input buffer has been dequeued + assertThat(decoder.dequeueOutputBuffer()).isNull(); + + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + + // Returns null before input has been queued + assertThat(decoder.dequeueOutputBuffer()).isNull(); + + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + + // Returns buffer when the input buffer is queued and output buffer is available + assertThat(decoder.dequeueOutputBuffer()).isNotNull(); + + // Returns null before next input buffer is queued + assertThat(decoder.dequeueOutputBuffer()).isNull(); + } + + @Test + public void dequeueOutputBuffer_releasedOutputAndQueuedNextInput_returnsOutputBuffer() + throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + exhaustAllOutputBuffers(decoder); + + assertThat(decoder.dequeueOutputBuffer()).isNull(); + outputBuffer.release(); + assertThat(decoder.dequeueOutputBuffer()).isNotNull(); + } + + @Test + public void dequeueInputBuffer_withQueuedInput_returnsNull() throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + + assertThat(decoder.dequeueInputBuffer()).isNull(); + } + + @Test + public void queueInputBuffer_queueingInputBufferThatDoesNotComeFromDecoder_fails() { + assertThrows( + IllegalStateException.class, () -> decoder.queueInputBuffer(new SubtitleInputBuffer())); + } + + @Test + public void queueInputBuffer_calledTwice_fails() throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + decoder.queueInputBuffer(inputBuffer); + + assertThrows(IllegalStateException.class, () -> decoder.queueInputBuffer(inputBuffer)); + } + + @Test + public void releaseOutputBuffer_calledTwice_fails() throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + outputBuffer.release(); + + assertThrows(IllegalStateException.class, outputBuffer::release); + } + + @Test + public void flush_doesNotInfluenceOutputBufferAvailability() throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + assertThat(outputBuffer).isNotNull(); + exhaustAllOutputBuffers(decoder); + decoder.flush(); + inputBuffer = decoder.dequeueInputBuffer(); + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + + assertThat(decoder.dequeueOutputBuffer()).isNull(); + } + + @Test + public void flush_makesAllInputBuffersAvailable() throws Exception { + List inputBuffers = new ArrayList<>(); + + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + while (inputBuffer != null) { + inputBuffers.add(inputBuffer); + inputBuffer = decoder.dequeueInputBuffer(); + } + for (int i = 0; i < inputBuffers.size(); i++) { + writeDataToInputBuffer(inputBuffers.get(i), /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffers.get(i)); + } + decoder.flush(); + + for (int i = 0; i < inputBuffers.size(); i++) { + assertThat(decoder.dequeueInputBuffer().data.position()).isEqualTo(0); + } + } + + private void exhaustAllOutputBuffers(ExoplayerCuesDecoder decoder) + throws SubtitleDecoderException { + SubtitleInputBuffer inputBuffer; + do { + inputBuffer = decoder.dequeueInputBuffer(); + if (inputBuffer != null) { + writeDataToInputBuffer(inputBuffer, /* timeUs=*/ 1000, ENCODED_CUES); + decoder.queueInputBuffer(inputBuffer); + } + } while (decoder.dequeueOutputBuffer() != null); + } + + private void writeDataToInputBuffer(SubtitleInputBuffer inputBuffer, long timeUs, byte[] data) { + inputBuffer.timeUs = timeUs; + inputBuffer.ensureSpaceForWrite(data.length); + inputBuffer.data.put(data); + } +} From 882957228c9843392baae1287542491962dc6e4d Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 31 Aug 2021 10:33:43 +0100 Subject: [PATCH 106/441] Fix errors in Transformer demo PiperOrigin-RevId: 393951084 --- .../exoplayer2/transformer/MediaCodecAdapterWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index abe338cef0..47936cbbf6 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -333,7 +333,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Returns the {@link BufferInfo} associated with the current output buffer, if available. */ @Nullable public BufferInfo getOutputBufferInfo() { - return maybeDequeueAndSetOutputBuffer() ? outputBufferInfo : null; + return maybeDequeueOutputBuffer() ? outputBufferInfo : null; } /** From 095c63933bfd960ac245aa135dd73222e011bc86 Mon Sep 17 00:00:00 2001 From: apodob Date: Tue, 31 Aug 2021 15:18:24 +0100 Subject: [PATCH 107/441] Fix the preparation of Extractor inside the init() method Extractor was not calling endTracks() and seekMap() on the extractorOutput which are required to finish the preparation. At that point extractor does not support seeking. PiperOrigin-RevId: 393994848 --- .../exoplayer2/extractor/subtitle/SubtitleExtractor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index eee12e4810..3e59f0087c 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.CueEncoder; @@ -117,6 +118,8 @@ public class SubtitleExtractor implements Extractor { checkState(state == STATE_CREATED); extractorOutput = output; trackOutput = extractorOutput.track(/* id= */ 0, C.TRACK_TYPE_TEXT); + extractorOutput.endTracks(); + extractorOutput.seekMap(new SeekMap.Unseekable(C.TIME_UNSET)); trackOutput.format(format); state = STATE_INITIALIZED; } From 9e04789e4d5f80df9b7ce78b9ac336ef99dcfadf Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 1 Sep 2021 00:39:49 +0100 Subject: [PATCH 108/441] Fix DefaultTrackSelector Javadoc about tunneling #minor-release Issue:#9350 PiperOrigin-RevId: 394112689 --- .../exoplayer2/trackselection/DefaultTrackSelector.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 abc32232a7..ccb826d3b1 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 @@ -164,8 +164,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; *

    Tunneling

    * * Tunneled playback can be enabled in cases where the combination of renderers and selected tracks - * support it. Tunneled playback is enabled by passing an audio session ID to {@link - * ParametersBuilder#setTunnelingEnabled(boolean)}. + * supports it. This can be done by using {@link ParametersBuilder#setTunnelingEnabled(boolean)}. */ public class DefaultTrackSelector extends MappingTrackSelector { From be1fe08ba5adfd2a5344e6d6d47d58e251e13cc6 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 1 Sep 2021 09:20:43 +0100 Subject: [PATCH 109/441] Add license headers PiperOrigin-RevId: 394176546 --- extensions/av1/src/main/jni/CMakeLists.txt | 16 ++++++++++++++++ extensions/av1/src/main/jni/cpu_info.cc | 15 +++++++++++++++ extensions/av1/src/main/jni/cpu_info.h | 15 +++++++++++++++ extensions/ffmpeg/src/main/jni/CMakeLists.txt | 16 ++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/extensions/av1/src/main/jni/CMakeLists.txt b/extensions/av1/src/main/jni/CMakeLists.txt index fe0e8edaeb..cb080e3c47 100644 --- a/extensions/av1/src/main/jni/CMakeLists.txt +++ b/extensions/av1/src/main/jni/CMakeLists.txt @@ -1,3 +1,19 @@ +# +# Copyright 2021 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + cmake_minimum_required(VERSION 3.7.1 FATAL_ERROR) set(CMAKE_CXX_STANDARD 11) diff --git a/extensions/av1/src/main/jni/cpu_info.cc b/extensions/av1/src/main/jni/cpu_info.cc index 8f4a405f4f..b3133aa19b 100644 --- a/extensions/av1/src/main/jni/cpu_info.cc +++ b/extensions/av1/src/main/jni/cpu_info.cc @@ -1,3 +1,18 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include "cpu_info.h" // NOLINT #include diff --git a/extensions/av1/src/main/jni/cpu_info.h b/extensions/av1/src/main/jni/cpu_info.h index 77f869a93e..e6bf207bcc 100644 --- a/extensions/av1/src/main/jni/cpu_info.h +++ b/extensions/av1/src/main/jni/cpu_info.h @@ -1,3 +1,18 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #ifndef EXOPLAYER_V2_EXTENSIONS_AV1_SRC_MAIN_JNI_CPU_INFO_H_ #define EXOPLAYER_V2_EXTENSIONS_AV1_SRC_MAIN_JNI_CPU_INFO_H_ diff --git a/extensions/ffmpeg/src/main/jni/CMakeLists.txt b/extensions/ffmpeg/src/main/jni/CMakeLists.txt index fd3e398dd9..c6a89975cf 100644 --- a/extensions/ffmpeg/src/main/jni/CMakeLists.txt +++ b/extensions/ffmpeg/src/main/jni/CMakeLists.txt @@ -1,3 +1,19 @@ +# +# Copyright 2021 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + cmake_minimum_required(VERSION 3.7.1 FATAL_ERROR) # Enable C++11 features. From 0d4986f80699f2db5db8b91211e32e7836ead20c Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 1 Sep 2021 11:57:23 +0100 Subject: [PATCH 110/441] Remove deprecated static metadata methods. PiperOrigin-RevId: 394196332 --- RELEASENOTES.md | 7 +++ docs/retrieving-metadata.md | 8 +-- .../exoplayer2/ext/cast/CastPlayer.java | 8 --- .../android/exoplayer2/ForwardingPlayer.java | 12 ---- .../com/google/android/exoplayer2/Player.java | 55 ++++++------------- .../android/exoplayer2/ExoPlayerImpl.java | 11 ---- .../android/exoplayer2/SimpleExoPlayer.java | 7 --- .../analytics/AnalyticsCollector.java | 10 ---- .../analytics/AnalyticsListener.java | 12 ---- .../exoplayer2/testutil/StubExoPlayer.java | 7 --- 10 files changed, 28 insertions(+), 109 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 365efac3f2..79174fc756 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -54,6 +54,13 @@ * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to support setting the playback speed ([#6784](https://github.com/google/ExoPlayer/issues/6784)). + * Remove `Player.getCurrentStaticMetadata`, + `Player.Listener.onStaticMetadataChanged` and + `Player.EVENT_STATIC_METADATA_CHANGED`. Use `Player.getMediaMetadata`, + `Player.Listener.onMediaMetadataChanged` and + `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to + structured metadata, or access the raw static metadata directly from + the `TrackSelection#getFormat()`. ### 2.15.0 (2021-08-10) diff --git a/docs/retrieving-metadata.md b/docs/retrieving-metadata.md index 44021b32b4..1b0339d8af 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 listen for `Player#onStaticMetadataChanged` (for static metadata from the -`Format`s) and/or add a `MetadataOutput` (for dynamic metadata delivered during -playback) to the player. The return values of these callbacks are used to -populate the `MediaMetadata`. +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`. ## Without playback ## diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 3e3d1fac56..c8d6a4ba99 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -38,7 +38,6 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; @@ -578,13 +577,6 @@ public final class CastPlayer extends BasePlayer { @Override public void setTrackSelectionParameters(TrackSelectionParameters parameters) {} - @Deprecated - @Override - public ImmutableList getCurrentStaticMetadata() { - // CastPlayer does not currently support metadata. - return ImmutableList.of(); - } - @Override public MediaMetadata getMediaMetadata() { // CastPlayer does not currently support metadata. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index b0b9eff834..b1a7ae0405 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -382,12 +382,6 @@ public class ForwardingPlayer implements Player { player.setTrackSelectionParameters(parameters); } - @Deprecated - @Override - public List getCurrentStaticMetadata() { - return player.getCurrentStaticMetadata(); - } - @Override public MediaMetadata getMediaMetadata() { return player.getMediaMetadata(); @@ -663,12 +657,6 @@ public class ForwardingPlayer implements Player { eventListener.onTracksChanged(trackGroups, trackSelections); } - @Deprecated - @Override - public void onStaticMetadataChanged(List metadataList) { - eventListener.onStaticMetadataChanged(metadataList); - } - @Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { eventListener.onMediaMetadataChanged(mediaMetadata); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 8bf9fbdf20..9a213d5ee7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -126,15 +126,6 @@ public interface Player { default void onTracksChanged( TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} - /** - * @deprecated Use {@link Player#getMediaMetadata()} and {@link - * #onMediaMetadataChanged(MediaMetadata)} for access to structured metadata, or access the - * raw static metadata directly from the {@link TrackSelection#getFormat(int) track - * selections' formats}. - */ - @Deprecated - default void onStaticMetadataChanged(List metadataList) {} - /** * Called when the combined {@link MediaMetadata} changes. * @@ -1263,7 +1254,6 @@ public interface Player { EVENT_TIMELINE_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_TRACKS_CHANGED, - EVENT_STATIC_METADATA_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, @@ -1289,45 +1279,43 @@ public interface Player { int EVENT_MEDIA_ITEM_TRANSITION = 1; /** {@link #getCurrentTrackGroups()} or {@link #getCurrentTrackSelections()} changed. */ int EVENT_TRACKS_CHANGED = 2; - /** @deprecated Use {@link #EVENT_MEDIA_METADATA_CHANGED} for structured metadata changes. */ - @Deprecated int EVENT_STATIC_METADATA_CHANGED = 3; /** {@link #isLoading()} ()} changed. */ - int EVENT_IS_LOADING_CHANGED = 4; + int EVENT_IS_LOADING_CHANGED = 3; /** {@link #getPlaybackState()} changed. */ - int EVENT_PLAYBACK_STATE_CHANGED = 5; + int EVENT_PLAYBACK_STATE_CHANGED = 4; /** {@link #getPlayWhenReady()} changed. */ - int EVENT_PLAY_WHEN_READY_CHANGED = 6; + int EVENT_PLAY_WHEN_READY_CHANGED = 5; /** {@link #getPlaybackSuppressionReason()} changed. */ - int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = 7; + int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = 6; /** {@link #isPlaying()} changed. */ - int EVENT_IS_PLAYING_CHANGED = 8; + int EVENT_IS_PLAYING_CHANGED = 7; /** {@link #getRepeatMode()} changed. */ - int EVENT_REPEAT_MODE_CHANGED = 9; + int EVENT_REPEAT_MODE_CHANGED = 8; /** {@link #getShuffleModeEnabled()} changed. */ - int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = 10; + int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = 9; /** {@link #getPlayerError()} changed. */ - int EVENT_PLAYER_ERROR = 11; + int EVENT_PLAYER_ERROR = 10; /** * A position discontinuity occurred. See {@link Listener#onPositionDiscontinuity(PositionInfo, * PositionInfo, int)}. */ - int EVENT_POSITION_DISCONTINUITY = 12; + int EVENT_POSITION_DISCONTINUITY = 11; /** {@link #getPlaybackParameters()} changed. */ - int EVENT_PLAYBACK_PARAMETERS_CHANGED = 13; + int EVENT_PLAYBACK_PARAMETERS_CHANGED = 12; /** {@link #isCommandAvailable(int)} changed for at least one {@link Command}. */ - int EVENT_AVAILABLE_COMMANDS_CHANGED = 14; + int EVENT_AVAILABLE_COMMANDS_CHANGED = 13; /** {@link #getMediaMetadata()} changed. */ - int EVENT_MEDIA_METADATA_CHANGED = 15; + int EVENT_MEDIA_METADATA_CHANGED = 14; /** {@link #getPlaylistMetadata()} changed. */ - int EVENT_PLAYLIST_METADATA_CHANGED = 16; + int EVENT_PLAYLIST_METADATA_CHANGED = 15; /** {@link #getSeekBackIncrement()} changed. */ - int EVENT_SEEK_BACK_INCREMENT_CHANGED = 17; + int EVENT_SEEK_BACK_INCREMENT_CHANGED = 16; /** {@link #getSeekForwardIncrement()} changed. */ - int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 18; + int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = 17; /** {@link #getMaxSeekToPreviousPosition()} changed. */ - int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 19; + int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 18; /** {@link #getTrackSelectionParameters()} changed. */ - int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 20; + int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 19; /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link @@ -2033,15 +2021,6 @@ public interface Player { */ void setTrackSelectionParameters(TrackSelectionParameters parameters); - /** - * @deprecated Use {@link #getMediaMetadata()} and {@link - * Listener#onMediaMetadataChanged(MediaMetadata)} for access to structured metadata, or - * access the raw static metadata directly from the {@link TrackSelection#getFormat(int) track - * selections' formats}. - */ - @Deprecated - List getCurrentStaticMetadata(); - /** * Returns the current combined {@link MediaMetadata}, or {@link MediaMetadata#EMPTY} if not * supported. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 8863c9259f..8933b388e9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -947,12 +947,6 @@ import java.util.concurrent.CopyOnWriteArraySet; return new TrackSelectionArray(playbackInfo.trackSelectorResult.selections); } - @Deprecated - @Override - public List getCurrentStaticMetadata() { - return playbackInfo.staticMetadata; - } - @Override public TrackSelectionParameters getTrackSelectionParameters() { return trackSelector.getParameters(); @@ -1276,11 +1270,6 @@ import java.util.concurrent.CopyOnWriteArraySet; Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(newPlaybackInfo.trackGroups, newSelection)); } - if (!previousPlaybackInfo.staticMetadata.equals(newPlaybackInfo.staticMetadata)) { - listeners.queueEvent( - Player.EVENT_STATIC_METADATA_CHANGED, - listener -> listener.onStaticMetadataChanged(newPlaybackInfo.staticMetadata)); - } if (metadataChanged) { final MediaMetadata finalMediaMetadata = mediaMetadata; listeners.queueEvent( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index f5c122e7a3..53fdb9c33b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1462,13 +1462,6 @@ public class SimpleExoPlayer extends BasePlayer player.setTrackSelectionParameters(parameters); } - @Deprecated - @Override - public List getCurrentStaticMetadata() { - verifyApplicationThread(); - return player.getCurrentStaticMetadata(); - } - @Override public MediaMetadata getMediaMetadata() { return player.getMediaMetadata(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 77d77603e3..6aaf008262 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -602,16 +602,6 @@ public class AnalyticsCollector listener -> listener.onTracksChanged(eventTime, trackGroups, trackSelections)); } - @Deprecated - @Override - public final void onStaticMetadataChanged(List metadataList) { - EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); - sendEvent( - eventTime, - AnalyticsListener.EVENT_STATIC_METADATA_CHANGED, - listener -> listener.onStaticMetadataChanged(eventTime, metadataList)); - } - @SuppressWarnings("deprecation") // Calling deprecated listener method. @Override public final void onIsLoadingChanged(boolean isLoading) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index 24dce074e1..0fca47cf56 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -58,7 +58,6 @@ import java.io.IOException; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.List; /** * A listener for analytics events. @@ -159,7 +158,6 @@ public interface AnalyticsListener { EVENT_TIMELINE_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_TRACKS_CHANGED, - EVENT_STATIC_METADATA_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, @@ -226,8 +224,6 @@ public interface AnalyticsListener { * {@link Player#getCurrentTrackGroups()} or {@link Player#getCurrentTrackSelections()} changed. */ int EVENT_TRACKS_CHANGED = Player.EVENT_TRACKS_CHANGED; - /** @deprecated See {@link Player#EVENT_MEDIA_METADATA_CHANGED}. */ - @Deprecated int EVENT_STATIC_METADATA_CHANGED = Player.EVENT_STATIC_METADATA_CHANGED; /** {@link Player#isLoading()} ()} changed. */ int EVENT_IS_LOADING_CHANGED = Player.EVENT_IS_LOADING_CHANGED; /** {@link Player#getPlaybackState()} changed. */ @@ -682,14 +678,6 @@ public interface AnalyticsListener { default void onTracksChanged( EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} - /** - * @deprecated Use {@link Player#getMediaMetadata()} and {@link #onMediaMetadataChanged(EventTime, - * MediaMetadata)} for access to structured metadata, or access the raw static metadata - * directly from the {@link TrackSelection#getFormat(int) track selections' formats}. - */ - @Deprecated - default void onStaticMetadataChanged(EventTime eventTime, List metadataList) {} - /** * Called when the combined {@link MediaMetadata} changes. * diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index beac8467b6..9e866a3d9a 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -34,7 +34,6 @@ import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AuxEffectInfo; -import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -463,12 +462,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Deprecated - @Override - public List getCurrentStaticMetadata() { - throw new UnsupportedOperationException(); - } - @Override public MediaMetadata getMediaMetadata() { throw new UnsupportedOperationException(); From 68eff51d96bc8dfeeef4fee8ce19ad693fe9cd16 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 2 Sep 2021 10:37:03 +0100 Subject: [PATCH 111/441] Remove max API level for reading TV resolution from system properties PiperOrigin-RevId: 394415421 --- .../google/android/exoplayer2/util/Util.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) 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 f6c685dd7e..c1fb466b10 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 @@ -2277,21 +2277,20 @@ public final class Util { * @return The size of the current mode, in pixels. */ public static Point getCurrentDisplayModeSize(Context context, Display display) { - if (Util.SDK_INT <= 29 && display.getDisplayId() == Display.DEFAULT_DISPLAY && isTv(context)) { - // On Android TVs it is common for the UI to be configured for a lower resolution than - // SurfaceViews can output. Before API 26 the Display object does not provide a way to - // identify this case, and up to and including API 28 many devices still do not correctly set - // their hardware compositor output size. - - // Sony Android TVs advertise support for 4k output via a system feature. - if ("Sony".equals(Util.MANUFACTURER) - && Util.MODEL.startsWith("BRAVIA") - && context.getPackageManager().hasSystemFeature("com.sony.dtv.hardware.panel.qfhd")) { - return new Point(3840, 2160); - } - - // Otherwise check the system property for display size. From API 28 treble may prevent the - // system from writing sys.display-size so we check vendor.display-size instead. + if (display.getDisplayId() == Display.DEFAULT_DISPLAY && isTv(context)) { + // On Android TVs it's common for the UI to be driven at a lower resolution than the physical + // resolution of the display (e.g., driving the UI at 1080p when the display is 4K). + // SurfaceView outputs are still able to use the full physical resolution on such devices. + // + // Prior to API level 26, the Display object did not provide a way to obtain the true physical + // resolution of the display. From API level 26, Display.getMode().getPhysical[Width|Height] + // is expected to return the display's true physical resolution, but we still see devices + // setting their hardware compositor output size incorrectly, which makes this unreliable. + // Hence for TV devices, we try and read the display's true physical resolution from system + // properties. + // + // From API level 28, Treble may prevent the system from writing sys.display-size, so we check + // vendor.display-size instead. @Nullable String displaySize = Util.SDK_INT < 28 @@ -2313,6 +2312,13 @@ public final class Util { } Log.e(TAG, "Invalid display size: " + displaySize); } + + // Sony Android TVs advertise support for 4k output via a system feature. + if ("Sony".equals(Util.MANUFACTURER) + && Util.MODEL.startsWith("BRAVIA") + && context.getPackageManager().hasSystemFeature("com.sony.dtv.hardware.panel.qfhd")) { + return new Point(3840, 2160); + } } Point displaySize = new Point(); From 373db56a52e9943df79ff3540da061264d6dc4b9 Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 2 Sep 2021 11:15:47 +0100 Subject: [PATCH 112/441] Add method to compile program from shader paths in GlUtil This method will be useful for adding Open GL to the Transformer. PiperOrigin-RevId: 394420744 --- .../gldemo/BitmapOverlayVideoProcessor.java | 27 +++++++------------ .../android/exoplayer2/util/GlUtil.java | 20 ++++++++++++++ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java index 38f5b7ff35..13e2a60684 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java @@ -28,9 +28,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.GlUtil; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; -import java.io.InputStream; import java.util.Locale; import javax.microedition.khronos.opengles.GL10; @@ -79,10 +77,15 @@ import javax.microedition.khronos.opengles.GL10; @Override public void initialize() { - String vertexShaderCode = - loadAssetAsString(context, "bitmap_overlay_video_processor_vertex.glsl"); - String fragmentShaderCode = - loadAssetAsString(context, "bitmap_overlay_video_processor_fragment.glsl"); + String vertexShaderCode; + String fragmentShaderCode; + try { + vertexShaderCode = GlUtil.loadAsset(context, "bitmap_overlay_video_processor_vertex.glsl"); + fragmentShaderCode = + GlUtil.loadAsset(context, "bitmap_overlay_video_processor_fragment.glsl"); + } catch (IOException e) { + throw new IllegalStateException(e); + } program = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); GlUtil.Attribute[] attributes = GlUtil.getAttributes(program); GlUtil.Uniform[] uniforms = GlUtil.getUniforms(program); @@ -156,16 +159,4 @@ import javax.microedition.khronos.opengles.GL10; GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, /* first= */ 0, /* count= */ 4); GlUtil.checkGlError(); } - - private static String loadAssetAsString(Context context, String assetFileName) { - @Nullable InputStream inputStream = null; - try { - inputStream = context.getAssets().open(assetFileName); - return Util.fromUtf8Bytes(Util.toByteArray(inputStream)); - } catch (IOException e) { - throw new IllegalStateException(e); - } finally { - Util.closeQuietly(inputStream); - } - } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index 09fc24add7..245c827f9b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -31,6 +31,8 @@ import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; +import java.io.IOException; +import java.io.InputStream; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -435,6 +437,24 @@ public final class GlUtil { return byteBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer(); } + /** + * Loads a file from the assets folder. + * + * @param context The {@link Context}. + * @param assetPath The path to the file to load, from the assets folder. + * @return The content of the file to load. + * @throws IOException If the file couldn't be read. + */ + public static String loadAsset(Context context, String assetPath) throws IOException { + @Nullable InputStream inputStream = null; + try { + inputStream = context.getAssets().open(assetPath); + return Util.fromUtf8Bytes(Util.toByteArray(inputStream)); + } finally { + Util.closeQuietly(inputStream); + } + } + /** * Creates a GL_TEXTURE_EXTERNAL_OES with default configuration of GL_LINEAR filtering and * GL_CLAMP_TO_EDGE wrapping. From 3213f969c09f2ae55654edb851367f6187a0a4bb Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 2 Sep 2021 16:59:18 +0100 Subject: [PATCH 113/441] Add handling end of stream in the ExoplayerCuesDecoder Empty buffer with flag C.BUFFER_FLAG_END_OF_STREAM is send at the end of the stream. Handling that flag properly is necessary to make the ExoplayerCuesDecoder work properly with components like TextRenderer. PiperOrigin-RevId: 394472642 --- .../exoplayer2/text/ExoplayerCuesDecoder.java | 12 ++++++++---- .../exoplayer2/text/ExoplayerCuesDecoderTest.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java index 7a238ed9c5..33703778d2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java @@ -93,11 +93,15 @@ public final class ExoplayerCuesDecoder implements SubtitleDecoder { if (inputBufferState != INPUT_BUFFER_QUEUED || availableOutputBuffers.isEmpty()) { return null; } - SingleEventSubtitle subtitle = - new SingleEventSubtitle( - inputBuffer.timeUs, cueDecoder.decode(checkNotNull(inputBuffer.data).array())); SubtitleOutputBuffer outputBuffer = availableOutputBuffers.removeFirst(); - outputBuffer.setContent(inputBuffer.timeUs, subtitle, /* subsampleOffsetUs=*/ 0); + if (inputBuffer.isEndOfStream()) { + outputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); + } else { + SingleEventSubtitle subtitle = + new SingleEventSubtitle( + inputBuffer.timeUs, cueDecoder.decode(checkNotNull(inputBuffer.data).array())); + outputBuffer.setContent(inputBuffer.timeUs, subtitle, /* subsampleOffsetUs=*/ 0); + } inputBuffer.clear(); inputBufferState = INPUT_BUFFER_AVAILABLE; return outputBuffer; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java index 15ab964058..645f5a4197 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoderTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; @@ -93,6 +94,17 @@ public class ExoplayerCuesDecoderTest { assertThat(decoder.dequeueOutputBuffer()).isNotNull(); } + @Test + public void dequeueOutputBuffer_queuedOnEndOfStreamInputBuffer_returnsEndOfStreamOutputBuffer() + throws Exception { + SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); + inputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); + decoder.queueInputBuffer(inputBuffer); + SubtitleOutputBuffer outputBuffer = decoder.dequeueOutputBuffer(); + + assertThat(outputBuffer.isEndOfStream()).isTrue(); + } + @Test public void dequeueInputBuffer_withQueuedInput_returnsNull() throws Exception { SubtitleInputBuffer inputBuffer = decoder.dequeueInputBuffer(); From dd19bc89270335ce16be4ff3b6b6d68f71815302 Mon Sep 17 00:00:00 2001 From: apodob Date: Thu, 2 Sep 2021 19:05:11 +0100 Subject: [PATCH 114/441] Integrate ExoplayerCuesDecoder and SubtitleExtractor This CL contains integration of the ExoplayerCuesDecoder and the SubtitleExtractor with the player. The SubtitleExtractor is integrated inside the DefaultMediaSourceFactory. The flag was added to the state of the DefaultMediaSourceFactory to let user decide between the ProgressiveMediaSource and the SingleSampleMediaSource as a source for subtitles. Choosing the ProgressiveMediaSource will cause data to flow through the SubtitleExtractor and eventually the ExoplayerCuesDecoder. PiperOrigin-RevId: 394500305 --- .../source/DefaultMediaSourceFactory.java | 58 +++++++++++++++++-- .../text/SubtitleDecoderFactory.java | 6 +- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 445f82432c..2ade14753f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -21,14 +21,18 @@ import android.content.Context; import android.util.SparseArray; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; +import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorsFactory; +import com.google.android.exoplayer2.extractor.subtitle.SubtitleExtractor; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsMediaSource; +import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; import com.google.android.exoplayer2.ui.AdViewProvider; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; @@ -112,6 +116,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { private long liveMaxOffsetMs; private float liveMinSpeed; private float liveMaxSpeed; + private boolean useProgressiveMediaSourceForSubtitles; /** * Creates a new instance. @@ -166,6 +171,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { liveMaxSpeed = C.RATE_UNSET; } + /** + * Sets whether a {@link ProgressiveMediaSource} or {@link SingleSampleMediaSource} is constructed + * to handle {@link MediaItem.PlaybackProperties#subtitles}. Defaults to false (i.e. {@link + * SingleSampleMediaSource}. + * + *

    This method is experimental, and will be renamed or removed in a future release. + * + * @param useProgressiveMediaSourceForSubtitles Indicates that {@link ProgressiveMediaSource} + * should be used for subtitles instead of {@link SingleSampleMediaSource}. + * @return This factory, for convenience. + */ + public DefaultMediaSourceFactory experimentalUseProgressiveMediaSourceForSubtitles( + boolean useProgressiveMediaSourceForSubtitles) { + this.useProgressiveMediaSourceForSubtitles = useProgressiveMediaSourceForSubtitles; + return this; + } + /** * Sets the {@link AdsLoaderProvider} that provides {@link AdsLoader} instances for media items * that have {@link MediaItem.PlaybackProperties#adsConfiguration ads configurations}. @@ -370,14 +392,38 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { if (!subtitles.isEmpty()) { MediaSource[] mediaSources = new MediaSource[subtitles.size() + 1]; mediaSources[0] = mediaSource; - SingleSampleMediaSource.Factory singleSampleSourceFactory = - new SingleSampleMediaSource.Factory(dataSourceFactory) - .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); for (int i = 0; i < subtitles.size(); i++) { - mediaSources[i + 1] = - singleSampleSourceFactory.createMediaSource( - subtitles.get(i), /* durationUs= */ C.TIME_UNSET); + if (useProgressiveMediaSourceForSubtitles + && subtitles.get(i).mimeType.equals(MimeTypes.TEXT_VTT)) { + int index = i; + ProgressiveMediaSource.Factory progressiveMediaSourceFactory = + new ProgressiveMediaSource.Factory( + dataSourceFactory, + () -> + new Extractor[] { + new SubtitleExtractor( + new WebvttDecoder(), + new Format.Builder() + .setSampleMimeType(subtitles.get(index).mimeType) + .setLanguage(subtitles.get(index).language) + .setSelectionFlags(subtitles.get(index).selectionFlags) + .setRoleFlags(subtitles.get(index).roleFlags) + .setLabel(subtitles.get(index).label) + .build()) + }); + mediaSources[i + 1] = + progressiveMediaSourceFactory.createMediaSource( + MediaItem.fromUri(subtitles.get(i).uri.toString())); + } else { + SingleSampleMediaSource.Factory singleSampleSourceFactory = + new SingleSampleMediaSource.Factory(dataSourceFactory) + .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); + mediaSources[i + 1] = + singleSampleSourceFactory.createMediaSource( + subtitles.get(i), /* durationUs= */ C.TIME_UNSET); + } } + mediaSource = new MergingMediaSource(mediaSources); } return maybeWrapWithAdsMediaSource(mediaItem, maybeClipMediaSource(mediaItem, mediaSource)); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderFactory.java index 043c181225..06ce3079c7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderFactory.java @@ -66,6 +66,7 @@ public interface SubtitleDecoderFactory { *

  • Cea708 ({@link Cea708Decoder}) *
  • DVB ({@link DvbDecoder}) *
  • PGS ({@link PgsDecoder}) + *
  • Exoplayer Cues ({@link ExoplayerCuesDecoder}) * */ SubtitleDecoderFactory DEFAULT = @@ -84,7 +85,8 @@ public interface SubtitleDecoderFactory { || MimeTypes.APPLICATION_MP4CEA608.equals(mimeType) || MimeTypes.APPLICATION_CEA708.equals(mimeType) || MimeTypes.APPLICATION_DVBSUBS.equals(mimeType) - || MimeTypes.APPLICATION_PGS.equals(mimeType); + || MimeTypes.APPLICATION_PGS.equals(mimeType) + || MimeTypes.TEXT_EXOPLAYER_CUES.equals(mimeType); } @Override @@ -116,6 +118,8 @@ public interface SubtitleDecoderFactory { return new DvbDecoder(format.initializationData); case MimeTypes.APPLICATION_PGS: return new PgsDecoder(); + case MimeTypes.TEXT_EXOPLAYER_CUES: + return new ExoplayerCuesDecoder(); default: break; } From 9991f14643c93c2ebc1d0177b08c603a483efd1f Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 3 Sep 2021 18:18:50 +0100 Subject: [PATCH 115/441] Add Open GL step to Transformer PiperOrigin-RevId: 394708737 --- .../android/exoplayer2/util/GlUtil.java | 3 + .../transformer/MediaCodecAdapterWrapper.java | 27 +-- .../transformer/TransformerBaseRenderer.java | 3 +- .../TransformerTranscodingVideoRenderer.java | 218 +++++++++++++++--- 4 files changed, 202 insertions(+), 49 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index 245c827f9b..a0643ad393 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -223,6 +223,9 @@ public final class GlUtil { } } + /** Represents an unset texture ID. */ + public static final int TEXTURE_ID_UNSET = -1; + /** Whether to throw a {@link GlException} in case of an OpenGL error. */ public static boolean glAssertionsEnabled = false; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 47936cbbf6..348d45ad06 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -343,8 +343,21 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * be available until the previous has been released. */ public void releaseOutputBuffer() { + releaseOutputBuffer(/* render= */ false); + } + + /** + * Releases the current output buffer. If the {@link MediaCodec} was configured with an output + * surface, setting {@code render} to {@code true} will first send the buffer to the output + * surface. The surface will release the buffer back to the codec once it is no longer + * used/displayed. + * + *

    This should be called after the buffer has been processed. The next output buffer will not + * be available until the previous has been released. + */ + public void releaseOutputBuffer(boolean render) { outputBuffer = null; - codec.releaseOutputBuffer(outputBufferIndex, /* render= */ false); + codec.releaseOutputBuffer(outputBufferIndex, render); outputBufferIndex = C.INDEX_UNSET; } @@ -359,18 +372,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; codec.release(); } - /** Returns {@code true} if a buffer is successfully obtained, rendered and released. */ - public boolean maybeDequeueRenderAndReleaseOutputBuffer() { - if (!maybeDequeueOutputBuffer()) { - return false; - } - - codec.releaseOutputBuffer(outputBufferIndex, /* render= */ true); - outputBuffer = null; - outputBufferIndex = C.INDEX_UNSET; - return true; - } - /** * Tries obtaining an output buffer and sets {@link #outputBuffer} to the obtained output buffer. * diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java index 40d6690a30..724790b8c6 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java @@ -20,6 +20,7 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.BaseRenderer; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.util.MediaClock; @@ -75,7 +76,7 @@ import com.google.android.exoplayer2.util.MimeTypes; } @Override - protected final void onStarted() { + protected void onStarted() throws ExoPlaybackException { isRendererStarted = true; } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 3122371b07..3e1da57bdf 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -17,8 +17,18 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; +import android.content.Context; +import android.graphics.SurfaceTexture; import android.media.MediaCodec; +import android.opengl.EGL14; +import android.opengl.EGLContext; +import android.opengl.EGLDisplay; +import android.opengl.EGLExt; +import android.opengl.EGLSurface; +import android.opengl.GLES20; +import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -28,34 +38,57 @@ import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.util.GlUtil; import java.io.IOException; import java.nio.ByteBuffer; @RequiresApi(18) /* package */ final class TransformerTranscodingVideoRenderer extends TransformerBaseRenderer { + static { + GlUtil.glAssertionsEnabled = true; + } + private static final String TAG = "TransformerTranscodingVideoRenderer"; - private final DecoderInputBuffer decoderInputBuffer; + private final Context context; /** The format the encoder is configured to output, may differ from the actual output format. */ private final Format encoderConfigurationOutputFormat; + private final DecoderInputBuffer decoderInputBuffer; + private final float[] decoderTextureTransformMatrix; + + @Nullable private EGLDisplay eglDisplay; + @Nullable private EGLContext eglContext; + @Nullable private EGLSurface eglSurface; + + private int decoderTextureId; + @Nullable private SurfaceTexture decoderSurfaceTexture; + @Nullable private Surface decoderSurface; @Nullable private MediaCodecAdapterWrapper decoder; + private volatile boolean isDecoderSurfacePopulated; + private boolean waitingForPopulatedDecoderSurface; + @Nullable private GlUtil.Uniform decoderTextureTransformUniform; + @Nullable private MediaCodecAdapterWrapper encoder; + private long nextEncoderTimeUs; /** Whether encoder's actual output format is obtained. */ private boolean hasEncoderActualOutputFormat; private boolean muxerWrapperTrackEnded; public TransformerTranscodingVideoRenderer( + Context context, MuxerWrapper muxerWrapper, TransformerMediaClock mediaClock, Transformation transformation, Format encoderConfigurationOutputFormat) { super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); - - decoderInputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + this.context = context; this.encoderConfigurationOutputFormat = encoderConfigurationOutputFormat; + decoderInputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + decoderTextureTransformMatrix = new float[16]; + decoderTextureId = GlUtil.TEXTURE_ID_UNSET; } @Override @@ -64,12 +97,15 @@ import java.nio.ByteBuffer; } @Override - public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { - if (!isRendererStarted || isEnded()) { - return; - } + protected void onStarted() throws ExoPlaybackException { + super.onStarted(); + ensureEncoderConfigured(); + ensureOpenGlConfigured(); + } - if (!ensureEncoderConfigured() || !ensureDecoderConfigured()) { + @Override + public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { + if (!isRendererStarted || isEnded() || !ensureDecoderConfigured()) { return; } @@ -87,10 +123,28 @@ import java.nio.ByteBuffer; protected void onReset() { decoderInputBuffer.clear(); decoderInputBuffer.data = null; + GlUtil.destroyEglContext(eglDisplay, eglContext); + eglDisplay = null; + eglContext = null; + eglSurface = null; + if (decoderTextureId != GlUtil.TEXTURE_ID_UNSET) { + GlUtil.deleteTexture(decoderTextureId); + } + if (decoderSurfaceTexture != null) { + decoderSurfaceTexture.release(); + decoderSurfaceTexture = null; + } + if (decoderSurface != null) { + decoderSurface.release(); + decoderSurface = null; + } if (decoder != null) { decoder.release(); decoder = null; } + isDecoderSurfacePopulated = false; + waitingForPopulatedDecoderSurface = false; + decoderTextureTransformUniform = null; if (encoder != null) { encoder.release(); encoder = null; @@ -99,6 +153,94 @@ import java.nio.ByteBuffer; muxerWrapperTrackEnded = false; } + private void ensureEncoderConfigured() throws ExoPlaybackException { + if (encoder != null) { + return; + } + + try { + encoder = MediaCodecAdapterWrapper.createForVideoEncoding(encoderConfigurationOutputFormat); + } catch (IOException e) { + throw createRendererException( + // TODO(claincly): should be "ENCODER_INIT_FAILED" + e, + checkNotNull(this.decoder).getOutputFormat(), + PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); + } + } + + private void ensureOpenGlConfigured() { + if (eglDisplay != null) { + return; + } + + eglDisplay = GlUtil.createEglDisplay(); + EGLContext eglContext; + try { + eglContext = GlUtil.createEglContext(eglDisplay); + this.eglContext = eglContext; + } catch (GlUtil.UnsupportedEglVersionException e) { + throw new IllegalStateException("EGL version is unsupported", e); + } + eglSurface = + GlUtil.getEglSurface(eglDisplay, checkNotNull(checkNotNull(encoder).getInputSurface())); + GlUtil.focusSurface( + eglDisplay, + eglContext, + eglSurface, + encoderConfigurationOutputFormat.width, + encoderConfigurationOutputFormat.height); + decoderTextureId = GlUtil.createExternalTexture(); + String vertexShaderCode; + String fragmentShaderCode; + try { + vertexShaderCode = GlUtil.loadAsset(context, "shaders/blit_vertex_shader.glsl"); + fragmentShaderCode = GlUtil.loadAsset(context, "shaders/copy_external_fragment_shader.glsl"); + } catch (IOException e) { + throw new IllegalStateException(e); + } + int copyProgram = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); + GLES20.glUseProgram(copyProgram); + GlUtil.Attribute[] copyAttributes = GlUtil.getAttributes(copyProgram); + checkState(copyAttributes.length == 2, "Expected program to have two vertex attributes."); + for (GlUtil.Attribute copyAttribute : copyAttributes) { + if (copyAttribute.name.equals("a_position")) { + copyAttribute.setBuffer( + new float[] { + -1.0f, -1.0f, 0.0f, 1.0f, + 1.0f, -1.0f, 0.0f, 1.0f, + -1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + }, + /* size= */ 4); + } else if (copyAttribute.name.equals("a_texcoord")) { + copyAttribute.setBuffer( + new float[] { + 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + }, + /* size= */ 4); + } else { + throw new IllegalStateException("Unexpected attribute name."); + } + copyAttribute.bind(); + } + GlUtil.Uniform[] copyUniforms = GlUtil.getUniforms(copyProgram); + checkState(copyUniforms.length == 2, "Expected program to have two uniforms."); + for (GlUtil.Uniform copyUniform : copyUniforms) { + if (copyUniform.name.equals("tex_sampler")) { + copyUniform.setSamplerTexId(decoderTextureId, 0); + copyUniform.bind(); + } else if (copyUniform.name.equals("tex_transform")) { + decoderTextureTransformUniform = copyUniform; + } else { + throw new IllegalStateException("Unexpected uniform name."); + } + } + } + private boolean ensureDecoderConfigured() throws ExoPlaybackException { if (decoder != null) { return true; @@ -114,11 +256,13 @@ import java.nio.ByteBuffer; } Format inputFormat = checkNotNull(formatHolder.format); - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + checkState(decoderTextureId != GlUtil.TEXTURE_ID_UNSET); + decoderSurfaceTexture = new SurfaceTexture(decoderTextureId); + decoderSurfaceTexture.setOnFrameAvailableListener( + surfaceTexture -> isDecoderSurfacePopulated = true); + decoderSurface = new Surface(decoderSurfaceTexture); try { - decoder = - MediaCodecAdapterWrapper.createForVideoDecoding( - inputFormat, checkNotNull(encoder.getInputSurface())); + decoder = MediaCodecAdapterWrapper.createForVideoDecoding(inputFormat, decoderSurface); } catch (IOException e) { throw createRendererException( e, formatHolder.format, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); @@ -126,23 +270,6 @@ import java.nio.ByteBuffer; return true; } - private boolean ensureEncoderConfigured() throws ExoPlaybackException { - if (encoder != null) { - return true; - } - - try { - encoder = MediaCodecAdapterWrapper.createForVideoEncoding(encoderConfigurationOutputFormat); - } catch (IOException e) { - throw createRendererException( - // TODO(claincly): should be "ENCODER_INIT_FAILED" - e, - checkNotNull(this.decoder).getOutputFormat(), - PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); - } - return true; - } - private boolean feedDecoderFromInput() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); if (!decoder.maybeDequeueInputBuffer(decoderInputBuffer)) { @@ -174,14 +301,35 @@ import java.nio.ByteBuffer; return false; } - // Rendering the decoder output queues input to the encoder because they share the same surface. - boolean hasProcessedOutputBuffer = decoder.maybeDequeueRenderAndReleaseOutputBuffer(); - if (decoder.isEnded()) { - checkNotNull(encoder).signalEndOfInputStream(); - // All decoded frames have been rendered to the encoder's input surface. + if (!isDecoderSurfacePopulated) { + if (!waitingForPopulatedDecoderSurface) { + if (decoder.getOutputBuffer() != null) { + nextEncoderTimeUs = checkNotNull(decoder.getOutputBufferInfo()).presentationTimeUs; + decoder.releaseOutputBuffer(/* render= */ true); + waitingForPopulatedDecoderSurface = true; + } + if (decoder.isEnded()) { + checkNotNull(encoder).signalEndOfInputStream(); + } + } return false; } - return hasProcessedOutputBuffer; + + waitingForPopulatedDecoderSurface = false; + SurfaceTexture decoderSurfaceTexture = checkNotNull(this.decoderSurfaceTexture); + decoderSurfaceTexture.updateTexImage(); + decoderSurfaceTexture.getTransformMatrix(decoderTextureTransformMatrix); + GlUtil.Uniform decoderTextureTransformUniform = + checkNotNull(this.decoderTextureTransformUniform); + decoderTextureTransformUniform.setFloats(decoderTextureTransformMatrix); + decoderTextureTransformUniform.bind(); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + EGLDisplay eglDisplay = checkNotNull(this.eglDisplay); + EGLSurface eglSurface = checkNotNull(this.eglSurface); + EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, nextEncoderTimeUs * 1000L); + EGL14.eglSwapBuffers(eglDisplay, eglSurface); + isDecoderSurfacePopulated = false; + return true; } private boolean feedMuxerFromEncoder() { From 00dda049ea01901f7584565d71c216a73908866c Mon Sep 17 00:00:00 2001 From: gyumin Date: Mon, 6 Sep 2021 01:37:11 +0100 Subject: [PATCH 116/441] Fix FlagSet.equals on API levels below 24 #minor-release PiperOrigin-RevId: 395004645 --- RELEASENOTES.md | 1 + .../android/exoplayer2/util/FlagSet.java | 26 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 79174fc756..0f00e6f670 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -13,6 +13,7 @@ `ForwardingPlayer`. * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use `GlUtil.glAssertionsEnabled` instead. + * Fix `FlagSet#equals` on API levels below 24. * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/FlagSet.java b/library/common/src/main/java/com/google/android/exoplayer2/util/FlagSet.java index 6322114b90..282203ed56 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/FlagSet.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/FlagSet.java @@ -211,11 +211,33 @@ public final class FlagSet { return false; } FlagSet that = (FlagSet) o; - return flags.equals(that.flags); + if (Util.SDK_INT < 24) { + // SparseBooleanArray.equals() is not implemented on API levels below 24. + if (size() != that.size()) { + return false; + } + for (int i = 0; i < size(); i++) { + if (get(i) != that.get(i)) { + return false; + } + } + return true; + } else { + return flags.equals(that.flags); + } } @Override public int hashCode() { - return flags.hashCode(); + if (Util.SDK_INT < 24) { + // SparseBooleanArray.hashCode() is not implemented on API levels below 24. + int hashCode = size(); + for (int i = 0; i < size(); i++) { + hashCode = 31 * hashCode + get(i); + } + return hashCode; + } else { + return flags.hashCode(); + } } } From d05c15dee013eb3e8b86ea617e52359df668d7f2 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 6 Sep 2021 13:26:34 +0100 Subject: [PATCH 117/441] Add open @IntDef for track types Also add handling of `C.TRACK_TYPE_IMAGE` in a couple of places where it was missing. #exofixit PiperOrigin-RevId: 395078312 --- .../java/com/google/android/exoplayer2/C.java | 23 +++++++++++++++++++ .../com/google/android/exoplayer2/Format.java | 2 +- .../google/android/exoplayer2/MediaItem.java | 4 ++-- .../android/exoplayer2/util/MimeTypes.java | 14 ++++++----- .../google/android/exoplayer2/util/Util.java | 22 ++++++++++-------- .../exoplayer2/DefaultLoadControl.java | 8 ++++++- .../google/android/exoplayer2/Renderer.java | 3 ++- .../android/exoplayer2/SimpleExoPlayer.java | 3 ++- .../AsynchronousMediaCodecAdapter.java | 8 +++---- .../mediacodec/MediaCodecRenderer.java | 5 ++-- .../exoplayer2/source/MediaLoadData.java | 7 +++--- .../source/chunk/ChunkSampleStream.java | 7 +++--- .../mediaparser/OutputConsumerAdapterV30.java | 1 + .../source/dash/DashMediaPeriod.java | 4 ++-- .../source/dash/manifest/AdaptationSet.java | 13 ++++------- .../dash/manifest/DashManifestParser.java | 8 ++++--- .../exoplayer2/extractor/ExtractorOutput.java | 7 +++--- .../exoplayer2/extractor/mp4/AtomParsers.java | 1 + .../exoplayer2/extractor/mp4/Track.java | 4 ++-- .../exoplayer2/source/hls/HlsMediaPeriod.java | 3 ++- .../source/hls/HlsSampleStreamWrapper.java | 8 +++---- .../smoothstreaming/manifest/SsManifest.java | 6 ++--- .../source/smoothstreaming/SsTestUtils.java | 3 ++- .../DefaultRenderersFactoryAsserts.java | 4 +++- .../exoplayer2/testutil/FakeRenderer.java | 2 +- 25 files changed, 105 insertions(+), 65 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 35c61faf81..8541583b39 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -649,6 +649,29 @@ public final class C { */ public static final int DATA_TYPE_CUSTOM_BASE = 10000; + /** + * Represents a type of media track. May be one of {@link #TRACK_TYPE_UNKNOWN}, {@link + * #TRACK_TYPE_DEFAULT}, {@link #TRACK_TYPE_AUDIO}, {@link #TRACK_TYPE_VIDEO}, {@link + * #TRACK_TYPE_TEXT}, {@link #TRACK_TYPE_IMAGE}, {@link #TRACK_TYPE_METADATA}, {@link + * #TRACK_TYPE_CAMERA_MOTION} or {@link #TRACK_TYPE_NONE}. May also be an app-defined value (see + * {@link #TRACK_TYPE_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + open = true, + value = { + TRACK_TYPE_UNKNOWN, + TRACK_TYPE_DEFAULT, + TRACK_TYPE_AUDIO, + TRACK_TYPE_VIDEO, + TRACK_TYPE_TEXT, + TRACK_TYPE_IMAGE, + TRACK_TYPE_METADATA, + TRACK_TYPE_CAMERA_MOTION, + TRACK_TYPE_NONE, + }) + public @interface TrackType {} /** A type constant for tracks of unknown type. */ public static final int TRACK_TYPE_UNKNOWN = -1; /** A type constant for tracks of some default type, where the type itself is unknown. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index 18f2c5b0b8..150505ddcd 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -1008,7 +1008,7 @@ public final class Format implements Bundleable { return this; } - int trackType = MimeTypes.getTrackType(sampleMimeType); + @C.TrackType int trackType = MimeTypes.getTrackType(sampleMimeType); // Use manifest value only. @Nullable String id = manifestFormat.id; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 568a9b97ca..920ce01319 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -352,8 +352,8 @@ public final class MediaItem implements Bundleable { } /** - * Sets a list of {@link C}{@code .TRACK_TYPE_*} constants for which to use a DRM session even - * when the tracks are in the clear. + * Sets a list of {@link C.TrackType track types} for which to use a DRM session even when the + * tracks are in the clear. * *

    For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link * C#TRACK_TYPE_AUDIO} the {@link #setDrmSessionForClearPeriods(boolean)} can be used. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 7922e93447..60d7c8e46a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -486,13 +486,14 @@ public final class MimeTypes { } /** - * Returns the {@link C}{@code .TRACK_TYPE_*} constant corresponding to a specified MIME type, or - * {@link C#TRACK_TYPE_UNKNOWN} if it could not be determined. + * Returns the {@link C.TrackType track type} constant corresponding to a specified MIME type, + * which may be {@link C#TRACK_TYPE_UNKNOWN} if it could not be determined. * * @param mimeType A MIME type. - * @return The corresponding {@link C}{@code .TRACK_TYPE_*}, or {@link C#TRACK_TYPE_UNKNOWN} if it - * could not be determined. + * @return The corresponding {@link C.TrackType track type}, which may be {@link + * C#TRACK_TYPE_UNKNOWN} if it could not be determined. */ + @C.TrackType public static int getTrackType(@Nullable String mimeType) { if (TextUtils.isEmpty(mimeType)) { return C.TRACK_TYPE_UNKNOWN; @@ -559,9 +560,10 @@ public final class MimeTypes { * Equivalent to {@code getTrackType(getMediaMimeType(codec))}. * * @param codec An RFC 6381 codec string. - * @return The corresponding {@link C}{@code .TRACK_TYPE_*}, or {@link C#TRACK_TYPE_UNKNOWN} if it - * could not be determined. + * @return The corresponding {@link C.TrackType track type}, which may be {@link + * C#TRACK_TYPE_UNKNOWN} if it could not be determined. */ + @C.TrackType public static int getTrackTypeOfCodec(String codec) { return getTrackType(getMediaMimeType(codec)); } 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 c1fb466b10..40d4b2e0a9 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 @@ -1498,7 +1498,7 @@ public final class Util { } /** Returns the number of codec strings in {@code codecs} whose type matches {@code trackType}. */ - public static int getCodecCountOfType(@Nullable String codecs, int trackType) { + public static int getCodecCountOfType(@Nullable String codecs, @C.TrackType int trackType) { String[] codecArray = splitCodecs(codecs); int count = 0; for (String codec : codecArray) { @@ -2333,27 +2333,29 @@ public final class Util { } /** - * Returns a string representation of a {@code TRACK_TYPE_*} constant defined in {@link C}. + * Returns a string representation of a {@link C.TrackType}. * - * @param trackType A {@code TRACK_TYPE_*} constant, + * @param trackType A {@link C.TrackType} constant, * @return A string representation of this constant. */ - public static String getTrackTypeString(int trackType) { + public static String getTrackTypeString(@C.TrackType int trackType) { switch (trackType) { - case C.TRACK_TYPE_AUDIO: - return "audio"; case C.TRACK_TYPE_DEFAULT: return "default"; + case C.TRACK_TYPE_AUDIO: + return "audio"; + case C.TRACK_TYPE_VIDEO: + return "video"; + case C.TRACK_TYPE_TEXT: + return "text"; + case C.TRACK_TYPE_IMAGE: + return "image"; case C.TRACK_TYPE_METADATA: return "metadata"; case C.TRACK_TYPE_CAMERA_MOTION: return "camera motion"; case C.TRACK_TYPE_NONE: return "none"; - case C.TRACK_TYPE_TEXT: - return "text"; - case C.TRACK_TYPE_VIDEO: - return "video"; default: return trackType >= C.TRACK_TYPE_CUSTOM_BASE ? "custom (" + trackType + ")" : "?"; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java index 2692925333..b947755f6d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java @@ -84,6 +84,9 @@ public class DefaultLoadControl implements LoadControl { /** A default size in bytes for a camera motion buffer. */ public static final int DEFAULT_CAMERA_MOTION_BUFFER_SIZE = 2 * C.DEFAULT_BUFFER_SEGMENT_SIZE; + /** A default size in bytes for an image buffer. */ + public static final int DEFAULT_IMAGE_BUFFER_SIZE = 2 * C.DEFAULT_BUFFER_SEGMENT_SIZE; + /** A default size in bytes for a muxed buffer (e.g. containing video, audio and text). */ public static final int DEFAULT_MUXED_BUFFER_SIZE = DEFAULT_VIDEO_BUFFER_SIZE + DEFAULT_AUDIO_BUFFER_SIZE + DEFAULT_TEXT_BUFFER_SIZE; @@ -421,7 +424,7 @@ public class DefaultLoadControl implements LoadControl { } } - private static int getDefaultBufferSize(int trackType) { + private static int getDefaultBufferSize(@C.TrackType int trackType) { switch (trackType) { case C.TRACK_TYPE_DEFAULT: return DEFAULT_MUXED_BUFFER_SIZE; @@ -435,8 +438,11 @@ public class DefaultLoadControl implements LoadControl { return DEFAULT_METADATA_BUFFER_SIZE; case C.TRACK_TYPE_CAMERA_MOTION: return DEFAULT_CAMERA_MOTION_BUFFER_SIZE; + case C.TRACK_TYPE_IMAGE: + return DEFAULT_IMAGE_BUFFER_SIZE; case C.TRACK_TYPE_NONE: return 0; + case C.TRACK_TYPE_UNKNOWN: default: throw new IllegalArgumentException(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index 8dc5fdcbd2..b56e67ec2b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -208,8 +208,9 @@ public interface Renderer extends PlayerMessage.Target { * Returns the track type that the renderer handles. * * @see ExoPlayer#getRendererType(int) - * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. + * @return The {@link C.TrackType track type}. */ + @C.TrackType int getTrackType(); /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 53fdb9c33b..0118dddeaf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1837,7 +1837,8 @@ public class SimpleExoPlayer extends BasePlayer } } - private void sendRendererMessage(int trackType, int messageType, @Nullable Object payload) { + private void sendRendererMessage( + @C.TrackType int trackType, int messageType, @Nullable Object payload) { for (Renderer renderer : renderers) { if (renderer.getTrackType() == trackType) { player.createMessage(renderer).setType(messageType).setPayload(payload).send(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index eef4441c92..45df174c97 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -73,7 +73,7 @@ import java.nio.ByteBuffer; * {@link MediaCodec}. */ public Factory( - int trackType, + @C.TrackType int trackType, boolean forceQueueingSynchronizationWorkaround, boolean synchronizeCodecInteractionsWithQueueing) { this( @@ -331,15 +331,15 @@ import java.nio.ByteBuffer; } } - private static String createCallbackThreadLabel(int trackType) { + private static String createCallbackThreadLabel(@C.TrackType int trackType) { return createThreadLabel(trackType, /* prefix= */ "ExoPlayer:MediaCodecAsyncAdapter:"); } - private static String createQueueingThreadLabel(int trackType) { + private static String createQueueingThreadLabel(@C.TrackType int trackType) { return createThreadLabel(trackType, /* prefix= */ "ExoPlayer:MediaCodecQueueingThread:"); } - private static String createThreadLabel(int trackType, String prefix) { + private static String createThreadLabel(@C.TrackType int trackType, String prefix) { StringBuilder labelBuilder = new StringBuilder(prefix); if (trackType == C.TRACK_TYPE_AUDIO) { labelBuilder.append("Audio"); 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 75ac662ff3..829fa8f4ef 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,8 +360,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { private int pendingOutputStreamOffsetCount; /** - * @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*} - * constants defined in {@link C}. + * @param trackType The {@link C.TrackType track type} that the renderer handles. * @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 @@ -371,7 +370,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { * explicitly using {@link MediaFormat#KEY_OPERATING_RATE}). */ public MediaCodecRenderer( - int trackType, + @C.TrackType int trackType, MediaCodecAdapter.Factory codecAdapterFactory, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java index 5f5eb38db7..440b6c2d11 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.DataType; +import com.google.android.exoplayer2.C.TrackType; import com.google.android.exoplayer2.Format; /** Descriptor for data being loaded or selected by a {@link MediaSource}. */ @@ -26,10 +27,10 @@ public final class MediaLoadData { /** The {@link DataType data type}. */ @DataType public final int dataType; /** - * One of the {@link C} {@code TRACK_TYPE_*} constants if the data corresponds to media of a - * specific type. {@link C#TRACK_TYPE_UNKNOWN} otherwise. + * One of the {@link TrackType track type}, which is a media track type if the data corresponds to + * media of a specific type, or {@link C#TRACK_TYPE_UNKNOWN} otherwise. */ - public final int trackType; + @TrackType public final int trackType; /** * The format of the track to which the data belongs. Null if the data does not belong to a * specific track. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index b6cd400f22..a835ca68b5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -69,7 +69,7 @@ public class ChunkSampleStream private static final String TAG = "ChunkSampleStream"; - public final int primaryTrackType; + @C.TrackType public final int primaryTrackType; private final int[] embeddedTrackTypes; private final Format[] embeddedTrackFormats; @@ -99,8 +99,7 @@ public class ChunkSampleStream /** * Constructs an instance. * - * @param primaryTrackType The type of the primary track. One of the {@link C} {@code - * TRACK_TYPE_*} constants. + * @param primaryTrackType The {@link C.TrackType type} of the primary track. * @param embeddedTrackTypes The types of any embedded tracks, or null. * @param embeddedTrackFormats The formats of the embedded tracks, or null. * @param chunkSource A {@link ChunkSource} from which chunks to load are obtained. @@ -115,7 +114,7 @@ public class ChunkSampleStream * events. */ public ChunkSampleStream( - int primaryTrackType, + @C.TrackType int primaryTrackType, @Nullable int[] embeddedTrackTypes, @Nullable Format[] embeddedTrackFormats, T chunkSource, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java index 648f1c7275..be2f0db7a8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java @@ -429,6 +429,7 @@ public final class OutputConsumerAdapterV30 implements MediaParser.OutputConsume tracksEnded = true; } + @C.TrackType private static int toTrackTypeConstant(@Nullable String string) { if (string == null) { return C.TRACK_TYPE_UNKNOWN; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index 058fca8aa8..476a2c5e22 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -921,7 +921,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; private static final int CATEGORY_MANIFEST_EVENTS = 2; public final int[] adaptationSetIndices; - public final int trackType; + @C.TrackType public final int trackType; @TrackGroupCategory public final int trackGroupCategory; public final int eventStreamGroupIndex; @@ -981,7 +981,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } private TrackGroupInfo( - int trackType, + @C.TrackType int trackType, @TrackGroupCategory int trackGroupCategory, int[] adaptationSetIndices, int primaryTrackGroupIndex, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java index 48b228e993..f609ef1a89 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.source.dash.manifest; +import com.google.android.exoplayer2.C; import java.util.Collections; import java.util.List; @@ -30,11 +31,8 @@ public class AdaptationSet { */ public final int id; - /** - * The type of the adaptation set. One of the {@link com.google.android.exoplayer2.C} {@code - * TRACK_TYPE_*} constants. - */ - public final int type; + /** The {@link C.TrackType track type} of the adaptation set. */ + @C.TrackType public final int type; /** {@link Representation}s in the adaptation set. */ public final List representations; @@ -51,8 +49,7 @@ public class AdaptationSet { /** * @param id A non-negative identifier for the adaptation set that's unique in the scope of its * containing period, or {@link #ID_UNSET} if not specified. - * @param type The type of the adaptation set. One of the {@link com.google.android.exoplayer2.C} - * {@code TRACK_TYPE_*} constants. + * @param type The {@link C.TrackType track type} of the adaptation set. * @param representations {@link Representation}s in the adaptation set. * @param accessibilityDescriptors Accessibility descriptors in the adaptation set. * @param essentialProperties Essential properties in the adaptation set. @@ -60,7 +57,7 @@ public class AdaptationSet { */ public AdaptationSet( int id, - int type, + @C.TrackType int type, List representations, List accessibilityDescriptors, List essentialProperties, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index 970ddf0829..092d779f89 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -376,7 +376,7 @@ public class DashManifestParser extends DefaultHandler long timeShiftBufferDepthMs) throws XmlPullParserException, IOException { int id = parseInt(xpp, "id", AdaptationSet.ID_UNSET); - int contentType = parseContentType(xpp); + @C.TrackType int contentType = parseContentType(xpp); String mimeType = xpp.getAttributeValue(null, "mimeType"); String codecs = xpp.getAttributeValue(null, "codecs"); @@ -514,7 +514,7 @@ public class DashManifestParser extends DefaultHandler protected AdaptationSet buildAdaptationSet( int id, - int contentType, + @C.TrackType int contentType, List representations, List accessibilityDescriptors, List essentialProperties, @@ -528,6 +528,7 @@ public class DashManifestParser extends DefaultHandler supplementalProperties); } + @C.TrackType protected int parseContentType(XmlPullParser xpp) { String contentType = xpp.getAttributeValue(null, "contentType"); return TextUtils.isEmpty(contentType) @@ -1676,7 +1677,8 @@ public class DashManifestParser extends DefaultHandler * @param secondType The second type. * @return The consistent type. */ - private static int checkContentTypeConsistency(int firstType, int secondType) { + private static int checkContentTypeConsistency( + @C.TrackType int firstType, @C.TrackType int secondType) { if (firstType == C.TRACK_TYPE_UNKNOWN) { return secondType; } else if (secondType == C.TRACK_TYPE_UNKNOWN) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorOutput.java index bffda30d0b..272187607b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorOutput.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.extractor; +import com.google.android.exoplayer2.C; + /** Receives stream level data extracted by an {@link Extractor}. */ public interface ExtractorOutput { @@ -48,11 +50,10 @@ public interface ExtractorOutput { * id}. * * @param id A track identifier. - * @param type The type of the track. Typically one of the {@link com.google.android.exoplayer2.C} - * {@code TRACK_TYPE_*} constants. + * @param type The {@link C.TrackType track type}. * @return The {@link TrackOutput} for the given track identifier. */ - TrackOutput track(int id, int type); + TrackOutput track(int id, @C.TrackType int type); /** * Called when all tracks have been identified, meaning no new {@code trackId} values will be diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index f6ed6f7796..067d53ebfe 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -866,6 +866,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } /** Returns the track type for a given handler value. */ + @C.TrackType private static int getTrackTypeForHdlr(int hdlr) { if (hdlr == TYPE_soun) { return C.TRACK_TYPE_AUDIO; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java index 3771be0952..9a4737f35b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java @@ -45,7 +45,7 @@ public final class Track { /** * One of {@link C#TRACK_TYPE_AUDIO}, {@link C#TRACK_TYPE_VIDEO} and {@link C#TRACK_TYPE_TEXT}. */ - public final int type; + @C.TrackType public final int type; /** The track timescale, defined as the number of time units that pass in one second. */ public final long timescale; @@ -81,7 +81,7 @@ public final class Track { public Track( int id, - int type, + @C.TrackType int type, long timescale, long movieTimescale, long durationUs, 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 785e7f1d36..6e4430923e 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 @@ -628,6 +628,7 @@ public final class HlsMediaPeriod numberOfAudioCodecs <= 1 && numberOfVideoCodecs <= 1 && numberOfAudioCodecs + numberOfVideoCodecs > 0; + @C.TrackType int trackType = !useVideoVariantsOnly && numberOfAudioCodecs > 0 ? C.TRACK_TYPE_AUDIO @@ -754,7 +755,7 @@ public final class HlsMediaPeriod } private HlsSampleStreamWrapper buildSampleStreamWrapper( - int trackType, + @C.TrackType int trackType, Uri[] playlistUrls, Format[] playlistFormats, @Nullable Format muxedAudioFormat, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index afe6cdd34f..cc031dd11e 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -125,7 +125,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; new HashSet<>( Arrays.asList(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_METADATA))); - private final int trackType; + @C.TrackType private final int trackType; private final Callback callback; private final HlsChunkSource chunkSource; private final Allocator allocator; @@ -135,7 +135,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final Loader loader; private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher; - private final @HlsMediaSource.MetadataType int metadataType; + @HlsMediaSource.MetadataType private final int metadataType; private final HlsChunkSource.HlsChunkHolder nextChunkHolder; private final ArrayList mediaChunks; private final List readOnlyMediaChunks; @@ -185,7 +185,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Nullable private HlsMediaChunk sourceChunk; /** - * @param trackType The type of the track. One of the {@link C} {@code TRACK_TYPE_*} constants. + * @param trackType The {@link C.TrackType track type}. * @param callback A callback for the wrapper. * @param chunkSource A {@link HlsChunkSource} from which chunks to load are obtained. * @param overridingDrmInitData Overriding {@link DrmInitData}, keyed by protection scheme type @@ -203,7 +203,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * events. */ public HlsSampleStreamWrapper( - int trackType, + @C.TrackType int trackType, Callback callback, HlsChunkSource chunkSource, Map overridingDrmInitData, diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java index 97e155b379..af2b45e612 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java @@ -60,7 +60,7 @@ public class SsManifest implements FilterableManifest { private static final String URL_PLACEHOLDER_BITRATE_1 = "{bitrate}"; private static final String URL_PLACEHOLDER_BITRATE_2 = "{Bitrate}"; - public final int type; + @C.TrackType public final int type; public final String subType; public final long timescale; public final String name; @@ -82,7 +82,7 @@ public class SsManifest implements FilterableManifest { public StreamElement( String baseUri, String chunkTemplate, - int type, + @C.TrackType int type, String subType, long timescale, String name, @@ -115,7 +115,7 @@ public class SsManifest implements FilterableManifest { private StreamElement( String baseUri, String chunkTemplate, - int type, + @C.TrackType int type, String subType, long timescale, String name, diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsTestUtils.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsTestUtils.java index 1e770756bc..ddcc393058 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsTestUtils.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsTestUtils.java @@ -59,7 +59,8 @@ public class SsTestUtils { } /** Creates test video stream element with the given name, track type and formats. */ - public static StreamElement createStreamElement(String name, int trackType, Format... formats) { + public static StreamElement createStreamElement( + String name, @C.TrackType int trackType, Format... formats) { return new StreamElement( TEST_BASE_URI, TEST_CHUNK_TEMPLATE, diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java index d865ea0090..26b9b35bc4 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import android.os.Handler; import android.os.Looper; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.audio.AudioRendererEventListener; @@ -45,7 +46,8 @@ public final class DefaultRenderersFactoryAsserts { * @param clazz The extension renderer class. * @param type The type of the renderer. */ - public static void assertExtensionRendererCreated(Class clazz, int type) { + public static void assertExtensionRendererCreated( + Class clazz, @C.TrackType int type) { // In EXTENSION_RENDERER_MODE_OFF the renderer should not be created. Renderer[] renderers = createRenderers(EXTENSION_RENDERER_MODE_OFF); for (Renderer renderer : renderers) { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java index 0506d2f96b..3aab64eab6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java @@ -62,7 +62,7 @@ public class FakeRenderer extends BaseRenderer { public int positionResetCount; public int sampleBufferReadCount; - public FakeRenderer(int trackType) { + public FakeRenderer(@C.TrackType int trackType) { super(trackType); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); lastSamplePositionUs = Long.MIN_VALUE; From 7129d84efda22696228737f277ea127b3004416a Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 7 Sep 2021 11:17:47 +0100 Subject: [PATCH 118/441] Avoid OMX.qti.audio.decoder.flac on API level < 32 Before, this decoder was avoided on API levels < 30. #minor-release Issue:#9349 PiperOrigin-RevId: 395209684 --- .../google/android/exoplayer2/mediacodec/MediaCodecUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java index ad16170b0b..40e75c06bb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java @@ -580,10 +580,10 @@ public final class MediaCodecUtil { } } - if (Util.SDK_INT < 30 && decoderInfos.size() > 1) { + if (Util.SDK_INT < 32 && decoderInfos.size() > 1) { String firstCodecName = decoderInfos.get(0).name; // Prefer anything other than OMX.qti.audio.decoder.flac on older devices. See [Internal - // ref: b/147278539] and [Internal ref: b/147354613]. + // ref: b/199124812]. if ("OMX.qti.audio.decoder.flac".equals(firstCodecName)) { decoderInfos.add(decoderInfos.remove(0)); } From 5183eaaf1e86767730134be12823888bfe46f0f2 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 7 Sep 2021 12:18:37 +0100 Subject: [PATCH 119/441] Add open @IntDef for track selection reasons. #exofixit PiperOrigin-RevId: 395217458 --- .../java/com/google/android/exoplayer2/C.java | 18 +++++++++++++++++ .../exoplayer2/offline/DownloadHelper.java | 1 + .../exoplayer2/source/MediaLoadData.java | 9 +++++---- .../source/MediaSourceEventListener.java | 20 +++++++++---------- .../source/chunk/BaseMediaChunk.java | 2 +- .../exoplayer2/source/chunk/Chunk.java | 10 +++++----- .../source/chunk/ContainerMediaChunk.java | 2 +- .../exoplayer2/source/chunk/DataChunk.java | 2 +- .../source/chunk/InitializationChunk.java | 2 +- .../exoplayer2/source/chunk/MediaChunk.java | 2 +- .../source/chunk/SingleSampleMediaChunk.java | 2 +- .../source/dash/DefaultDashChunkSource.java | 6 +++--- .../exoplayer2/source/hls/HlsChunkSource.java | 2 +- .../exoplayer2/source/hls/HlsMediaChunk.java | 4 ++-- .../smoothstreaming/DefaultSsChunkSource.java | 2 +- .../exoplayer2/testutil/FakeMediaChunk.java | 8 ++++++-- 16 files changed, 58 insertions(+), 34 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 8541583b39..44d9e0277c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -696,6 +696,24 @@ public final class C { */ public static final int TRACK_TYPE_CUSTOM_BASE = 10000; + /** + * Represents a reason for selection. May be one of {@link #SELECTION_REASON_UNKNOWN}, {@link + * #SELECTION_REASON_INITIAL}, {@link #SELECTION_REASON_MANUAL}, {@link + * #SELECTION_REASON_ADAPTIVE} or {@link #SELECTION_REASON_TRICK_PLAY}. May also be an app-defined + * value (see {@link #SELECTION_REASON_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + open = true, + value = { + SELECTION_REASON_UNKNOWN, + SELECTION_REASON_INITIAL, + SELECTION_REASON_MANUAL, + SELECTION_REASON_ADAPTIVE, + SELECTION_REASON_TRICK_PLAY + }) + public @interface SelectionReason {} /** A selection reason constant for selections whose reasons are unknown or unspecified. */ public static final int SELECTION_REASON_UNKNOWN = 0; /** A selection reason constant for an initial track selection. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 38448f61b6..c8c832736b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -1096,6 +1096,7 @@ public final class DownloadHelper { } @Override + @C.SelectionReason public int getSelectionReason() { return C.SELECTION_REASON_UNKNOWN; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java index 440b6c2d11..7f0aa46fd6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.DataType; +import com.google.android.exoplayer2.C.SelectionReason; import com.google.android.exoplayer2.C.TrackType; import com.google.android.exoplayer2.Format; @@ -37,8 +38,8 @@ public final class MediaLoadData { */ @Nullable public final Format trackFormat; /** - * One of the {@link C} {@code SELECTION_REASON_*} constants if the data belongs to a track. - * {@link C#SELECTION_REASON_UNKNOWN} otherwise. + * One of the {@link SelectionReason selection reasons} if the data belongs to a track. {@link + * C#SELECTION_REASON_UNKNOWN} otherwise. */ public final int trackSelectionReason; /** @@ -82,9 +83,9 @@ public final class MediaLoadData { */ public MediaLoadData( @DataType int dataType, - int trackType, + @TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java index 115bff2a99..13f7562576 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java @@ -229,9 +229,9 @@ public interface MediaSourceEventListener { public void loadStarted( LoadEventInfo loadEventInfo, @DataType int dataType, - int trackType, + @C.TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaStartTimeUs, long mediaEndTimeUs) { @@ -274,9 +274,9 @@ public interface MediaSourceEventListener { public void loadCompleted( LoadEventInfo loadEventInfo, @DataType int dataType, - int trackType, + @C.TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaStartTimeUs, long mediaEndTimeUs) { @@ -320,9 +320,9 @@ public interface MediaSourceEventListener { public void loadCanceled( LoadEventInfo loadEventInfo, @DataType int dataType, - int trackType, + @C.TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaStartTimeUs, long mediaEndTimeUs) { @@ -378,9 +378,9 @@ public interface MediaSourceEventListener { public void loadError( LoadEventInfo loadEventInfo, @DataType int dataType, - int trackType, + @C.TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaStartTimeUs, long mediaEndTimeUs, @@ -445,9 +445,9 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */ public void downstreamFormatChanged( - int trackType, + @C.TrackType int trackType, @Nullable Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long mediaTimeUs) { downstreamFormatChanged( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java index 330bb494da..992991180e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java @@ -58,7 +58,7 @@ public abstract class BaseMediaChunk extends MediaChunk { DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java index c2d00123b7..c0ee8c5aaa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java @@ -44,11 +44,11 @@ public abstract class Chunk implements Loadable { /** The format of the track to which this chunk belongs. */ public final Format trackFormat; /** - * One of the {@link C} {@code SELECTION_REASON_*} constants if the chunk belongs to a track. - * {@link C#SELECTION_REASON_UNKNOWN} if the chunk does not belong to a track, or if the selection - * reason is unknown. + * One of the {@link C.SelectionReason selection reasons} if the chunk belongs to a track. {@link + * C#SELECTION_REASON_UNKNOWN} if the chunk does not belong to a track, or if the selection reason + * is unknown. */ - public final int trackSelectionReason; + @C.SelectionReason public final int trackSelectionReason; /** * Optional data associated with the selection of the track to which this chunk belongs. Null if * the chunk does not belong to a track, or if there is no associated track selection data. @@ -82,7 +82,7 @@ public abstract class Chunk implements Loadable { DataSpec dataSpec, @DataType int type, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java index cd4fcbee77..776b1803c8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java @@ -61,7 +61,7 @@ public class ContainerMediaChunk extends BaseMediaChunk { DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java index aa705bc101..a9b989c858 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java @@ -51,7 +51,7 @@ public abstract class DataChunk extends Chunk { DataSpec dataSpec, @DataType int type, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, @Nullable byte[] data) { super( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java index b9717a3d46..2b4ba05e36 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java @@ -51,7 +51,7 @@ public final class InitializationChunk extends Chunk { DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, ChunkExtractor chunkExtractor) { super( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java index 7e4913db15..2780c0d3bf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java @@ -42,7 +42,7 @@ public abstract class MediaChunk extends Chunk { DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java index 1ded32b70c..f0d95cf74e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java @@ -52,7 +52,7 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index e5fd60a2b0..b147867854 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -609,7 +609,7 @@ public class DefaultDashChunkSource implements DashChunkSource { RepresentationHolder representationHolder, DataSource dataSource, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, Object trackSelectionData, @Nullable RangedUri initializationUri, RangedUri indexUri) { @@ -644,9 +644,9 @@ public class DefaultDashChunkSource implements DashChunkSource { protected Chunk newMediaChunk( RepresentationHolder representationHolder, DataSource dataSource, - int trackType, + @C.TrackType int trackType, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, Object trackSelectionData, long firstSegmentNum, int maxSegmentCount, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java index 7c36d257b1..fa1dfb48ad 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java @@ -875,7 +875,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, byte[] scratchSpace) { super( diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index 930d497e74..d074d269b6 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -84,7 +84,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; HlsChunkSource.SegmentBaseHolder segmentBaseHolder, Uri playlistUrl, @Nullable List muxedCaptionFormats, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, boolean isMasterTimestampSource, TimestampAdjusterProvider timestampAdjusterProvider, @@ -280,7 +280,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; boolean initSegmentEncrypted, Uri playlistUrl, @Nullable List muxedCaptionFormats, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java index dd3ad568b4..f329cabfcf 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java @@ -318,7 +318,7 @@ public class DefaultSsChunkSource implements SsChunkSource { long chunkStartTimeUs, long chunkEndTimeUs, long chunkSeekTimeUs, - int trackSelectionReason, + @C.SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, ChunkExtractor chunkExtractor) { DataSpec dataSpec = new DataSpec(uri); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunk.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunk.java index 23ea5630ae..aa989256ca 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunk.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaChunk.java @@ -46,9 +46,13 @@ public final class FakeMediaChunk extends MediaChunk { * @param trackFormat The {@link Format}. * @param startTimeUs The start time of the media, in microseconds. * @param endTimeUs The end time of the media, in microseconds. - * @param selectionReason The reason for selecting this format. + * @param selectionReason One of the {@link C.SelectionReason selection reasons}. */ - public FakeMediaChunk(Format trackFormat, long startTimeUs, long endTimeUs, int selectionReason) { + public FakeMediaChunk( + Format trackFormat, + long startTimeUs, + long endTimeUs, + @C.SelectionReason int selectionReason) { super( DATA_SOURCE, new DataSpec(Uri.EMPTY), From 2e21208f639c7eb5baf5e7a3ae1180b13be3b733 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 12:52:20 +0100 Subject: [PATCH 120/441] Workaround ConnectivityManager SecurityException on Android 11 #exofixit #minor-release Issue: #9002 PiperOrigin-RevId: 395221648 --- RELEASENOTES.md | 5 +++++ .../exoplayer2/scheduler/Requirements.java | 16 +++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0f00e6f670..9258236924 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -287,6 +287,11 @@ ([#9183](https://github.com/google/ExoPlayer/issues/9183)). * Allow the timeout to be customised via `RtspMediaSource.Factory.setTimeoutMs`. +* Downloads and caching: + * Workaround platform issue that can cause a `SecurityException` to be + thrown from `Requirements.isInternetConnectivityValidated` on devices + running Android 11 + ([#9002](https://github.com/google/ExoPlayer/issues/9002)). ### 2.14.1 (2021-06-11) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java index 7a2946d012..52c82443c3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java @@ -210,11 +210,17 @@ public final class Requirements implements Parcelable { if (activeNetwork == null) { return false; } - @Nullable - NetworkCapabilities networkCapabilities = - connectivityManager.getNetworkCapabilities(activeNetwork); - return networkCapabilities != null - && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); + + try { + @Nullable + NetworkCapabilities networkCapabilities = + connectivityManager.getNetworkCapabilities(activeNetwork); + return networkCapabilities != null + && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); + } catch (SecurityException e) { + // Workaround for https://issuetracker.google.com/issues/175055271. + return true; + } } @Override From 97b717b8dc342f0cfcba478f0f1803d09f9a5a3f Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 13:09:53 +0100 Subject: [PATCH 121/441] Duration readers: Return TIME_UNSET rather than a negative value This typically happens if there's a discontinuity in the stream. It's better to say we don't know, than it is to return a negative position. Issue: #8346 #exofixit #minor-release PiperOrigin-RevId: 395224088 --- .../android/exoplayer2/extractor/ts/PsDurationReader.java | 7 +++++++ .../android/exoplayer2/extractor/ts/TsDurationReader.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java index 55218c31f2..d55e633207 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.TimestampAdjuster; import com.google.android.exoplayer2.util.Util; @@ -41,6 +42,8 @@ import java.io.IOException; */ /* package */ final class PsDurationReader { + private static final String TAG = "PsDurationReader"; + private static final int TIMESTAMP_SEARCH_BYTES = 20_000; private final TimestampAdjuster scrTimestampAdjuster; @@ -102,6 +105,10 @@ import java.io.IOException; long minScrPositionUs = scrTimestampAdjuster.adjustTsTimestamp(firstScrValue); long maxScrPositionUs = scrTimestampAdjuster.adjustTsTimestamp(lastScrValue); durationUs = maxScrPositionUs - minScrPositionUs; + if (durationUs < 0) { + Log.w(TAG, "Invalid duration: " + durationUs + ". Using TIME_UNSET instead."); + durationUs = C.TIME_UNSET; + } return finishReadDuration(input); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java index 6f2406bf2c..5934be9653 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.TimestampAdjuster; import com.google.android.exoplayer2.util.Util; @@ -38,6 +39,8 @@ import java.io.IOException; */ /* package */ final class TsDurationReader { + private static final String TAG = "TsDurationReader"; + private final int timestampSearchBytes; private final TimestampAdjuster pcrTimestampAdjuster; private final ParsableByteArray packetBuffer; @@ -98,6 +101,10 @@ import java.io.IOException; long minPcrPositionUs = pcrTimestampAdjuster.adjustTsTimestamp(firstPcrValue); long maxPcrPositionUs = pcrTimestampAdjuster.adjustTsTimestamp(lastPcrValue); durationUs = maxPcrPositionUs - minPcrPositionUs; + if (durationUs < 0) { + Log.w(TAG, "Invalid duration: " + durationUs + ". Using TIME_UNSET instead."); + durationUs = C.TIME_UNSET; + } return finishReadDuration(input); } From 730cdbb9e668300563b4013d7745d60d4860c498 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 13:14:54 +0100 Subject: [PATCH 122/441] Use defStyleAttr when obtaining styled attributes in player views #minor-release #exofixit Issue #9024 PiperOrigin-RevId: 395224661 --- RELEASENOTES.md | 3 +++ .../android/exoplayer2/ui/PlayerControlView.java | 7 ++++--- .../com/google/android/exoplayer2/ui/PlayerView.java | 6 +++++- .../android/exoplayer2/ui/StyledPlayerControlView.java | 10 +++++++--- .../google/android/exoplayer2/ui/StyledPlayerView.java | 5 ++++- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9258236924..29d225bda9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -31,6 +31,9 @@ * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with `Player.addListener`. + * Use `defStyleAttr` when obtaining styled attributes in + `StyledPlayerView`, `PlayerView` and `PlayerControlView` + ([#9024](https://github.com/google/ExoPlayer/issues/9024)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 2c1e469d81..7fc028ccc1 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -377,7 +377,8 @@ public class PlayerControlView extends FrameLayout { TypedArray a = context .getTheme() - .obtainStyledAttributes(playbackAttrs, R.styleable.PlayerControlView, 0, 0); + .obtainStyledAttributes( + playbackAttrs, R.styleable.PlayerControlView, defStyleAttr, /* defStyleRes= */ 0); try { showTimeoutMs = a.getInt(R.styleable.PlayerControlView_show_timeout, showTimeoutMs); controllerLayoutId = @@ -424,8 +425,8 @@ public class PlayerControlView extends FrameLayout { if (customTimeBar != null) { timeBar = customTimeBar; } else if (timeBarPlaceholder != null) { - // Propagate attrs as timebarAttrs so that DefaultTimeBar's custom attributes are transferred, - // but standard attributes (e.g. background) are not. + // Propagate playbackAttrs as timebarAttrs so that DefaultTimeBar's custom attributes are + // transferred, but standard attributes (e.g. background) are not. DefaultTimeBar defaultTimeBar = new DefaultTimeBar(context, null, 0, playbackAttrs); defaultTimeBar.setId(R.id.exo_progress); defaultTimeBar.setLayoutParams(timeBarPlaceholder.getLayoutParams()); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index fa454a1813..9b36708740 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -367,7 +367,11 @@ public class PlayerView extends FrameLayout implements AdViewProvider { boolean controllerHideDuringAds = true; int showBuffering = SHOW_BUFFERING_NEVER; if (attrs != null) { - TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PlayerView, 0, 0); + TypedArray a = + context + .getTheme() + .obtainStyledAttributes( + attrs, R.styleable.PlayerView, defStyleAttr, /* defStyleRes= */ 0); try { shutterColorSet = a.hasValue(R.styleable.PlayerView_shutter_background_color); shutterColor = a.getColor(R.styleable.PlayerView_shutter_background_color, shutterColor); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 277faca145..31071b7b52 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -490,7 +490,11 @@ public class StyledPlayerControlView extends FrameLayout { TypedArray a = context .getTheme() - .obtainStyledAttributes(playbackAttrs, R.styleable.StyledPlayerControlView, 0, 0); + .obtainStyledAttributes( + playbackAttrs, + R.styleable.StyledPlayerControlView, + defStyleAttr, + /* defStyleRes= */ 0); try { controllerLayoutId = a.getResourceId( @@ -575,8 +579,8 @@ public class StyledPlayerControlView extends FrameLayout { if (customTimeBar != null) { timeBar = customTimeBar; } else if (timeBarPlaceholder != null) { - // Propagate attrs as timebarAttrs so that DefaultTimeBar's custom attributes are transferred, - // but standard attributes (e.g. background) are not. + // Propagate playbackAttrs as timebarAttrs so that DefaultTimeBar's custom attributes are + // transferred, but standard attributes (e.g. background) are not. DefaultTimeBar defaultTimeBar = new DefaultTimeBar(context, null, 0, playbackAttrs, R.style.ExoStyledControls_TimeBar); defaultTimeBar.setId(R.id.exo_progress); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index cb8e95997c..734a3561ca 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -369,7 +369,10 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { int showBuffering = SHOW_BUFFERING_NEVER; if (attrs != null) { TypedArray a = - context.getTheme().obtainStyledAttributes(attrs, R.styleable.StyledPlayerView, 0, 0); + context + .getTheme() + .obtainStyledAttributes( + attrs, R.styleable.StyledPlayerView, defStyleAttr, /* defStyleRes= */ 0); try { shutterColorSet = a.hasValue(R.styleable.StyledPlayerView_shutter_background_color); shutterColor = From 093d117127ba9ec7fc3b00cb810bd434b27351f8 Mon Sep 17 00:00:00 2001 From: claincly Date: Tue, 7 Sep 2021 13:30:31 +0100 Subject: [PATCH 123/441] Handle when additional spaces are in SDP's RTPMAP atrribute Issue: #9379 PiperOrigin-RevId: 395226701 --- RELEASENOTES.md | 7 +++++-- .../source/rtsp/MediaDescription.java | 4 ++-- .../source/rtsp/RtspMediaTrack.java | 8 -------- .../source/rtsp/SessionDescriptionTest.java | 19 +++++++++++++++++++ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 29d225bda9..e72169a16e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -63,8 +63,11 @@ `Player.EVENT_STATIC_METADATA_CHANGED`. Use `Player.getMediaMetadata`, `Player.Listener.onMediaMetadataChanged` and `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to - structured metadata, or access the raw static metadata directly from - the `TrackSelection#getFormat()`. + structured metadata, or access the raw static metadata directly from the + `TrackSelection#getFormat()`. +* RTSP: + * Handle when additional spaces are in SDP's RTPMAP atrribute + ([#9379](https://github.com/google/ExoPlayer/issues/9379)). ### 2.15.0 (2021-08-10) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java index 0a7d87436c..755a32f8a6 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java @@ -43,11 +43,11 @@ import java.util.HashMap; /** Parses the RTPMAP attribute value (with the part "a=rtpmap:" removed). */ public static RtpMapAttribute parse(String rtpmapString) throws ParserException { - String[] rtpmapInfo = Util.split(rtpmapString, " "); + String[] rtpmapInfo = Util.splitAtFirst(rtpmapString, " "); checkArgument(rtpmapInfo.length == 2); int payloadType = parseInt(rtpmapInfo[0]); - String[] mediaInfo = Util.split(rtpmapInfo[1], "/"); + String[] mediaInfo = Util.split(rtpmapInfo[1].trim(), "/"); checkArgument(mediaInfo.length >= 2); int clockRate = parseInt(mediaInfo[1]); int encodingParameters = C.INDEX_UNSET; diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java index 2f6a3c3c01..cdd8e0b820 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source.rtsp; import static com.google.android.exoplayer2.source.rtsp.MediaDescription.MEDIA_TYPE_AUDIO; import static com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat.getMimeTypeFromRtpMediaType; import static com.google.android.exoplayer2.source.rtsp.SessionDescription.ATTR_CONTROL; -import static com.google.android.exoplayer2.source.rtsp.SessionDescription.ATTR_RTPMAP; import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.NalUnitUtil.NAL_START_CODE; @@ -95,13 +94,6 @@ import com.google.common.collect.ImmutableMap; formatBuilder.setAverageBitrate(mediaDescription.bitrate); } - // rtpmap is mandatory in an RTSP session with dynamic payload types (RFC2326 Section C.1.3). - checkArgument(mediaDescription.attributes.containsKey(ATTR_RTPMAP)); - String rtpmapAttribute = castNonNull(mediaDescription.attributes.get(ATTR_RTPMAP)); - - // rtpmap string format: RFC2327 Page 22. - String[] rtpmap = Util.split(rtpmapAttribute, " "); - checkArgument(rtpmap.length == 2); int rtpPayloadType = mediaDescription.rtpMapAttribute.payloadType; String mimeType = getMimeTypeFromRtpMediaType(mediaDescription.rtpMapAttribute.mediaEncoding); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java index d71976148d..cd2f6c3266 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java @@ -191,6 +191,25 @@ public class SessionDescriptionTest { assertThat(sessionDescription.attributes).containsEntry(ATTR_CONTROL, "session1"); } + @Test + public void parse_sdpStringWithExtraSpaceInRtpMapAttribute_succeeds() throws Exception { + String testMediaSdpInfo = + "v=0\r\n" + + "o=MNobody 2890844526 2890842807 IN IP4 192.0.2.46\r\n" + + "s=SDP Seminar\r\n" + + "t=0 0\r\n" + + "a=control:*\r\n" + + "m=audio 3456 RTP/AVP 0\r\n" + + "a=rtpmap:97 AC3/44100 \r\n"; + + SessionDescription sessionDescription = SessionDescriptionParser.parse(testMediaSdpInfo); + MediaDescription.RtpMapAttribute rtpMapAttribute = + sessionDescription.mediaDescriptionList.get(0).rtpMapAttribute; + assertThat(rtpMapAttribute.payloadType).isEqualTo(97); + assertThat(rtpMapAttribute.mediaEncoding).isEqualTo("AC3"); + assertThat(rtpMapAttribute.clockRate).isEqualTo(44100); + } + @Test public void buildMediaDescription_withInvalidRtpmapAttribute_throwsIllegalStateException() { assertThrows( From 11d2d7daf9029ae6e6ed1457dc931f5aca9f663f Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 7 Sep 2021 14:26:53 +0100 Subject: [PATCH 124/441] Add open @IntDef for Renderer message types. #exofixit PiperOrigin-RevId: 395233622 --- .../android/exoplayer2/BaseRenderer.java | 3 ++- .../android/exoplayer2/NoSampleRenderer.java | 3 ++- .../android/exoplayer2/PlayerMessage.java | 4 ++- .../google/android/exoplayer2/Renderer.java | 27 +++++++++++++++++++ .../android/exoplayer2/SimpleExoPlayer.java | 20 +++++++++++--- .../audio/DecoderAudioRenderer.java | 9 ++++++- .../audio/MediaCodecAudioRenderer.java | 13 ++++++++- .../video/DecoderVideoRenderer.java | 3 ++- .../video/MediaCodecVideoRenderer.java | 9 ++++++- .../video/spherical/CameraMotionRenderer.java | 3 ++- .../android/exoplayer2/ExoPlayerTest.java | 6 ++--- .../exoplayer2/testutil/ActionSchedule.java | 4 ++- .../testutil/FakeVideoRenderer.java | 14 +++++++++- 13 files changed, 102 insertions(+), 16 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 23b5352ed2..91e3f4ac76 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -196,7 +196,8 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { // Do nothing. } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java index 39dd111078..b6f8482ac9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java @@ -179,7 +179,8 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { // Do nothing. } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java index 6ff7100ad1..0d591ee9f6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2; import android.os.Handler; import android.os.Looper; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Renderer.MessageType; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import java.util.concurrent.TimeoutException; @@ -39,7 +40,8 @@ public final class PlayerMessage { * @throws ExoPlaybackException If an error occurred whilst handling the message. Should only be * thrown by targets that handle messages on the playback thread. */ - void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException; + void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException; } /** A sender for messages. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index b56e67ec2b..b7b8f6bb3c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -74,6 +74,33 @@ public interface Renderer extends PlayerMessage.Target { void onWakeup(); } + /** + * Represents a type of message that can be passed to a renderer. May be one of {@link + * #MSG_SET_VIDEO_OUTPUT}, {@link #MSG_SET_VOLUME}, {@link #MSG_SET_AUDIO_ATTRIBUTES}, {@link + * #MSG_SET_SCALING_MODE}, {@link #MSG_SET_CHANGE_FRAME_RATE_STRATEGY}, {@link + * #MSG_SET_AUX_EFFECT_INFO}, {@link #MSG_SET_VIDEO_FRAME_METADATA_LISTENER}, {@link + * #MSG_SET_CAMERA_MOTION_LISTENER}, {@link #MSG_SET_SKIP_SILENCE_ENABLED}, {@link + * #MSG_SET_AUDIO_SESSION_ID} or {@link #MSG_SET_WAKEUP_LISTENER}. May also be an app-defined + * value (see {@link #MSG_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef( + open = true, + value = { + MSG_SET_VIDEO_OUTPUT, + MSG_SET_VOLUME, + MSG_SET_AUDIO_ATTRIBUTES, + MSG_SET_SCALING_MODE, + MSG_SET_CHANGE_FRAME_RATE_STRATEGY, + MSG_SET_AUX_EFFECT_INFO, + MSG_SET_VIDEO_FRAME_METADATA_LISTENER, + MSG_SET_CAMERA_MOTION_LISTENER, + MSG_SET_SKIP_SILENCE_ENABLED, + MSG_SET_AUDIO_SESSION_ID, + MSG_SET_WAKEUP_LISTENER + }) + public @interface MessageType {} /** * The type of a message that can be passed to a video renderer via {@link * ExoPlayer#createMessage(Target)}. The message payload is normally a {@link Surface}, however diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 0118dddeaf..849cdc8433 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -45,6 +45,7 @@ import android.view.TextureView; import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import com.google.android.exoplayer2.Renderer.MessageType; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -2206,11 +2207,15 @@ public class SimpleExoPlayer extends BasePlayer private static final class FrameMetadataListener implements VideoFrameMetadataListener, CameraMotionListener, PlayerMessage.Target { + @MessageType public static final int MSG_SET_VIDEO_FRAME_METADATA_LISTENER = Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; + + @MessageType public static final int MSG_SET_CAMERA_MOTION_LISTENER = Renderer.MSG_SET_CAMERA_MOTION_LISTENER; - public static final int MSG_SET_SPHERICAL_SURFACE_VIEW = Renderer.MSG_CUSTOM_BASE; + + @MessageType public static final int MSG_SET_SPHERICAL_SURFACE_VIEW = Renderer.MSG_CUSTOM_BASE; @Nullable private VideoFrameMetadataListener videoFrameMetadataListener; @Nullable private CameraMotionListener cameraMotionListener; @@ -2218,7 +2223,7 @@ public class SimpleExoPlayer extends BasePlayer @Nullable private CameraMotionListener internalCameraMotionListener; @Override - public void handleMessage(int messageType, @Nullable Object message) { + public void handleMessage(@MessageType int messageType, @Nullable Object message) { switch (messageType) { case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: videoFrameMetadataListener = (VideoFrameMetadataListener) message; @@ -2227,7 +2232,7 @@ public class SimpleExoPlayer extends BasePlayer cameraMotionListener = (CameraMotionListener) message; break; case MSG_SET_SPHERICAL_SURFACE_VIEW: - SphericalGLSurfaceView surfaceView = (SphericalGLSurfaceView) message; + @Nullable SphericalGLSurfaceView surfaceView = (SphericalGLSurfaceView) message; if (surfaceView == null) { internalVideoFrameMetadataListener = null; internalCameraMotionListener = null; @@ -2236,6 +2241,15 @@ public class SimpleExoPlayer extends BasePlayer internalCameraMotionListener = surfaceView.getCameraMotionListener(); } break; + case Renderer.MSG_SET_AUDIO_ATTRIBUTES: + case Renderer.MSG_SET_AUDIO_SESSION_ID: + case Renderer.MSG_SET_AUX_EFFECT_INFO: + case Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case Renderer.MSG_SET_SCALING_MODE: + case Renderer.MSG_SET_SKIP_SILENCE_ENABLED: + case Renderer.MSG_SET_VIDEO_OUTPUT: + case Renderer.MSG_SET_VOLUME: + case Renderer.MSG_SET_WAKEUP_LISTENER: default: break; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index e5b306aff1..ed97f09d3f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -571,7 +571,8 @@ public abstract class DecoderAudioRenderer< } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VOLUME: audioSink.setVolume((Float) message); @@ -590,6 +591,12 @@ public abstract class DecoderAudioRenderer< case MSG_SET_AUDIO_SESSION_ID: audioSink.setAudioSessionId((Integer) message); break; + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case MSG_SET_SCALING_MODE: + case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case MSG_SET_VIDEO_OUTPUT: + case MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); break; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index b3de393abb..66a56cf15e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -15,6 +15,11 @@ */ package com.google.android.exoplayer2.audio; +import static com.google.android.exoplayer2.Renderer.MSG_SET_CAMERA_MOTION_LISTENER; +import static com.google.android.exoplayer2.Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY; +import static com.google.android.exoplayer2.Renderer.MSG_SET_SCALING_MODE; +import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; +import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.REUSE_RESULT_NO; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; @@ -667,7 +672,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VOLUME: audioSink.setVolume((Float) message); @@ -689,6 +695,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media case MSG_SET_WAKEUP_LISTENER: this.wakeupListener = (WakeupListener) message; break; + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case MSG_SET_SCALING_MODE: + case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case MSG_SET_VIDEO_OUTPUT: default: super.handleMessage(messageType, message); break; 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 30630bf878..2c64e6c92f 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 @@ -247,7 +247,8 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { // PlayerMessage.Target implementation. @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { if (messageType == MSG_SET_VIDEO_OUTPUT) { setOutput(message); } else if (messageType == MSG_SET_VIDEO_FRAME_METADATA_LISTENER) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 1848950a96..2640eb3c56 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -505,7 +505,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VIDEO_OUTPUT: setOutput(message); @@ -532,6 +533,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } } break; + case MSG_SET_AUDIO_ATTRIBUTES: + case MSG_SET_AUX_EFFECT_INFO: + case MSG_SET_CAMERA_MOTION_LISTENER: + case MSG_SET_SKIP_SILENCE_ENABLED: + case MSG_SET_VOLUME: + case MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java index 6eaa2812c9..8d2c801fab 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/CameraMotionRenderer.java @@ -64,7 +64,8 @@ public final class CameraMotionRenderer extends BaseRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { if (messageType == MSG_SET_CAMERA_MOTION_LISTENER) { listener = (CameraMotionListener) message; } else { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 8ec85152fd..deb4e780e1 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -2573,7 +2573,7 @@ public final class ExoPlayerTest { Renderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO) { @Override - public void handleMessage(int messageType, @Nullable Object message) + public void handleMessage(@MessageType int messageType, @Nullable Object message) throws ExoPlaybackException { super.handleMessage(messageType, message); rendererMessages.add(messageType); @@ -11093,7 +11093,7 @@ public final class ExoPlayerTest { } @Override - public void handleMessage(int messageType, @Nullable Object message) + public void handleMessage(@MessageType int messageType, @Nullable Object message) throws ExoPlaybackException { if (messageType == MSG_SET_WAKEUP_LISTENER) { assertThat(message).isNotNull(); @@ -11116,7 +11116,7 @@ public final class ExoPlayerTest { public int messageCount; @Override - public void handleMessage(int messageType, @Nullable Object message) { + public void handleMessage(@Renderer.MessageType int messageType, @Nullable Object message) { messageCount++; } } 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 f88938a962..a93d23ab95 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 @@ -24,6 +24,7 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.PlayerMessage.Target; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -616,7 +617,8 @@ public final class ActionSchedule { SimpleExoPlayer player, int messageType, @Nullable Object message); @Override - public final void handleMessage(int messageType, @Nullable Object message) { + public final void handleMessage( + @Renderer.MessageType int messageType, @Nullable Object message) { handleMessage(Assertions.checkStateNotNull(player), messageType, message); if (callback != null) { hasArrived = true; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java index 10e5ade18e..ad30d53bae 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeVideoRenderer.java @@ -95,12 +95,24 @@ public class FakeVideoRenderer extends FakeRenderer { } @Override - public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { + public void handleMessage(@MessageType int messageType, @Nullable Object message) + throws ExoPlaybackException { switch (messageType) { case MSG_SET_VIDEO_OUTPUT: output = message; renderedFirstFrameAfterReset = false; break; + + case Renderer.MSG_SET_AUDIO_ATTRIBUTES: + case Renderer.MSG_SET_AUDIO_SESSION_ID: + case Renderer.MSG_SET_AUX_EFFECT_INFO: + case Renderer.MSG_SET_CAMERA_MOTION_LISTENER: + case Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY: + case Renderer.MSG_SET_SCALING_MODE: + case Renderer.MSG_SET_SKIP_SILENCE_ENABLED: + case Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER: + case Renderer.MSG_SET_VOLUME: + case Renderer.MSG_SET_WAKEUP_LISTENER: default: super.handleMessage(messageType, message); } From b6089758ffa7caf37749183119e0ddfc98e65dd3 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 14:27:02 +0100 Subject: [PATCH 125/441] Fix incorrect assertion in CacheDataSource #minor-release #exofixit PiperOrigin-RevId: 395233639 --- RELEASENOTES.md | 3 +++ .../upstream/cache/CacheDataSource.java | 4 ++-- .../upstream/cache/CacheDataSourceTest.java | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e72169a16e..fe7021b519 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -14,6 +14,9 @@ * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use `GlUtil.glAssertionsEnabled` instead. * Fix `FlagSet#equals` on API levels below 24. + * Fix `NullPointerException` being thrown from `CacheDataSource` when + reading a fully cached resource with `DataSpec.position` equal to the + resource length. * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java index 931cdf4552..338d9cd2ac 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java @@ -597,14 +597,14 @@ public final class CacheDataSource implements DataSource { @Override public int read(byte[] buffer, int offset, int length) throws IOException { - DataSpec requestDataSpec = checkNotNull(this.requestDataSpec); - DataSpec currentDataSpec = checkNotNull(this.currentDataSpec); if (length == 0) { return 0; } if (bytesRemaining == 0) { return C.RESULT_END_OF_INPUT; } + DataSpec requestDataSpec = checkNotNull(this.requestDataSpec); + DataSpec currentDataSpec = checkNotNull(this.currentDataSpec); try { if (readPosition >= checkCachePosition) { openNextSource(requestDataSpec, true); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java index 705188f88e..eefc4eb8c4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java @@ -124,6 +124,28 @@ public final class CacheDataSourceTest { assertCacheAndRead(boundedDataSpec, /* unknownLength= */ false); } + @Test + public void cacheAndReadFromLength_readsZeroBytes() throws Exception { + // Read and cache all data from upstream. + CacheDataSource cacheDataSource = + createCacheDataSource( + /* setReadException= */ false, /* unknownLength= */ false, /* cacheKeyFactory= */ null); + assertReadDataContentLength( + cacheDataSource, + unboundedDataSpec, + /* unknownLength= */ false, + /* customCacheKey= */ false); + + // Read from position == length. + cacheDataSource = + createCacheDataSource( + /* setReadException= */ true, /* unknownLength= */ false, /* cacheKeyFactory= */ null); + assertReadData( + cacheDataSource, + unboundedDataSpec.buildUpon().setPosition(TEST_DATA.length).build(), + /* unknownLength= */ false); + } + @Test public void propagatesHttpHeadersUpstream() throws Exception { CacheDataSource cacheDataSource = From 9949424da45740f0202e72886ea53fe822cdf244 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 7 Sep 2021 15:42:09 +0100 Subject: [PATCH 126/441] Deprecate all methods on C and move them to Util C should only hold constants. Also resolve the TODO in getErrorCodeForMediaDrmErrorCode(), and annotate the deprecated methods with Error Prone's @InlineMe to facilitate automated refactoring of callers. PiperOrigin-RevId: 395244855 --- constants.gradle | 1 + library/common/build.gradle | 1 + .../java/com/google/android/exoplayer2/C.java | 125 +++++------------- .../google/android/exoplayer2/util/Util.java | 96 ++++++++++++++ .../google/android/exoplayer2/ExoPlayer.java | 4 +- 5 files changed, 132 insertions(+), 95 deletions(-) diff --git a/constants.gradle b/constants.gradle index 51e671fd2c..4037f925ad 100644 --- a/constants.gradle +++ b/constants.gradle @@ -32,6 +32,7 @@ project.ext { // Keep this in sync with Google's internal Checker Framework version. checkerframeworkVersion = '3.5.0' checkerframeworkCompatVersion = '2.5.0' + errorProneVersion = '2.9.0' jsr305Version = '3.0.2' kotlinAnnotationsVersion = '1.5.20' androidxAnnotationVersion = '1.2.0' diff --git a/library/common/build.gradle b/library/common/build.gradle index bdfe7a00f3..d4aa1615f8 100644 --- a/library/common/build.gradle +++ b/library/common/build.gradle @@ -27,6 +27,7 @@ dependencies { } implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version + compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 44d9e0277c..975a0efd8f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -24,10 +24,10 @@ import android.media.MediaCrypto; import android.media.MediaFormat; import android.view.Surface; import androidx.annotation.IntDef; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.errorprone.annotations.InlineMe; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1110,112 +1110,51 @@ public final class C { * audio MIME type. */ public static final int FORMAT_UNSUPPORTED_TYPE = 0b000; - /** - * Converts a time in microseconds to the corresponding time in milliseconds, preserving {@link - * #TIME_UNSET} and {@link #TIME_END_OF_SOURCE} values. - * - * @param timeUs The time in microseconds. - * @return The corresponding time in milliseconds. - */ + + /** @deprecated Use {@link Util#usToMs(long)}. */ + @InlineMe( + replacement = "Util.usToMs(timeUs)", + imports = {"com.google.android.exoplayer2.util.Util"}) + @Deprecated public static long usToMs(long timeUs) { - return (timeUs == TIME_UNSET || timeUs == TIME_END_OF_SOURCE) ? timeUs : (timeUs / 1000); + return Util.usToMs(timeUs); } - /** - * Converts a time in milliseconds to the corresponding time in microseconds, preserving {@link - * #TIME_UNSET} values and {@link #TIME_END_OF_SOURCE} values. - * - * @param timeMs The time in milliseconds. - * @return The corresponding time in microseconds. - */ + /** @deprecated Use {@link Util#msToUs(long)}. */ + @InlineMe( + replacement = "Util.msToUs(timeMs)", + imports = {"com.google.android.exoplayer2.util.Util"}) + @Deprecated public static long msToUs(long timeMs) { - return (timeMs == TIME_UNSET || timeMs == TIME_END_OF_SOURCE) ? timeMs : (timeMs * 1000); + return Util.msToUs(timeMs); } - /** - * Returns a newly generated audio session identifier, or {@link AudioManager#ERROR} if an error - * occurred in which case audio playback may fail. - * - * @see AudioManager#generateAudioSessionId() - */ + /** @deprecated Use {@link Util#generateAudioSessionIdV21(Context)}. */ + @InlineMe( + replacement = "Util.generateAudioSessionIdV21(context)", + imports = {"com.google.android.exoplayer2.util.Util"}) + @Deprecated @RequiresApi(21) public static int generateAudioSessionIdV21(Context context) { - @Nullable - AudioManager audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)); - return audioManager == null ? AudioManager.ERROR : audioManager.generateAudioSessionId(); + return Util.generateAudioSessionIdV21(context); } - /** - * Returns string representation of a {@link FormatSupport} flag. - * - * @param formatSupport A {@link FormatSupport} flag. - * @return A string representation of the flag. - */ + /** @deprecated Use {@link Util#getFormatSupportString(int)}. */ + @InlineMe( + replacement = "Util.getFormatSupportString(formatSupport)", + imports = {"com.google.android.exoplayer2.util.Util"}) + @Deprecated public static String getFormatSupportString(@FormatSupport int formatSupport) { - switch (formatSupport) { - case FORMAT_HANDLED: - return "YES"; - case FORMAT_EXCEEDS_CAPABILITIES: - return "NO_EXCEEDS_CAPABILITIES"; - case FORMAT_UNSUPPORTED_DRM: - return "NO_UNSUPPORTED_DRM"; - case FORMAT_UNSUPPORTED_SUBTYPE: - return "NO_UNSUPPORTED_TYPE"; - case FORMAT_UNSUPPORTED_TYPE: - return "NO"; - default: - throw new IllegalStateException(); - } + return Util.getFormatSupportString(formatSupport); } - // Copy of relevant error codes defined in MediaDrm.ErrorCodes from API 31. - // TODO (internal b/192337376): Remove once ExoPlayer depends on SDK 31. - private static final int ERROR_KEY_EXPIRED = 2; - private static final int ERROR_INSUFFICIENT_OUTPUT_PROTECTION = 4; - private static final int ERROR_INSUFFICIENT_SECURITY = 7; - private static final int ERROR_FRAME_TOO_LARGE = 8; - private static final int ERROR_CERTIFICATE_MALFORMED = 10; - private static final int ERROR_INIT_DATA = 15; - private static final int ERROR_KEY_NOT_LOADED = 16; - private static final int ERROR_LICENSE_PARSE = 17; - private static final int ERROR_LICENSE_POLICY = 18; - private static final int ERROR_LICENSE_RELEASE = 19; - private static final int ERROR_LICENSE_REQUEST_REJECTED = 20; - private static final int ERROR_LICENSE_RESTORE = 21; - private static final int ERROR_LICENSE_STATE = 22; - private static final int ERROR_PROVISIONING_CERTIFICATE = 24; - private static final int ERROR_PROVISIONING_CONFIG = 25; - private static final int ERROR_PROVISIONING_PARSE = 26; - private static final int ERROR_PROVISIONING_REQUEST_REJECTED = 27; - private static final int ERROR_PROVISIONING_RETRY = 28; - + /** @deprecated Use {@link Util#getErrorCodeForMediaDrmErrorCode(int)}. */ + @InlineMe( + replacement = "Util.getErrorCodeForMediaDrmErrorCode(mediaDrmErrorCode)", + imports = {"com.google.android.exoplayer2.util.Util"}) + @Deprecated @PlaybackException.ErrorCode public static int getErrorCodeForMediaDrmErrorCode(int mediaDrmErrorCode) { - switch (mediaDrmErrorCode) { - case ERROR_PROVISIONING_CONFIG: - case ERROR_PROVISIONING_PARSE: - case ERROR_PROVISIONING_REQUEST_REJECTED: - case ERROR_PROVISIONING_CERTIFICATE: - case ERROR_PROVISIONING_RETRY: - return PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED; - case ERROR_LICENSE_PARSE: - case ERROR_LICENSE_RELEASE: - case ERROR_LICENSE_REQUEST_REJECTED: - case ERROR_LICENSE_RESTORE: - case ERROR_LICENSE_STATE: - case ERROR_CERTIFICATE_MALFORMED: - return PlaybackException.ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED; - case ERROR_LICENSE_POLICY: - case ERROR_INSUFFICIENT_OUTPUT_PROTECTION: - case ERROR_INSUFFICIENT_SECURITY: - case ERROR_KEY_EXPIRED: - case ERROR_KEY_NOT_LOADED: - return PlaybackException.ERROR_CODE_DRM_DISALLOWED_OPERATION; - case ERROR_INIT_DATA: - case ERROR_FRAME_TOO_LARGE: - return PlaybackException.ERROR_CODE_DRM_CONTENT_ERROR; - default: - return PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR; - } + return Util.getErrorCodeForMediaDrmErrorCode(mediaDrmErrorCode); } } 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 40d4b2e0a9..c152bd5d05 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 @@ -38,6 +38,8 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.Point; import android.hardware.display.DisplayManager; import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.MediaDrm; import android.net.Uri; import android.os.Build; import android.os.Handler; @@ -60,6 +62,7 @@ import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.upstream.DataSource; import com.google.common.base.Ascii; import com.google.common.base.Charsets; @@ -1169,6 +1172,28 @@ public final class Util { return min; } + /** + * Converts a time in microseconds to the corresponding time in milliseconds, preserving {@link + * C#TIME_UNSET} and {@link C#TIME_END_OF_SOURCE} values. + * + * @param timeUs The time in microseconds. + * @return The corresponding time in milliseconds. + */ + public static long usToMs(long timeUs) { + return (timeUs == C.TIME_UNSET || timeUs == C.TIME_END_OF_SOURCE) ? timeUs : (timeUs / 1000); + } + + /** + * Converts a time in milliseconds to the corresponding time in microseconds, preserving {@link + * C#TIME_UNSET} values and {@link C#TIME_END_OF_SOURCE} values. + * + * @param timeMs The time in milliseconds. + * @return The corresponding time in microseconds. + */ + public static long msToUs(long timeMs) { + return (timeMs == C.TIME_UNSET || timeMs == C.TIME_END_OF_SOURCE) ? timeMs : (timeMs * 1000); + } + /** * Parses an xs:duration attribute value, returning the parsed duration in milliseconds. * @@ -1755,6 +1780,19 @@ public final class Util { } } + /** + * Returns a newly generated audio session identifier, or {@link AudioManager#ERROR} if an error + * occurred in which case audio playback may fail. + * + * @see AudioManager#generateAudioSessionId() + */ + @RequiresApi(21) + public static int generateAudioSessionIdV21(Context context) { + @Nullable + AudioManager audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)); + return audioManager == null ? AudioManager.ERROR : audioManager.generateAudioSessionId(); + } + /** * Derives a DRM {@link UUID} from {@code drmScheme}. * @@ -1779,6 +1817,41 @@ public final class Util { } } + /** + * Returns a {@link PlaybackException.ErrorCode} value that corresponds to the provided {@link + * MediaDrm.ErrorCodes} value. Returns {@link PlaybackException#ERROR_CODE_DRM_SYSTEM_ERROR} if + * the provided error code isn't recognised. + */ + @PlaybackException.ErrorCode + public static int getErrorCodeForMediaDrmErrorCode(int mediaDrmErrorCode) { + switch (mediaDrmErrorCode) { + case MediaDrm.ErrorCodes.ERROR_PROVISIONING_CONFIG: + case MediaDrm.ErrorCodes.ERROR_PROVISIONING_PARSE: + case MediaDrm.ErrorCodes.ERROR_PROVISIONING_REQUEST_REJECTED: + case MediaDrm.ErrorCodes.ERROR_PROVISIONING_CERTIFICATE: + case MediaDrm.ErrorCodes.ERROR_PROVISIONING_RETRY: + return PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED; + case MediaDrm.ErrorCodes.ERROR_LICENSE_PARSE: + case MediaDrm.ErrorCodes.ERROR_LICENSE_RELEASE: + case MediaDrm.ErrorCodes.ERROR_LICENSE_REQUEST_REJECTED: + case MediaDrm.ErrorCodes.ERROR_LICENSE_RESTORE: + case MediaDrm.ErrorCodes.ERROR_LICENSE_STATE: + case MediaDrm.ErrorCodes.ERROR_CERTIFICATE_MALFORMED: + return PlaybackException.ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED; + case MediaDrm.ErrorCodes.ERROR_LICENSE_POLICY: + case MediaDrm.ErrorCodes.ERROR_INSUFFICIENT_OUTPUT_PROTECTION: + case MediaDrm.ErrorCodes.ERROR_INSUFFICIENT_SECURITY: + case MediaDrm.ErrorCodes.ERROR_KEY_EXPIRED: + case MediaDrm.ErrorCodes.ERROR_KEY_NOT_LOADED: + return PlaybackException.ERROR_CODE_DRM_DISALLOWED_OPERATION; + case MediaDrm.ErrorCodes.ERROR_INIT_DATA: + case MediaDrm.ErrorCodes.ERROR_FRAME_TOO_LARGE: + return PlaybackException.ERROR_CODE_DRM_CONTENT_ERROR; + default: + return PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR; + } + } + /** * Makes a best guess to infer the {@link ContentType} from a {@link Uri}. * @@ -2428,6 +2501,29 @@ public final class Util { } } + /** + * Returns string representation of a {@link C.FormatSupport} flag. + * + * @param formatSupport A {@link C.FormatSupport} flag. + * @return A string representation of the flag. + */ + public static String getFormatSupportString(@C.FormatSupport int formatSupport) { + switch (formatSupport) { + case C.FORMAT_HANDLED: + return "YES"; + case C.FORMAT_EXCEEDS_CAPABILITIES: + return "NO_EXCEEDS_CAPABILITIES"; + case C.FORMAT_UNSUPPORTED_DRM: + return "NO_UNSUPPORTED_DRM"; + case C.FORMAT_UNSUPPORTED_SUBTYPE: + return "NO_UNSUPPORTED_TYPE"; + case C.FORMAT_UNSUPPORTED_TYPE: + return "NO"; + default: + throw new IllegalStateException(); + } + } + @Nullable private static String getSystemProperty(String name) { try { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 62b5347ece..2d82609c74 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -1047,8 +1047,8 @@ public interface ExoPlayer extends Player { /** * Sets the ID of the audio session to attach to the underlying {@link android.media.AudioTrack}. * - *

    The audio session ID can be generated using {@link C#generateAudioSessionIdV21(Context)} for - * API 21+. + *

    The audio session ID can be generated using {@link Util#generateAudioSessionIdV21(Context)} + * for API 21+. * * @param audioSessionId The audio session ID, or {@link C#AUDIO_SESSION_ID_UNSET} if it should be * generated by the framework. From 66335ab6f58e37725c64585a2f6e4041b0d09900 Mon Sep 17 00:00:00 2001 From: apodob Date: Tue, 7 Sep 2021 17:42:31 +0100 Subject: [PATCH 127/441] Redesign states of the SubtitleExtractor. Simplifies the SubtitleExtractor implementation. Makes the extractor more aligned with the Extractor interface documentation by removing STATE_DECODING in which extractor was doing nothing in term of input and output while returning RESULT_CONTINUE at the same time. PiperOrigin-RevId: 395267468 --- .../extractor/subtitle/SubtitleExtractor.java | 91 ++++++------------- 1 file changed, 29 insertions(+), 62 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index 3e59f0087c..24d991ba45 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -47,33 +47,20 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Generic extractor for extracting subtitles from various subtitle formats. */ public class SubtitleExtractor implements Extractor { - @IntDef( - value = { - STATE_CREATED, - STATE_INITIALIZED, - STATE_READING, - STATE_DECODING, - STATE_WRITING, - STATE_FINISHED, - STATE_RELEASED - }) @Retention(RetentionPolicy.SOURCE) + @IntDef({STATE_CREATED, STATE_INITIALIZED, STATE_EXTRACTING, STATE_FINISHED, STATE_RELEASED}) private @interface State {} /** The extractor has been created. */ private static final int STATE_CREATED = 0; /** The extractor has been initialized. */ private static final int STATE_INITIALIZED = 1; - /** The extractor is reading data from the input. */ - private static final int STATE_READING = 2; - /** The extractor is queueing data for decoding. */ - private static final int STATE_DECODING = 3; - /** The extractor is writing data to the output. */ - private static final int STATE_WRITING = 4; - /** The extractor has finished writing. */ - private static final int STATE_FINISHED = 5; - /** The extractor has bean released */ - private static final int STATE_RELEASED = 6; + /** The extractor is reading from input and writing to output. */ + private static final int STATE_EXTRACTING = 2; + /** The extractor has finished. */ + private static final int STATE_FINISHED = 3; + /** The extractor has been released. */ + private static final int STATE_RELEASED = 4; private static final int DEFAULT_BUFFER_SIZE = 1024; @@ -126,29 +113,26 @@ public class SubtitleExtractor implements Extractor { @Override public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { - switch (state) { - case STATE_INITIALIZED: - prepareMemory(input); - state = readFromInput(input) ? STATE_DECODING : STATE_READING; - return Extractor.RESULT_CONTINUE; - case STATE_READING: - state = readFromInput(input) ? STATE_DECODING : STATE_READING; - return Extractor.RESULT_CONTINUE; - case STATE_DECODING: - queueDataToDecoder(); - state = STATE_WRITING; - return RESULT_CONTINUE; - case STATE_WRITING: - writeToOutput(); - state = STATE_FINISHED; - return Extractor.RESULT_END_OF_INPUT; - case STATE_FINISHED: - return Extractor.RESULT_END_OF_INPUT; - case STATE_CREATED: - case STATE_RELEASED: - default: - throw new IllegalStateException(); + checkState(state != STATE_CREATED && state != STATE_RELEASED); + if (state == STATE_INITIALIZED) { + subtitleData.reset( + input.getLength() != C.LENGTH_UNSET + ? Ints.checkedCast(input.getLength()) + : DEFAULT_BUFFER_SIZE); + bytesRead = 0; + state = STATE_EXTRACTING; } + if (state == STATE_EXTRACTING) { + boolean inputFinished = readFromInput(input); + if (inputFinished) { + decodeAndWriteToOutput(); + state = STATE_FINISHED; + } + } + if (state == STATE_FINISHED) { + return RESULT_END_OF_INPUT; + } + return RESULT_CONTINUE; } @Override @@ -166,13 +150,6 @@ public class SubtitleExtractor implements Extractor { state = STATE_RELEASED; } - private void prepareMemory(ExtractorInput input) { - subtitleData.reset( - input.getLength() != C.LENGTH_UNSET - ? Ints.checkedCast(input.getLength()) - : DEFAULT_BUFFER_SIZE); - } - /** Returns whether reading has been finished. */ private boolean readFromInput(ExtractorInput input) throws IOException { if (subtitleData.capacity() == bytesRead) { @@ -186,7 +163,9 @@ public class SubtitleExtractor implements Extractor { return readResult == C.RESULT_END_OF_INPUT; } - private void queueDataToDecoder() throws IOException { + /** Decodes subtitle data and writes samples to the output. */ + private void decodeAndWriteToOutput() throws IOException { + checkStateNotNull(this.trackOutput); try { @Nullable SubtitleInputBuffer inputBuffer = subtitleDecoder.dequeueInputBuffer(); while (inputBuffer == null) { @@ -196,23 +175,11 @@ public class SubtitleExtractor implements Extractor { inputBuffer.ensureSpaceForWrite(bytesRead); inputBuffer.data.put(subtitleData.getData(), /* offset= */ 0, bytesRead); subtitleDecoder.queueInputBuffer(inputBuffer); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new InterruptedIOException(); - } catch (SubtitleDecoderException e) { - throw ParserException.createForMalformedContainer("SubtitleDecoder failed.", e); - } - } - - private void writeToOutput() throws IOException { - checkStateNotNull(this.trackOutput); - try { @Nullable SubtitleOutputBuffer outputBuffer = subtitleDecoder.dequeueOutputBuffer(); while (outputBuffer == null) { Thread.sleep(5); outputBuffer = subtitleDecoder.dequeueOutputBuffer(); } - for (int i = 0; i < outputBuffer.getEventTimeCount(); i++) { List cues = outputBuffer.getCues(outputBuffer.getEventTime(i)); byte[] cuesSample = cueEncoder.encode(cues); From e53e59388f3287c25ede736db52cdc34abc8f1a1 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 18:14:46 +0100 Subject: [PATCH 128/441] ID3: Fix end-of-string detection for UTF-16 The current detection logic checks that the two byte terminator starts at an even position in the ID3 data, where-as it should check that it starts at an even position relative to the start of the string. #minor-release #exofixit Issue: #9087 PiperOrigin-RevId: 395274934 --- RELEASENOTES.md | 3 ++ .../exoplayer2/metadata/id3/Id3Decoder.java | 4 +- .../metadata/id3/Id3DecoderTest.java | 53 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fe7021b519..b824358866 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -71,6 +71,9 @@ * RTSP: * Handle when additional spaces are in SDP's RTPMAP atrribute ([#9379](https://github.com/google/ExoPlayer/issues/9379)). +* Extractors: + * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings + ([#9087](https://github.com/google/ExoPlayer/issues/9087)). ### 2.15.0 (2021-08-10) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java b/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java index 0d97cef846..46bd482178 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java @@ -806,9 +806,9 @@ public final class Id3Decoder extends SimpleMetadataDecoder { return terminationPos; } - // Otherwise ensure an even index and look for a second zero byte. + // Otherwise ensure an even offset from the start, and look for a second zero byte. while (terminationPos < data.length - 1) { - if (terminationPos % 2 == 0 && data[terminationPos + 1] == (byte) 0) { + if ((terminationPos - fromIndex) % 2 == 0 && data[terminationPos + 1] == (byte) 0) { return terminationPos; } terminationPos = indexOfZeroByte(data, terminationPos + 1); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java b/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java index f08b8f8740..833a290cea 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java @@ -38,6 +38,7 @@ public final class Id3DecoderTest { @Test public void decodeTxxxFrame() { + // Test UTF-8. byte[] rawId3 = buildSingleFrameTag( "TXXX", @@ -53,6 +54,21 @@ public final class Id3DecoderTest { assertThat(textInformationFrame.description).isEmpty(); assertThat(textInformationFrame.value).isEqualTo("mdialog_VINDICO1527664_start"); + // Test UTF-16. + rawId3 = + buildSingleFrameTag( + "TXXX", + new byte[] { + 1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, + 100, 0, 0 + }); + metadata = decoder.decode(rawId3, rawId3.length); + assertThat(metadata.length()).isEqualTo(1); + textInformationFrame = (TextInformationFrame) metadata.get(0); + assertThat(textInformationFrame.id).isEqualTo("TXXX"); + assertThat(textInformationFrame.description).isEqualTo("Hello World"); + assertThat(textInformationFrame.value).isEmpty(); + // Test empty. rawId3 = buildSingleFrameTag("TXXX", new byte[0]); metadata = decoder.decode(rawId3, rawId3.length); @@ -220,6 +236,43 @@ public final class Id3DecoderTest { assertThat(apicFrame.description).isEqualTo("Hello World"); assertThat(apicFrame.pictureData).hasLength(10); assertThat(apicFrame.pictureData).isEqualTo(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}); + + // Test with UTF-16 description at even offset. + rawId3 = + buildSingleFrameTag( + "APIC", + new byte[] { + 1, 105, 109, 97, 103, 101, 47, 106, 112, 101, 103, 0, 16, 0, 72, 0, 101, 0, 108, 0, + 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 0 + }); + decoder = new Id3Decoder(); + metadata = decoder.decode(rawId3, rawId3.length); + assertThat(metadata.length()).isEqualTo(1); + apicFrame = (ApicFrame) metadata.get(0); + assertThat(apicFrame.mimeType).isEqualTo("image/jpeg"); + assertThat(apicFrame.pictureType).isEqualTo(16); + assertThat(apicFrame.description).isEqualTo("Hello World"); + assertThat(apicFrame.pictureData).hasLength(10); + assertThat(apicFrame.pictureData).isEqualTo(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}); + + // Test with UTF-16 description at odd offset. + rawId3 = + buildSingleFrameTag( + "APIC", + new byte[] { + 1, 105, 109, 97, 103, 101, 47, 112, 110, 103, 0, 16, 0, 72, 0, 101, 0, 108, 0, 108, 0, + 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 + }); + decoder = new Id3Decoder(); + metadata = decoder.decode(rawId3, rawId3.length); + assertThat(metadata.length()).isEqualTo(1); + apicFrame = (ApicFrame) metadata.get(0); + assertThat(apicFrame.mimeType).isEqualTo("image/png"); + assertThat(apicFrame.pictureType).isEqualTo(16); + assertThat(apicFrame.description).isEqualTo("Hello World"); + assertThat(apicFrame.pictureData).hasLength(10); + assertThat(apicFrame.pictureData).isEqualTo(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}); } @Test From 86f8c4e44e5467cb9d3b79dcf0593903ddd58422 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 7 Sep 2021 20:10:47 +0100 Subject: [PATCH 129/441] Fix some PlayerControlView accessibility issues - Fix focus when pausing and resuming - Prevent repeated readout of the playback position when paused #exofixit #minor-release Issue #9111 PiperOrigin-RevId: 395301765 --- RELEASENOTES.md | 2 + .../android/exoplayer2/ui/DefaultTimeBar.java | 9 ++++ .../exoplayer2/ui/PlayerControlView.java | 46 ++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b824358866..420dcd0e49 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -37,6 +37,8 @@ * Use `defStyleAttr` when obtaining styled attributes in `StyledPlayerView`, `PlayerView` and `PlayerControlView` ([#9024](https://github.com/google/ExoPlayer/issues/9024)). + * Fix accessibility focus in `PlayerControlView` + ([#9111](https://github.com/google/ExoPlayer/issues/9111)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java index 2b0dce52d0..3db156f4b4 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java @@ -512,6 +512,9 @@ public class DefaultTimeBar extends View implements TimeBar { @Override public void setPosition(long position) { + if (this.position == position) { + return; + } this.position = position; setContentDescription(getProgressText()); update(); @@ -519,12 +522,18 @@ public class DefaultTimeBar extends View implements TimeBar { @Override public void setBufferedPosition(long bufferedPosition) { + if (this.bufferedPosition == bufferedPosition) { + return; + } this.bufferedPosition = bufferedPosition; update(); } @Override public void setDuration(long duration) { + if (this.duration == duration) { + return; + } this.duration = duration; if (scrubbing && duration == C.TIME_UNSET) { stopScrubbing(/* canceled= */ true); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 7fc028ccc1..1d2d38784e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -41,10 +41,13 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.ExoPlayer; @@ -339,6 +342,8 @@ public class PlayerControlView extends FrameLayout { private long[] extraAdGroupTimesMs; private boolean[] extraPlayedAdGroups; private long currentWindowOffset; + private long currentPosition; + private long currentBufferedPosition; public PlayerControlView(Context context) { this(context, /* attrs= */ null); @@ -783,6 +788,7 @@ public class PlayerControlView extends FrameLayout { } updateAll(); requestPlayPauseFocus(); + requestPlayPauseAccessibilityFocus(); } // Call hideAfterTimeout even if already visible to reset the timeout. hideAfterTimeout(); @@ -831,18 +837,30 @@ public class PlayerControlView extends FrameLayout { return; } boolean requestPlayPauseFocus = false; + boolean requestPlayPauseAccessibilityFocus = false; boolean shouldShowPauseButton = shouldShowPauseButton(); if (playButton != null) { requestPlayPauseFocus |= shouldShowPauseButton && playButton.isFocused(); + requestPlayPauseAccessibilityFocus |= + Util.SDK_INT < 21 + ? requestPlayPauseFocus + : (shouldShowPauseButton && Api21.isAccessibilityFocused(playButton)); playButton.setVisibility(shouldShowPauseButton ? GONE : VISIBLE); } if (pauseButton != null) { requestPlayPauseFocus |= !shouldShowPauseButton && pauseButton.isFocused(); + requestPlayPauseAccessibilityFocus |= + Util.SDK_INT < 21 + ? requestPlayPauseFocus + : (!shouldShowPauseButton && Api21.isAccessibilityFocused(pauseButton)); pauseButton.setVisibility(shouldShowPauseButton ? VISIBLE : GONE); } if (requestPlayPauseFocus) { requestPlayPauseFocus(); } + if (requestPlayPauseAccessibilityFocus) { + requestPlayPauseAccessibilityFocus(); + } } private void updateNavigation() { @@ -1021,14 +1039,21 @@ public class PlayerControlView extends FrameLayout { position = currentWindowOffset + player.getContentPosition(); bufferedPosition = currentWindowOffset + player.getContentBufferedPosition(); } - if (positionView != null && !scrubbing) { + boolean positionChanged = position != currentPosition; + boolean bufferedPositionChanged = bufferedPosition != currentBufferedPosition; + currentPosition = position; + currentBufferedPosition = bufferedPosition; + + // Only update the TextView if the position has changed, else TalkBack will repeatedly read the + // same position to the user. + if (positionView != null && !scrubbing && positionChanged) { positionView.setText(Util.getStringForTime(formatBuilder, formatter, position)); } if (timeBar != null) { timeBar.setPosition(position); timeBar.setBufferedPosition(bufferedPosition); } - if (progressUpdateListener != null) { + if (progressUpdateListener != null && (positionChanged || bufferedPositionChanged)) { progressUpdateListener.onProgressUpdate(position, bufferedPosition); } @@ -1065,6 +1090,15 @@ public class PlayerControlView extends FrameLayout { } } + private void requestPlayPauseAccessibilityFocus() { + boolean shouldShowPauseButton = shouldShowPauseButton(); + if (!shouldShowPauseButton && playButton != null) { + playButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); + } else if (shouldShowPauseButton && pauseButton != null) { + pauseButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); + } + } + private void updateButton(boolean visible, boolean enabled, @Nullable View view) { if (view == null) { return; @@ -1339,4 +1373,12 @@ public class PlayerControlView extends FrameLayout { } } } + + @RequiresApi(21) + private static final class Api21 { + @DoNotInline + public static boolean isAccessibilityFocused(View view) { + return view.isAccessibilityFocused(); + } + } } From 442a5f4500530051a6aa7c7a48bc9da2facfc75c Mon Sep 17 00:00:00 2001 From: klhyun Date: Wed, 8 Sep 2021 05:32:34 +0100 Subject: [PATCH 130/441] Update PlayerView's UI when available commands change PiperOrigin-RevId: 395395015 --- RELEASENOTES.md | 2 ++ .../com/google/android/exoplayer2/ui/PlayerControlView.java | 4 +++- .../google/android/exoplayer2/ui/StyledPlayerControlView.java | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 420dcd0e49..49c7112baa 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -39,6 +39,8 @@ ([#9024](https://github.com/google/ExoPlayer/issues/9024)). * Fix accessibility focus in `PlayerControlView` ([#9111](https://github.com/google/ExoPlayer/issues/9111)). + * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI + when available player commands change. * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 1d2d38784e..7035372b32 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -20,6 +20,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; +import static com.google.android.exoplayer2.Player.EVENT_AVAILABLE_COMMANDS_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_IS_PLAYING_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_STATE_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAY_WHEN_READY_CHANGED; @@ -1314,7 +1315,8 @@ public class PlayerControlView extends FrameLayout { EVENT_REPEAT_MODE_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_POSITION_DISCONTINUITY, - EVENT_TIMELINE_CHANGED)) { + EVENT_TIMELINE_CHANGED, + EVENT_AVAILABLE_COMMANDS_CHANGED)) { updateNavigation(); } if (events.containsAny(EVENT_POSITION_DISCONTINUITY, EVENT_TIMELINE_CHANGED)) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 31071b7b52..69b0ad0fd1 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -20,6 +20,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; +import static com.google.android.exoplayer2.Player.EVENT_AVAILABLE_COMMANDS_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_IS_PLAYING_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_PARAMETERS_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_STATE_CHANGED; @@ -1769,7 +1770,8 @@ public class StyledPlayerControlView extends FrameLayout { EVENT_POSITION_DISCONTINUITY, EVENT_TIMELINE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, - EVENT_SEEK_FORWARD_INCREMENT_CHANGED)) { + EVENT_SEEK_FORWARD_INCREMENT_CHANGED, + EVENT_AVAILABLE_COMMANDS_CHANGED)) { updateNavigation(); } if (events.containsAny(EVENT_POSITION_DISCONTINUITY, EVENT_TIMELINE_CHANGED)) { From 3cdc8a9ea3a381b01832038534269129626117b4 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 8 Sep 2021 10:31:49 +0100 Subject: [PATCH 131/441] Use correct last timestamp for C2 MP3 workaround The C2 MP3 decoder produces an extra output buffer when draining after end-of-stream is queued. This output buffer has a later timestamp than the last queued input buffer so we need to calculate its timestamp to detect a stream change in the correct position. Before this CL we used the original input buffer timestamp as the largest queued timestamp, which caused the stream change to be detected at the correct position because the original input buffer timestamp was slightly larger than the actual last output buffer timestamp. After this change we use exact calculated timestamp as the largest queued timestamp. I manually verified gapless continues to work on a device using the C2 MP3 decoder by comparing output of the MP3 gapless and MP3 gapless stripped playlists in the demo app, and that the last buffer timestamp now matches. #exofixit PiperOrigin-RevId: 395428928 --- .../mediacodec/C2Mp3TimestampTracker.java | 49 +++++++++------ .../mediacodec/MediaCodecRenderer.java | 17 +++--- .../mediacodec/C2Mp3TimestampTrackerTest.java | 60 +++++++++++++------ 3 files changed, 81 insertions(+), 45 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTracker.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTracker.java index 04b453d529..8fde836637 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTracker.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTracker.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.mediacodec; +import static java.lang.Math.max; + import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.MpegAudioUtil; @@ -29,13 +31,11 @@ import java.nio.ByteBuffer; */ /* package */ final class C2Mp3TimestampTracker { - // Mirroring the actual codec, as can be found at - // https://cs.android.com/android/platform/superproject/+/main:frameworks/av/media/codec2/components/mp3/C2SoftMp3Dec.h;l=55;drc=3665390c9d32a917398b240c5a46ced07a3b65eb - private static final long DECODER_DELAY_SAMPLES = 529; + private static final long DECODER_DELAY_FRAMES = 529; private static final String TAG = "C2Mp3TimestampTracker"; - private long processedSamples; private long anchorTimestampUs; + private long processedFrames; private boolean seenInvalidMpegAudioHeader; /** @@ -44,8 +44,8 @@ import java.nio.ByteBuffer; *

    This should be done when the codec is flushed. */ public void reset() { - processedSamples = 0; anchorTimestampUs = 0; + processedFrames = 0; seenInvalidMpegAudioHeader = false; } @@ -57,6 +57,10 @@ import java.nio.ByteBuffer; * @return The expected output presentation time, in microseconds. */ public long updateAndGetPresentationTimeUs(Format format, DecoderInputBuffer buffer) { + if (processedFrames == 0) { + anchorTimestampUs = buffer.timeUs; + } + if (seenInvalidMpegAudioHeader) { return buffer.timeUs; } @@ -71,23 +75,32 @@ import java.nio.ByteBuffer; int frameCount = MpegAudioUtil.parseMpegAudioFrameSampleCount(sampleHeaderData); if (frameCount == C.LENGTH_UNSET) { seenInvalidMpegAudioHeader = true; + processedFrames = 0; + anchorTimestampUs = buffer.timeUs; Log.w(TAG, "MPEG audio header is invalid."); return buffer.timeUs; } - - // These calculations mirror the timestamp calculations in the Codec2 Mp3 Decoder. - // https://cs.android.com/android/platform/superproject/+/main:frameworks/av/media/codec2/components/mp3/C2SoftMp3Dec.cpp;l=464;drc=ed134640332fea70ca4b05694289d91a5265bb46 - if (processedSamples == 0) { - anchorTimestampUs = buffer.timeUs; - processedSamples = frameCount - DECODER_DELAY_SAMPLES; - return anchorTimestampUs; - } - long processedDurationUs = getProcessedDurationUs(format); - processedSamples += frameCount; - return anchorTimestampUs + processedDurationUs; + long currentBufferTimestampUs = getBufferTimestampUs(format.sampleRate); + processedFrames += frameCount; + return currentBufferTimestampUs; } - private long getProcessedDurationUs(Format format) { - return processedSamples * C.MICROS_PER_SECOND / format.sampleRate; + /** + * Returns the timestamp of the last buffer that will be produced if the stream ends at the + * current position, in microseconds. + * + * @param format The format associated with input buffers. + * @return The timestamp of the last buffer that will be produced if the stream ends at the + * current position, in microseconds. + */ + public long getLastOutputBufferPresentationTimeUs(Format format) { + return getBufferTimestampUs(format.sampleRate); + } + + private long getBufferTimestampUs(long sampleRate) { + // This calculation matches the timestamp calculation in the Codec2 Mp3 Decoder. + // https://cs.android.com/android/platform/superproject/+/main:frameworks/av/media/codec2/components/mp3/C2SoftMp3Dec.cpp;l=464;drc=ed134640332fea70ca4b05694289d91a5265bb46 + return anchorTimestampUs + + max(0, (processedFrames - DECODER_DELAY_FRAMES) * C.MICROS_PER_SECOND / sampleRate); } } 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 829fa8f4ef..fab14c4774 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 @@ -1333,6 +1333,14 @@ public abstract class MediaCodecRenderer extends BaseRenderer { if (c2Mp3TimestampTracker != null) { presentationTimeUs = c2Mp3TimestampTracker.updateAndGetPresentationTimeUs(inputFormat, buffer); + // When draining the C2 MP3 decoder it produces an extra non-empty buffer with a timestamp + // after all queued input buffer timestamps (unlike other decoders, which generally propagate + // the input timestamps to output buffers 1:1). To detect the end of the stream when this + // buffer is dequeued we override the largest queued timestamp accordingly. + largestQueuedPresentationTimeUs = + max( + largestQueuedPresentationTimeUs, + c2Mp3TimestampTracker.getLastOutputBufferPresentationTimeUs(inputFormat)); } if (buffer.isDecodeOnly()) { @@ -1342,14 +1350,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { formatQueue.add(presentationTimeUs, inputFormat); waitingForFirstSampleInFormat = false; } - - // TODO(b/158483277): Find the root cause of why a gap is introduced in MP3 playback when using - // presentationTimeUs from the c2Mp3TimestampTracker. - if (c2Mp3TimestampTracker != null) { - largestQueuedPresentationTimeUs = max(largestQueuedPresentationTimeUs, buffer.timeUs); - } else { - largestQueuedPresentationTimeUs = max(largestQueuedPresentationTimeUs, presentationTimeUs); - } + largestQueuedPresentationTimeUs = max(largestQueuedPresentationTimeUs, presentationTimeUs); buffer.flip(); if (buffer.hasSupplementalData()) { handleInputBufferSupplementalData(buffer); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTrackerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTrackerTest.java index 1108b882e4..eaec4a4717 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTrackerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/C2Mp3TimestampTrackerTest.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.mediacodec; +import static com.google.android.exoplayer2.testutil.TestUtil.createByteArray; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -22,6 +23,8 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,49 +33,68 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public final class C2Mp3TimestampTrackerTest { - private static final Format AUDIO_MP3 = + private static final Format FORMAT = new Format.Builder() .setSampleMimeType(MimeTypes.AUDIO_MPEG) .setChannelCount(2) .setSampleRate(44_100) .build(); - private DecoderInputBuffer buffer; private C2Mp3TimestampTracker timestampTracker; + private DecoderInputBuffer buffer; + private DecoderInputBuffer invalidBuffer; @Before public void setUp() { - buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED); timestampTracker = new C2Mp3TimestampTracker(); - buffer.data = ByteBuffer.wrap(new byte[] {-1, -5, -24, 60}); + buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED); + buffer.data = ByteBuffer.wrap(createByteArray(0xFF, 0xFB, 0xE8, 0x3C)); buffer.timeUs = 100_000; + invalidBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED); + invalidBuffer.data = ByteBuffer.wrap(createByteArray(0, 0, 0, 0)); + invalidBuffer.timeUs = 120_000; } @Test - public void whenUpdateCalledMultipleTimes_timestampsIncrease() { - long first = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); - long second = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); - long third = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); + public void handleBuffers_outputsCorrectTimestamps() { + List presentationTimesUs = new ArrayList<>(); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.getLastOutputBufferPresentationTimeUs(FORMAT)); - assertThat(second).isGreaterThan(first); - assertThat(third).isGreaterThan(second); + assertThat(presentationTimesUs).containsExactly(100_000L, 114_126L, 140_249L, 166_371L); } @Test - public void whenResetCalled_timestampsDecrease() { - long first = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); - long second = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); + public void handleBuffersWithReset_resetsTimestamps() { + List presentationTimesUs = new ArrayList<>(); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); timestampTracker.reset(); - long third = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.getLastOutputBufferPresentationTimeUs(FORMAT)); - assertThat(second).isGreaterThan(first); - assertThat(third).isLessThan(second); + assertThat(presentationTimesUs).containsExactly(100_000L, 114_126L, 100_000L, 114_126L); } @Test - public void whenBufferTimeIsNotZero_firstSampleIsOffset() { - long first = timestampTracker.updateAndGetPresentationTimeUs(AUDIO_MP3, buffer); + public void handleInvalidBuffer_stopsUpdatingTimestamps() { + List presentationTimesUs = new ArrayList<>(); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)); + presentationTimesUs.add(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, invalidBuffer)); + presentationTimesUs.add(timestampTracker.getLastOutputBufferPresentationTimeUs(FORMAT)); - assertThat(first).isEqualTo(buffer.timeUs); + assertThat(presentationTimesUs).containsExactly(100_000L, 114_126L, 120_000L, 120_000L); + } + + @Test + public void firstTimestamp_matchesBuffer() { + assertThat(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, buffer)) + .isEqualTo(buffer.timeUs); + timestampTracker.reset(); + assertThat(timestampTracker.updateAndGetPresentationTimeUs(FORMAT, invalidBuffer)) + .isEqualTo(invalidBuffer.timeUs); } } From d9bc22314a0560a1f9c83f2cddc1daaf7b5d254d Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 8 Sep 2021 10:38:11 +0100 Subject: [PATCH 132/441] Use identical cache keys for downloading and playing DASH segments #minor-release #exofixit Issue: #9370 PiperOrigin-RevId: 395429794 --- RELEASENOTES.md | 7 +++- .../exoplayer2/source/dash/DashUtil.java | 26 +++++++++--- .../source/dash/DefaultDashChunkSource.java | 17 ++------ .../source/dash/offline/DashDownloader.java | 32 ++++++++++----- .../exoplayer2/source/dash/DashUtilTest.java | 41 +++++++++++++++++++ 5 files changed, 91 insertions(+), 32 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 49c7112baa..f97db1cef6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -39,8 +39,11 @@ ([#9024](https://github.com/google/ExoPlayer/issues/9024)). * Fix accessibility focus in `PlayerControlView` ([#9111](https://github.com/google/ExoPlayer/issues/9111)). - * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI - when available player commands change. + * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI when + available player commands change. +* DASH + * Use identical cache keys for downloading and playing DASH segments + ([#9370](https://github.com/google/ExoPlayer/issues/9370)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java index 9ca1c176fe..78eec4ec69 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java @@ -46,20 +46,20 @@ public final class DashUtil { /** * Builds a {@link DataSpec} for a given {@link RangedUri} belonging to {@link Representation}. * + * @param representation The {@link Representation} to which the request belongs. * @param baseUrl The base url with which to resolve the request URI. * @param requestUri The {@link RangedUri} of the data to request. - * @param cacheKey An optional cache key. * @param flags Flags to be set on the returned {@link DataSpec}. See {@link * DataSpec.Builder#setFlags(int)}. * @return The {@link DataSpec}. */ public static DataSpec buildDataSpec( - String baseUrl, RangedUri requestUri, @Nullable String cacheKey, int flags) { + Representation representation, String baseUrl, RangedUri requestUri, int flags) { return new DataSpec.Builder() .setUri(requestUri.resolveUri(baseUrl)) .setPosition(requestUri.start) .setLength(requestUri.length) - .setKey(cacheKey) + .setKey(resolveCacheKey(representation, requestUri)) .setFlags(flags) .build(); } @@ -77,8 +77,7 @@ public final class DashUtil { */ public static DataSpec buildDataSpec( Representation representation, RangedUri requestUri, int flags) { - return buildDataSpec( - representation.baseUrls.get(0).url, requestUri, representation.getCacheKey(), flags); + return buildDataSpec(representation, representation.baseUrls.get(0).url, requestUri, flags); } /** @@ -289,9 +288,9 @@ public final class DashUtil { throws IOException { DataSpec dataSpec = DashUtil.buildDataSpec( + representation, representation.baseUrls.get(baseUrlIndex).url, requestUri, - representation.getCacheKey(), /* flags= */ 0); InitializationChunk initializationChunk = new InitializationChunk( @@ -304,6 +303,21 @@ public final class DashUtil { initializationChunk.load(); } + /** + * Resolves the cache key to be used when requesting the given ranged URI for the given {@link + * Representation}. + * + * @param representation The {@link Representation} to which the URI belongs to. + * @param rangedUri The URI for which to resolve the cache key. + * @return The cache key. + */ + public static String resolveCacheKey(Representation representation, RangedUri rangedUri) { + @Nullable String cacheKey = representation.getCacheKey(); + return cacheKey != null + ? cacheKey + : rangedUri.resolveUri(representation.baseUrls.get(0).url).toString(); + } + private static ChunkExtractor newChunkExtractor(int trackType, Format format) { String mimeType = format.containerMimeType; boolean isWebm = diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index b147867854..d878430747 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -628,10 +628,7 @@ public class DefaultDashChunkSource implements DashChunkSource { } DataSpec dataSpec = DashUtil.buildDataSpec( - representationHolder.selectedBaseUrl.url, - requestUri, - representation.getCacheKey(), - /* flags= */ 0); + representation, representationHolder.selectedBaseUrl.url, requestUri, /* flags= */ 0); return new InitializationChunk( dataSource, dataSpec, @@ -664,10 +661,7 @@ public class DefaultDashChunkSource implements DashChunkSource { : DataSpec.FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED; DataSpec dataSpec = DashUtil.buildDataSpec( - representationHolder.selectedBaseUrl.url, - segmentUri, - representation.getCacheKey(), - flags); + representation, representationHolder.selectedBaseUrl.url, segmentUri, flags); return new SingleSampleMediaChunk( dataSource, dataSpec, @@ -706,10 +700,7 @@ public class DefaultDashChunkSource implements DashChunkSource { : DataSpec.FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED; DataSpec dataSpec = DashUtil.buildDataSpec( - representationHolder.selectedBaseUrl.url, - segmentUri, - representation.getCacheKey(), - flags); + representation, representationHolder.selectedBaseUrl.url, segmentUri, flags); long sampleOffsetUs = -representation.presentationTimeOffsetUs; return new ContainerMediaChunk( dataSource, @@ -765,9 +756,9 @@ public class DefaultDashChunkSource implements DashChunkSource { ? 0 : DataSpec.FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED; return DashUtil.buildDataSpec( + representationHolder.representation, representationHolder.selectedBaseUrl.url, segmentUri, - representationHolder.representation.getCacheKey(), flags); } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java index 513ab6403c..5bc557761d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java @@ -15,12 +15,15 @@ */ package com.google.android.exoplayer2.source.dash.offline; +import static com.google.android.exoplayer2.util.Util.castNonNull; + import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.offline.DownloadException; import com.google.android.exoplayer2.offline.SegmentDownloader; +import com.google.android.exoplayer2.source.dash.BaseUrlExclusionList; import com.google.android.exoplayer2.source.dash.DashSegmentIndex; import com.google.android.exoplayer2.source.dash.DashUtil; import com.google.android.exoplayer2.source.dash.DashWrappingSegmentIndex; @@ -70,6 +73,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; */ public final class DashDownloader extends SegmentDownloader { + private final BaseUrlExclusionList baseUrlExclusionList; + /** * Creates a new instance. * @@ -113,6 +118,7 @@ public final class DashDownloader extends SegmentDownloader { CacheDataSource.Factory cacheDataSourceFactory, Executor executor) { super(mediaItem, manifestParser, cacheDataSourceFactory, executor); + baseUrlExclusionList = new BaseUrlExclusionList(); } @Override @@ -163,28 +169,32 @@ public final class DashDownloader extends SegmentDownloader { throw new DownloadException("Unbounded segment index"); } - String baseUrl = representation.baseUrls.get(0).url; - RangedUri initializationUri = representation.getInitializationUri(); + String baseUrl = castNonNull(baseUrlExclusionList.selectBaseUrl(representation.baseUrls)).url; + @Nullable RangedUri initializationUri = representation.getInitializationUri(); if (initializationUri != null) { - addSegment(periodStartUs, baseUrl, initializationUri, out); + out.add(createSegment(representation, baseUrl, periodStartUs, initializationUri)); } - RangedUri indexUri = representation.getIndexUri(); + @Nullable RangedUri indexUri = representation.getIndexUri(); if (indexUri != null) { - addSegment(periodStartUs, baseUrl, indexUri, out); + out.add(createSegment(representation, baseUrl, periodStartUs, indexUri)); } long firstSegmentNum = index.getFirstSegmentNum(); long lastSegmentNum = firstSegmentNum + segmentCount - 1; for (long j = firstSegmentNum; j <= lastSegmentNum; j++) { - addSegment(periodStartUs + index.getTimeUs(j), baseUrl, index.getSegmentUrl(j), out); + out.add( + createSegment( + representation, + baseUrl, + periodStartUs + index.getTimeUs(j), + index.getSegmentUrl(j))); } } } - private static void addSegment( - long startTimeUs, String baseUrl, RangedUri rangedUri, ArrayList out) { - DataSpec dataSpec = - new DataSpec(rangedUri.resolveUri(baseUrl), rangedUri.start, rangedUri.length); - out.add(new Segment(startTimeUs, dataSpec)); + private Segment createSegment( + Representation representation, String baseUrl, long startTimeUs, RangedUri rangedUri) { + DataSpec dataSpec = DashUtil.buildDataSpec(representation, baseUrl, rangedUri, /* flags= */ 0); + return new Segment(startTimeUs, dataSpec); } @Nullable diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java index 655baea575..d0cb9dabdd 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashUtilTest.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.source.dash.manifest.AdaptationSet; import com.google.android.exoplayer2.source.dash.manifest.BaseUrl; import com.google.android.exoplayer2.source.dash.manifest.Period; +import com.google.android.exoplayer2.source.dash.manifest.RangedUri; import com.google.android.exoplayer2.source.dash.manifest.Representation; import com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase; import com.google.android.exoplayer2.upstream.DummyDataSource; @@ -67,6 +68,46 @@ public final class DashUtilTest { assertThat(format).isNull(); } + @Test + public void resolveCacheKey_representationCacheKeyIsNull_resolvesRangedUriWithFirstBaseUrl() { + ImmutableList baseUrls = + ImmutableList.of(new BaseUrl("http://www.google.com"), new BaseUrl("http://www.foo.com")); + Representation.SingleSegmentRepresentation representation = + new Representation.SingleSegmentRepresentation( + /* revisionId= */ 1L, + new Format.Builder().build(), + baseUrls, + new SingleSegmentBase(), + /* inbandEventStreams= */ null, + /* cacheKey= */ null, + /* contentLength= */ 1); + RangedUri rangedUri = new RangedUri("path/to/resource", /* start= */ 0, /* length= */ 1); + + String cacheKey = DashUtil.resolveCacheKey(representation, rangedUri); + + assertThat(cacheKey).isEqualTo("http://www.google.com/path/to/resource"); + } + + @Test + public void resolveCacheKey_representationCacheKeyDefined_usesRepresentationCacheKey() { + ImmutableList baseUrls = + ImmutableList.of(new BaseUrl("http://www.google.com"), new BaseUrl("http://www.foo.com")); + Representation.SingleSegmentRepresentation representation = + new Representation.SingleSegmentRepresentation( + /* revisionId= */ 1L, + new Format.Builder().build(), + baseUrls, + new SingleSegmentBase(), + /* inbandEventStreams= */ null, + "cacheKey", + /* contentLength= */ 1); + RangedUri rangedUri = new RangedUri("path/to/resource", /* start= */ 0, /* length= */ 1); + + String cacheKey = DashUtil.resolveCacheKey(representation, rangedUri); + + assertThat(cacheKey).isEqualTo("cacheKey"); + } + private static Period newPeriod(AdaptationSet... adaptationSets) { return new Period("", 0, Arrays.asList(adaptationSets)); } From e088cb431859896307618c90316fe314f02c0203 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 8 Sep 2021 11:51:43 +0100 Subject: [PATCH 133/441] Handle RTSP request by replying Method Not Allowed. PiperOrigin-RevId: 395438728 --- .../exoplayer2/source/rtsp/RtspClient.java | 43 ++++++++++++++--- .../exoplayer2/source/rtsp/RtspHeaders.java | 17 +++++++ .../source/rtsp/RtspMessageUtil.java | 20 ++++++++ .../source/rtsp/RtspMessageUtilTest.java | 47 +++++++++++++++++++ 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java index 45d7bcad9a..882a090435 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java @@ -34,6 +34,7 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import static com.google.common.base.Strings.nullToEmpty; +import static java.lang.Math.max; import android.net.Uri; import android.os.Handler; @@ -376,18 +377,23 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; lastRequest.method, sessionId, lastRequestHeaders, lastRequest.uri)); } + public void sendMethodNotAllowedResponse(int cSeq) { + // RTSP status code 405: Method Not Allowed (RFC2326 Section 7.1.1). + sendResponse( + new RtspResponse( + /* status= */ 405, new RtspHeaders.Builder(userAgent, sessionId, cSeq).build())); + + // The server could send a cSeq that is larger than the current stored cSeq. To maintain a + // monotonically increasing cSeq number, this.cSeq needs to be reset to server's cSeq + 1. + this.cSeq = max(this.cSeq, cSeq + 1); + } + private RtspRequest getRequestWithCommonHeaders( @RtspRequest.Method int method, @Nullable String sessionId, Map additionalHeaders, Uri uri) { - RtspHeaders.Builder headersBuilder = new RtspHeaders.Builder(); - headersBuilder.add(RtspHeaders.CSEQ, String.valueOf(cSeq++)); - headersBuilder.add(RtspHeaders.USER_AGENT, userAgent); - - if (sessionId != null) { - headersBuilder.add(RtspHeaders.SESSION, sessionId); - } + RtspHeaders.Builder headersBuilder = new RtspHeaders.Builder(userAgent, sessionId, cSeq++); if (rtspAuthenticationInfo != null) { checkStateNotNull(rtspAuthUserInfo); @@ -413,6 +419,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; messageChannel.send(message); lastRequest = request; } + + private void sendResponse(RtspResponse response) { + List message = RtspMessageUtil.serializeResponse(response); + maybeLogMessage(message); + messageChannel.send(message); + } } private final class MessageListener implements RtspMessageChannel.MessageListener { @@ -436,6 +448,23 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private void handleRtspMessage(List message) { maybeLogMessage(message); + + if (RtspMessageUtil.isRtspResponse(message)) { + handleRtspResponse(message); + } else { + handleRtspRequest(message); + } + } + + private void handleRtspRequest(List message) { + // Handling RTSP requests on the client is optional (RFC2326 Section 10). Decline all + // requests with 'Method Not Allowed'. + messageSender.sendMethodNotAllowedResponse( + Integer.parseInt( + checkNotNull(RtspMessageUtil.parseRequest(message).headers.get(RtspHeaders.CSEQ)))); + } + + private void handleRtspResponse(List message) { RtspResponse response = RtspMessageUtil.parseResponse(message); int cSeq = Integer.parseInt(checkNotNull(response.headers.get(RtspHeaders.CSEQ))); diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java index 12c980a1a3..be228a414f 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java @@ -78,6 +78,23 @@ import java.util.Map; namesAndValuesBuilder = new ImmutableListMultimap.Builder<>(); } + /** + * Creates a new instance with common header values. + * + * @param userAgent The user agent string. + * @param sessionId The RTSP session ID; use {@code null} when the session is not yet set up. + * @param cSeq The RTSP cSeq sequence number. + */ + public Builder(String userAgent, @Nullable String sessionId, int cSeq) { + this(); + + add(USER_AGENT, userAgent); + add(CSEQ, String.valueOf(cSeq)); + if (sessionId != null) { + add(SESSION, sessionId); + } + } + /** * Creates a new instance to build upon the provided {@link RtspHeaders}. * diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index c8ffff2574..a1a9b69afd 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -114,10 +114,15 @@ import java.util.regex.Pattern; /** * Serializes an {@link RtspRequest} to an {@link ImmutableList} of strings. * + *

    The {@link RtspRequest} must include the {@link RtspHeaders#CSEQ} header, or this method + * throws {@link IllegalArgumentException}. + * * @param request The {@link RtspRequest}. * @return A list of the lines of the {@link RtspRequest}, without line terminators (CRLF). */ public static ImmutableList serializeRequest(RtspRequest request) { + checkArgument(request.headers.get(RtspHeaders.CSEQ) != null); + ImmutableList.Builder builder = new ImmutableList.Builder<>(); // Request line. builder.add( @@ -140,10 +145,15 @@ import java.util.regex.Pattern; /** * Serializes an {@link RtspResponse} to an {@link ImmutableList} of strings. * + *

    The {@link RtspResponse} must include the {@link RtspHeaders#CSEQ} header, or this method + * throws {@link IllegalArgumentException}. + * * @param response The {@link RtspResponse}. * @return A list of the lines of the {@link RtspResponse}, without line terminators (CRLF). */ public static ImmutableList serializeResponse(RtspResponse response) { + checkArgument(response.headers.get(RtspHeaders.CSEQ) != null); + ImmutableList.Builder builder = new ImmutableList.Builder<>(); // Request line. builder.add( @@ -327,6 +337,16 @@ import java.util.regex.Pattern; || STATUS_LINE_PATTERN.matcher(line).matches(); } + /** + * Returns whether the RTSP message is an RTSP response. + * + * @param lines The non-empty list of received lines, with line terminators removed. + * @return Whether the lines represent an RTSP response. + */ + public static boolean isRtspResponse(List lines) { + return STATUS_LINE_PATTERN.matcher(lines.get(0)).matches(); + } + /** Returns the lines in an RTSP message body split by the line terminator used in body. */ public static String[] splitRtspMessageBody(String body) { return Util.split(body, body.contains(CRLF) ? CRLF : LF); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java index 92463f3085..b11e82f9c9 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.rtsp; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import android.net.Uri; import androidx.annotation.Nullable; @@ -335,6 +336,52 @@ public final class RtspMessageUtilTest { .isEqualTo(expectedRtspMessage.getBytes(RtspMessageChannel.CHARSET)); } + @Test + public void serialize_requestWithoutCseqHeader_throwsIllegalArgumentException() { + RtspRequest request = + new RtspRequest( + Uri.parse("rtsp://127.0.0.1/test.mkv/track1"), + RtspRequest.METHOD_OPTIONS, + RtspHeaders.EMPTY, + /* messageBody= */ ""); + + assertThrows(IllegalArgumentException.class, () -> RtspMessageUtil.serializeRequest(request)); + } + + @Test + public void serialize_responseWithoutCseqHeader_throwsIllegalArgumentException() { + RtspResponse response = new RtspResponse(/* status= */ 200, RtspHeaders.EMPTY); + + assertThrows(IllegalArgumentException.class, () -> RtspMessageUtil.serializeResponse(response)); + } + + @Test + public void isRtspResponse_withSuccessfulRtspResponse_returnsTrue() { + List responseLines = + Arrays.asList( + "RTSP/1.0 200 OK", + "CSeq: 2", + "Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER", + ""); + + assertThat(RtspMessageUtil.isRtspResponse(responseLines)).isTrue(); + } + + @Test + public void isRtspResponse_withUnsuccessfulRtspResponse_returnsTrue() { + List responseLines = Arrays.asList("RTSP/1.0 405 Method Not Allowed", "CSeq: 2", ""); + + assertThat(RtspMessageUtil.isRtspResponse(responseLines)).isTrue(); + } + + @Test + public void isRtspResponse_withRtspRequest_returnsFalse() { + List requestLines = + Arrays.asList("OPTIONS rtsp://localhost:554/foo.bar RTSP/1.0", "CSeq: 2", ""); + + assertThat(RtspMessageUtil.isRtspResponse(requestLines)).isFalse(); + } + @Test public void serialize_failedResponse_succeeds() { RtspResponse response = From c2e6d2028be45ef970dda8f5fdbb875d49e95d84 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 8 Sep 2021 12:27:26 +0100 Subject: [PATCH 134/441] Fix poor documentation and variable name choice in StreamKey Issue #9284 PiperOrigin-RevId: 395443015 --- .../android/exoplayer2/offline/StreamKey.java | 52 +++++++++++++------ .../offline/DefaultDownloadIndex.java | 2 +- .../source/dash/manifest/DashManifest.java | 2 +- .../hls/playlist/HlsMasterPlaylist.java | 2 +- .../smoothstreaming/manifest/SsManifest.java | 2 +- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/offline/StreamKey.java b/library/common/src/main/java/com/google/android/exoplayer2/offline/StreamKey.java index f9a48868d9..6a9c9325d0 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/offline/StreamKey.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/offline/StreamKey.java @@ -20,11 +20,18 @@ import android.os.Parcelable; import androidx.annotation.Nullable; /** - * A key for a subset of media which can be separately loaded (a "stream"). + * A key for a subset of media that can be separately loaded (a "stream"). * - *

    The stream key consists of a period index, a group index within the period and a track index + *

    The stream key consists of a period index, a group index within the period and a stream index * within the group. The interpretation of these indices depends on the type of media for which the - * stream key is used. + * stream key is used. Note that they are not the same as track group and track indices, + * because multiple tracks can be multiplexed into a single stream. + * + *

    Application code should not generally attempt to build StreamKey instances directly. Instead, + * {@code DownloadHelper.getDownloadRequest} can be used to generate download requests with the + * correct StreamKeys for the track selections that have been configured on the helper. {@code + * MediaPeriod.getStreamKeys} provides a lower level way of generating StreamKeys corresponding to a + * particular track selection. */ public final class StreamKey implements Comparable, Parcelable { @@ -32,37 +39,48 @@ public final class StreamKey implements Comparable, Parcelable { public final int periodIndex; /** The group index. */ public final int groupIndex; - /** The track index. */ - public final int trackIndex; + /** The stream index. */ + public final int streamIndex; + + /** @deprecated Use {@link #streamIndex}. */ + @Deprecated public final int trackIndex; /** + * Creates an instance with {@link #periodIndex} set to 0. + * * @param groupIndex The group index. - * @param trackIndex The track index. + * @param streamIndex The stream index. */ - public StreamKey(int groupIndex, int trackIndex) { - this(0, groupIndex, trackIndex); + public StreamKey(int groupIndex, int streamIndex) { + this(0, groupIndex, streamIndex); } /** + * Creates an instance. + * * @param periodIndex The period index. * @param groupIndex The group index. - * @param trackIndex The track index. + * @param streamIndex The stream index. */ - public StreamKey(int periodIndex, int groupIndex, int trackIndex) { + @SuppressWarnings("deprecation") + public StreamKey(int periodIndex, int groupIndex, int streamIndex) { this.periodIndex = periodIndex; this.groupIndex = groupIndex; - this.trackIndex = trackIndex; + this.streamIndex = streamIndex; + trackIndex = streamIndex; } + @SuppressWarnings("deprecation") /* package */ StreamKey(Parcel in) { periodIndex = in.readInt(); groupIndex = in.readInt(); - trackIndex = in.readInt(); + streamIndex = in.readInt(); + trackIndex = streamIndex; } @Override public String toString() { - return periodIndex + "." + groupIndex + "." + trackIndex; + return periodIndex + "." + groupIndex + "." + streamIndex; } @Override @@ -77,14 +95,14 @@ public final class StreamKey implements Comparable, Parcelable { StreamKey that = (StreamKey) o; return periodIndex == that.periodIndex && groupIndex == that.groupIndex - && trackIndex == that.trackIndex; + && streamIndex == that.streamIndex; } @Override public int hashCode() { int result = periodIndex; result = 31 * result + groupIndex; - result = 31 * result + trackIndex; + result = 31 * result + streamIndex; return result; } @@ -96,7 +114,7 @@ public final class StreamKey implements Comparable, Parcelable { if (result == 0) { result = groupIndex - o.groupIndex; if (result == 0) { - result = trackIndex - o.trackIndex; + result = streamIndex - o.streamIndex; } } return result; @@ -113,7 +131,7 @@ public final class StreamKey implements Comparable, Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(periodIndex); dest.writeInt(groupIndex); - dest.writeInt(trackIndex); + dest.writeInt(streamIndex); } public static final Parcelable.Creator CREATOR = diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java index 3388424e6e..df987c3776 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java @@ -415,7 +415,7 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex { .append('.') .append(streamKey.groupIndex) .append('.') - .append(streamKey.trackIndex) + .append(streamKey.streamIndex) .append(','); } if (stringBuilder.length() > 0) { diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java index 06699afa7a..c0d8a36e9d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java @@ -189,7 +189,7 @@ public class DashManifest implements FilterableManifest { List representations = adaptationSet.representations; ArrayList copyRepresentations = new ArrayList<>(); do { - Representation representation = representations.get(key.trackIndex); + Representation representation = representations.get(key.streamIndex); copyRepresentations.add(representation); key = keys.poll(); } while (key.periodIndex == periodIndex && key.groupIndex == adaptationSetIndex); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java index 2db9425a84..57f4100515 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java @@ -308,7 +308,7 @@ public final class HlsMasterPlaylist extends HlsPlaylist { T stream = streams.get(i); for (int j = 0; j < streamKeys.size(); j++) { StreamKey streamKey = streamKeys.get(j); - if (streamKey.groupIndex == groupIndex && streamKey.trackIndex == i) { + if (streamKey.groupIndex == groupIndex && streamKey.streamIndex == i) { copiedStreams.add(stream); break; } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java index af2b45e612..efac82d4c1 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java @@ -339,7 +339,7 @@ public class SsManifest implements FilterableManifest { copiedFormats.clear(); } currentStreamElement = streamElement; - copiedFormats.add(streamElement.formats[key.trackIndex]); + copiedFormats.add(streamElement.formats[key.streamIndex]); } if (currentStreamElement != null) { // Add the last stream element. From c403de1c19657eef1270ff895247980849f5f0dc Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 8 Sep 2021 12:41:08 +0100 Subject: [PATCH 135/441] Fix AudioSink reset javadoc. PiperOrigin-RevId: 395444714 --- .../java/com/google/android/exoplayer2/audio/AudioSink.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java index 8f38dacf5d..76e41399fd 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java @@ -446,6 +446,6 @@ public interface AudioSink { */ void experimentalFlushWithoutAudioTrackRelease(); - /** Resets the renderer, releasing any resources that it currently holds. */ + /** Resets the sink, releasing any resources that it currently holds. */ void reset(); } From e6b5392e6316160b1b1726b8b9a195af4f06cbb7 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 8 Sep 2021 13:47:20 +0100 Subject: [PATCH 136/441] Handle malformed URL in RTP-Info header. Some server will send partial URIs in the RTP-Info header, while the RTSP spec requires absolute URLs. Issue: #9346 #exofixit PiperOrigin-RevId: 395452741 --- RELEASENOTES.md | 2 + .../exoplayer2/source/rtsp/RtspClient.java | 2 +- .../source/rtsp/RtspTrackTiming.java | 54 +++++++++++- .../source/rtsp/RtspTrackTimingTest.java | 85 ++++++++++++++++--- 4 files changed, 127 insertions(+), 16 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f97db1cef6..16fe885297 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -78,6 +78,8 @@ * RTSP: * Handle when additional spaces are in SDP's RTPMAP atrribute ([#9379](https://github.com/google/ExoPlayer/issues/9379)). + * Handle partial URIs in RTP-Info headers + ([#9346](https://github.com/google/ExoPlayer/issues/9346)). * Extractors: * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings ([#9087](https://github.com/google/ExoPlayer/issues/9087)). diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java index 882a090435..a800336531 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java @@ -545,7 +545,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ImmutableList trackTimingList = rtpInfoString == null ? ImmutableList.of() - : RtspTrackTiming.parseTrackTiming(rtpInfoString); + : RtspTrackTiming.parseTrackTiming(rtpInfoString, uri); onPlayResponseReceived(new RtspPlayResponse(response.status, timing, trackTimingList)); break; diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTiming.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTiming.java index 3e6d34038e..cf0fd5f691 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTiming.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTiming.java @@ -15,10 +15,15 @@ */ package com.google.android.exoplayer2.source.rtsp; +import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.net.Uri; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.util.UriUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; @@ -49,11 +54,12 @@ import com.google.common.collect.ImmutableList; * * * @param rtpInfoString The value of the RTP-Info header, with header name (RTP-Info) removed. + * @param sessionUri The session URI, must include an {@code rtsp} scheme. * @return A list of parsed {@link RtspTrackTiming}. * @throws ParserException If parsing failed. */ - public static ImmutableList parseTrackTiming(String rtpInfoString) - throws ParserException { + public static ImmutableList parseTrackTiming( + String rtpInfoString, Uri sessionUri) throws ParserException { ImmutableList.Builder listBuilder = new ImmutableList.Builder<>(); for (String perTrackTimingString : Util.split(rtpInfoString, ",")) { @@ -69,7 +75,7 @@ import com.google.common.collect.ImmutableList; switch (attributeName) { case "url": - uri = Uri.parse(attributeValue); + uri = resolveUri(/* urlString= */ attributeValue, sessionUri); break; case "seq": sequenceNumber = Integer.parseInt(attributeValue); @@ -96,6 +102,48 @@ import com.google.common.collect.ImmutableList; return listBuilder.build(); } + /** + * Resolves the input string to always be an absolute URL with RTP-Info headers + * + *

    Handles some servers do not send absolute URL in RTP-Info headers. This method takes in + * RTP-Info header's url string, and returns the correctly formatted {@link Uri url} for this + * track. The input url string could be + * + *

      + *
    • A correctly formatted URL, like "{@code rtsp://foo.bar/video}". + *
    • A correct URI that is missing the scheme, like "{@code foo.bar/video}". + *
    • A path to the resource, like "{@code video}" or "{@code /video}". + *
    + * + * @param urlString The URL included in the RTP-Info header, without the {@code url=} identifier. + * @param sessionUri The session URI, must include an {@code rtsp} scheme, or {@link + * IllegalArgumentException} is thrown. + * @return The formatted URL. + */ + @VisibleForTesting + /* package */ static Uri resolveUri(String urlString, Uri sessionUri) { + checkArgument(checkNotNull(sessionUri.getScheme()).equals("rtsp")); + + Uri uri = Uri.parse(urlString); + if (uri.isAbsolute()) { + return uri; + } + + // The urlString is at least missing the scheme. + uri = Uri.parse("rtsp://" + urlString); + String sessionUriString = sessionUri.toString(); + + String host = checkNotNull(uri.getHost()); + if (host.equals(sessionUri.getHost())) { + // Handles the case that the urlString is only missing the scheme. + return uri; + } + + return sessionUriString.endsWith("/") + ? UriUtil.resolveToUri(sessionUriString, urlString) + : UriUtil.resolveToUri(sessionUriString + "/", urlString); + } + /** * The timestamp of the next RTP packet, {@link C#TIME_UNSET} if not present. * diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTimingTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTimingTest.java index 1269811301..5f50929fba 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTimingTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspTrackTimingTest.java @@ -35,7 +35,7 @@ public class RtspTrackTimingTest { "url=rtsp://video.example.com/twister/video;seq=12312232;rtptime=78712811"; ImmutableList trackTimingList = - RtspTrackTiming.parseTrackTiming(rtpInfoString); + RtspTrackTiming.parseTrackTiming(rtpInfoString, Uri.parse("rtsp://video.example.com")); assertThat(trackTimingList).hasSize(1); RtspTrackTiming trackTiming = trackTimingList.get(0); @@ -50,7 +50,7 @@ public class RtspTrackTimingTest { "url=rtsp://foo.com/bar.avi/streamid=0;seq=45102,url=rtsp://foo.com/bar.avi/streamid=1;seq=30211"; ImmutableList trackTimingList = - RtspTrackTiming.parseTrackTiming(rtpInfoString); + RtspTrackTiming.parseTrackTiming(rtpInfoString, Uri.parse("rtsp://foo.com")); assertThat(trackTimingList).hasSize(2); RtspTrackTiming trackTiming = trackTimingList.get(0); @@ -67,27 +67,88 @@ public class RtspTrackTimingTest { public void parseTiming_withInvalidParameter_throws() { String rtpInfoString = "url=rtsp://video.example.com/twister/video;seq=123abc"; - assertThrows(ParserException.class, () -> RtspTrackTiming.parseTrackTiming(rtpInfoString)); - } - - @Test - public void parseTiming_withInvalidUrl_throws() { - String rtpInfoString = "url=video.example.com/twister/video;seq=36192348"; - - assertThrows(ParserException.class, () -> RtspTrackTiming.parseTrackTiming(rtpInfoString)); + assertThrows( + ParserException.class, + () -> + RtspTrackTiming.parseTrackTiming( + rtpInfoString, Uri.parse("rtsp://video.example.com/twister"))); } @Test public void parseTiming_withNoParameter_throws() { String rtpInfoString = "url=rtsp://video.example.com/twister/video"; - assertThrows(ParserException.class, () -> RtspTrackTiming.parseTrackTiming(rtpInfoString)); + assertThrows( + ParserException.class, + () -> + RtspTrackTiming.parseTrackTiming( + rtpInfoString, Uri.parse("rtsp://video.example.com/twister"))); } @Test public void parseTiming_withNoUrl_throws() { String rtpInfoString = "seq=35421887"; - assertThrows(ParserException.class, () -> RtspTrackTiming.parseTrackTiming(rtpInfoString)); + assertThrows( + ParserException.class, + () -> + RtspTrackTiming.parseTrackTiming( + rtpInfoString, Uri.parse("rtsp://video.example.com/twister"))); + } + + @Test + public void resolveUri_withAbsoluteUri_succeeds() { + Uri uri = + RtspTrackTiming.resolveUri( + "rtsp://video.example.com/twister/video=1?a2bfc09887ce", + Uri.parse("rtsp://video.example.com/twister")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://video.example.com/twister/video=1?a2bfc09887ce")); + } + + @Test + public void resolveUri_withCompleteUriMissingScheme_succeeds() { + Uri uri = + RtspTrackTiming.resolveUri( + "video.example.com/twister/video=1", Uri.parse("rtsp://video.example.com/twister")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://video.example.com/twister/video=1")); + } + + @Test + public void resolveUri_withPartialUriMissingScheme_succeeds() { + Uri uri = RtspTrackTiming.resolveUri("video=1", Uri.parse("rtsp://video.example.com/twister")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://video.example.com/twister/video=1")); + } + + @Test + public void resolveUri_withMultipartPartialUriMissingScheme_succeeds() { + Uri uri = + RtspTrackTiming.resolveUri( + "container/video=1", Uri.parse("rtsp://video.example.com/twister")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://video.example.com/twister/container/video=1")); + } + + @Test + public void resolveUri_withPartialUriMissingSchemeWithIpBaseUri_succeeds() { + Uri uri = RtspTrackTiming.resolveUri("video=1", Uri.parse("rtsp://127.0.0.1:18888/test")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://127.0.0.1:18888/test/video=1")); + } + + @Test + public void resolveUri_withPartialUriMissingSchemeWithIpBaseUriWithSlash_succeeds() { + Uri uri = RtspTrackTiming.resolveUri("video=1", Uri.parse("rtsp://127.0.0.1:18888/test/")); + + assertThat(uri).isEqualTo(Uri.parse("rtsp://127.0.0.1:18888/test/video=1")); + } + + @Test + public void resolveUri_withSessionUriMissingScheme_throwsIllegalArgumentException() { + assertThrows( + IllegalArgumentException.class, + () -> RtspTrackTiming.resolveUri("video=1", Uri.parse("127.0.0.1:18888/test"))); } } From 87d2054b674a5a232e53a53c9ddfe2a66a084f38 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 8 Sep 2021 14:37:31 +0100 Subject: [PATCH 137/441] Update value of C.TRACK_TYPE_NONE to -2 to allow for future 'real' track types. PiperOrigin-RevId: 395460563 --- .../common/src/main/java/com/google/android/exoplayer2/C.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 975a0efd8f..d641c9c8a1 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -672,6 +672,8 @@ public final class C { TRACK_TYPE_NONE, }) public @interface TrackType {} + /** A type constant for a fake or empty track. */ + public static final int TRACK_TYPE_NONE = -2; /** A type constant for tracks of unknown type. */ public static final int TRACK_TYPE_UNKNOWN = -1; /** A type constant for tracks of some default type, where the type itself is unknown. */ @@ -688,8 +690,6 @@ public final class C { public static final int TRACK_TYPE_METADATA = 5; /** A type constant for camera motion tracks. */ public static final int TRACK_TYPE_CAMERA_MOTION = 6; - /** A type constant for a fake or empty track. */ - public static final int TRACK_TYPE_NONE = 7; /** * Applications or extensions may define custom {@code TRACK_TYPE_*} constants greater than or * equal to this value. From 837667dea12ba9aaf5dea9ded6820af04898c525 Mon Sep 17 00:00:00 2001 From: apodob Date: Wed, 8 Sep 2021 16:20:58 +0100 Subject: [PATCH 138/441] Add seeking support to the SubtitleExtractor SubtitleExtractor is using IndexSeekMap with only one position to indicate that its output is seekable. SubtitleExtractor is keeping Cues in memory anyway so more seek points are not needed. SubtitleExtractor gets notified about seek occurrence through seek() method. Inside that method extractor saves seekTimeUs, and on the next call to read() extractor outputs all cues that should be displayed at this time and later. PiperOrigin-RevId: 395477127 --- .../extractor/subtitle/SubtitleExtractor.java | 97 ++++++++++++--- .../subtitle/SubtitleExtractorTest.java | 115 ++++++++++++++++-- 2 files changed, 182 insertions(+), 30 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java index 24d991ba45..a9890e20ba 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java @@ -26,8 +26,8 @@ import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; +import com.google.android.exoplayer2.extractor.IndexSeekMap; import com.google.android.exoplayer2.extractor.PositionHolder; -import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.CueEncoder; @@ -37,30 +37,41 @@ import com.google.android.exoplayer2.text.SubtitleInputBuffer; import com.google.android.exoplayer2.text.SubtitleOutputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; +import com.google.android.exoplayer2.util.Util; import com.google.common.primitives.Ints; import java.io.IOException; import java.io.InterruptedIOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.List; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Generic extractor for extracting subtitles from various subtitle formats. */ public class SubtitleExtractor implements Extractor { @Retention(RetentionPolicy.SOURCE) - @IntDef({STATE_CREATED, STATE_INITIALIZED, STATE_EXTRACTING, STATE_FINISHED, STATE_RELEASED}) + @IntDef({ + STATE_CREATED, + STATE_INITIALIZED, + STATE_EXTRACTING, + STATE_SEEKING, + STATE_FINISHED, + STATE_RELEASED + }) private @interface State {} /** The extractor has been created. */ private static final int STATE_CREATED = 0; /** The extractor has been initialized. */ private static final int STATE_INITIALIZED = 1; - /** The extractor is reading from input and writing to output. */ + /** The extractor is reading from the input and writing to the output. */ private static final int STATE_EXTRACTING = 2; - /** The extractor has finished. */ - private static final int STATE_FINISHED = 3; + /** The extractor has received a seek() operation after it has already finished extracting. */ + private static final int STATE_SEEKING = 3; + /** The extractor has finished extracting the input. */ + private static final int STATE_FINISHED = 4; /** The extractor has been released. */ - private static final int STATE_RELEASED = 4; + private static final int STATE_RELEASED = 5; private static final int DEFAULT_BUFFER_SIZE = 1024; @@ -68,11 +79,14 @@ public class SubtitleExtractor implements Extractor { private final CueEncoder cueEncoder; private final ParsableByteArray subtitleData; private final Format format; + private final List timestamps; + private final List samples; private @MonotonicNonNull ExtractorOutput extractorOutput; private @MonotonicNonNull TrackOutput trackOutput; private int bytesRead; @State private int state; + private long seekTimeUs; /** * @param subtitleDecoder The decoder used for decoding the subtitle data. The extractor will @@ -89,7 +103,10 @@ public class SubtitleExtractor implements Extractor { .setSampleMimeType(MimeTypes.TEXT_EXOPLAYER_CUES) .setCodecs(format.sampleMimeType) .build(); + timestamps = new ArrayList<>(); + samples = new ArrayList<>(); state = STATE_CREATED; + seekTimeUs = C.TIME_UNSET; } @Override @@ -106,7 +123,11 @@ public class SubtitleExtractor implements Extractor { extractorOutput = output; trackOutput = extractorOutput.track(/* id= */ 0, C.TRACK_TYPE_TEXT); extractorOutput.endTracks(); - extractorOutput.seekMap(new SeekMap.Unseekable(C.TIME_UNSET)); + extractorOutput.seekMap( + new IndexSeekMap( + /* positions= */ new long[] {0}, + /* timesUs= */ new long[] {0}, + /* durationUs= */ C.TIME_UNSET)); trackOutput.format(format); state = STATE_INITIALIZED; } @@ -125,7 +146,15 @@ public class SubtitleExtractor implements Extractor { if (state == STATE_EXTRACTING) { boolean inputFinished = readFromInput(input); if (inputFinished) { - decodeAndWriteToOutput(); + decode(); + writeToOutput(); + state = STATE_FINISHED; + } + } + if (state == STATE_SEEKING) { + boolean inputFinished = skipInput(input); + if (inputFinished) { + writeToOutput(); state = STATE_FINISHED; } } @@ -138,6 +167,13 @@ public class SubtitleExtractor implements Extractor { @Override public void seek(long position, long timeUs) { checkState(state != STATE_CREATED && state != STATE_RELEASED); + seekTimeUs = timeUs; + if (state == STATE_EXTRACTING) { + state = STATE_INITIALIZED; + } + if (state == STATE_FINISHED) { + state = STATE_SEEKING; + } } /** Releases the extractor's resources, including the {@link SubtitleDecoder}. */ @@ -150,6 +186,15 @@ public class SubtitleExtractor implements Extractor { state = STATE_RELEASED; } + /** Returns whether the input has been fully skipped. */ + private boolean skipInput(ExtractorInput input) throws IOException { + return input.skip( + input.getLength() != C.LENGTH_UNSET + ? Ints.checkedCast(input.getLength()) + : DEFAULT_BUFFER_SIZE) + == C.RESULT_END_OF_INPUT; + } + /** Returns whether reading has been finished. */ private boolean readFromInput(ExtractorInput input) throws IOException { if (subtitleData.capacity() == bytesRead) { @@ -163,9 +208,8 @@ public class SubtitleExtractor implements Extractor { return readResult == C.RESULT_END_OF_INPUT; } - /** Decodes subtitle data and writes samples to the output. */ - private void decodeAndWriteToOutput() throws IOException { - checkStateNotNull(this.trackOutput); + /** Decodes the subtitle data and stores the samples in the memory of the extractor. */ + private void decode() throws IOException { try { @Nullable SubtitleInputBuffer inputBuffer = subtitleDecoder.dequeueInputBuffer(); while (inputBuffer == null) { @@ -183,13 +227,8 @@ public class SubtitleExtractor implements Extractor { for (int i = 0; i < outputBuffer.getEventTimeCount(); i++) { List cues = outputBuffer.getCues(outputBuffer.getEventTime(i)); byte[] cuesSample = cueEncoder.encode(cues); - trackOutput.sampleData(new ParsableByteArray(cuesSample), cuesSample.length); - trackOutput.sampleMetadata( - /* timeUs= */ outputBuffer.getEventTime(i), - /* flags= */ C.BUFFER_FLAG_KEY_FRAME, - /* size= */ cuesSample.length, - /* offset= */ 0, - /* cryptoData= */ null); + timestamps.add(outputBuffer.getEventTime(i)); + samples.add(new ParsableByteArray(cuesSample)); } outputBuffer.release(); } catch (InterruptedException e) { @@ -199,4 +238,26 @@ public class SubtitleExtractor implements Extractor { throw ParserException.createForMalformedContainer("SubtitleDecoder failed.", e); } } + + private void writeToOutput() { + checkStateNotNull(this.trackOutput); + checkState(timestamps.size() == samples.size()); + int index = + seekTimeUs == C.TIME_UNSET + ? 0 + : Util.binarySearchFloor( + timestamps, seekTimeUs, /* inclusive= */ true, /* stayInBounds= */ true); + for (int i = index; i < samples.size(); i++) { + ParsableByteArray sample = samples.get(i); + sample.setPosition(0); + int size = sample.getData().length; + trackOutput.sampleData(sample, size); + trackOutput.sampleMetadata( + /* timeUs= */ timestamps.get(i), + /* flags= */ C.BUFFER_FLAG_KEY_FRAME, + /* size= */ size, + /* offset= */ 0, + /* cryptoData= */ null); + } + } } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java index 9366d3db43..52c013deab 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java @@ -36,24 +36,25 @@ import org.junit.runner.RunWith; /** Tests for {@link SubtitleExtractor}. */ @RunWith(AndroidJUnit4.class) public class SubtitleExtractorTest { + private static final String TEST_DATA = + "WEBVTT\n" + + "\n" + + "00:00.000 --> 00:01.234\n" + + "This is the first subtitle.\n" + + "\n" + + "00:02.345 --> 00:03.456\n" + + "This is the second subtitle.\n" + + "\n" + + "00:02.600 --> 00:04.567\n" + + "This is the third subtitle."; + @Test public void extractor_outputsCues() throws Exception { - String testData = - "WEBVTT\n" - + "\n" - + "00:00.000 --> 00:01.234\n" - + "This is the first subtitle.\n" - + "\n" - + "00:02.345 --> 00:03.456\n" - + "This is the second subtitle.\n" - + "\n" - + "00:02.600 --> 00:04.567\n" - + "This is the third subtitle."; CueDecoder decoder = new CueDecoder(); FakeExtractorOutput output = new FakeExtractorOutput(); FakeExtractorInput input = new FakeExtractorInput.Builder() - .setData(Util.getUtf8Bytes(testData)) + .setData(Util.getUtf8Bytes(TEST_DATA)) .setSimulatePartialReads(true) .build(); SubtitleExtractor extractor = @@ -95,6 +96,96 @@ public class SubtitleExtractorTest { assertThat(cues5).isEmpty(); } + @Test + public void extractor_seekAfterExtracting_outputsCues() throws Exception { + CueDecoder decoder = new CueDecoder(); + FakeExtractorOutput output = new FakeExtractorOutput(); + FakeExtractorInput input = + new FakeExtractorInput.Builder() + .setData(Util.getUtf8Bytes(TEST_DATA)) + .setSimulatePartialReads(true) + .build(); + SubtitleExtractor extractor = + new SubtitleExtractor( + new WebvttDecoder(), + new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).build()); + extractor.init(output); + FakeTrackOutput trackOutput = output.trackOutputs.get(0); + + while (extractor.read(input, null) != Extractor.RESULT_END_OF_INPUT) {} + extractor.seek((int) output.seekMap.getSeekPoints(2_445_000L).first.position, 2_445_000L); + input.setPosition((int) output.seekMap.getSeekPoints(2_445_000L).first.position); + trackOutput.clear(); + while (extractor.read(input, null) != Extractor.RESULT_END_OF_INPUT) {} + + assertThat(trackOutput.lastFormat.sampleMimeType).isEqualTo(MimeTypes.TEXT_EXOPLAYER_CUES); + assertThat(trackOutput.lastFormat.codecs).isEqualTo(MimeTypes.TEXT_VTT); + assertThat(trackOutput.getSampleCount()).isEqualTo(4); + // Check sample timestamps. + assertThat(trackOutput.getSampleTimeUs(0)).isEqualTo(2_345_000L); + assertThat(trackOutput.getSampleTimeUs(1)).isEqualTo(2_600_000L); + assertThat(trackOutput.getSampleTimeUs(2)).isEqualTo(3_456_000L); + assertThat(trackOutput.getSampleTimeUs(3)).isEqualTo(4_567_000L); + // Check sample content. + List cues0 = decoder.decode(trackOutput.getSampleData(0)); + assertThat(cues0).hasSize(1); + assertThat(cues0.get(0).text.toString()).isEqualTo("This is the second subtitle."); + List cues1 = decoder.decode(trackOutput.getSampleData(1)); + assertThat(cues1).hasSize(2); + assertThat(cues1.get(0).text.toString()).isEqualTo("This is the second subtitle."); + assertThat(cues1.get(1).text.toString()).isEqualTo("This is the third subtitle."); + List cues2 = decoder.decode(trackOutput.getSampleData(2)); + assertThat(cues2).hasSize(1); + assertThat(cues2.get(0).text.toString()).isEqualTo("This is the third subtitle."); + List cues3 = decoder.decode(trackOutput.getSampleData(3)); + assertThat(cues3).isEmpty(); + } + + @Test + public void extractor_seekBetweenReads_outputsCues() throws Exception { + CueDecoder decoder = new CueDecoder(); + FakeExtractorOutput output = new FakeExtractorOutput(); + FakeExtractorInput input = + new FakeExtractorInput.Builder() + .setData(Util.getUtf8Bytes(TEST_DATA)) + .setSimulatePartialReads(true) + .build(); + SubtitleExtractor extractor = + new SubtitleExtractor( + new WebvttDecoder(), + new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).build()); + extractor.init(output); + FakeTrackOutput trackOutput = output.trackOutputs.get(0); + + assertThat(extractor.read(input, null)).isNotEqualTo(Extractor.RESULT_END_OF_INPUT); + extractor.seek((int) output.seekMap.getSeekPoints(2_345_000L).first.position, 2_345_000L); + input.setPosition((int) output.seekMap.getSeekPoints(2_345_000L).first.position); + trackOutput.clear(); + while (extractor.read(input, null) != Extractor.RESULT_END_OF_INPUT) {} + + assertThat(trackOutput.lastFormat.sampleMimeType).isEqualTo(MimeTypes.TEXT_EXOPLAYER_CUES); + assertThat(trackOutput.lastFormat.codecs).isEqualTo(MimeTypes.TEXT_VTT); + assertThat(trackOutput.getSampleCount()).isEqualTo(4); + // Check sample timestamps. + assertThat(trackOutput.getSampleTimeUs(0)).isEqualTo(2_345_000L); + assertThat(trackOutput.getSampleTimeUs(1)).isEqualTo(2_600_000L); + assertThat(trackOutput.getSampleTimeUs(2)).isEqualTo(3_456_000L); + assertThat(trackOutput.getSampleTimeUs(3)).isEqualTo(4_567_000L); + // Check sample content. + List cues0 = decoder.decode(trackOutput.getSampleData(0)); + assertThat(cues0).hasSize(1); + assertThat(cues0.get(0).text.toString()).isEqualTo("This is the second subtitle."); + List cues1 = decoder.decode(trackOutput.getSampleData(1)); + assertThat(cues1).hasSize(2); + assertThat(cues1.get(0).text.toString()).isEqualTo("This is the second subtitle."); + assertThat(cues1.get(1).text.toString()).isEqualTo("This is the third subtitle."); + List cues2 = decoder.decode(trackOutput.getSampleData(2)); + assertThat(cues2).hasSize(1); + assertThat(cues2.get(0).text.toString()).isEqualTo("This is the third subtitle."); + List cues3 = decoder.decode(trackOutput.getSampleData(3)); + assertThat(cues3).isEmpty(); + } + @Test public void read_withoutInit_fails() { FakeExtractorInput input = new FakeExtractorInput.Builder().setData(new byte[0]).build(); From bd38c28bb87a286d8e7befa1cd9841032a711416 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 8 Sep 2021 16:26:38 +0100 Subject: [PATCH 139/441] Fix a bug in core_settings.gradle with relative paths I think this has been broken since https://github.com/google/ExoPlayer/commit/617267bfcf20c500fb4a3cfdff7104e4d88261a7 (which was trying to fix the same problem). This change initializes `rootDir` to always be the current project (i.e. ExoPlayer) directory. From the [Gradle docs](https://docs.gradle.org/current/userguide/working_with_files.html#sec:single_file_paths): > What happens in the case of multi-project builds? The file() method > will always turn relative paths into paths that are relative to the > current project directory, which may be a child project. We can also then remove exoplayerRoot completely and simplify the local dependency instructions. * #minor-release * #exofixit * Issue: #9403 PiperOrigin-RevId: 395478121 --- README.md | 3 +-- RELEASENOTES.md | 3 +++ core_settings.gradle | 2 +- settings.gradle | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d3c8c5e44c..3933f0bc18 100644 --- a/README.md +++ b/README.md @@ -115,9 +115,8 @@ Next, add the following to your project's `settings.gradle` file, replacing `path/to/exoplayer` with the path to your local copy: ```gradle -gradle.ext.exoplayerRoot = 'path/to/exoplayer' gradle.ext.exoplayerModulePrefix = 'exoplayer-' -apply from: file("$gradle.ext.exoplayerRoot/core_settings.gradle") +apply from: file("path/to/exoplayer/core_settings.gradle") ``` You should now see the ExoPlayer modules appear as part of your project. You can diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 16fe885297..d700482627 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -17,6 +17,9 @@ * Fix `NullPointerException` being thrown from `CacheDataSource` when reading a fully cached resource with `DataSpec.position` equal to the resource length. + * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with + a relative path + ([#9403](https://github.com/google/ExoPlayer/issues/9403)). * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). diff --git a/core_settings.gradle b/core_settings.gradle index 7fc3a4c3e2..06a4327aa7 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -def rootDir = file(gradle.ext.exoplayerRoot) +def rootDir = file(".") if (!gradle.ext.has('exoplayerSettingsDir')) { gradle.ext.exoplayerSettingsDir = rootDir.getCanonicalPath() } diff --git a/settings.gradle b/settings.gradle index ee651f1908..c73ad7a1e0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -gradle.ext.exoplayerRoot = rootDir gradle.ext.exoplayerModulePrefix = '' def modulePrefix = ':' From b6e0ade9395c8d7ca0e6d83a2608c7bd67ff9550 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 8 Sep 2021 16:33:29 +0100 Subject: [PATCH 140/441] Rename transformer renderer methods to make them match #exofixit PiperOrigin-RevId: 395479329 --- .../transformer/TransformerAudioRenderer.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 6504151db5..6b1d0f3b90 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -118,15 +118,15 @@ import java.nio.ByteBuffer; if (ensureDecoderConfigured()) { if (ensureEncoderAndAudioProcessingConfigured()) { - while (drainEncoderToFeedMuxer()) {} + while (feedMuxerFromEncoder()) {} if (sonicAudioProcessor.isActive()) { - while (drainSonicToFeedEncoder()) {} - while (drainDecoderToFeedSonic()) {} + while (feedEncoderFromSonic()) {} + while (feedSonicFromDecoder()) {} } else { - while (drainDecoderToFeedEncoder()) {} + while (feedEncoderFromDecoder()) {} } } - while (feedDecoderInputFromSource()) {} + while (feedDecoderFromInput()) {} } } @@ -134,7 +134,7 @@ import java.nio.ByteBuffer; * Attempts to write encoder output data to the muxer, and returns whether it may be possible to * write more data immediately by calling this method again. */ - private boolean drainEncoderToFeedMuxer() { + private boolean feedMuxerFromEncoder() { MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); if (!hasEncoderOutputFormat) { @Nullable Format encoderOutputFormat = encoder.getOutputFormat(); @@ -170,7 +170,7 @@ import java.nio.ByteBuffer; * Attempts to pass decoder output data to the encoder, and returns whether it may be possible to * pass more data immediately by calling this method again. */ - private boolean drainDecoderToFeedEncoder() { + private boolean feedEncoderFromDecoder() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { @@ -201,7 +201,7 @@ import java.nio.ByteBuffer; * Attempts to pass audio processor output data to the encoder, and returns whether it may be * possible to pass more data immediately by calling this method again. */ - private boolean drainSonicToFeedEncoder() { + private boolean feedEncoderFromSonic() { MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { return false; @@ -225,7 +225,7 @@ import java.nio.ByteBuffer; * Attempts to process decoder output data, and returns whether it may be possible to process more * data immediately by calling this method again. */ - private boolean drainDecoderToFeedSonic() { + private boolean feedSonicFromDecoder() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); if (drainingSonicForSpeedChange) { @@ -268,7 +268,7 @@ import java.nio.ByteBuffer; * Attempts to pass input data to the decoder, and returns whether it may be possible to pass more * data immediately by calling this method again. */ - private boolean feedDecoderInputFromSource() { + private boolean feedDecoderFromInput() { MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); if (!decoder.maybeDequeueInputBuffer(decoderInputBuffer)) { return false; From ee8df7afcb7982519b9375b590f8bdb086f0b08c Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 8 Sep 2021 17:29:05 +0100 Subject: [PATCH 141/441] Ensure MediaSourceFactory instances can be re-used This fixes DefaultDrmSessionManager so it can be used by a new Player instance (by nulling out its reference to the playback thread, which is unique per-Player instance). This only works if the DefaultDrmSessionManager is 'fully released' before being used by the second Player instance, meaning that the reference count of the manager and all its sessions is zero. #exofixit #minor-release Issue: #9099 PiperOrigin-RevId: 395490506 --- RELEASENOTES.md | 4 + ...MediaSourceFactoryInstrumentationTest.java | 99 +++++++++++++++++++ .../drm/DefaultDrmSessionManager.java | 20 ++-- .../exoplayer2/source/MediaSourceFactory.java | 9 +- 4 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d700482627..bbf9a87e30 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -20,6 +20,10 @@ * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with a relative path ([#9403](https://github.com/google/ExoPlayer/issues/9403)). + * Fix bug in `DefaultDrmSessionManager` which prevented + `MediaSourceFactory` instances from being re-used by `ExoPlayer` + instances with non-overlapping lifecycles + ([#9099](https://github.com/google/ExoPlayer/issues/9099)). * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java new file mode 100644 index 0000000000..921fd0f027 --- /dev/null +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.source; + +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.util.ConditionVariable; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Instrumentation tests for {@link DefaultMediaSourceFactory}. */ +@RunWith(AndroidJUnit4.class) +public final class DefaultMediaSourceFactoryInstrumentationTest { + + // https://github.com/google/ExoPlayer/issues/9099 + @Test + public void reuseMediaSourceFactoryBetweenPlayerInstances() throws Exception { + MediaItem mediaItem = + new MediaItem.Builder() + .setUri("asset:///media/mp4/sample.mp4") + .setDrmUuid(C.WIDEVINE_UUID) + .setDrmSessionForClearPeriods(true) + .build(); + AtomicReference player = new AtomicReference<>(); + DefaultMediaSourceFactory defaultMediaSourceFactory = + new DefaultMediaSourceFactory(getInstrumentation().getContext()); + getInstrumentation() + .runOnMainSync( + () -> + player.set( + new ExoPlayer.Builder(getInstrumentation().getContext()) + .setMediaSourceFactory(defaultMediaSourceFactory) + .build())); + playUntilEndAndRelease(player.get(), mediaItem); + getInstrumentation() + .runOnMainSync( + () -> + player.set( + new ExoPlayer.Builder(getInstrumentation().getContext()) + .setMediaSourceFactory(defaultMediaSourceFactory) + .build())); + playUntilEndAndRelease(player.get(), mediaItem); + } + + private void playUntilEndAndRelease(Player player, MediaItem mediaItem) + throws InterruptedException { + ConditionVariable playbackComplete = new ConditionVariable(); + AtomicReference playbackException = new AtomicReference<>(); + getInstrumentation() + .runOnMainSync( + () -> { + player.addListener( + new Player.Listener() { + @Override + public void onPlaybackStateChanged(@Player.State int playbackState) { + if (playbackState == Player.STATE_ENDED) { + playbackComplete.open(); + } + } + + @Override + public void onPlayerError(PlaybackException error) { + playbackException.set(error); + playbackComplete.open(); + } + }); + player.setMediaItem(mediaItem); + player.prepare(); + player.play(); + }); + + playbackComplete.block(); + getInstrumentation().runOnMainSync(player::release); + getInstrumentation().waitForIdleSync(); + assertThat(playbackException.get()).isNull(); + } +} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index 1ea5fed05e..ac02fb1aed 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -53,7 +53,6 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** * A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. @@ -298,8 +297,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Nullable private ExoMediaDrm exoMediaDrm; @Nullable private DefaultDrmSession placeholderDrmSession; @Nullable private DefaultDrmSession noMultiSessionDrmSession; - private @MonotonicNonNull Looper playbackLooper; - private @MonotonicNonNull Handler playbackHandler; + @Nullable private Looper playbackLooper; + @Nullable private Handler playbackHandler; private int mode; @Nullable private byte[] offlineLicenseKeySetId; @@ -484,7 +483,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { } releaseAllPreacquiredSessions(); - maybeReleaseMediaDrm(); + maybeFullyReleaseManager(); } @Override @@ -663,6 +662,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { this.playbackLooper = playbackLooper; this.playbackHandler = new Handler(playbackLooper); } else { + // Check this manager is only being used by a single player at a time. checkState(this.playbackLooper == playbackLooper); checkNotNull(playbackHandler); } @@ -779,12 +779,18 @@ public class DefaultDrmSessionManager implements DrmSessionManager { return session; } - private void maybeReleaseMediaDrm() { + private void maybeFullyReleaseManager() { if (exoMediaDrm != null && prepareCallsCount == 0 && sessions.isEmpty() && preacquiredSessionReferences.isEmpty()) { - // This manager and all its sessions are fully released so we can release exoMediaDrm. + // This manager and all its sessions are fully released so we can null out the looper & + // handler references and release exoMediaDrm. + if (playbackLooper != null) { + checkNotNull(playbackHandler).removeCallbacksAndMessages(/* token= */ null); + playbackHandler = null; + playbackLooper = null; + } checkNotNull(exoMediaDrm).release(); exoMediaDrm = null; } @@ -935,7 +941,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { keepaliveSessions.remove(session); } } - maybeReleaseMediaDrm(); + maybeFullyReleaseManager(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index 755096bbe9..cbdae8aa41 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -19,6 +19,7 @@ import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DefaultDrmSessionManagerProvider; import com.google.android.exoplayer2.drm.DrmSessionManager; @@ -31,7 +32,13 @@ import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import java.util.List; -/** Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. */ +/** + * Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. + * + *

    A factory must only be used by a single {@link Player} at a time. A factory can only be + * re-used by a second {@link Player} if the previous {@link Player} and all associated resources + * are fully released. + */ public interface MediaSourceFactory { /** @deprecated Use {@link MediaItem.PlaybackProperties#streamKeys} instead. */ From 0c969bb73ddc8a629bdcd5959c8ac8965ce7c37b Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 8 Sep 2021 19:25:01 +0100 Subject: [PATCH 142/441] Remove deprecated SingleSampleMediaSource.createMediaSource #exofixit PiperOrigin-RevId: 395518824 --- RELEASENOTES.md | 3 +++ .../exoplayer2/source/SingleSampleMediaSource.java | 14 -------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bbf9a87e30..705dec2e59 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -69,6 +69,9 @@ `VideoListener`. Use `Player.addListener` and `Player.Listener` instead. * Remove `DefaultHttpDataSourceFactory`. Use `DefaultHttpDataSource.Factory` instead. + * Remove `SingleSampleMediaSource.createMediaSource(Uri, Format, long)`. + Use `SingleSampleMediaSource.createMediaSource(MediaItem.Subtitle, + long)` instead. * Remove `GvrAudioProcessor` and the GVR extension, which has been deprecated since 2.11.0. * Cast extension: diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 45f33c39c9..c0d34d0ff3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -128,20 +128,6 @@ public final class SingleSampleMediaSource extends BaseMediaSource { treatLoadErrorsAsEndOfStream, tag); } - - /** @deprecated Use {@link #createMediaSource(MediaItem.Subtitle, long)} instead. */ - @Deprecated - public SingleSampleMediaSource createMediaSource(Uri uri, Format format, long durationUs) { - return new SingleSampleMediaSource( - format.id == null ? trackId : format.id, - new MediaItem.Subtitle( - uri, checkNotNull(format.sampleMimeType), format.language, format.selectionFlags), - dataSourceFactory, - durationUs, - loadErrorHandlingPolicy, - treatLoadErrorsAsEndOfStream, - tag); - } } private final DataSpec dataSpec; From 1bef1a2b38f2f4ae23d5aad7c8ddcebead59fca5 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 9 Sep 2021 10:13:23 +0100 Subject: [PATCH 143/441] Fix STATE_IDLE Javadoc Since playlist support was added, it's possible for the player to "have media" and be in STATE_IDLE. The STATE_IDLE documentation therefore became incorrect. Issue: #8946 #exofixit #minor-release PiperOrigin-RevId: 395653716 --- .../main/java/com/google/android/exoplayer2/Player.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 9a213d5ee7..b24d29db4c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -1064,11 +1064,12 @@ public interface Player { @Retention(RetentionPolicy.SOURCE) @IntDef({STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED}) @interface State {} - /** The player does not have any media to play. */ + /** The player is idle, and must be {@link #prepare() prepared} before it will play the media. */ int STATE_IDLE = 1; /** - * The player is not able to immediately play from its current position. This state typically - * occurs when more data needs to be loaded. + * The player is not able to immediately play the media, but is doing work toward being able to do + * so. This state typically occurs when the player needs to buffer more data before playback can + * start. */ int STATE_BUFFERING = 2; /** From 0c4bb23dd33cb4e2bc671a5d011fb9aa8715f5b6 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 9 Sep 2021 16:11:45 +0100 Subject: [PATCH 144/441] Rename `audioVolume` parameter to `volume` The new name is consistent with the corresponding parameters to `onVolumeChanged`, `setDeviceVolume` and `onDeviceVolumeChanged`. PiperOrigin-RevId: 395705288 --- .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../android/exoplayer2/ForwardingPlayer.java | 4 ++-- .../com/google/android/exoplayer2/Player.java | 4 ++-- .../android/exoplayer2/ExoPlayerImpl.java | 2 +- .../android/exoplayer2/SimpleExoPlayer.java | 20 +++++++++---------- .../exoplayer2/testutil/StubExoPlayer.java | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index c8d6a4ba99..3e6f7a7e8a 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -678,7 +678,7 @@ public final class CastPlayer extends BasePlayer { /** This method is not supported and does nothing. */ @Override - public void setVolume(float audioVolume) {} + public void setVolume(float volume) {} /** This method is not supported and returns 1. */ @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index b1a7ae0405..1f990befef 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -525,8 +525,8 @@ public class ForwardingPlayer implements Player { } @Override - public void setVolume(float audioVolume) { - player.setVolume(audioVolume); + public void setVolume(float volume) { + player.setVolume(volume); } @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index b24d29db4c..f1eb502d08 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -2210,9 +2210,9 @@ public interface Player { /** * Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). * - * @param audioVolume Linear output gain to apply to all audio channels. + * @param volume Linear output gain to apply to all audio channels. */ - void setVolume(@FloatRange(from = 0) float audioVolume); + void setVolume(@FloatRange(from = 0) float volume); /** * Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 8933b388e9..9ba5c42394 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -1010,7 +1010,7 @@ import java.util.concurrent.CopyOnWriteArraySet; /** This method is not supported and does nothing. */ @Override - public void setVolume(float audioVolume) {} + public void setVolume(float volume) {} /** This method is not supported and returns 1. */ @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 849cdc8433..2e2615cfca 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -452,7 +452,7 @@ public class SimpleExoPlayer extends BasePlayer @Nullable private DecoderCounters audioDecoderCounters; private int audioSessionId; private AudioAttributes audioAttributes; - private float audioVolume; + private float volume; private boolean skipSilenceEnabled; private List currentCues; @Nullable private VideoFrameMetadataListener videoFrameMetadataListener; @@ -517,7 +517,7 @@ public class SimpleExoPlayer extends BasePlayer componentListener); // Set initial values. - audioVolume = 1; + volume = 1; if (Util.SDK_INT < 21) { audioSessionId = initializeKeepSessionIdAudioTrack(C.AUDIO_SESSION_ID_UNSET); } else { @@ -870,24 +870,24 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public void setVolume(float audioVolume) { + public void setVolume(float volume) { verifyApplicationThread(); - audioVolume = Util.constrainValue(audioVolume, /* min= */ 0, /* max= */ 1); - if (this.audioVolume == audioVolume) { + volume = Util.constrainValue(volume, /* min= */ 0, /* max= */ 1); + if (this.volume == volume) { return; } - this.audioVolume = audioVolume; + this.volume = volume; sendVolumeToRenderers(); - analyticsCollector.onVolumeChanged(audioVolume); + analyticsCollector.onVolumeChanged(volume); // TODO(internal b/187152483): Events should be dispatched via ListenerSet for (Listener listener : listeners) { - listener.onVolumeChanged(audioVolume); + listener.onVolumeChanged(volume); } } @Override public float getVolume() { - return audioVolume; + return volume; } @Override @@ -1772,7 +1772,7 @@ public class SimpleExoPlayer extends BasePlayer } private void sendVolumeToRenderers() { - float scaledVolume = audioVolume * audioFocusManager.getVolumeMultiplier(); + float scaledVolume = volume * audioFocusManager.getVolumeMultiplier(); sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_VOLUME, scaledVolume); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 9e866a3d9a..fece3444e5 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -543,7 +543,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override - public void setVolume(float audioVolume) { + public void setVolume(float volume) { throw new UnsupportedOperationException(); } From 9e3ef8180f4d731dad4244eb89b45f3854650320 Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 9 Sep 2021 17:32:27 +0100 Subject: [PATCH 145/441] Select base URL on demand when a new chunk is created Instead of selecting the base URL initially or when a load error occurs, it is now selected when a chunk or initialization chunk is created. The selected base URL is then assigned to `RepresentationHolder.lastUsedBaseUrl` that is excluded in case of a load error. For a next chunk another base URL will be selected by using the `BaseUrlExclusionList`. #minor-release #exo-fixit PiperOrigin-RevId: 395721221 --- RELEASENOTES.md | 2 + .../source/dash/DefaultDashChunkSource.java | 50 +++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 705dec2e59..f679980992 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -51,6 +51,8 @@ * DASH * Use identical cache keys for downloading and playing DASH segments ([#9370](https://github.com/google/ExoPlayer/issues/9370)). + * Fix base URL selection and load error handling when base URLs are shared + across adaptation sets. * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index d878430747..bd0df333ad 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -338,6 +338,7 @@ public class DefaultDashChunkSource implements DashChunkSource { if (segmentNum < firstAvailableSegmentNum) { chunkIterators[i] = MediaChunkIterator.EMPTY; } else { + representationHolder = updateSelectedBaseUrl(/* trackIndex= */ i); chunkIterators[i] = new RepresentationSegmentIterator( representationHolder, segmentNum, lastAvailableSegmentNum, nowPeriodTimeUs); @@ -350,12 +351,11 @@ public class DefaultDashChunkSource implements DashChunkSource { playbackPositionUs, bufferedDurationUs, availableLiveDurationUs, queue, chunkIterators); RepresentationHolder representationHolder = - representationHolders[trackSelection.getSelectedIndex()]; - + updateSelectedBaseUrl(trackSelection.getSelectedIndex()); if (representationHolder.chunkExtractor != null) { Representation selectedRepresentation = representationHolder.representation; - RangedUri pendingInitializationUri = null; - RangedUri pendingIndexUri = null; + @Nullable RangedUri pendingInitializationUri = null; + @Nullable RangedUri pendingIndexUri = null; if (representationHolder.chunkExtractor.getSampleFormats() == null) { pendingInitializationUri = selectedRepresentation.getInitializationUri(); } @@ -495,18 +495,26 @@ public class DefaultDashChunkSource implements DashChunkSource { int trackIndex = trackSelection.indexOf(chunk.trackFormat); RepresentationHolder representationHolder = representationHolders[trackIndex]; + @Nullable + BaseUrl newBaseUrl = + baseUrlExclusionList.selectBaseUrl(representationHolder.representation.baseUrls); + if (newBaseUrl != null && !representationHolder.selectedBaseUrl.equals(newBaseUrl)) { + // The base URL has changed since the failing chunk was created. Request a replacement chunk, + // which will use the new base URL. + return true; + } + LoadErrorHandlingPolicy.FallbackOptions fallbackOptions = createFallbackOptions(trackSelection, representationHolder.representation.baseUrls); if (!fallbackOptions.isFallbackAvailable(LoadErrorHandlingPolicy.FALLBACK_TYPE_TRACK) && !fallbackOptions.isFallbackAvailable(LoadErrorHandlingPolicy.FALLBACK_TYPE_LOCATION)) { - // No more alternatives remaining. return false; } @Nullable LoadErrorHandlingPolicy.FallbackSelection fallbackSelection = loadErrorHandlingPolicy.getFallbackSelectionFor(fallbackOptions, loadErrorInfo); - if (fallbackSelection == null) { - // Policy indicated to not use any fallback. + if (fallbackSelection == null || !fallbackOptions.isFallbackAvailable(fallbackSelection.type)) { + // Policy indicated to not use any fallback or a fallback type that is not available. return false; } @@ -518,17 +526,7 @@ public class DefaultDashChunkSource implements DashChunkSource { } else if (fallbackSelection.type == LoadErrorHandlingPolicy.FALLBACK_TYPE_LOCATION) { baseUrlExclusionList.exclude( representationHolder.selectedBaseUrl, fallbackSelection.exclusionDurationMs); - for (int i = 0; i < representationHolders.length; i++) { - @Nullable - BaseUrl baseUrl = - baseUrlExclusionList.selectBaseUrl(representationHolders[i].representation.baseUrls); - if (baseUrl != null) { - if (i == trackIndex) { - cancelLoad = true; - } - representationHolders[i] = representationHolders[i].copyWithNewSelectedBaseUrl(baseUrl); - } - } + cancelLoad = true; } return cancelLoad; } @@ -610,9 +608,9 @@ public class DefaultDashChunkSource implements DashChunkSource { DataSource dataSource, Format trackFormat, @C.SelectionReason int trackSelectionReason, - Object trackSelectionData, + @Nullable Object trackSelectionData, @Nullable RangedUri initializationUri, - RangedUri indexUri) { + @Nullable RangedUri indexUri) { Representation representation = representationHolder.representation; @Nullable RangedUri requestUri; if (initializationUri != null) { @@ -719,6 +717,18 @@ public class DefaultDashChunkSource implements DashChunkSource { } } + private RepresentationHolder updateSelectedBaseUrl(int trackIndex) { + RepresentationHolder representationHolder = representationHolders[trackIndex]; + @Nullable + BaseUrl selectedBaseUrl = + baseUrlExclusionList.selectBaseUrl(representationHolder.representation.baseUrls); + if (selectedBaseUrl != null && !selectedBaseUrl.equals(representationHolder.selectedBaseUrl)) { + representationHolder = representationHolder.copyWithNewSelectedBaseUrl(selectedBaseUrl); + representationHolders[trackIndex] = representationHolder; + } + return representationHolder; + } + // Protected classes. /** {@link MediaChunkIterator} wrapping a {@link RepresentationHolder}. */ From 2138bfb3963eaea5dfcf305e3876cfc06ce6cb57 Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 9 Sep 2021 18:02:46 +0100 Subject: [PATCH 146/441] Add DASH samples with multiple base URLs PiperOrigin-RevId: 395727438 --- demos/main/src/main/assets/media.exolist.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index 0513dda601..7659abe5f1 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -212,6 +212,19 @@ } ] }, + { + "name": "DASH - Multiple base URLs", + "samples": [ + { + "name": "DASH - Multiple base URLs", + "uri": "https://storage.googleapis.com/exoplayer-test-media-0/dash-multiple-base-urls/manifest.mpd" + }, + { + "name": "DASH - Multiple base URLs (fail over)", + "uri": "https://storage.googleapis.com/exoplayer-test-media-0/dash-multiple-base-urls/manifest-failover.mpd" + } + ] + }, { "name": "HLS", "samples": [ From 7dff223d807d4c52de4b3a41d0cb4083e4b32375 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Fri, 10 Sep 2021 01:58:16 +0100 Subject: [PATCH 147/441] Transformer Demo: Add config page to remove audio/video. The new ConfigurationActivity can be used to configure settings specifying Transformer inputs, using checkboxes and submitted via a button. PiperOrigin-RevId: 395826358 --- constants.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/constants.gradle b/constants.gradle index 4037f925ad..005f125b98 100644 --- a/constants.gradle +++ b/constants.gradle @@ -38,6 +38,7 @@ project.ext { androidxAnnotationVersion = '1.2.0' androidxAppCompatVersion = '1.3.0' androidxCollectionVersion = '1.1.0' + androidxConstraintLayoutVersion = '2.0.4' androidxCoreVersion = '1.3.2' androidxFuturesVersion = '1.1.0' androidxMediaVersion = '1.4.1' From 9f3c2fb5e10a4e17a753e3791c9e4e07a79005d1 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 10 Sep 2021 12:00:12 +0100 Subject: [PATCH 148/441] Add MediaItem.DrmConfiguration.Builder and use it in MediaItem.Builder PiperOrigin-RevId: 395896034 --- .../google/android/exoplayer2/MediaItem.java | 378 +++++++++++------- .../android/exoplayer2/MediaItemTest.java | 92 ++++- 2 files changed, 327 insertions(+), 143 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 920ce01319..c881b9d412 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -26,13 +26,14 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -71,14 +72,9 @@ public final class MediaItem implements Bundleable { private boolean clipRelativeToLiveWindow; private boolean clipRelativeToDefaultPosition; private boolean clipStartsAtKeyFrame; - @Nullable private Uri drmLicenseUri; - private Map drmLicenseRequestHeaders; - @Nullable private UUID drmUuid; - private boolean drmMultiSession; - private boolean drmPlayClearContentWithoutKey; - private boolean drmForceDefaultLicenseUri; - private List drmSessionForClearTypes; - @Nullable private byte[] drmKeySetId; + // TODO: Change this to @Nullable DrmConfiguration once all the deprecated individual setters + // are removed. + private DrmConfiguration.Builder drmConfiguration; private List streamKeys; @Nullable private String customCacheKey; private List subtitles; @@ -93,10 +89,10 @@ public final class MediaItem implements Bundleable { private float liveMaxPlaybackSpeed; /** Creates a builder. */ + @SuppressWarnings("deprecation") // Temporarily uses DrmConfiguration.Builder() constructor. public Builder() { clipEndPositionMs = C.TIME_END_OF_SOURCE; - drmSessionForClearTypes = Collections.emptyList(); - drmLicenseRequestHeaders = Collections.emptyMap(); + drmConfiguration = new DrmConfiguration.Builder(); streamKeys = Collections.emptyList(); subtitles = Collections.emptyList(); liveTargetOffsetMs = C.TIME_UNSET; @@ -128,17 +124,10 @@ public final class MediaItem implements Bundleable { streamKeys = playbackProperties.streamKeys; subtitles = playbackProperties.subtitles; tag = playbackProperties.tag; - @Nullable DrmConfiguration drmConfiguration = playbackProperties.drmConfiguration; - if (drmConfiguration != null) { - drmLicenseUri = drmConfiguration.licenseUri; - drmLicenseRequestHeaders = drmConfiguration.requestHeaders; - drmMultiSession = drmConfiguration.multiSession; - drmForceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri; - drmPlayClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; - drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; - drmUuid = drmConfiguration.uuid; - drmKeySetId = drmConfiguration.getKeySetId(); - } + drmConfiguration = + playbackProperties.drmConfiguration != null + ? playbackProperties.drmConfiguration.buildUpon() + : new DrmConfiguration.Builder(); @Nullable AdsConfiguration adsConfiguration = playbackProperties.adsConfiguration; if (adsConfiguration != null) { adTagUri = adsConfiguration.adTagUri; @@ -243,149 +232,111 @@ public final class MediaItem implements Bundleable { return this; } + /** Sets the optional DRM configuration. */ + public Builder setDrmConfiguration(@Nullable DrmConfiguration drmConfiguration) { + this.drmConfiguration = + drmConfiguration != null ? drmConfiguration.buildUpon() : new DrmConfiguration.Builder(); + return this; + } + /** - * Sets the optional default DRM license server URI. If this URI is set, the {@link - * DrmConfiguration#uuid} needs to be specified as well. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setLicenseUri(Uri)} instead. */ + @Deprecated public Builder setDrmLicenseUri(@Nullable Uri licenseUri) { - drmLicenseUri = licenseUri; + drmConfiguration.setLicenseUri(licenseUri); return this; } /** - * Sets the optional default DRM license server URI. If this URI is set, the {@link - * DrmConfiguration#uuid} needs to be specified as well. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setLicenseUri(String)} instead. */ + @Deprecated public Builder setDrmLicenseUri(@Nullable String licenseUri) { - drmLicenseUri = licenseUri == null ? null : Uri.parse(licenseUri); + drmConfiguration.setLicenseUri(licenseUri); return this; } /** - * Sets the optional request headers attached to the DRM license request. - * - *

    {@code null} or an empty {@link Map} can be used for a reset. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setLicenseRequestHeaders(Map)} instead. */ + @Deprecated public Builder setDrmLicenseRequestHeaders( @Nullable Map licenseRequestHeaders) { - this.drmLicenseRequestHeaders = - licenseRequestHeaders != null && !licenseRequestHeaders.isEmpty() - ? Collections.unmodifiableMap(new HashMap<>(licenseRequestHeaders)) - : Collections.emptyMap(); + drmConfiguration.setLicenseRequestHeaders(licenseRequestHeaders); return this; } /** - * Sets the {@link UUID} of the protection scheme. - * - *

    If {@code uuid} is null or unset then no {@link DrmConfiguration} object is created during - * {@link #build()} and no other {@code Builder} methods that would populate {@link - * MediaItem.PlaybackProperties#drmConfiguration} should be called. - * - *

    This method should only be called if {@link #setUri} is passed a non-null value. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and pass the {@code uuid} to + * {@link DrmConfiguration.Builder#Builder(UUID)} instead. */ + @Deprecated public Builder setDrmUuid(@Nullable UUID uuid) { - drmUuid = uuid; + drmConfiguration.setNullableUuid(uuid); return this; } /** - * Sets whether the DRM configuration is multi session enabled. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setMultiSession(boolean)} instead. */ + @Deprecated public Builder setDrmMultiSession(boolean multiSession) { - drmMultiSession = multiSession; + drmConfiguration.setMultiSession(multiSession); return this; } /** - * Sets whether to force use the default DRM license server URI even if the media specifies its - * own DRM license server URI. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setForceDefaultLicenseUri(boolean)} instead. */ + @Deprecated public Builder setDrmForceDefaultLicenseUri(boolean forceDefaultLicenseUri) { - this.drmForceDefaultLicenseUri = forceDefaultLicenseUri; + drmConfiguration.setForceDefaultLicenseUri(forceDefaultLicenseUri); return this; } /** - * Sets whether clear samples within protected content should be played when keys for the - * encrypted part of the content have yet to be loaded. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setPlayClearContentWithoutKey(boolean)} instead. */ + @Deprecated public Builder setDrmPlayClearContentWithoutKey(boolean playClearContentWithoutKey) { - this.drmPlayClearContentWithoutKey = playClearContentWithoutKey; + drmConfiguration.setPlayClearContentWithoutKey(playClearContentWithoutKey); return this; } /** - * Sets whether a DRM session should be used for clear tracks of type {@link C#TRACK_TYPE_VIDEO} - * and {@link C#TRACK_TYPE_AUDIO}. - * - *

    This method overrides what has been set by previously calling {@link - * #setDrmSessionForClearTypes(List)}. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setSessionForClearPeriods(boolean)} instead. */ + @Deprecated public Builder setDrmSessionForClearPeriods(boolean sessionForClearPeriods) { - this.setDrmSessionForClearTypes( - sessionForClearPeriods - ? Arrays.asList(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO) - : Collections.emptyList()); + drmConfiguration.setSessionForClearPeriods(sessionForClearPeriods); return this; } /** - * Sets a list of {@link C.TrackType track types} for which to use a DRM session even when the - * tracks are in the clear. - * - *

    For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link - * C#TRACK_TYPE_AUDIO} the {@link #setDrmSessionForClearPeriods(boolean)} can be used. - * - *

    This method overrides what has been set by previously calling {@link - * #setDrmSessionForClearPeriods(boolean)}. - * - *

    {@code null} or an empty {@link List} can be used for a reset. - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setSessionForClearTypes(List)} instead. */ + @Deprecated public Builder setDrmSessionForClearTypes(@Nullable List sessionForClearTypes) { - this.drmSessionForClearTypes = - sessionForClearTypes != null && !sessionForClearTypes.isEmpty() - ? Collections.unmodifiableList(new ArrayList<>(sessionForClearTypes)) - : Collections.emptyList(); + drmConfiguration.setSessionForClearTypes(sessionForClearTypes); return this; } /** - * Sets the key set ID of the offline license. - * - *

    The key set ID identifies an offline license. The ID is required to query, renew or - * release an existing offline license (see {@code DefaultDrmSessionManager#setMode(int - * mode,byte[] offlineLicenseKeySetId)}). - * - *

    This method should only be called if both {@link #setUri} and {@link #setDrmUuid(UUID)} - * are passed non-null values. + * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link + * DrmConfiguration.Builder#setKeySetId(byte[])} instead. */ + @Deprecated public Builder setDrmKeySetId(@Nullable byte[] keySetId) { - this.drmKeySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; + drmConfiguration.setKeySetId(keySetId); return this; } @@ -568,7 +519,8 @@ public final class MediaItem implements Bundleable { /** Returns a new {@link MediaItem} instance with the current builder values. */ public MediaItem build() { - checkState(drmLicenseUri == null || drmUuid != null); + // TODO: remove this check once all the deprecated individual DRM setters are removed. + checkState(drmConfiguration.licenseUri == null || drmConfiguration.uuid != null); @Nullable PlaybackProperties playbackProperties = null; @Nullable Uri uri = this.uri; if (uri != null) { @@ -576,17 +528,7 @@ public final class MediaItem implements Bundleable { new PlaybackProperties( uri, mimeType, - drmUuid != null - ? new DrmConfiguration( - drmUuid, - drmLicenseUri, - drmLicenseRequestHeaders, - drmMultiSession, - drmForceDefaultLicenseUri, - drmPlayClearContentWithoutKey, - drmSessionForClearTypes, - drmKeySetId) - : null, + drmConfiguration.uuid != null ? drmConfiguration.build() : null, adTagUri != null ? new AdsConfiguration(adTagUri, adsId) : null, streamKeys, customCacheKey, @@ -615,6 +557,165 @@ public final class MediaItem implements Bundleable { /** DRM configuration for a media item. */ public static final class DrmConfiguration { + /** Builder for {@link DrmConfiguration}. */ + public static final class Builder { + + // TODO remove @Nullable annotation when the deprecated zero-arg constructor is removed. + @Nullable private UUID uuid; + @Nullable private Uri licenseUri; + private ImmutableMap licenseRequestHeaders; + private boolean multiSession; + private boolean playClearContentWithoutKey; + private boolean forceDefaultLicenseUri; + private ImmutableList sessionForClearTypes; + @Nullable private byte[] keySetId; + + /** + * Constructs an instance. + * + * @param uuid The {@link UUID} of the protection scheme. + */ + public Builder(UUID uuid) { + this.uuid = uuid; + this.licenseRequestHeaders = ImmutableMap.of(); + this.sessionForClearTypes = ImmutableList.of(); + } + + /** + * @deprecated This only exists to support the deprecated setters for individual DRM + * properties on {@link MediaItem.Builder}. + */ + @Deprecated + private Builder() { + this.licenseRequestHeaders = ImmutableMap.of(); + this.sessionForClearTypes = ImmutableList.of(); + } + + private Builder(DrmConfiguration drmConfiguration) { + this.uuid = drmConfiguration.uuid; + this.licenseUri = drmConfiguration.licenseUri; + this.licenseRequestHeaders = drmConfiguration.requestHeaders; + this.multiSession = drmConfiguration.multiSession; + this.playClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; + this.forceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri; + this.sessionForClearTypes = drmConfiguration.sessionForClearTypes; + this.keySetId = drmConfiguration.keySetId; + } + + /** Sets the {@link UUID} of the protection scheme. */ + public Builder setUuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * @deprecated This only exists to support the deprecated {@link + * MediaItem.Builder#setDrmUuid(UUID)}. + */ + @Deprecated + private Builder setNullableUuid(@Nullable UUID uuid) { + this.uuid = uuid; + return this; + } + + /** Sets the optional default DRM license server URI. */ + public Builder setLicenseUri(@Nullable Uri licenseUri) { + this.licenseUri = licenseUri; + return this; + } + + /** Sets the optional default DRM license server URI. */ + public Builder setLicenseUri(@Nullable String licenseUri) { + this.licenseUri = licenseUri == null ? null : Uri.parse(licenseUri); + return this; + } + + /** Sets the optional request headers attached to DRM license requests. */ + public Builder setLicenseRequestHeaders(@Nullable Map licenseRequestHeaders) { + this.licenseRequestHeaders = + licenseRequestHeaders != null + ? ImmutableMap.copyOf(licenseRequestHeaders) + : ImmutableMap.of(); + return this; + } + + /** Sets whether multi session is enabled. */ + public Builder setMultiSession(boolean multiSession) { + this.multiSession = multiSession; + return this; + } + + /** + * Sets whether to always use the default DRM license server URI even if the media specifies + * its own DRM license server URI. + */ + public Builder setForceDefaultLicenseUri(boolean forceDefaultLicenseUri) { + this.forceDefaultLicenseUri = forceDefaultLicenseUri; + return this; + } + + /** + * Sets whether clear samples within protected content should be played when keys for the + * encrypted part of the content have yet to be loaded. + */ + public Builder setPlayClearContentWithoutKey(boolean playClearContentWithoutKey) { + this.playClearContentWithoutKey = playClearContentWithoutKey; + return this; + } + + /** + * Sets whether a DRM session should be used for clear tracks of type {@link + * C#TRACK_TYPE_VIDEO} and {@link C#TRACK_TYPE_AUDIO}. + * + *

    This method overrides what has been set by previously calling {@link + * #setSessionForClearTypes(List)}. + */ + public Builder setSessionForClearPeriods(boolean sessionForClearPeriods) { + this.setSessionForClearTypes( + sessionForClearPeriods + ? ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO) + : ImmutableList.of()); + return this; + } + + /** + * Sets a list of {@link C}{@code .TRACK_TYPE_*} constants for which to use a DRM session even + * when the tracks are in the clear. + * + *

    For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link + * C#TRACK_TYPE_AUDIO} the {@link #setSessionForClearPeriods(boolean)} can be used. + * + *

    This method overrides what has been set by previously calling {@link + * #setSessionForClearPeriods(boolean)}. + * + *

    {@code null} or an empty {@link List} can be used for a reset. + */ + public Builder setSessionForClearTypes(@Nullable List sessionForClearTypes) { + this.sessionForClearTypes = + sessionForClearTypes != null + ? ImmutableList.copyOf(sessionForClearTypes) + : ImmutableList.of(); + return this; + } + + /** + * Sets the key set ID of the offline license. + * + *

    The key set ID identifies an offline license. The ID is required to query, renew or + * release an existing offline license (see {@code DefaultDrmSessionManager#setMode(int + * mode,byte[] offlineLicenseKeySetId)}). + */ + public Builder setKeySetId(@Nullable byte[] keySetId) { + this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; + return this; + } + + public DrmConfiguration build() { + + return new DrmConfiguration(this); + } + } + /** The UUID of the protection scheme. */ public final UUID uuid; @@ -625,7 +726,7 @@ public final class MediaItem implements Bundleable { @Nullable public final Uri licenseUri; /** The headers to attach to the request to the DRM license server. */ - public final Map requestHeaders; + public final ImmutableMap requestHeaders; /** Whether the DRM configuration is multi session enabled. */ public final boolean multiSession; @@ -643,28 +744,23 @@ public final class MediaItem implements Bundleable { public final boolean forceDefaultLicenseUri; /** The types of clear tracks for which to use a DRM session. */ - public final List sessionForClearTypes; + public final ImmutableList sessionForClearTypes; @Nullable private final byte[] keySetId; - private DrmConfiguration( - UUID uuid, - @Nullable Uri licenseUri, - Map requestHeaders, - boolean multiSession, - boolean forceDefaultLicenseUri, - boolean playClearContentWithoutKey, - List drmSessionForClearTypes, - @Nullable byte[] keySetId) { - Assertions.checkArgument(!(forceDefaultLicenseUri && licenseUri == null)); - this.uuid = uuid; - this.licenseUri = licenseUri; - this.requestHeaders = requestHeaders; - this.multiSession = multiSession; - this.forceDefaultLicenseUri = forceDefaultLicenseUri; - this.playClearContentWithoutKey = playClearContentWithoutKey; - this.sessionForClearTypes = drmSessionForClearTypes; - this.keySetId = keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; + private DrmConfiguration(Builder builder) { + checkState(!(builder.forceDefaultLicenseUri && builder.licenseUri == null)); + this.uuid = checkNotNull(builder.uuid); + this.licenseUri = builder.licenseUri; + this.requestHeaders = builder.licenseRequestHeaders; + this.multiSession = builder.multiSession; + this.forceDefaultLicenseUri = builder.forceDefaultLicenseUri; + this.playClearContentWithoutKey = builder.playClearContentWithoutKey; + this.sessionForClearTypes = builder.sessionForClearTypes; + this.keySetId = + builder.keySetId != null + ? Arrays.copyOf(builder.keySetId, builder.keySetId.length) + : null; } /** Returns the key set ID of the offline license. */ @@ -673,6 +769,10 @@ public final class MediaItem implements Bundleable { return keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; } + public Builder buildUpon() { + return new Builder(this); + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 8ebadc17e0..1da3443512 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -22,6 +22,7 @@ import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -77,14 +78,15 @@ public class MediaItemTest { } @Test - public void builderSetDrmConfig_isNullByDefault() { + public void builder_drmConfigIsNullByDefault() { // Null value by default. MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNull(); } @Test - public void builderSetDrmConfig_setsAllProperties() { + @SuppressWarnings("deprecation") // Testing deprecated methods + public void builderSetDrmPropertiesIndividually() { Uri licenseUri = Uri.parse(URI_STRING); Map requestHeaders = new HashMap<>(); requestHeaders.put("Referer", "http://www.google.com"); @@ -92,14 +94,14 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_STRING) - .setDrmUuid(C.WIDEVINE_UUID) .setDrmLicenseUri(licenseUri) .setDrmLicenseRequestHeaders(requestHeaders) .setDrmMultiSession(true) .setDrmForceDefaultLicenseUri(true) .setDrmPlayClearContentWithoutKey(true) - .setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO)) + .setDrmSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) .setDrmKeySetId(keySetId) + .setDrmUuid(C.WIDEVINE_UUID) .build(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); @@ -116,6 +118,73 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated methods + public void builderSetDrmConfigurationOverwritesIndividualProperties() { + Uri licenseUri = Uri.parse(URI_STRING); + Map requestHeaders = new HashMap<>(); + requestHeaders.put("Referer", "http://www.google.com"); + byte[] keySetId = new byte[] {1, 2, 3}; + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setDrmLicenseUri(licenseUri) + .setDrmLicenseRequestHeaders(requestHeaders) + .setDrmMultiSession(true) + .setDrmForceDefaultLicenseUri(true) + .setDrmPlayClearContentWithoutKey(true) + .setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO)) + .setDrmKeySetId(keySetId) + .setDrmUuid(C.WIDEVINE_UUID) + .setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID).build()) + .build(); + + assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID); + assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders).isEmpty(); + assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isFalse(); + assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isFalse(); + assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isFalse(); + assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes).isEmpty(); + assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isNull(); + } + + @Test + public void builderSetDrmConfiguration() { + Uri licenseUri = Uri.parse(URI_STRING); + Map requestHeaders = new HashMap<>(); + requestHeaders.put("Referer", "http://www.google.com"); + byte[] keySetId = new byte[] {1, 2, 3}; + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(licenseUri) + .setLicenseRequestHeaders(requestHeaders) + .setMultiSession(true) + .setForceDefaultLicenseUri(true) + .setPlayClearContentWithoutKey(true) + .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .setKeySetId(keySetId) + .build()) + .build(); + + assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); + assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); + assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) + .isEqualTo(requestHeaders); + assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); + assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue(); + assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); + assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes) + .containsExactly(C.TRACK_TYPE_AUDIO); + assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId); + } + + @Test + @SuppressWarnings("deprecation") // Testing deprecated methods public void builderSetDrmSessionForClearPeriods_setsAudioAndVideoTracks() { Uri licenseUri = Uri.parse(URI_STRING); MediaItem mediaItem = @@ -132,6 +201,21 @@ public class MediaItemTest { } @Test + public void drmConfigurationBuilderSetSessionForClearPeriods_overridesSetSessionForClearTypes() { + Uri licenseUri = Uri.parse(URI_STRING); + MediaItem.DrmConfiguration drmConfiguration = + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(licenseUri) + .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .setSessionForClearPeriods(true) + .build(); + + assertThat(drmConfiguration.sessionForClearTypes) + .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); + } + + @Test + @SuppressWarnings("deprecation") // Testing deprecated methods public void builderSetDrmUuid_notCalled_throwsIllegalStateException() { assertThrows( IllegalStateException.class, From 4f064193345c490a8e32599ddb8839c7506add79 Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 10 Sep 2021 13:53:40 +0100 Subject: [PATCH 149/441] Fix RTSP session header parsing regex error. Issue: #9416 The dash "-" in the brackets must be escaped, or it acts like a range operator. #minor-release PiperOrigin-RevId: 395909845 --- RELEASENOTES.md | 2 ++ .../exoplayer2/source/rtsp/RtspMessageUtil.java | 2 +- .../exoplayer2/source/rtsp/RtspMessageUtilTest.java | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f679980992..0a2ba36024 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -92,6 +92,8 @@ ([#9379](https://github.com/google/ExoPlayer/issues/9379)). * Handle partial URIs in RTP-Info headers ([#9346](https://github.com/google/ExoPlayer/issues/9346)). + * Fix RTSP Session header handling + ([#9416](https://github.com/google/ExoPlayer/issues/9416)). * Extractors: * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings ([#9087](https://github.com/google/ExoPlayer/issues/9087)). diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index a1a9b69afd..ece8b77653 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -94,7 +94,7 @@ import java.util.regex.Pattern; // Session header pattern, see RFC2326 Sections 3.4 and 12.37. private static final Pattern SESSION_HEADER_PATTERN = - Pattern.compile("([\\w$-_.+]+)(?:;\\s?timeout=(\\d+))?"); + Pattern.compile("([\\w$\\-_.+]+)(?:;\\s?timeout=(\\d+))?"); // WWW-Authenticate header pattern, see RFC2068 Sections 14.46 and RFC2069. private static final Pattern WWW_AUTHENTICATION_HEADER_DIGEST_PATTERN = diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java index b11e82f9c9..d6a37965c0 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java @@ -406,6 +406,16 @@ public final class RtspMessageUtilTest { assertThat(sessionHeader.sessionId).isEqualTo("610a63df-9b57.4856_97ac$665f+56e9c04"); } + @Test + public void parseSessionHeader_withSessionIdContainingSpecialCharactersAndTimeout_succeeds() + throws Exception { + String sessionHeaderString = "610a63df-9b57.4856_97ac$665f+56e9c04;timeout=60"; + RtspMessageUtil.RtspSessionHeader sessionHeader = + RtspMessageUtil.parseSessionHeader(sessionHeaderString); + assertThat(sessionHeader.sessionId).isEqualTo("610a63df-9b57.4856_97ac$665f+56e9c04"); + assertThat(sessionHeader.timeoutMs).isEqualTo(60_000); + } + @Test public void removeUserInfo_withUserInfo() { Uri uri = Uri.parse("rtsp://user:pass@foo.bar/foo.mkv"); From 68ee587e25235d4db89f47d1d192d2b6f34a2419 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 10 Sep 2021 14:46:32 +0100 Subject: [PATCH 150/441] Constrain resolved period positions to be within the period This is a candidate fix for #8906. As mentioned in that issue, negative positions within windows might be (kind of) valid in live streaming scenarios, where the window starts at some non-zero position within the period. However, negative positions within periods are definitely not valid. Neither are positions that exceed the period duration. There was already logic in ExoPlayerImplInternal to prevent a resolved seek position from exceeding the period duration. This fix adds the equivalent constraint for the start of the period. It also moves the application of the constraints into Timeline. This has the advantage that the constraints are applied as part of state masking in ExoPlayerImpl.seekTo, removing any UI flicker where the invalid seek position is temporarily visible. Issue: #8906 PiperOrigin-RevId: 395917413 --- RELEASENOTES.md | 4 ++++ .../com/google/android/exoplayer2/Timeline.java | 16 +++++++++++++++- .../exoplayer2/ExoPlayerImplInternal.java | 15 ++++----------- .../google/android/exoplayer2/ExoPlayerTest.java | 10 +++++----- .../source/SinglePeriodTimelineTest.java | 4 ++-- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0a2ba36024..052b568b7d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,10 @@ `MediaSourceFactory` instances from being re-used by `ExoPlayer` instances with non-overlapping lifecycles ([#9099](https://github.com/google/ExoPlayer/issues/9099)). + * Better handle invalid seek requests. Seeks to positions that are before + the start or after the end of the media are now handled as seeks to the + start and end respectively + ([8906](https://github.com/google/ExoPlayer/issues/8906)). * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). 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 189efc3258..31bea4d806 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 @@ -17,6 +17,8 @@ package com.google.android.exoplayer2; import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkState; +import static java.lang.Math.max; +import static java.lang.Math.min; import android.net.Uri; import android.os.Bundle; @@ -28,6 +30,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.BundleUtil; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import java.lang.annotation.Documented; @@ -1158,7 +1161,9 @@ public abstract class Timeline implements Bundleable { } /** - * Converts (windowIndex, windowPositionUs) to the corresponding (periodUid, periodPositionUs). + * Converts {@code (windowIndex, windowPositionUs)} to the corresponding {@code (periodUid, + * periodPositionUs)}. The returned {@code periodPositionUs} is constrained to be non-negative, + * and to be less than the containing period's duration if it is known. * * @param window A {@link Window} that may be overwritten. * @param period A {@link Period} that may be overwritten. @@ -1195,6 +1200,15 @@ public abstract class Timeline implements Bundleable { } getPeriod(periodIndex, period, /* setIds= */ true); long periodPositionUs = windowPositionUs - period.positionInWindowUs; + // The period positions must be less than the period duration, if it is known. + if (period.durationUs != C.TIME_UNSET) { + periodPositionUs = min(periodPositionUs, period.durationUs - 1); + } + // Period positions cannot be negative. + periodPositionUs = max(0, periodPositionUs); + if (periodPositionUs == 9) { + Log.e("XXX", "YYY"); + } return Pair.create(Assertions.checkNotNull(period.uid), periodPositionUs); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index a497f20b09..93b8311894 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1273,17 +1273,10 @@ import java.util.concurrent.atomic.AtomicBoolean; if (!newPlayingPeriodHolder.prepared) { newPlayingPeriodHolder.info = newPlayingPeriodHolder.info.copyWithStartPositionUs(periodPositionUs); - } else { - if (newPlayingPeriodHolder.info.durationUs != C.TIME_UNSET - && periodPositionUs >= newPlayingPeriodHolder.info.durationUs) { - // Make sure seek position doesn't exceed period duration. - periodPositionUs = max(0, newPlayingPeriodHolder.info.durationUs - 1); - } - if (newPlayingPeriodHolder.hasEnabledTracks) { - periodPositionUs = newPlayingPeriodHolder.mediaPeriod.seekToUs(periodPositionUs); - newPlayingPeriodHolder.mediaPeriod.discardBuffer( - periodPositionUs - backBufferDurationUs, retainBackBufferFromKeyframe); - } + } else if (newPlayingPeriodHolder.hasEnabledTracks) { + periodPositionUs = newPlayingPeriodHolder.mediaPeriod.seekToUs(periodPositionUs); + newPlayingPeriodHolder.mediaPeriod.discardBuffer( + periodPositionUs - backBufferDurationUs, retainBackBufferFromKeyframe); } resetRendererPosition(periodPositionUs); maybeContinueLoading(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index deb4e780e1..fb2913fd70 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -3663,7 +3663,7 @@ public final class ExoPlayerTest { Timeline fakeTimeline = new FakeTimeline( new TimelineWindowDefinition( - /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000)); + /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); final ConcatenatingMediaSource underlyingSource = new ConcatenatingMediaSource(); CompositeMediaSource delegatingMediaSource = new CompositeMediaSource() { @@ -5416,7 +5416,7 @@ public final class ExoPlayerTest { Timeline fakeTimeline = new FakeTimeline( new TimelineWindowDefinition( - /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000)); + /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource( /* isAtomic= */ false, @@ -5455,7 +5455,7 @@ public final class ExoPlayerTest { Timeline fakeTimeline = new FakeTimeline( new TimelineWindowDefinition( - /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000)); + /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(/* isAtomic= */ false); int[] currentWindowIndices = new int[2]; @@ -5526,7 +5526,7 @@ public final class ExoPlayerTest { Timeline fakeTimeline = new FakeTimeline( new TimelineWindowDefinition( - /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000)); + /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(/* isAtomic= */ false); int[] currentWindowIndices = new int[2]; @@ -10729,7 +10729,7 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); player.seekForward(); - assertThat(player.getCurrentPosition()).isEqualTo(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS / 2); + assertThat(player.getCurrentPosition()).isEqualTo(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS / 2 - 1); player.release(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java index 09ac9b6df2..5f5b28262d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java @@ -79,9 +79,9 @@ public final class SinglePeriodTimelineTest { timeline.getPeriodPosition(window, period, 0, C.TIME_UNSET, windowDurationUs + 1); assertThat(position).isNull(); // Should return (0, duration) with a projection equal to window duration. - position = timeline.getPeriodPosition(window, period, 0, C.TIME_UNSET, windowDurationUs); + position = timeline.getPeriodPosition(window, period, 0, C.TIME_UNSET, windowDurationUs - 1); assertThat(position.first).isEqualTo(timeline.getUidOfPeriod(0)); - assertThat(position.second).isEqualTo(windowDurationUs); + assertThat(position.second).isEqualTo(windowDurationUs - 1); // Should return (0, 0) without a position projection. position = timeline.getPeriodPosition(window, period, 0, C.TIME_UNSET, 0); assertThat(position.first).isEqualTo(timeline.getUidOfPeriod(0)); From 296074fbea3992a7e3c3a5e4897dcbfabd58756b Mon Sep 17 00:00:00 2001 From: Marcus Wichelmann Date: Mon, 13 Sep 2021 10:27:55 +0200 Subject: [PATCH 151/441] Extend SPS parsing when building the initial MP4 HevcConfig and include the PAR for propagating it into the Format --- .../util/CodecSpecificDataUtil.java | 25 +- .../android/exoplayer2/util/NalUnitUtil.java | 267 +++++++++++++++++- .../exoplayer2/util/NalUnitUtilTest.java | 7 +- .../exoplayer2/extractor/mp4/AtomParsers.java | 3 + .../exoplayer2/extractor/ts/H264Reader.java | 8 +- .../exoplayer2/extractor/ts/H265Reader.java | 22 +- .../android/exoplayer2/video/AvcConfig.java | 5 +- .../android/exoplayer2/video/HevcConfig.java | 38 ++- .../source/rtsp/RtspMediaTrack.java | 4 +- 9 files changed, 322 insertions(+), 57 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java index 0f8edb4acd..8d310bd361 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java @@ -86,28 +86,11 @@ public final class CodecSpecificDataUtil { } /** - * Returns an RFC 6381 HEVC codec string based on the SPS NAL unit read from the provided bit - * array. The position of the bit array must be the start of an SPS NALU (nal_unit_header), and - * the position may be modified by this method. + * Builds a RFC 6381 HEVC codec string using the provided parameters. */ - public static String buildHevcCodecStringFromSps(ParsableNalUnitBitArray bitArray) { - // Skip nal_unit_header, sps_video_parameter_set_id, sps_max_sub_layers_minus1 and - // sps_temporal_id_nesting_flag. - bitArray.skipBits(16 + 4 + 3 + 1); - int generalProfileSpace = bitArray.readBits(2); - boolean generalTierFlag = bitArray.readBit(); - int generalProfileIdc = bitArray.readBits(5); - int generalProfileCompatibilityFlags = 0; - for (int i = 0; i < 32; i++) { - if (bitArray.readBit()) { - generalProfileCompatibilityFlags |= (1 << i); - } - } - int[] constraintBytes = new int[6]; - for (int i = 0; i < constraintBytes.length; ++i) { - constraintBytes[i] = bitArray.readBits(8); - } - int generalLevelIdc = bitArray.readBits(8); + public static String buildHevcCodecString( + int generalProfileSpace, boolean generalTierFlag, int generalProfileIdc, + int generalProfileCompatibilityFlags, int[] constraintBytes, int generalLevelIdc) { StringBuilder builder = new StringBuilder( Util.formatInvariant( diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java index 1fd44011e0..4b267e0bfa 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.util; +import static java.lang.Math.min; + import androidx.annotation.Nullable; import java.nio.ByteBuffer; import java.util.Arrays; @@ -24,7 +26,7 @@ public final class NalUnitUtil { private static final String TAG = "NalUnitUtil"; - /** Holds data parsed from a sequence parameter set NAL unit. */ + /** Holds data parsed from a H.264 sequence parameter set NAL unit. */ public static final class SpsData { public final int profileIdc; @@ -71,6 +73,44 @@ public final class NalUnitUtil { } } + /** Holds data parsed from a H.265 sequence parameter set NAL unit. */ + public static final class H265SpsData { + + public final int generalProfileSpace; + public final boolean generalTierFlag; + public final int generalProfileIdc; + public final int generalProfileCompatibilityFlags; + public final int[] constraintBytes; + public final int generalLevelIdc; + public final int seqParameterSetId; + public final int picWidthInLumaSamples; + public final int picHeightInLumaSamples; + public final float pixelWidthHeightRatio; + + public H265SpsData( + int generalProfileSpace, + boolean generalTierFlag, + int generalProfileIdc, + int generalProfileCompatibilityFlags, + int[] constraintBytes, + int generalLevelIdc, + int seqParameterSetId, + int picWidthInLumaSamples, + int picHeightInLumaSamples, + float pixelWidthHeightRatio) { + this.generalProfileSpace = generalProfileSpace; + this.generalTierFlag = generalTierFlag; + this.generalProfileIdc = generalProfileIdc; + this.generalProfileCompatibilityFlags = generalProfileCompatibilityFlags; + this.constraintBytes = constraintBytes; + this.generalLevelIdc = generalLevelIdc; + this.seqParameterSetId = seqParameterSetId; + this.picWidthInLumaSamples = picWidthInLumaSamples; + this.picHeightInLumaSamples = picHeightInLumaSamples; + this.pixelWidthHeightRatio = pixelWidthHeightRatio; + } + } + /** Holds data parsed from a picture parameter set NAL unit. */ public static final class PpsData { @@ -252,17 +292,16 @@ public final class NalUnitUtil { } /** - * Parses an SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection - * 7.3.2.1.1. + * Parses a SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * subsection 7.3.2.1.1. * * @param nalData A buffer containing escaped SPS data. - * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalOffset The offset of the NAL unit in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the SPS data. */ - public static SpsData parseSpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + public static SpsData parseSpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit) { ParsableNalUnitBitArray data = new ParsableNalUnitBitArray(nalData, nalOffset, nalLimit); - data.skipBits(8); // nal_unit int profileIdc = data.readBits(8); int constraintsFlagsAndReservedZero2Bits = data.readBits(8); int levelIdc = data.readBits(8); @@ -387,17 +426,166 @@ public final class NalUnitUtil { } /** - * Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection - * 7.3.2.2. + * Parses a H.265 SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.265 (2019) + * subsection 7.3.2.2.1. + * + * @param nalData A buffer containing escaped SPS data. + * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the SPS data. + */ + public static H265SpsData parseH265SpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit) { + ParsableNalUnitBitArray data = new ParsableNalUnitBitArray(nalData, nalOffset, nalLimit); + // Skip sps_video_parameter_set_id. + data.skipBits(8 + 4); + int maxSubLayersMinus1 = data.readBits(3); + data.skipBit(); // sps_temporal_id_nesting_flag + int generalProfileSpace = data.readBits(2); + boolean generalTierFlag = data.readBit(); + int generalProfileIdc = data.readBits(5); + int generalProfileCompatibilityFlags = 0; + for (int i = 0; i < 32; i++) { + if (data.readBit()) { + generalProfileCompatibilityFlags |= (1 << i); + } + } + int[] constraintBytes = new int[6]; + for (int i = 0; i < constraintBytes.length; ++i) { + constraintBytes[i] = data.readBits(8); + } + int generalLevelIdc = data.readBits(8); + int toSkip = 0; + for (int i = 0; i < maxSubLayersMinus1; i++) { + if (data.readBit()) { // sub_layer_profile_present_flag[i] + toSkip += 89; + } + if (data.readBit()) { // sub_layer_level_present_flag[i] + toSkip += 8; + } + } + data.skipBits(toSkip); + if (maxSubLayersMinus1 > 0) { + data.skipBits(2 * (8 - maxSubLayersMinus1)); + } + int seqParameterSetId = data.readUnsignedExpGolombCodedInt(); + int chromaFormatIdc = data.readUnsignedExpGolombCodedInt(); + if (chromaFormatIdc == 3) { + data.skipBit(); // separate_colour_plane_flag + } + int picWidthInLumaSamples = data.readUnsignedExpGolombCodedInt(); + int picHeightInLumaSamples = data.readUnsignedExpGolombCodedInt(); + if (data.readBit()) { // conformance_window_flag + int confWinLeftOffset = data.readUnsignedExpGolombCodedInt(); + int confWinRightOffset = data.readUnsignedExpGolombCodedInt(); + int confWinTopOffset = data.readUnsignedExpGolombCodedInt(); + int confWinBottomOffset = data.readUnsignedExpGolombCodedInt(); + // H.265/HEVC (2014) Table 6-1 + int subWidthC = chromaFormatIdc == 1 || chromaFormatIdc == 2 ? 2 : 1; + int subHeightC = chromaFormatIdc == 1 ? 2 : 1; + picWidthInLumaSamples -= subWidthC * (confWinLeftOffset + confWinRightOffset); + picHeightInLumaSamples -= subHeightC * (confWinTopOffset + confWinBottomOffset); + } + data.readUnsignedExpGolombCodedInt(); // bit_depth_luma_minus8 + data.readUnsignedExpGolombCodedInt(); // bit_depth_chroma_minus8 + int log2MaxPicOrderCntLsbMinus4 = data.readUnsignedExpGolombCodedInt(); + // for (i = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1; ...) + for (int i = data.readBit() ? 0 : maxSubLayersMinus1; i <= maxSubLayersMinus1; i++) { + data.readUnsignedExpGolombCodedInt(); // sps_max_dec_pic_buffering_minus1[i] + data.readUnsignedExpGolombCodedInt(); // sps_max_num_reorder_pics[i] + data.readUnsignedExpGolombCodedInt(); // sps_max_latency_increase_plus1[i] + } + data.readUnsignedExpGolombCodedInt(); // log2_min_luma_coding_block_size_minus3 + data.readUnsignedExpGolombCodedInt(); // log2_diff_max_min_luma_coding_block_size + data.readUnsignedExpGolombCodedInt(); // log2_min_luma_transform_block_size_minus2 + data.readUnsignedExpGolombCodedInt(); // log2_diff_max_min_luma_transform_block_size + data.readUnsignedExpGolombCodedInt(); // max_transform_hierarchy_depth_inter + data.readUnsignedExpGolombCodedInt(); // max_transform_hierarchy_depth_intra + // if (scaling_list_enabled_flag) { if (sps_scaling_list_data_present_flag) {...}} + boolean scalingListEnabled = data.readBit(); + if (scalingListEnabled && data.readBit()) { + skipH265ScalingList(data); + } + data.skipBits(2); // amp_enabled_flag (1), sample_adaptive_offset_enabled_flag (1) + if (data.readBit()) { // pcm_enabled_flag + // pcm_sample_bit_depth_luma_minus1 (4), pcm_sample_bit_depth_chroma_minus1 (4) + data.skipBits(8); + data.readUnsignedExpGolombCodedInt(); // log2_min_pcm_luma_coding_block_size_minus3 + data.readUnsignedExpGolombCodedInt(); // log2_diff_max_min_pcm_luma_coding_block_size + data.skipBit(); // pcm_loop_filter_disabled_flag + } + // Skips all short term reference picture sets. + skipShortTermRefPicSets(data); + if (data.readBit()) { // long_term_ref_pics_present_flag + // num_long_term_ref_pics_sps + for (int i = 0; i < data.readUnsignedExpGolombCodedInt(); i++) { + int ltRefPicPocLsbSpsLength = log2MaxPicOrderCntLsbMinus4 + 4; + // lt_ref_pic_poc_lsb_sps[i], used_by_curr_pic_lt_sps_flag[i] + data.skipBits(ltRefPicPocLsbSpsLength + 1); + } + } + data.skipBits(2); // sps_temporal_mvp_enabled_flag, strong_intra_smoothing_enabled_flag + float pixelWidthHeightRatio = 1; + if (data.readBit()) { // vui_parameters_present_flag + if (data.readBit()) { // aspect_ratio_info_present_flag + int aspectRatioIdc = data.readBits(8); + if (aspectRatioIdc == NalUnitUtil.EXTENDED_SAR) { + int sarWidth = data.readBits(16); + int sarHeight = data.readBits(16); + if (sarWidth != 0 && sarHeight != 0) { + pixelWidthHeightRatio = (float) sarWidth / sarHeight; + } + } else if (aspectRatioIdc < NalUnitUtil.ASPECT_RATIO_IDC_VALUES.length) { + pixelWidthHeightRatio = NalUnitUtil.ASPECT_RATIO_IDC_VALUES[aspectRatioIdc]; + } else { + Log.w(TAG, "Unexpected aspect_ratio_idc value: " + aspectRatioIdc); + } + } + if (data.readBit()) { // overscan_info_present_flag + data.skipBit(); // overscan_appropriate_flag + } + if (data.readBit()) { // video_signal_type_present_flag + data.skipBits(4); // video_format, video_full_range_flag + if (data.readBit()) { // colour_description_present_flag + // colour_primaries, transfer_characteristics, matrix_coeffs + data.skipBits(24); + } + } + if (data.readBit()) { // chroma_loc_info_present_flag + data.readUnsignedExpGolombCodedInt(); // chroma_sample_loc_type_top_field + data.readUnsignedExpGolombCodedInt(); // chroma_sample_loc_type_bottom_field + } + data.skipBit(); // neutral_chroma_indication_flag + if (data.readBit()) { // field_seq_flag + // field_seq_flag equal to 1 indicates that the coded video sequence conveys pictures that + // represent fields, which means that frame height is double the picture height. + picHeightInLumaSamples *= 2; + } + } + + return new H265SpsData( + generalProfileSpace, + generalTierFlag, + generalProfileIdc, + generalProfileCompatibilityFlags, + constraintBytes, + generalLevelIdc, + seqParameterSetId, + picWidthInLumaSamples, + picHeightInLumaSamples, + pixelWidthHeightRatio); + } + + /** + * Parses a PPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * subsection 7.3.2.2. * * @param nalData A buffer containing escaped PPS data. - * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalOffset The offset of the NAL unit in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the PPS data. */ - public static PpsData parsePpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + public static PpsData parsePpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit) { ParsableNalUnitBitArray data = new ParsableNalUnitBitArray(nalData, nalOffset, nalLimit); - data.skipBits(8); // nal_unit int picParameterSetId = data.readUnsignedExpGolombCodedInt(); int seqParameterSetId = data.readUnsignedExpGolombCodedInt(); data.skipBit(); // entropy_coding_mode_flag @@ -516,6 +704,63 @@ public final class NalUnitUtil { } } + private static void skipH265ScalingList(ParsableNalUnitBitArray bitArray) { + for (int sizeId = 0; sizeId < 4; sizeId++) { + for (int matrixId = 0; matrixId < 6; matrixId += sizeId == 3 ? 3 : 1) { + if (!bitArray.readBit()) { // scaling_list_pred_mode_flag[sizeId][matrixId] + // scaling_list_pred_matrix_id_delta[sizeId][matrixId] + bitArray.readUnsignedExpGolombCodedInt(); + } else { + int coefNum = min(64, 1 << (4 + (sizeId << 1))); + if (sizeId > 1) { + // scaling_list_dc_coef_minus8[sizeId - 2][matrixId] + bitArray.readSignedExpGolombCodedInt(); + } + for (int i = 0; i < coefNum; i++) { + bitArray.readSignedExpGolombCodedInt(); // scaling_list_delta_coef + } + } + } + } + } + + private static void skipShortTermRefPicSets(ParsableNalUnitBitArray bitArray) { + int numShortTermRefPicSets = bitArray.readUnsignedExpGolombCodedInt(); + boolean interRefPicSetPredictionFlag = false; + int numNegativePics; + int numPositivePics; + // As this method applies in a SPS, the only element of NumDeltaPocs accessed is the previous + // one, so we just keep track of that rather than storing the whole array. + // RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1) and delta_idx_minus1 is always zero in SPS. + int previousNumDeltaPocs = 0; + for (int stRpsIdx = 0; stRpsIdx < numShortTermRefPicSets; stRpsIdx++) { + if (stRpsIdx != 0) { + interRefPicSetPredictionFlag = bitArray.readBit(); + } + if (interRefPicSetPredictionFlag) { + bitArray.skipBit(); // delta_rps_sign + bitArray.readUnsignedExpGolombCodedInt(); // abs_delta_rps_minus1 + for (int j = 0; j <= previousNumDeltaPocs; j++) { + if (bitArray.readBit()) { // used_by_curr_pic_flag[j] + bitArray.skipBit(); // use_delta_flag[j] + } + } + } else { + numNegativePics = bitArray.readUnsignedExpGolombCodedInt(); + numPositivePics = bitArray.readUnsignedExpGolombCodedInt(); + previousNumDeltaPocs = numNegativePics + numPositivePics; + for (int i = 0; i < numNegativePics; i++) { + bitArray.readUnsignedExpGolombCodedInt(); // delta_poc_s0_minus1[i] + bitArray.skipBit(); // used_by_curr_pic_s0_flag[i] + } + for (int i = 0; i < numPositivePics; i++) { + bitArray.readUnsignedExpGolombCodedInt(); // delta_poc_s1_minus1[i] + bitArray.skipBit(); // used_by_curr_pic_s1_flag[i] + } + } + } + } + private NalUnitUtil() { // Prevent instantiation. } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java index 4d9fc89a03..1d202c6eb6 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java @@ -33,7 +33,7 @@ public final class NalUnitUtilTest { createByteArray( 0x00, 0x00, 0x01, 0x67, 0x4D, 0x40, 0x16, 0xEC, 0xA0, 0x50, 0x17, 0xFC, 0xB8, 0x08, 0x80, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x0F, 0x47, 0x8B, 0x16, 0xCB); - private static final int SPS_TEST_DATA_OFFSET = 3; + private static final int SPS_TEST_DATA_OFFSET = 4; @Test public void findNalUnit() { @@ -121,9 +121,10 @@ public final class NalUnitUtilTest { } @Test - public void parseSpsNalUnit() { + public void parseSpsNalUnitPayload() { NalUnitUtil.SpsData data = - NalUnitUtil.parseSpsNalUnit(SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); + NalUnitUtil.parseSpsNalUnitPayload( + SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); assertThat(data.width).isEqualTo(640); assertThat(data.height).isEqualTo(360); assertThat(data.deltaPicOrderAlwaysZeroFlag).isFalse(); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index f6ed6f7796..fcb0db2c94 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -1139,6 +1139,9 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; HevcConfig hevcConfig = HevcConfig.parse(parent); initializationData = hevcConfig.initializationData; out.nalUnitLengthFieldLength = hevcConfig.nalUnitLengthFieldLength; + if (!pixelWidthHeightRatioFromPasp) { + pixelWidthHeightRatio = hevcConfig.pixelWidthHeightRatio; + } codecs = hevcConfig.codecs; } else if (childAtomType == Atom.TYPE_dvcC || childAtomType == Atom.TYPE_dvvC) { @Nullable DolbyVisionConfig dolbyVisionConfig = DolbyVisionConfig.parse(parent); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java index 6790747ac9..8bdc00cc65 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java @@ -200,8 +200,8 @@ public final class H264Reader implements ElementaryStreamReader { List initializationData = new ArrayList<>(); initializationData.add(Arrays.copyOf(sps.nalData, sps.nalLength)); initializationData.add(Arrays.copyOf(pps.nalData, pps.nalLength)); - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); String codecs = CodecSpecificDataUtil.buildAvcCodecString( spsData.profileIdc, @@ -224,11 +224,11 @@ public final class H264Reader implements ElementaryStreamReader { pps.reset(); } } else if (sps.isCompleted()) { - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); sampleReader.putSps(spsData); sps.reset(); } else if (pps.isCompleted()) { - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); sampleReader.putPps(ppsData); pps.reset(); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java index 9dccd88280..18e4d2edd4 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java @@ -243,10 +243,20 @@ public final class H265Reader implements ElementaryStreamReader { bitArray.skipBits(40 + 4); // NAL header, sps_video_parameter_set_id int maxSubLayersMinus1 = bitArray.readBits(3); bitArray.skipBit(); // sps_temporal_id_nesting_flag - - // profile_tier_level(1, sps_max_sub_layers_minus1) - bitArray.skipBits(88); // if (profilePresentFlag) {...} - bitArray.skipBits(8); // general_level_idc + int generalProfileSpace = bitArray.readBits(2); + boolean generalTierFlag = bitArray.readBit(); + int generalProfileIdc = bitArray.readBits(5); + int generalProfileCompatibilityFlags = 0; + for (int i = 0; i < 32; i++) { + if (bitArray.readBit()) { + generalProfileCompatibilityFlags |= (1 << i); + } + } + int[] constraintBytes = new int[6]; + for (int i = 0; i < constraintBytes.length; ++i) { + constraintBytes[i] = bitArray.readBits(8); + } + int generalLevelIdc = bitArray.readBits(8); int toSkip = 0; for (int i = 0; i < maxSubLayersMinus1; i++) { if (bitArray.readBit()) { // sub_layer_profile_present_flag[i] @@ -359,7 +369,9 @@ public final class H265Reader implements ElementaryStreamReader { // Parse the SPS to derive an RFC 6381 codecs string. bitArray.reset(sps.nalData, 0, sps.nalLength); bitArray.skipBits(24); // Skip start code. - String codecs = CodecSpecificDataUtil.buildHevcCodecStringFromSps(bitArray); + String codecs = CodecSpecificDataUtil.buildHevcCodecString( + generalProfileSpace, generalTierFlag, generalProfileIdc, + generalProfileCompatibilityFlags, constraintBytes, generalLevelIdc); return new Format.Builder() .setId(formatId) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java index a6c5577749..8f46a4afb7 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java @@ -66,9 +66,8 @@ public final class AvcConfig { @Nullable String codecs = null; if (numSequenceParameterSets > 0) { byte[] sps = initializationData.get(0); - SpsData spsData = - NalUnitUtil.parseSpsNalUnit( - initializationData.get(0), nalUnitLengthFieldLength, sps.length); + SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps, + nalUnitLengthFieldLength + 1, sps.length); width = spsData.width; height = spsData.height; pixelWidthAspectRatio = spsData.pixelWidthAspectRatio; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java index 567485ba92..a29b17fda1 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java @@ -16,11 +16,11 @@ package com.google.android.exoplayer2.video; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.util.CodecSpecificDataUtil; import com.google.android.exoplayer2.util.NalUnitUtil; import com.google.android.exoplayer2.util.ParsableByteArray; -import com.google.android.exoplayer2.util.ParsableNalUnitBitArray; import java.util.Collections; import java.util.List; @@ -58,6 +58,9 @@ public final class HevcConfig { data.setPosition(csdStartPosition); byte[] buffer = new byte[csdLength]; int bufferPosition = 0; + int width = Format.NO_VALUE; + int height = Format.NO_VALUE; + float pixelWidthAspectRatio = 1; @Nullable String codecs = null; for (int i = 0; i < numberOfArrays; i++) { int nalUnitType = data.readUnsignedByte() & 0x7F; // completeness (1), nal_unit_type (7) @@ -74,12 +77,16 @@ public final class HevcConfig { System.arraycopy( data.getData(), data.getPosition(), buffer, bufferPosition, nalUnitLength); if (nalUnitType == SPS_NAL_UNIT_TYPE && j == 0) { - ParsableNalUnitBitArray bitArray = - new ParsableNalUnitBitArray( - buffer, - /* offset= */ bufferPosition, - /* limit= */ bufferPosition + nalUnitLength); - codecs = CodecSpecificDataUtil.buildHevcCodecStringFromSps(bitArray); + NalUnitUtil.H265SpsData spsData = + NalUnitUtil.parseH265SpsNalUnitPayload( + buffer, bufferPosition + 1, bufferPosition + nalUnitLength); + width = spsData.picWidthInLumaSamples; + height = spsData.picHeightInLumaSamples; + pixelWidthAspectRatio = spsData.pixelWidthHeightRatio; + codecs = CodecSpecificDataUtil.buildHevcCodecString(spsData.generalProfileSpace, + spsData.generalTierFlag, spsData.generalProfileIdc, + spsData.generalProfileCompatibilityFlags, spsData.constraintBytes, + spsData.generalLevelIdc); } bufferPosition += nalUnitLength; data.skipBytes(nalUnitLength); @@ -88,7 +95,13 @@ public final class HevcConfig { @Nullable List initializationData = csdLength == 0 ? null : Collections.singletonList(buffer); - return new HevcConfig(initializationData, lengthSizeMinusOne + 1, codecs); + return new HevcConfig( + initializationData, + lengthSizeMinusOne + 1, + width, + height, + pixelWidthAspectRatio, + codecs); } catch (ArrayIndexOutOfBoundsException e) { throw ParserException.createForMalformedContainer("Error parsing HEVC config", e); } @@ -105,6 +118,9 @@ public final class HevcConfig { @Nullable public final List initializationData; /** The length of the NAL unit length field in the bitstream's container, in bytes. */ public final int nalUnitLengthFieldLength; + public final int width; + public final int height; + public final float pixelWidthHeightRatio; /** * An RFC 6381 codecs string representing the video format, or {@code null} if not known. * @@ -115,9 +131,15 @@ public final class HevcConfig { private HevcConfig( @Nullable List initializationData, int nalUnitLengthFieldLength, + int width, + int height, + float pixelWidthAspectRatio, @Nullable String codecs) { this.initializationData = initializationData; this.nalUnitLengthFieldLength = nalUnitLengthFieldLength; + this.width = width; + this.height = height; + this.pixelWidthHeightRatio = pixelWidthAspectRatio; this.codecs = codecs; } } diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java index 2f6a3c3c01..5fef4ce231 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java @@ -183,8 +183,8 @@ import com.google.common.collect.ImmutableMap; // Process SPS (Sequence Parameter Set). byte[] spsNalDataWithStartCode = initializationData.get(0); NalUnitUtil.SpsData spsData = - NalUnitUtil.parseSpsNalUnit( - spsNalDataWithStartCode, NAL_START_CODE.length, spsNalDataWithStartCode.length); + NalUnitUtil.parseSpsNalUnitPayload( + spsNalDataWithStartCode, NAL_START_CODE.length + 1, spsNalDataWithStartCode.length); formatBuilder.setPixelWidthHeightRatio(spsData.pixelWidthAspectRatio); formatBuilder.setHeight(spsData.height); formatBuilder.setWidth(spsData.width); From dbc708871670dccbf1face1de3c512dda90cbd08 Mon Sep 17 00:00:00 2001 From: Marcus Wichelmann Date: Mon, 13 Sep 2021 12:30:21 +0200 Subject: [PATCH 152/441] Keep the existing parseSpsNalUnit (and similar) methods to avoid breaking changes --- .../android/exoplayer2/util/NalUnitUtil.java | 51 ++++++++++++++++--- .../exoplayer2/util/NalUnitUtilTest.java | 7 ++- .../exoplayer2/extractor/ts/H264Reader.java | 8 +-- .../android/exoplayer2/video/AvcConfig.java | 5 +- .../android/exoplayer2/video/HevcConfig.java | 4 +- .../source/rtsp/RtspMediaTrack.java | 4 +- 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java index 4b267e0bfa..a911e939e5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java @@ -292,11 +292,24 @@ public final class NalUnitUtil { } /** - * Parses a SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection + * 7.3.2.1.1. + * + * @param nalData A buffer containing escaped SPS data. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the SPS data. + */ + public static SpsData parseSpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parseSpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) * subsection 7.3.2.1.1. * * @param nalData A buffer containing escaped SPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the SPS data. */ @@ -426,11 +439,24 @@ public final class NalUnitUtil { } /** - * Parses a H.265 SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.265 (2019) + * Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) * subsection 7.3.2.2.1. * * @param nalData A buffer containing escaped SPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the SPS data. + */ + public static H265SpsData parseH265SpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parseH265SpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) + * subsection 7.3.2.2.1. + * + * @param nalData A buffer containing escaped SPS data. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the SPS data. */ @@ -576,11 +602,24 @@ public final class NalUnitUtil { } /** - * Parses a PPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection + * 7.3.2.2. + * + * @param nalData A buffer containing escaped PPS data. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the PPS data. + */ + public static PpsData parsePpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parsePpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) * subsection 7.3.2.2. * * @param nalData A buffer containing escaped PPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the PPS data. */ diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java index 1d202c6eb6..4d9fc89a03 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java @@ -33,7 +33,7 @@ public final class NalUnitUtilTest { createByteArray( 0x00, 0x00, 0x01, 0x67, 0x4D, 0x40, 0x16, 0xEC, 0xA0, 0x50, 0x17, 0xFC, 0xB8, 0x08, 0x80, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x0F, 0x47, 0x8B, 0x16, 0xCB); - private static final int SPS_TEST_DATA_OFFSET = 4; + private static final int SPS_TEST_DATA_OFFSET = 3; @Test public void findNalUnit() { @@ -121,10 +121,9 @@ public final class NalUnitUtilTest { } @Test - public void parseSpsNalUnitPayload() { + public void parseSpsNalUnit() { NalUnitUtil.SpsData data = - NalUnitUtil.parseSpsNalUnitPayload( - SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); + NalUnitUtil.parseSpsNalUnit(SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); assertThat(data.width).isEqualTo(640); assertThat(data.height).isEqualTo(360); assertThat(data.deltaPicOrderAlwaysZeroFlag).isFalse(); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java index 8bdc00cc65..6790747ac9 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java @@ -200,8 +200,8 @@ public final class H264Reader implements ElementaryStreamReader { List initializationData = new ArrayList<>(); initializationData.add(Arrays.copyOf(sps.nalData, sps.nalLength)); initializationData.add(Arrays.copyOf(pps.nalData, pps.nalLength)); - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); String codecs = CodecSpecificDataUtil.buildAvcCodecString( spsData.profileIdc, @@ -224,11 +224,11 @@ public final class H264Reader implements ElementaryStreamReader { pps.reset(); } } else if (sps.isCompleted()) { - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); sampleReader.putSps(spsData); sps.reset(); } else if (pps.isCompleted()) { - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); sampleReader.putPps(ppsData); pps.reset(); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java index 8f46a4afb7..a6c5577749 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java @@ -66,8 +66,9 @@ public final class AvcConfig { @Nullable String codecs = null; if (numSequenceParameterSets > 0) { byte[] sps = initializationData.get(0); - SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps, - nalUnitLengthFieldLength + 1, sps.length); + SpsData spsData = + NalUnitUtil.parseSpsNalUnit( + initializationData.get(0), nalUnitLengthFieldLength, sps.length); width = spsData.width; height = spsData.height; pixelWidthAspectRatio = spsData.pixelWidthAspectRatio; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java index a29b17fda1..87ee8fa359 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java @@ -78,8 +78,8 @@ public final class HevcConfig { data.getData(), data.getPosition(), buffer, bufferPosition, nalUnitLength); if (nalUnitType == SPS_NAL_UNIT_TYPE && j == 0) { NalUnitUtil.H265SpsData spsData = - NalUnitUtil.parseH265SpsNalUnitPayload( - buffer, bufferPosition + 1, bufferPosition + nalUnitLength); + NalUnitUtil.parseH265SpsNalUnit( + buffer, bufferPosition, bufferPosition + nalUnitLength); width = spsData.picWidthInLumaSamples; height = spsData.picHeightInLumaSamples; pixelWidthAspectRatio = spsData.pixelWidthHeightRatio; diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java index 5fef4ce231..2f6a3c3c01 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java @@ -183,8 +183,8 @@ import com.google.common.collect.ImmutableMap; // Process SPS (Sequence Parameter Set). byte[] spsNalDataWithStartCode = initializationData.get(0); NalUnitUtil.SpsData spsData = - NalUnitUtil.parseSpsNalUnitPayload( - spsNalDataWithStartCode, NAL_START_CODE.length + 1, spsNalDataWithStartCode.length); + NalUnitUtil.parseSpsNalUnit( + spsNalDataWithStartCode, NAL_START_CODE.length, spsNalDataWithStartCode.length); formatBuilder.setPixelWidthHeightRatio(spsData.pixelWidthAspectRatio); formatBuilder.setHeight(spsData.height); formatBuilder.setWidth(spsData.width); From 45db77dc6ddfb0ca9de191faad184aaf90821012 Mon Sep 17 00:00:00 2001 From: Marcus Wichelmann Date: Mon, 13 Sep 2021 12:34:44 +0200 Subject: [PATCH 153/441] Fixed some spaces --- .../java/com/google/android/exoplayer2/util/NalUnitUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java index a911e939e5..d3d075abf4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java @@ -452,7 +452,7 @@ public final class NalUnitUtil { } /** - * Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) + * Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) * subsection 7.3.2.2.1. * * @param nalData A buffer containing escaped SPS data. @@ -615,7 +615,7 @@ public final class NalUnitUtil { } /** - * Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) + * Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) * subsection 7.3.2.2. * * @param nalData A buffer containing escaped PPS data. From 65001cc0e5063121420e698feaf7b1c5aabd0ed0 Mon Sep 17 00:00:00 2001 From: Marcus Wichelmann Date: Mon, 13 Sep 2021 16:48:08 +0200 Subject: [PATCH 154/441] Added javadoc comments to HevcConfig --- .../com/google/android/exoplayer2/video/HevcConfig.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java index 87ee8fa359..a2b62503c6 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java @@ -116,11 +116,19 @@ public final class HevcConfig { * @see com.google.android.exoplayer2.Format#initializationData */ @Nullable public final List initializationData; + /** The length of the NAL unit length field in the bitstream's container, in bytes. */ public final int nalUnitLengthFieldLength; + + /** The width of the encoded picture in luma samples. */ public final int width; + + /** The height of the encoded picture in luma samples. */ public final int height; + + /** The pixel aspect ratio. */ public final float pixelWidthHeightRatio; + /** * An RFC 6381 codecs string representing the video format, or {@code null} if not known. * From a951769eaa953b1fb328872ee2c7baf7e9bc42d5 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Fri, 10 Sep 2021 16:42:16 +0100 Subject: [PATCH 155/441] Transformer Demo: Reduce visibility of demo-only include. PiperOrigin-RevId: 395936070 --- constants.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index 005f125b98..4037f925ad 100644 --- a/constants.gradle +++ b/constants.gradle @@ -38,7 +38,6 @@ project.ext { androidxAnnotationVersion = '1.2.0' androidxAppCompatVersion = '1.3.0' androidxCollectionVersion = '1.1.0' - androidxConstraintLayoutVersion = '2.0.4' androidxCoreVersion = '1.3.2' androidxFuturesVersion = '1.1.0' androidxMediaVersion = '1.4.1' From 76014cf0e93d223e52790c1ddf28703b72283c76 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 13 Sep 2021 08:52:27 +0100 Subject: [PATCH 156/441] Add support for generating javadoc with Dackka PiperOrigin-RevId: 396297834 --- javadoc_combined.gradle | 72 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/javadoc_combined.gradle b/javadoc_combined.gradle index c40ffc8815..73c80358f6 100644 --- a/javadoc_combined.gradle +++ b/javadoc_combined.gradle @@ -16,22 +16,27 @@ apply from: "${buildscript.sourceFile.parentFile}/javadoc_util.gradle" class CombinedJavadocPlugin implements Plugin { - static final String TASK_NAME = "generateCombinedJavadoc" + static final String JAVADOC_TASK_NAME = "generateCombinedJavadoc" + static final String DACKKA_TASK_NAME = "generateCombinedDackka" + + static final String DACKKA_JAR_URL = + "https://androidx.dev/dackka/builds/7709825/artifacts/dackka-0.0.9.jar" @Override void apply(Project project) { project.gradle.projectsEvaluated { Set libraryModules = getLibraryModules(project) if (!libraryModules.isEmpty()) { - project.task(TASK_NAME, type: Javadoc) { + def guavaReferenceUrl = "https://guava.dev/releases/$project.ext.guavaVersion/api/docs" + + project.task(JAVADOC_TASK_NAME, type: Javadoc) { description = "Generates combined Javadoc." title = "ExoPlayer library" source = libraryModules.generateJavadoc.source classpath = project.files([]) destinationDir = project.file("$project.buildDir/docs/javadoc") options { - links "https://developer.android.com/reference", - "https://guava.dev/releases/$project.ext.guavaVersion/api/docs" + links "https://developer.android.com/reference", guavaReferenceUrl encoding = "UTF-8" } options.addBooleanOption "-no-module-directories", true @@ -60,6 +65,54 @@ class CombinedJavadocPlugin implements Plugin { project.fixJavadoc() } } + + project.task(DACKKA_TASK_NAME, type: JavaExec) { + doFirst { + // Recreate the output directory to remove any leftover files from a previous run. + def outputDir = project.file("$project.buildDir/docs/dackka") + project.delete outputDir + project.mkdir outputDir + + // Download the Dackka JAR. + new URL(DACKKA_JAR_URL).withInputStream { + i -> classpath.getSingleFile().withOutputStream { it << i } + } + + // Build lists of source files and dependencies. + def sources = [] + def dependencies = [] + libraryModules.each { libraryModule -> + libraryModule.android.libraryVariants.all { variant -> + def name = variant.buildType.name + if (name == "release") { + def classpathFiles = + project.files(variant.javaCompileProvider.get().classpath.files) + variant.sourceSets.inject(sources) { + acc, val -> acc << val.javaDirectories + } + dependencies << classpathFiles.filter { f -> !(f.path.contains("/buildout/")) } + dependencies << libraryModule.project.android.getBootClasspath() + } + } + } + + // Set command line arguments to Dackka. + def guavaPackageListFile = getGuavaPackageListFile(getTemporaryDir()) + def globalLinksString = "$guavaReferenceUrl^$guavaPackageListFile^^" + def sourcesString = project.files(sources.flatten()) + .filter({ f -> project.file(f).exists() }).join(";") + def dependenciesString = project.files(dependencies).asPath.replace(':', ';') + args("-moduleName", "", + "-outputDir", "$outputDir", + "-globalLinks", "$globalLinksString", + "-loggingLevel", "WARN", + "-sourceSet", "-src $sourcesString -classpath $dependenciesString", + "-offlineMode") + environment("DEVSITE_TENANT", "androidx") + } + description = "Generates combined javadoc for developer.android.com." + classpath = project.files(new File(getTemporaryDir(), "dackka.jar")) + } } } } @@ -72,6 +125,17 @@ class CombinedJavadocPlugin implements Plugin { } } + // Returns a file containing the list of packages that should be linked to Guava documentation. + private static File getGuavaPackageListFile(File directory) { + def packageListFile = new File(directory, "guava") + packageListFile.text = ["com.google.common.base", "com.google.common.collect", + "com.google.common.io", "com.google.common.math", + "com.google.common.net", "com.google.common.primitives", + "com.google.common.truth", "com.google.common.util.concurrent"] + .join('\n') + return packageListFile + } + } apply plugin: CombinedJavadocPlugin From ff7dcbd6f2d6a6e0cb3386fae303854acb97e224 Mon Sep 17 00:00:00 2001 From: claincly Date: Mon, 13 Sep 2021 09:34:57 +0100 Subject: [PATCH 157/441] Handle RTSP 301/302 redirection. PiperOrigin-RevId: 396303242 --- .../exoplayer2/source/rtsp/RtspClient.java | 34 +++++++++---- .../exoplayer2/source/rtsp/RtspHeaders.java | 3 ++ .../source/rtsp/RtspMessageUtil.java | 4 ++ .../source/rtsp/RtspClientTest.java | 50 +++++++++++++++++++ 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java index a800336531..665a387466 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java @@ -101,8 +101,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final SessionInfoListener sessionInfoListener; private final PlaybackEventListener playbackEventListener; - private final Uri uri; - @Nullable private final RtspAuthUserInfo rtspAuthUserInfo; private final String userAgent; private final boolean debugLoggingEnabled; private final ArrayDeque pendingSetupRtpLoadInfos; @@ -110,7 +108,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final SparseArray pendingRequests; private final MessageSender messageSender; + /** RTSP session URI. */ + private Uri uri; + private RtspMessageChannel messageChannel; + @Nullable private RtspAuthUserInfo rtspAuthUserInfo; @Nullable private String sessionId; @Nullable private KeepAliveMonitor keepAliveMonitor; @Nullable private RtspAuthenticationInfo rtspAuthenticationInfo; @@ -140,15 +142,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; boolean debugLoggingEnabled) { this.sessionInfoListener = sessionInfoListener; this.playbackEventListener = playbackEventListener; - this.uri = RtspMessageUtil.removeUserInfo(uri); - this.rtspAuthUserInfo = RtspMessageUtil.parseUserInfo(uri); this.userAgent = userAgent; this.debugLoggingEnabled = debugLoggingEnabled; - pendingSetupRtpLoadInfos = new ArrayDeque<>(); - pendingRequests = new SparseArray<>(); - messageSender = new MessageSender(); - pendingSeekPositionUs = C.TIME_UNSET; - messageChannel = new RtspMessageChannel(new MessageListener()); + this.pendingSetupRtpLoadInfos = new ArrayDeque<>(); + this.pendingRequests = new SparseArray<>(); + this.messageSender = new MessageSender(); + this.uri = RtspMessageUtil.removeUserInfo(uri); + this.messageChannel = new RtspMessageChannel(new MessageListener()); + this.rtspAuthUserInfo = RtspMessageUtil.parseUserInfo(uri); + this.pendingSeekPositionUs = C.TIME_UNSET; } /** @@ -482,6 +484,20 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; switch (response.status) { case 200: break; + case 301: + case 302: + // Redirection request. + @Nullable String redirectionUriString = response.headers.get(RtspHeaders.LOCATION); + if (redirectionUriString == null) { + sessionInfoListener.onSessionTimelineRequestFailed( + "Redirection without new location.", /* cause= */ null); + } else { + Uri redirectionUri = Uri.parse(redirectionUriString); + RtspClient.this.uri = RtspMessageUtil.removeUserInfo(redirectionUri); + RtspClient.this.rtspAuthUserInfo = RtspMessageUtil.parseUserInfo(redirectionUri); + messageSender.sendDescribeRequest(RtspClient.this.uri, RtspClient.this.sessionId); + } + return; case 401: if (rtspAuthUserInfo != null && !receivedAuthorizationRequest) { // Unauthorized. diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java index be228a414f..29fa0affb4 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java @@ -50,6 +50,7 @@ import java.util.Map; public static final String CSEQ = "CSeq"; public static final String DATE = "Date"; public static final String EXPIRES = "Expires"; + public static final String LOCATION = "Location"; public static final String PROXY_AUTHENTICATE = "Proxy-Authenticate"; public static final String PROXY_REQUIRE = "Proxy-Require"; public static final String PUBLIC = "Public"; @@ -251,6 +252,8 @@ import java.util.Map; return DATE; } else if (Ascii.equalsIgnoreCase(messageHeaderName, EXPIRES)) { return EXPIRES; + } else if (Ascii.equalsIgnoreCase(messageHeaderName, LOCATION)) { + return LOCATION; } else if (Ascii.equalsIgnoreCase(messageHeaderName, PROXY_AUTHENTICATE)) { return PROXY_AUTHENTICATE; } else if (Ascii.equalsIgnoreCase(messageHeaderName, PROXY_REQUIRE)) { diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index ece8b77653..4e8b7a08d0 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -462,6 +462,10 @@ import java.util.regex.Pattern; switch (statusCode) { case 200: return "OK"; + case 301: + return "Move Permanently"; + case 302: + return "Move Temporarily"; case 400: return "Bad Request"; case 401: diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java index 15237d1003..2ab0154b63 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java @@ -120,6 +120,56 @@ public final class RtspClientTest { assertThat(tracksInSession.get()).hasSize(2); } + @Test + public void connectServerAndClient_describeRedirects_updatesSessionTimeline() throws Exception { + class ResponseProvider implements RtspServer.ResponseProvider { + @Override + public RtspResponse getOptionsResponse() { + return new RtspResponse(/* status= */ 200, RtspHeaders.EMPTY); + } + + @Override + public RtspResponse getDescribeResponse(Uri requestedUri) { + if (!requestedUri.getPath().contains("redirect")) { + return new RtspResponse( + 301, + new RtspHeaders.Builder() + .add( + RtspHeaders.LOCATION, + requestedUri.buildUpon().appendEncodedPath("redirect").build().toString()) + .build()); + } + + return RtspTestUtils.newDescribeResponseWithSdpMessage( + SESSION_DESCRIPTION, rtpPacketStreamDumps, requestedUri); + } + } + rtspServer = new RtspServer(new ResponseProvider()); + + AtomicReference> tracksInSession = new AtomicReference<>(); + rtspClient = + new RtspClient( + new SessionInfoListener() { + @Override + public void onSessionTimelineUpdated( + RtspSessionTiming timing, ImmutableList tracks) { + tracksInSession.set(tracks); + } + + @Override + public void onSessionTimelineRequestFailed( + String message, @Nullable Throwable cause) {} + }, + EMPTY_PLAYBACK_LISTENER, + /* userAgent= */ "ExoPlayer:RtspClientTest", + RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()), + /* debugLoggingEnabled= */ false); + rtspClient.start(); + RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); + + assertThat(tracksInSession.get()).hasSize(2); + } + @Test public void connectServerAndClient_serverSupportsDescribeNoHeaderInOptions_updatesSessionTimeline() From d74be1780de7d6a77f8a36411904917c6e88ce54 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 13 Sep 2021 09:35:19 +0100 Subject: [PATCH 158/441] Fix issue ref PiperOrigin-RevId: 396303288 --- RELEASENOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 052b568b7d..244f05ecab 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -27,7 +27,7 @@ * Better handle invalid seek requests. Seeks to positions that are before the start or after the end of the media are now handled as seeks to the start and end respectively - ([8906](https://github.com/google/ExoPlayer/issues/8906)). + ([#8906](https://github.com/google/ExoPlayer/issues/8906)). * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). From 71a4b6337cde1657da30a84eeff29157c10936c3 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 13 Sep 2021 09:51:13 +0100 Subject: [PATCH 159/441] Fix javadoc consistency #exofixit PiperOrigin-RevId: 396304941 --- .../com/google/android/exoplayer2/util/BundleableUtils.java | 2 +- .../main/java/com/google/android/exoplayer2/util/Util.java | 2 +- .../main/java/com/google/android/exoplayer2/ExoPlayer.java | 2 +- .../java/com/google/android/exoplayer2/ExoPlayerImpl.java | 2 +- .../android/exoplayer2/mediacodec/MediaCodecRenderer.java | 2 +- .../java/com/google/android/exoplayer2/ui/PlayerView.java | 6 +++--- .../com/google/android/exoplayer2/ui/StyledPlayerView.java | 6 +++--- .../java/com/google/android/exoplayer2/ui/SubtitleView.java | 4 ++-- .../android/exoplayer2/testutil/AdditionalFailureInfo.java | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java index 1a29691dd8..932a3e8f7b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java @@ -135,7 +135,7 @@ public final class BundleableUtils { } /** - * Set the application class loader to the given {@link Bundle} if no class loader is present. + * Sets the application class loader to the given {@link Bundle} if no class loader is present. * *

    This assumes that all classes unparceled from {@code bundle} are sharing the class loader of * {@code BundleableUtils}. 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 c152bd5d05..e570ec77e3 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 @@ -1417,7 +1417,7 @@ public final class Util { } /** - * Return the long that is composed of the bits of the 2 specified integers. + * Returns the long that is composed of the bits of the 2 specified integers. * * @param mostSignificantBits The 32 most significant bits of the long to return. * @param leastSignificantBits The 32 least significant bits of the long to return. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 2d82609c74..02044ef0a8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -482,7 +482,7 @@ public interface ExoPlayer extends Player { } /** - * Set a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link + * Sets a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link * #setForegroundMode} takes more than {@code timeoutMs} milliseconds to complete, the player * will raise an error via {@link Player.Listener#onPlayerError}. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 9ba5c42394..49e5df4341 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -253,7 +253,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } /** - * Set a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link + * Sets a limit on the time a call to {@link #setForegroundMode} can spend. If a call to {@link * #setForegroundMode} takes more than {@code timeoutMs} milliseconds to complete, the player will * raise an error via {@link Player.Listener#onPlayerError}. * 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 fab14c4774..0836102ae6 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 @@ -416,7 +416,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } /** - * Set a limit on the time a single {@link #render(long, long)} call can spend draining and + * Sets a limit on the time a single {@link #render(long, long)} call can spend draining and * filling the decoder. * *

    This method should be called right after creating an instance of this class. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 9b36708740..d96170d4e2 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -555,7 +555,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link Player} to use. + * Sets the {@link Player} to use. * *

    To transition a {@link Player} from targeting one view to another, it's recommended to use * {@link #switchTargetView(Player, PlayerView, PlayerView)} rather than this method. If you do @@ -912,7 +912,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link PlayerControlView.VisibilityListener}. + * Sets the {@link PlayerControlView.VisibilityListener}. * * @param listener The listener to be notified about visibility changes, or null to remove the * current listener. @@ -1030,7 +1030,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link AspectRatioFrameLayout.AspectRatioListener}. + * Sets the {@link AspectRatioFrameLayout.AspectRatioListener}. * * @param listener The listener to be notified about aspect ratios changes of the video content or * the content frame. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 734a3561ca..72534209dc 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -562,7 +562,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link Player} to use. + * Sets the {@link Player} to use. * *

    To transition a {@link Player} from targeting one view to another, it's recommended to use * {@link #switchTargetView(Player, StyledPlayerView, StyledPlayerView)} rather than this method. @@ -917,7 +917,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link StyledPlayerControlView.VisibilityListener}. + * Sets the {@link StyledPlayerControlView.VisibilityListener}. * * @param listener The listener to be notified about visibility changes, or null to remove the * current listener. @@ -1067,7 +1067,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { } /** - * Set the {@link AspectRatioFrameLayout.AspectRatioListener}. + * Sets the {@link AspectRatioFrameLayout.AspectRatioListener}. * * @param listener The listener to be notified about aspect ratios changes of the video content or * the content frame. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java index ee62328b4e..5c5b630d5d 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleView.java @@ -163,7 +163,7 @@ public final class SubtitleView extends FrameLayout implements Player.Listener { } /** - * Set the type of {@link View} used to display subtitles. + * Sets the type of {@link View} used to display subtitles. * *

    NOTE: {@link #VIEW_TYPE_WEB} is currently very experimental, and doesn't support most * styling and layout properties of {@link Cue}. @@ -198,7 +198,7 @@ public final class SubtitleView extends FrameLayout implements Player.Listener { } /** - * Set the text size to a given unit and value. + * Sets the text size to a given unit and value. * *

    See {@link TypedValue} for the possible dimension units. * diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.java index 7818255075..bcaff7e19f 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.java @@ -48,7 +48,7 @@ public final class AdditionalFailureInfo implements TestRule { } /** - * Set the additional info to be added to any test failures. Pass {@code null} to skip adding any + * Sets the additional info to be added to any test failures. Pass {@code null} to skip adding any * additional info. * *

    Can be called from any thread. From 76d60b911ee8d362d5453d1ee328c6d9545c40db Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 13 Sep 2021 10:56:32 +0100 Subject: [PATCH 160/441] Migrate media item transition tests to TestExoPlayer PiperOrigin-RevId: 396313679 --- .../android/exoplayer2/ExoPlayerTest.java | 523 +++++++++--------- .../testutil/ExoPlayerTestRunner.java | 21 - .../exoplayer2/testutil/FakeMediaSource.java | 7 + .../android/exoplayer2/testutil/TestUtil.java | 19 + 4 files changed, 286 insertions(+), 284 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index fb2913fd70..e004a19a99 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -55,6 +55,7 @@ import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runU import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilTimelineChanged; import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM; import static com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem.oneByteSample; +import static com.google.android.exoplayer2.testutil.TestUtil.assertTimelinesSame; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertThrows; @@ -104,7 +105,6 @@ import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSourceEventListener; -import com.google.android.exoplayer2.source.SilenceMediaSource; import com.google.android.exoplayer2.source.SinglePeriodTimeline; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -7823,298 +7823,292 @@ public final class ExoPlayerTest { } @Test - public void setMediaSources_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource = factory.setTag("1").createMediaSource(); + public void setMediaSource_notifiesMediaItemTransition() { + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource) - .build() - .start() - .blockUntilEnded(TIMEOUT_MS); + player.setMediaSource(mediaSource); - exoPlayerTestRunner.assertMediaItemsTransitionedSame(mediaSource.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems).containsExactly(mediaSource.getMediaItem()); + assertThat(reportedTransitionReasons) + .containsExactly(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + player.release(); } @Test - public void setMediaSources_replaceWithSameMediaItem_notifiesMediaItemTransition() + public void setMediaSource_replaceWithSameMediaItem_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource = factory.setTag("1").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .waitForPlaybackState(Player.STATE_READY) - .setMediaSources(mediaSource) - .waitForPlaybackState(Player.STATE_READY) - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.setMediaSource(mediaSource); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); + player.setMediaSource(mediaSource); - exoPlayerTestRunner.assertMediaItemsTransitionedSame( - mediaSource.getMediaItem(), mediaSource.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems) + .containsExactly(mediaSource.getMediaItem(), mediaSource.getMediaItem()); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + player.release(); } @Test public void automaticWindowTransition_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .build() - .start() - .blockUntilEnded(TIMEOUT_MS); + player.play(); + runUntilPlaybackState(player, Player.STATE_ENDED); - exoPlayerTestRunner.assertMediaItemsTransitionedSame( - mediaSource1.getMediaItem(), mediaSource2.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_AUTO); + assertThat(reportedMediaItems) + .containsExactly(mediaSource1.getMediaItem(), mediaSource2.getMediaItem()) + .inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_AUTO) + .inOrder(); + player.release(); } @Test - public void clearMediaItem_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 2000) - .clearMediaItems() - .build(); + public void clearMediaItems_notifiesMediaItemTransition() throws Exception { + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); + player.play(); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.clearMediaItems(); - exoPlayerTestRunner.assertMediaItemsTransitionedSame( - mediaSource1.getMediaItem(), mediaSource2.getMediaItem(), null); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_AUTO, - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems) + .containsExactly(mediaSource1.getMediaItem(), mediaSource2.getMediaItem(), null) + .inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_AUTO, + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED) + .inOrder(); + player.release(); } @Test public void seekTo_otherWindow_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .waitForPlaybackState(Player.STATE_READY) - .seek(/* windowIndex= */ 1, /* positionMs= */ 2000) - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 2000); - exoPlayerTestRunner.assertMediaItemsTransitionedSame( - mediaSource1.getMediaItem(), mediaSource2.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_SEEK); + assertThat(reportedMediaItems) + .containsExactly(mediaSource1.getMediaItem(), mediaSource2.getMediaItem()) + .inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_SEEK) + .inOrder(); + player.release(); } @Test public void seekTo_sameWindow_doesNotNotifyMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) - .seek(/* windowIndex= */ 0, /* positionMs= */ 20_000) - .stop() - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 2000); - exoPlayerTestRunner.assertMediaItemsTransitionedSame(mediaSource1.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems).containsExactly(mediaSource1.getMediaItem()).inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED) + .inOrder(); + player.release(); } @Test public void repeat_notifiesMediaItemTransition() throws Exception { - MediaItem mediaItem1 = MediaItem.fromUri("http://foo.bar/fake1"); - TimelineWindowDefinition window1 = - new TimelineWindowDefinition( - /* periodCount= */ 1, - /* id= */ 1, - /* isSeekable= */ true, - /* isDynamic= */ false, - /* isLive= */ false, - /* isPlaceholder= */ false, - /* durationUs = */ 100_000, - /* defaultPositionUs = */ 0, - /* windowOffsetInFirstPeriodUs= */ 0, - AdPlaybackState.NONE, - mediaItem1); - MediaItem mediaItem2 = MediaItem.fromUri("http://foo.bar/fake2"); - TimelineWindowDefinition window2 = - new TimelineWindowDefinition( - /* periodCount= */ 1, - /* id= */ 2, - /* isSeekable= */ true, - /* isDynamic= */ false, - /* isLive= */ false, - /* isPlaceholder= */ false, - /* durationUs = */ 100_000, - /* defaultPositionUs = */ 0, - /* windowOffsetInFirstPeriodUs= */ 0, - AdPlaybackState.NONE, - mediaItem2); - FakeMediaSource mediaSource1 = new FakeMediaSource(new FakeTimeline(window1)); - FakeMediaSource mediaSource2 = new FakeMediaSource(new FakeTimeline(window2)); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .executeRunnable( - new PlayerRunnable() { - @Override - public void run(SimpleExoPlayer player) { - player.setRepeatMode(Player.REPEAT_MODE_ONE); - } - }) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 90) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 80) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 70) - .executeRunnable( - new PlayerRunnable() { - @Override - public void run(SimpleExoPlayer player) { - player.setRepeatMode(Player.REPEAT_MODE_OFF); - } - }) - .play() - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.setRepeatMode(Player.REPEAT_MODE_ONE); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.play(); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); + player.setRepeatMode(Player.REPEAT_MODE_OFF); + runUntilPlaybackState(player, Player.STATE_ENDED); - exoPlayerTestRunner.assertMediaItemsTransitionedSame( - mediaSource1.getMediaItem(), - mediaSource1.getMediaItem(), - mediaSource1.getMediaItem(), - mediaSource2.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT, - Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT, - Player.MEDIA_ITEM_TRANSITION_REASON_AUTO); + assertThat(reportedMediaItems) + .containsExactly( + mediaSource1.getMediaItem(), + mediaSource1.getMediaItem(), + mediaSource1.getMediaItem(), + mediaSource2.getMediaItem()) + .inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT, + Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT, + Player.MEDIA_ITEM_TRANSITION_REASON_AUTO) + .inOrder(); + player.release(); } + // Tests deprecated stop(boolean reset) + @SuppressWarnings("deprecation") @Test public void stop_withReset_notifiesMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) - .stop(/* reset= */ true) - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.stop(/* reset= */ true); - exoPlayerTestRunner.assertMediaItemsTransitionedSame(mediaSource1.getMediaItem(), null); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems).containsExactly(mediaSource1.getMediaItem(), null).inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly( + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED) + .inOrder(); + player.release(); } @Test public void stop_withoutReset_doesNotNotifyMediaItemTransition() throws Exception { - SilenceMediaSource.Factory factory = - new SilenceMediaSource.Factory().setDurationUs(C.msToUs(100_000)); - SilenceMediaSource mediaSource1 = factory.setTag("1").createMediaSource(); - SilenceMediaSource mediaSource2 = factory.setTag("2").createMediaSource(); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) - .stop(/* reset= */ false) - .build(); + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + MediaSource mediaSource1 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + MediaSource mediaSource2 = FakeMediaSource.createWithWindowId(/* windowId= */ new Object()); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2)); + player.prepare(); + runUntilPlaybackState(player, Player.STATE_READY); - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource1, mediaSource2) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + player.stop(); - exoPlayerTestRunner.assertMediaItemsTransitionedSame(mediaSource1.getMediaItem()); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); + assertThat(reportedMediaItems).containsExactly(mediaSource1.getMediaItem()).inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED) + .inOrder(); + player.release(); } @Test public void timelineRefresh_withModifiedMediaItem_doesNotNotifyMediaItemTransition() throws Exception { + List reportedMediaItems = new ArrayList<>(); + List reportedTransitionReasons = new ArrayList<>(); + List reportedTimelines = new ArrayList<>(); MediaItem initialMediaItem = FakeTimeline.FAKE_MEDIA_ITEM.buildUpon().setTag(0).build(); TimelineWindowDefinition initialWindow = new TimelineWindowDefinition( @@ -8145,32 +8139,35 @@ public final class ExoPlayerTest { FakeTimeline timeline = new FakeTimeline(initialWindow); FakeTimeline newTimeline = new FakeTimeline(secondWindow); FakeMediaSource mediaSource = new FakeMediaSource(timeline); - ActionSchedule actionSchedule = - new ActionSchedule.Builder(TAG) - .pause() - .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) - .waitForPlayWhenReady(false) - .executeRunnable( - () -> { - mediaSource.setNewSourceInfo(newTimeline); - }) - .play() - .build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.addListener( + new Listener() { + @Override + public void onTimelineChanged(Timeline timeline, int reason) { + reportedTimelines.add(timeline); + } - ExoPlayerTestRunner exoPlayerTestRunner = - new ExoPlayerTestRunner.Builder(context) - .setMediaSources(mediaSource) - .setActionSchedule(actionSchedule) - .build() - .start() - .blockUntilActionScheduleFinished(TIMEOUT_MS) - .blockUntilEnded(TIMEOUT_MS); + @Override + public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { + reportedMediaItems.add(mediaItem); + reportedTransitionReasons.add(reason); + } + }); + player.setMediaSource(mediaSource); + player.prepare(); + player.play(); + runUntilPlaybackState(player, Player.STATE_READY); - exoPlayerTestRunner.assertTimelinesSame(placeholderTimeline, timeline, newTimeline); - exoPlayerTestRunner.assertMediaItemsTransitionReasonsEqual( - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED); - exoPlayerTestRunner.assertMediaItemsTransitionedSame(initialMediaItem); + mediaSource.setNewSourceInfo(newTimeline); + runUntilPlaybackState(player, Player.STATE_ENDED); + + assertTimelinesSame( + reportedTimelines, ImmutableList.of(placeholderTimeline, timeline, newTimeline)); + assertThat(reportedMediaItems).containsExactly(initialMediaItem).inOrder(); + assertThat(reportedTransitionReasons) + .containsExactly(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED) + .inOrder(); + player.release(); } @Test diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index b302d571d8..682de8d56c 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -554,27 +554,6 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul assertThat(timelineChangeReasons).containsExactlyElementsIn(Arrays.asList(reasons)).inOrder(); } - /** - * Asserts that the media items reported by {@link - * Player.Listener#onMediaItemTransition(MediaItem, int)} are the same as the provided media - * items. - * - * @param mediaItems A list of expected {@link MediaItem media items}. - */ - public void assertMediaItemsTransitionedSame(MediaItem... mediaItems) { - assertThat(this.mediaItems).containsExactlyElementsIn(mediaItems).inOrder(); - } - - /** - * Asserts that the media item transition reasons reported by {@link - * Player.Listener#onMediaItemTransition(MediaItem, int)} are the same as the provided reasons. - * - * @param reasons A list of expected transition reasons. - */ - public void assertMediaItemsTransitionReasonsEqual(Integer... reasons) { - assertThat(this.mediaItemTransitionReasons).containsExactlyElementsIn(reasons).inOrder(); - } - /** * Asserts that the playback states reported by {@link * Player.Listener#onPlaybackStateChanged(int)} are equal to the provided playback states. 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 835828aa8b..330450173b 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 @@ -73,6 +73,13 @@ public class FakeMediaSource extends BaseMediaSource { } } + /** Convenience method to create a {@link FakeMediaSource} with the given window id. */ + public static FakeMediaSource createWithWindowId(Object windowId) { + return new FakeMediaSource( + new FakeTimeline( + new FakeTimeline.TimelineWindowDefinition(/* periodCount= */ 1, windowId))); + } + /** The media item used by the fake media source. */ public static final MediaItem FAKE_MEDIA_ITEM = new MediaItem.Builder().setMediaId("FakeMediaSource").setUri("http://manifest.uri").build(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java index 295091ed2b..462ccc5e6d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java @@ -26,6 +26,7 @@ import android.graphics.Color; import android.media.MediaCodec; import android.net.Uri; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.database.DatabaseProvider; import com.google.android.exoplayer2.database.DefaultDatabaseProvider; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; @@ -45,6 +46,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; +import java.util.List; import java.util.Random; /** Utility methods for tests. */ @@ -183,6 +185,23 @@ public class TestUtil { }); } + /** + * Asserts that the actual timelines are the same to the expected timelines. This assert differs + * from testing equality by not comparing period ids which may be different due to id mapping of + * child source period ids. + * + * @param actualTimelines A list of actual {@link Timeline timelines}. + * @param expectedTimelines A list of expected {@link Timeline timelines}. + */ + public static void assertTimelinesSame( + List actualTimelines, List expectedTimelines) { + assertThat(actualTimelines).hasSize(expectedTimelines.size()); + for (int i = 0; i < actualTimelines.size(); i++) { + assertThat(new NoUidTimeline(actualTimelines.get(i))) + .isEqualTo(new NoUidTimeline(expectedTimelines.get(i))); + } + } + /** * Asserts that data read from a {@link DataSource} matches {@code expected}. * From cd91ae4053b17952decae2b01e5dd95ce47247ba Mon Sep 17 00:00:00 2001 From: christosts Date: Mon, 13 Sep 2021 12:59:22 +0100 Subject: [PATCH 161/441] PlaybackStatsListener: add check when adding guessed times This is was reported in #9257 where the PlaybackStatsListener may try to access an emtpy ArrayList. Issue: #9257 #minor-release #exofixit PiperOrigin-RevId: 396329373 --- .../exoplayer2/analytics/PlaybackStatsListener.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java index fd349ea60c..e061066788 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java @@ -769,10 +769,12 @@ public final class PlaybackStatsListener } } } - mediaTimeHistory.add( - mediaTimeMs == C.TIME_UNSET - ? guessMediaTimeBasedOnElapsedRealtime(realtimeMs) - : new long[] {realtimeMs, mediaTimeMs}); + + if (mediaTimeMs != C.TIME_UNSET) { + mediaTimeHistory.add(new long[] {realtimeMs, mediaTimeMs}); + } else if (!mediaTimeHistory.isEmpty()) { + mediaTimeHistory.add(guessMediaTimeBasedOnElapsedRealtime(realtimeMs)); + } } private long[] guessMediaTimeBasedOnElapsedRealtime(long realtimeMs) { From 040a45f3101c7b123e2b58bf77d18dd8ed8ddba6 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 13 Sep 2021 13:00:59 +0100 Subject: [PATCH 162/441] Remove deprecated getDefaultRequestProperties from HttpDataSource #exo-fixit PiperOrigin-RevId: 396329591 --- RELEASENOTES.md | 2 ++ .../exoplayer2/ext/cronet/CronetDataSource.java | 7 ------- .../exoplayer2/ext/okhttp/OkHttpDataSource.java | 7 ------- .../exoplayer2/upstream/DefaultHttpDataSource.java | 7 ------- .../android/exoplayer2/upstream/HttpDataSource.java | 11 ----------- 5 files changed, 2 insertions(+), 32 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 244f05ecab..fd02527b4d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -78,6 +78,8 @@ * Remove `SingleSampleMediaSource.createMediaSource(Uri, Format, long)`. Use `SingleSampleMediaSource.createMediaSource(MediaItem.Subtitle, long)` instead. + * Remove `HttpDataSource.Factory.getDefaultRequestProperties`. Use + `HttpDataSource.Factory.setDefaultRequestProperties` instead. * Remove `GvrAudioProcessor` and the GVR extension, which has been deprecated since 2.11.0. * Cast extension: diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index 483df638b3..3b8b6916ce 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -140,13 +140,6 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS; } - /** @deprecated Use {@link #setDefaultRequestProperties(Map)} instead. */ - @Deprecated - @Override - public final RequestProperties getDefaultRequestProperties() { - return defaultRequestProperties; - } - @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); diff --git a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java index 9d5d1cc5a0..a40fb95680 100644 --- a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java +++ b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java @@ -87,13 +87,6 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { defaultRequestProperties = new RequestProperties(); } - /** @deprecated Use {@link #setDefaultRequestProperties(Map)} instead. */ - @Deprecated - @Override - public final RequestProperties getDefaultRequestProperties() { - return defaultRequestProperties; - } - @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java index d2c6b5e993..bcd878fcbc 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java @@ -78,13 +78,6 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS; } - /** @deprecated Use {@link #setDefaultRequestProperties(Map)} instead. */ - @Deprecated - @Override - public final RequestProperties getDefaultRequestProperties() { - return defaultRequestProperties; - } - @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java index 150d983348..e76e6f0414 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java @@ -42,10 +42,6 @@ public interface HttpDataSource extends DataSource { @Override HttpDataSource createDataSource(); - /** @deprecated Use {@link #setDefaultRequestProperties(Map)} instead. */ - @Deprecated - RequestProperties getDefaultRequestProperties(); - /** * Sets the default request headers for {@link HttpDataSource} instances created by the factory. * @@ -153,13 +149,6 @@ public interface HttpDataSource extends DataSource { return createDataSourceInternal(defaultRequestProperties); } - /** @deprecated Use {@link #setDefaultRequestProperties(Map)} instead. */ - @Deprecated - @Override - public final RequestProperties getDefaultRequestProperties() { - return defaultRequestProperties; - } - @Override public final Factory setDefaultRequestProperties(Map defaultRequestProperties) { this.defaultRequestProperties.clearAndSet(defaultRequestProperties); From 469c0e756a0c7bae04eb020055a068491541096a Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 13 Sep 2021 13:28:26 +0100 Subject: [PATCH 163/441] Use `@C.TrackType` more widely Also add `TYPE_USE` target on the @IntDef (and fix @Targets for other @IntDefs). #exofixit PiperOrigin-RevId: 396333212 --- .../android/exoplayer2/demo/IntentUtil.java | 2 +- .../exoplayer2/ext/cast/CastPlayer.java | 4 ++-- .../java/com/google/android/exoplayer2/C.java | 3 +++ .../google/android/exoplayer2/DeviceInfo.java | 2 +- .../google/android/exoplayer2/MediaItem.java | 14 ++++++++------ .../android/exoplayer2/util/MimeTypes.java | 19 +++++++++---------- .../google/android/exoplayer2/util/Util.java | 7 ++++--- .../android/exoplayer2/BaseRenderer.java | 6 +++--- .../google/android/exoplayer2/ExoPlayer.java | 3 ++- .../android/exoplayer2/ExoPlayerImpl.java | 2 +- .../android/exoplayer2/NoSampleRenderer.java | 2 +- .../exoplayer2/RendererCapabilities.java | 3 ++- .../android/exoplayer2/SimpleExoPlayer.java | 2 +- .../exoplayer2/analytics/PlaybackStats.java | 2 +- .../analytics/PlaybackStatsListener.java | 1 + .../drm/DefaultDrmSessionManager.java | 10 +++++----- .../AsynchronousMediaCodecAdapter.java | 4 ++-- .../exoplayer2/source/MediaLoadData.java | 6 +++--- .../source/chunk/BaseMediaChunkOutput.java | 5 +++-- .../source/chunk/BundledChunkExtractor.java | 7 +++---- .../source/chunk/ChunkExtractor.java | 9 ++++----- .../source/chunk/ChunkSampleStream.java | 2 +- .../chunk/MediaParserChunkExtractor.java | 6 +++--- .../source/chunk/SingleSampleMediaChunk.java | 7 +++---- .../mediaparser/OutputConsumerAdapterV30.java | 11 +++++------ .../trackselection/MappingTrackSelector.java | 12 ++++++------ .../source/dash/DashChunkSource.java | 8 +++++--- .../source/dash/DashMediaPeriod.java | 2 +- .../exoplayer2/source/dash/DashUtil.java | 4 ++-- .../source/dash/DefaultDashChunkSource.java | 8 ++++---- .../source/dash/manifest/AdaptationSet.java | 2 +- .../dash/manifest/DashManifestParser.java | 3 +-- .../exoplayer2/extractor/mp4/AtomParsers.java | 4 ++-- .../exoplayer2/extractor/mp4/Track.java | 2 +- .../source/hls/HlsSampleStreamWrapper.java | 2 +- .../smoothstreaming/manifest/SsManifest.java | 2 +- .../exoplayer2/transformer/MuxerWrapper.java | 16 +++++++++------- .../transformer/TransformerMediaClock.java | 2 +- 38 files changed, 107 insertions(+), 99 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index b285374e16..903c031491 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -216,7 +216,7 @@ public class IntentUtil { } intent.putExtra(DRM_KEY_REQUEST_PROPERTIES_EXTRA + extrasKeySuffix, drmKeyRequestProperties); - List drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; + List<@C.TrackType Integer> drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; if (!drmSessionForClearTypes.isEmpty()) { // Only video and audio together are supported. Assertions.checkState( diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 3e6f7a7e8a..e42e7bbee4 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -1022,7 +1022,7 @@ public final class CastPlayer extends BasePlayer { trackGroups[i] = new TrackGroup(CastUtils.mediaTrackToFormat(mediaTrack)); long id = mediaTrack.getId(); - int trackType = MimeTypes.getTrackType(mediaTrack.getContentType()); + @C.TrackType int trackType = MimeTypes.getTrackType(mediaTrack.getContentType()); int rendererIndex = getRendererIndexForTrackType(trackType); if (isTrackActive(id, activeTrackIds) && rendererIndex != C.INDEX_UNSET @@ -1289,7 +1289,7 @@ public final class CastPlayer extends BasePlayer { return false; } - private static int getRendererIndexForTrackType(int trackType) { + private static int getRendererIndexForTrackType(@C.TrackType int trackType) { return trackType == C.TRACK_TYPE_VIDEO ? RENDERER_INDEX_VIDEO : trackType == C.TRACK_TYPE_AUDIO diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index d641c9c8a1..6a2755fe6c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -29,8 +29,10 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.errorprone.annotations.InlineMe; import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.UUID; /** Defines constants used by the library. */ @@ -658,6 +660,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({ElementType.TYPE_USE}) @IntDef( open = true, value = { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java index 419cb8ff1d..9ae078ae32 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/DeviceInfo.java @@ -30,7 +30,7 @@ public final class DeviceInfo implements Bundleable { /** Types of playback. One of {@link #PLAYBACK_TYPE_LOCAL} or {@link #PLAYBACK_TYPE_REMOTE}. */ @Documented @Retention(RetentionPolicy.SOURCE) - @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) + @Target({ElementType.TYPE_USE}) @IntDef({ PLAYBACK_TYPE_LOCAL, PLAYBACK_TYPE_REMOTE, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index c881b9d412..0e3e17d5a9 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -325,7 +325,8 @@ public final class MediaItem implements Bundleable { * DrmConfiguration.Builder#setSessionForClearTypes(List)} instead. */ @Deprecated - public Builder setDrmSessionForClearTypes(@Nullable List sessionForClearTypes) { + public Builder setDrmSessionForClearTypes( + @Nullable List<@C.TrackType Integer> sessionForClearTypes) { drmConfiguration.setSessionForClearTypes(sessionForClearTypes); return this; } @@ -567,7 +568,7 @@ public final class MediaItem implements Bundleable { private boolean multiSession; private boolean playClearContentWithoutKey; private boolean forceDefaultLicenseUri; - private ImmutableList sessionForClearTypes; + private ImmutableList<@C.TrackType Integer> sessionForClearTypes; @Nullable private byte[] keySetId; /** @@ -679,18 +680,19 @@ public final class MediaItem implements Bundleable { } /** - * Sets a list of {@link C}{@code .TRACK_TYPE_*} constants for which to use a DRM session even + * Sets a list of {@link C.TrackType track type} constants for which to use a DRM session even * when the tracks are in the clear. * *

    For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link - * C#TRACK_TYPE_AUDIO} the {@link #setSessionForClearPeriods(boolean)} can be used. + * C#TRACK_TYPE_AUDIO}, {@link #setSessionForClearPeriods(boolean)} can be used. * *

    This method overrides what has been set by previously calling {@link * #setSessionForClearPeriods(boolean)}. * *

    {@code null} or an empty {@link List} can be used for a reset. */ - public Builder setSessionForClearTypes(@Nullable List sessionForClearTypes) { + public Builder setSessionForClearTypes( + @Nullable List<@C.TrackType Integer> sessionForClearTypes) { this.sessionForClearTypes = sessionForClearTypes != null ? ImmutableList.copyOf(sessionForClearTypes) @@ -744,7 +746,7 @@ public final class MediaItem implements Bundleable { public final boolean forceDefaultLicenseUri; /** The types of clear tracks for which to use a DRM session. */ - public final ImmutableList sessionForClearTypes; + public final ImmutableList<@C.TrackType Integer> sessionForClearTypes; @Nullable private final byte[] keySetId; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 60d7c8e46a..f729621172 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -154,10 +154,11 @@ public final class MimeTypes { * * @param mimeType The custom MIME type to register. * @param codecPrefix The RFC 6381 codec string prefix associated with the MIME type. - * @param trackType The {@link C}{@code .TRACK_TYPE_*} constant associated with the MIME type. - * This value is ignored if the top-level type of {@code mimeType} is audio, video or text. + * @param trackType The {@link C.TrackType track type} associated with the MIME type. This value + * is ignored if the top-level type of {@code mimeType} is audio, video or text. */ - public static void registerCustomMimeType(String mimeType, String codecPrefix, int trackType) { + public static void registerCustomMimeType( + String mimeType, String codecPrefix, @C.TrackType int trackType) { CustomMimeType customMimeType = new CustomMimeType(mimeType, codecPrefix, trackType); int customMimeTypeCount = customMimeTypes.size(); for (int i = 0; i < customMimeTypeCount; i++) { @@ -493,8 +494,7 @@ public final class MimeTypes { * @return The corresponding {@link C.TrackType track type}, which may be {@link * C#TRACK_TYPE_UNKNOWN} if it could not be determined. */ - @C.TrackType - public static int getTrackType(@Nullable String mimeType) { + public static @C.TrackType int getTrackType(@Nullable String mimeType) { if (TextUtils.isEmpty(mimeType)) { return C.TRACK_TYPE_UNKNOWN; } else if (isAudio(mimeType)) { @@ -563,8 +563,7 @@ public final class MimeTypes { * @return The corresponding {@link C.TrackType track type}, which may be {@link * C#TRACK_TYPE_UNKNOWN} if it could not be determined. */ - @C.TrackType - public static int getTrackTypeOfCodec(String codec) { + public static @C.TrackType int getTrackTypeOfCodec(String codec) { return getTrackType(getMediaMimeType(codec)); } @@ -628,7 +627,7 @@ public final class MimeTypes { return null; } - private static int getTrackTypeForCustomMimeType(String mimeType) { + private static @C.TrackType int getTrackTypeForCustomMimeType(String mimeType) { int customMimeTypeCount = customMimeTypes.size(); for (int i = 0; i < customMimeTypeCount; i++) { CustomMimeType customMimeType = customMimeTypes.get(i); @@ -721,9 +720,9 @@ public final class MimeTypes { private static final class CustomMimeType { public final String mimeType; public final String codecPrefix; - public final int trackType; + public final @C.TrackType int trackType; - public CustomMimeType(String mimeType, String codecPrefix, int trackType) { + public CustomMimeType(String mimeType, String codecPrefix, @C.TrackType int trackType) { this.mimeType = mimeType; this.codecPrefix = codecPrefix; this.trackType = trackType; 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 e570ec77e3..ec913e52e1 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 @@ -1539,11 +1539,12 @@ public final class Util { * trackType}. * * @param codecs A codec sequence string, as defined in RFC 6381. - * @param trackType One of {@link C}{@code .TRACK_TYPE_*}. + * @param trackType The {@link C.TrackType track type}. * @return A copy of {@code codecs} without the codecs whose track type doesn't match {@code - * trackType}. If this ends up empty, or {@code codecs} is null, return null. + * trackType}. If this ends up empty, or {@code codecs} is null, returns null. */ - public static @Nullable String getCodecsOfType(@Nullable String codecs, int trackType) { + @Nullable + public static String getCodecsOfType(@Nullable String codecs, @C.TrackType int trackType) { String[] codecArray = splitCodecs(codecs); if (codecArray.length == 0) { return null; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 91e3f4ac76..91330e7be7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -30,7 +30,7 @@ import java.io.IOException; /** An abstract base class suitable for most {@link Renderer} implementations. */ public abstract class BaseRenderer implements Renderer, RendererCapabilities { - private final int trackType; + private final @C.TrackType int trackType; private final FormatHolder formatHolder; @Nullable private RendererConfiguration configuration; @@ -48,14 +48,14 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { * @param trackType The track type that the renderer handles. One of the {@link C} {@code * TRACK_TYPE_*} constants. */ - public BaseRenderer(int trackType) { + public BaseRenderer(@C.TrackType int trackType) { this.trackType = trackType; formatHolder = new FormatHolder(); readingPositionUs = C.TIME_END_OF_SOURCE; } @Override - public final int getTrackType() { + public final @C.TrackType int getTrackType() { return trackType; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 02044ef0a8..990c4b9f3e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -897,8 +897,9 @@ public interface ExoPlayer extends Player { * return {@link C#TRACK_TYPE_AUDIO} and a text renderer will return {@link C#TRACK_TYPE_TEXT}. * * @param index The index of the renderer. - * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. + * @return The {@link C.TrackType track type} that the renderer handles. */ + @C.TrackType int getRendererType(int index); /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 49e5df4341..96015815ae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -928,7 +928,7 @@ import java.util.concurrent.CopyOnWriteArraySet; return renderers.length; } - public int getRendererType(int index) { + public @C.TrackType int getRendererType(int index) { return renderers[index].getTrackType(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java index b6f8482ac9..0038b9ab8f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java @@ -35,7 +35,7 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities private boolean streamIsFinal; @Override - public final int getTrackType() { + public final @C.TrackType int getTrackType() { return C.TRACK_TYPE_NONE; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/RendererCapabilities.java b/library/core/src/main/java/com/google/android/exoplayer2/RendererCapabilities.java index 37176cb752..62eaa49b9e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/RendererCapabilities.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/RendererCapabilities.java @@ -201,8 +201,9 @@ public interface RendererCapabilities { * text renderer will return {@link C#TRACK_TYPE_TEXT}, and so on. * * @see Renderer#getTrackType() - * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. + * @return The {@link C.TrackType track type}. */ + @C.TrackType int getTrackType(); /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 2e2615cfca..d6413fb4ac 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1427,7 +1427,7 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public int getRendererType(int index) { + public @C.TrackType int getRendererType(int index) { verifyApplicationThread(); return player.getRendererType(index); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java index 3c6929bdbf..0c23877c27 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java @@ -172,7 +172,7 @@ public final class PlaybackStats { */ @Documented @Retention(RetentionPolicy.SOURCE) - @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) + @Target({ElementType.TYPE_USE}) @IntDef({ PLAYBACK_STATE_NOT_STARTED, PLAYBACK_STATE_JOINING_BACKGROUND, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java index e061066788..35adc83bd6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java @@ -527,6 +527,7 @@ public final class PlaybackStatsListener boolean audioEnabled = false; for (TrackSelection trackSelection : player.getCurrentTrackSelections().getAll()) { if (trackSelection != null && trackSelection.length() > 0) { + @C.TrackType int trackType = MimeTypes.getTrackType(trackSelection.getFormat(0).sampleMimeType); if (trackType == C.TRACK_TYPE_VIDEO) { videoEnabled = true; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index ac02fb1aed..ad5ba1427b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -74,7 +74,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { private UUID uuid; private ExoMediaDrm.Provider exoMediaDrmProvider; private boolean multiSession; - private int[] useDrmSessionsForClearContentTrackTypes; + private @C.TrackType int[] useDrmSessionsForClearContentTrackTypes; private boolean playClearSamplesWithoutKeys; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private long sessionKeepaliveMs; @@ -165,8 +165,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { * track types other than {@link C#TRACK_TYPE_AUDIO} and {@link C#TRACK_TYPE_VIDEO}. */ public Builder setUseDrmSessionsForClearContent( - int... useDrmSessionsForClearContentTrackTypes) { - for (int trackType : useDrmSessionsForClearContentTrackTypes) { + @C.TrackType int... useDrmSessionsForClearContentTrackTypes) { + for (@C.TrackType int trackType : useDrmSessionsForClearContentTrackTypes) { checkArgument(trackType == C.TRACK_TYPE_VIDEO || trackType == C.TRACK_TYPE_AUDIO); } this.useDrmSessionsForClearContentTrackTypes = @@ -282,7 +282,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { private final MediaDrmCallback callback; private final HashMap keyRequestParameters; private final boolean multiSession; - private final int[] useDrmSessionsForClearContentTrackTypes; + private final @C.TrackType int[] useDrmSessionsForClearContentTrackTypes; private final boolean playClearSamplesWithoutKeys; private final ProvisioningManagerImpl provisioningManagerImpl; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; @@ -393,7 +393,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { MediaDrmCallback callback, HashMap keyRequestParameters, boolean multiSession, - int[] useDrmSessionsForClearContentTrackTypes, + @C.TrackType int[] useDrmSessionsForClearContentTrackTypes, boolean playClearSamplesWithoutKeys, LoadErrorHandlingPolicy loadErrorHandlingPolicy, long sessionKeepaliveMs) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index 45df174c97..5832144f5a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -52,8 +52,8 @@ import java.nio.ByteBuffer; private final boolean forceQueueingSynchronizationWorkaround; private final boolean synchronizeCodecInteractionsWithQueueing; - /** Creates a factory for the specified {@code trackType}. */ - public Factory(int trackType) { + /** Creates a factory for codecs handling the specified {@link C.TrackType track type}. */ + public Factory(@C.TrackType int trackType) { this( trackType, /* forceQueueingSynchronizationWorkaround= */ false, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java index 7f0aa46fd6..862b8ca6c0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java @@ -28,10 +28,10 @@ public final class MediaLoadData { /** The {@link DataType data type}. */ @DataType public final int dataType; /** - * One of the {@link TrackType track type}, which is a media track type if the data corresponds to - * media of a specific type, or {@link C#TRACK_TYPE_UNKNOWN} otherwise. + * One of the {@link TrackType track types}, which is a media track type if the data corresponds + * to media of a specific type, or {@link C#TRACK_TYPE_UNKNOWN} otherwise. */ - @TrackType public final int trackType; + public final @TrackType int trackType; /** * The format of the track to which the data belongs. Null if the data does not belong to a * specific track. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunkOutput.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunkOutput.java index f7b2524e07..f0a37f4dc8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunkOutput.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunkOutput.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.source.chunk; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.DummyTrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.source.SampleQueue; @@ -29,7 +30,7 @@ public final class BaseMediaChunkOutput implements TrackOutputProvider { private static final String TAG = "BaseMediaChunkOutput"; - private final int[] trackTypes; + private final @C.TrackType int[] trackTypes; private final SampleQueue[] sampleQueues; /** @@ -42,7 +43,7 @@ public final class BaseMediaChunkOutput implements TrackOutputProvider { } @Override - public TrackOutput track(int id, int type) { + public TrackOutput track(int id, @C.TrackType int type) { for (int i = 0; i < trackTypes.length; i++) { if (type == trackTypes[i]) { return sampleQueues[i]; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java index 322ee748fd..e2e3ae0914 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java @@ -83,7 +83,7 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac private static final PositionHolder POSITION_HOLDER = new PositionHolder(); private final Extractor extractor; - private final int primaryTrackType; + private final @C.TrackType int primaryTrackType; private final Format primaryTrackManifestFormat; private final SparseArray bindingTrackOutputs; @@ -97,13 +97,12 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac * Creates an instance. * * @param extractor The extractor to wrap. - * @param primaryTrackType The type of the primary track. Typically one of the {@link - * com.google.android.exoplayer2.C} {@code TRACK_TYPE_*} constants. + * @param primaryTrackType The {@link C.TrackType type} of the primary track. * @param primaryTrackManifestFormat A manifest defined {@link Format} whose data should be merged * into any sample {@link Format} output from the {@link Extractor} for the primary track. */ public BundledChunkExtractor( - Extractor extractor, int primaryTrackType, Format primaryTrackManifestFormat) { + Extractor extractor, @C.TrackType int primaryTrackType, Format primaryTrackManifestFormat) { this.extractor = extractor; this.primaryTrackType = primaryTrackType; this.primaryTrackManifestFormat = primaryTrackManifestFormat; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractor.java index 60774c3ea6..c1e1762163 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractor.java @@ -38,7 +38,7 @@ public interface ChunkExtractor { /** * Returns a new {@link ChunkExtractor} instance. * - * @param primaryTrackType The type of the primary track. One of {@link C C.TRACK_TYPE_*}. + * @param primaryTrackType The {@link C.TrackType type} of the primary track. * @param representationFormat The format of the representation to extract from. * @param enableEventMessageTrack Whether to enable the event message track. * @param closedCaptionFormats The {@link Format Formats} of the Closed-Caption tracks. @@ -46,7 +46,7 @@ public interface ChunkExtractor { */ @Nullable ChunkExtractor createProgressiveMediaExtractor( - int primaryTrackType, + @C.TrackType int primaryTrackType, Format representationFormat, boolean enableEventMessageTrack, List closedCaptionFormats, @@ -63,11 +63,10 @@ public interface ChunkExtractor { * id}. * * @param id A track identifier. - * @param type The type of the track. Typically one of the {@link C} {@code TRACK_TYPE_*} - * constants. + * @param type The {@link C.TrackType type} of the track. * @return The {@link TrackOutput} for the given track identifier. */ - TrackOutput track(int id, int type); + TrackOutput track(int id, @C.TrackType int type); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index a835ca68b5..a44a0615c4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -69,7 +69,7 @@ public class ChunkSampleStream private static final String TAG = "ChunkSampleStream"; - @C.TrackType public final int primaryTrackType; + public final @C.TrackType int primaryTrackType; private final int[] embeddedTrackTypes; private final Format[] embeddedTrackFormats; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.java index 47467bc2ea..e04ee5cf4a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.java @@ -81,15 +81,15 @@ public final class MediaParserChunkExtractor implements ChunkExtractor { /** * Creates a new instance. * - * @param primaryTrackType The type of the primary track, or {@link C#TRACK_TYPE_NONE} if there is - * no primary track. Must be one of the {@link C C.TRACK_TYPE_*} constants. + * @param primaryTrackType The {@link C.TrackType type} of the primary track. {@link + * C#TRACK_TYPE_NONE} if there is no primary track. * @param manifestFormat The chunks {@link Format} as obtained from the manifest. * @param closedCaptionFormats A list containing the {@link Format Formats} of the closed-caption * tracks in the chunks. */ @SuppressLint("WrongConstant") public MediaParserChunkExtractor( - int primaryTrackType, Format manifestFormat, List closedCaptionFormats) { + @C.TrackType int primaryTrackType, Format manifestFormat, List closedCaptionFormats) { outputConsumerAdapter = new OutputConsumerAdapterV30( manifestFormat, primaryTrackType, /* expectDummySeekMap= */ true); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java index f0d95cf74e..8781577ab8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java @@ -29,7 +29,7 @@ import java.io.IOException; /** A {@link BaseMediaChunk} for chunks consisting of a single raw sample. */ public final class SingleSampleMediaChunk extends BaseMediaChunk { - private final int trackType; + private final @C.TrackType int trackType; private final Format sampleFormat; private long nextLoadPosition; @@ -44,8 +44,7 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { * @param startTimeUs The start time of the media contained by the chunk, in microseconds. * @param endTimeUs The end time of the media contained by the chunk, in microseconds. * @param chunkIndex The index of the chunk, or {@link C#INDEX_UNSET} if it is not known. - * @param trackType The type of the chunk. Typically one of the {@link C} {@code TRACK_TYPE_*} - * constants. + * @param trackType The {@link C.TrackType track type} of the chunk. * @param sampleFormat The {@link Format} of the sample in the chunk. */ public SingleSampleMediaChunk( @@ -57,7 +56,7 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { long startTimeUs, long endTimeUs, long chunkIndex, - int trackType, + @C.TrackType int trackType, Format sampleFormat) { super( dataSource, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java index be2f0db7a8..233eded306 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java @@ -97,7 +97,7 @@ public final class OutputConsumerAdapterV30 implements MediaParser.OutputConsume private final ArrayList<@NullableType CryptoData> lastOutputCryptoDatas; private final DataReaderAdapter scratchDataReaderAdapter; private final boolean expectDummySeekMap; - private final int primaryTrackType; + private final @C.TrackType int primaryTrackType; @Nullable private final Format primaryTrackManifestFormat; private ExtractorOutput extractorOutput; @@ -130,14 +130,14 @@ public final class OutputConsumerAdapterV30 implements MediaParser.OutputConsume * * @param primaryTrackManifestFormat The manifest-obtained format of the primary track, or null if * not applicable. - * @param primaryTrackType The type of the primary track, or {@link C#TRACK_TYPE_NONE} if there is - * no primary track. Must be one of the {@link C C.TRACK_TYPE_*} constants. + * @param primaryTrackType The {@link C.TrackType type} of the primary track. {@link + * C#TRACK_TYPE_NONE} if there is no primary track. * @param expectDummySeekMap Whether the output consumer should expect an initial dummy seek map * which should be exposed through {@link #getDummySeekMap()}. */ public OutputConsumerAdapterV30( @Nullable Format primaryTrackManifestFormat, - int primaryTrackType, + @C.TrackType int primaryTrackType, boolean expectDummySeekMap) { this.expectDummySeekMap = expectDummySeekMap; this.primaryTrackManifestFormat = primaryTrackManifestFormat; @@ -429,8 +429,7 @@ public final class OutputConsumerAdapterV30 implements MediaParser.OutputConsume tracksEnded = true; } - @C.TrackType - private static int toTrackTypeConstant(@Nullable String string) { + private static @C.TrackType int toTrackTypeConstant(@Nullable String string) { if (string == null) { return C.TRACK_TYPE_UNKNOWN; } 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 b73eb43c18..c45a69f45f 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 @@ -90,7 +90,7 @@ public abstract class MappingTrackSelector extends TrackSelector { private final int rendererCount; private final String[] rendererNames; - private final int[] rendererTrackTypes; + private final @C.TrackType int[] rendererTrackTypes; private final TrackGroupArray[] rendererTrackGroups; @AdaptiveSupport private final int[] rendererMixedMimeTypeAdaptiveSupports; @Capabilities private final int[][][] rendererFormatSupports; @@ -98,7 +98,7 @@ public abstract class MappingTrackSelector extends TrackSelector { /** * @param rendererNames The name of each renderer. - * @param rendererTrackTypes The track type handled by each renderer. + * @param rendererTrackTypes The {@link C.TrackType track type} handled by each renderer. * @param rendererTrackGroups The {@link TrackGroup}s mapped to each renderer. * @param rendererMixedMimeTypeAdaptiveSupports The {@link AdaptiveSupport} for mixed MIME type * adaptation for the renderer. @@ -109,7 +109,7 @@ public abstract class MappingTrackSelector extends TrackSelector { @SuppressWarnings("deprecation") /* package */ MappedTrackInfo( String[] rendererNames, - int[] rendererTrackTypes, + @C.TrackType int[] rendererTrackTypes, TrackGroupArray[] rendererTrackGroups, @AdaptiveSupport int[] rendererMixedMimeTypeAdaptiveSupports, @Capabilities int[][][] rendererFormatSupports, @@ -146,7 +146,7 @@ public abstract class MappingTrackSelector extends TrackSelector { * @param rendererIndex The renderer index. * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. */ - public int getRendererType(int rendererIndex) { + public @C.TrackType int getRendererType(int rendererIndex) { return rendererTrackTypes[rendererIndex]; } @@ -199,11 +199,11 @@ public abstract class MappingTrackSelector extends TrackSelector { * specified type. If no such renderers exist then {@link #RENDERER_SUPPORT_NO_TRACKS} is * returned. * - * @param trackType The track type. One of the {@link C} {@code TRACK_TYPE_*} constants. + * @param trackType The {@link C.TrackType track type}. * @return The {@link RendererSupport}. */ @RendererSupport - public int getTypeSupport(int trackType) { + public int getTypeSupport(@C.TrackType int trackType) { @RendererSupport int bestRendererSupport = RENDERER_SUPPORT_NO_TRACKS; for (int i = 0; i < rendererCount; i++) { if (rendererTrackTypes[i] == trackType) { 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 128334ced2..48865510d1 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 @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source.dash; import android.os.SystemClock; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.source.chunk.ChunkSource; import com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler; @@ -39,10 +40,11 @@ public interface DashChunkSource extends ChunkSource { * @param periodIndex The index of the corresponding period in the manifest. * @param adaptationSetIndices The indices of the corresponding adaptation sets in the period. * @param trackSelection The track selection. + * @param type The {@link C.TrackType track type}. * @param elapsedRealtimeOffsetMs If known, an estimate of the instantaneous difference between * server-side unix time and {@link SystemClock#elapsedRealtime()} in milliseconds, - * specified as the server's unix time minus the local elapsed time. Or {@link - * com.google.android.exoplayer2.C#TIME_UNSET} if unknown. + * specified as the server's unix time minus the local elapsed time. Or {@link C#TIME_UNSET} + * 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 transferListener The transfer listener which should be informed of any data transfers. @@ -56,7 +58,7 @@ public interface DashChunkSource extends ChunkSource { int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int type, + @C.TrackType int type, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List closedCaptionFormats, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java index 476a2c5e22..062117563d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java @@ -921,7 +921,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; private static final int CATEGORY_MANIFEST_EVENTS = 2; public final int[] adaptationSetIndices; - @C.TrackType public final int trackType; + public final @C.TrackType int trackType; @TrackGroupCategory public final int trackGroupCategory; public final int eventStreamGroupIndex; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java index 78eec4ec69..a12cbeb805 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java @@ -103,7 +103,7 @@ public final class DashUtil { @Nullable public static Format loadFormatWithDrmInitData(DataSource dataSource, Period period) throws IOException { - int primaryTrackType = C.TRACK_TYPE_VIDEO; + @C.TrackType int primaryTrackType = C.TRACK_TYPE_VIDEO; Representation representation = getFirstRepresentation(period, primaryTrackType); if (representation == null) { primaryTrackType = C.TRACK_TYPE_AUDIO; @@ -329,7 +329,7 @@ public final class DashUtil { } @Nullable - private static Representation getFirstRepresentation(Period period, int type) { + private static Representation getFirstRepresentation(Period period, @C.TrackType int type) { int index = period.getAdaptationSetIndex(type); if (index == C.INDEX_UNSET) { return null; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index bd0df333ad..234c0f4dfd 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -105,7 +105,7 @@ public class DefaultDashChunkSource implements DashChunkSource { int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int trackType, + @C.TrackType int trackType, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List closedCaptionFormats, @@ -136,7 +136,7 @@ public class DefaultDashChunkSource implements DashChunkSource { private final LoaderErrorThrower manifestLoaderErrorThrower; private final BaseUrlExclusionList baseUrlExclusionList; private final int[] adaptationSetIndices; - private final int trackType; + private final @C.TrackType int trackType; private final DataSource dataSource; private final long elapsedRealtimeOffsetMs; private final int maxSegmentsPerLoad; @@ -159,7 +159,7 @@ public class DefaultDashChunkSource implements DashChunkSource { * @param periodIndex The index of the period in the manifest. * @param adaptationSetIndices The indices of the adaptation sets in the period. * @param trackSelection The track selection. - * @param trackType The type of the tracks in the selection. + * @param trackType The {@link C.TrackType type} of the tracks in the selection. * @param dataSource A {@link DataSource} suitable for loading the media data. * @param elapsedRealtimeOffsetMs If known, an estimate of the instantaneous difference between * server-side unix time and {@link SystemClock#elapsedRealtime()} in milliseconds, specified @@ -180,7 +180,7 @@ public class DefaultDashChunkSource implements DashChunkSource { int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int trackType, + @C.TrackType int trackType, DataSource dataSource, long elapsedRealtimeOffsetMs, int maxSegmentsPerLoad, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java index f609ef1a89..26c52697be 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.java @@ -32,7 +32,7 @@ public class AdaptationSet { public final int id; /** The {@link C.TrackType track type} of the adaptation set. */ - @C.TrackType public final int type; + public final @C.TrackType int type; /** {@link Representation}s in the adaptation set. */ public final List representations; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index 092d779f89..9cff83646c 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -528,8 +528,7 @@ public class DashManifestParser extends DefaultHandler supplementalProperties); } - @C.TrackType - protected int parseContentType(XmlPullParser xpp) { + protected @C.TrackType int parseContentType(XmlPullParser xpp) { String contentType = xpp.getAttributeValue(null, "contentType"); return TextUtils.isEmpty(contentType) ? C.TRACK_TYPE_UNKNOWN diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index 067d53ebfe..5964c95164 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -280,6 +280,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; boolean isQuickTime) throws ParserException { Atom.ContainerAtom mdia = checkNotNull(trak.getContainerAtomOfType(Atom.TYPE_mdia)); + @C.TrackType int trackType = getTrackTypeForHdlr(parseHdlr(checkNotNull(mdia.getLeafAtomOfType(Atom.TYPE_hdlr)).data)); if (trackType == C.TRACK_TYPE_UNKNOWN) { @@ -866,8 +867,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } /** Returns the track type for a given handler value. */ - @C.TrackType - private static int getTrackTypeForHdlr(int hdlr) { + private static @C.TrackType int getTrackTypeForHdlr(int hdlr) { if (hdlr == TYPE_soun) { return C.TRACK_TYPE_AUDIO; } else if (hdlr == TYPE_vide) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java index 9a4737f35b..68eb7b4674 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java @@ -45,7 +45,7 @@ public final class Track { /** * One of {@link C#TRACK_TYPE_AUDIO}, {@link C#TRACK_TYPE_VIDEO} and {@link C#TRACK_TYPE_TEXT}. */ - @C.TrackType public final int type; + public final @C.TrackType int type; /** The track timescale, defined as the number of time units that pass in one second. */ public final long timescale; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index cc031dd11e..1f0f92d158 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -125,7 +125,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; new HashSet<>( Arrays.asList(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_METADATA))); - @C.TrackType private final int trackType; + private final @C.TrackType int trackType; private final Callback callback; private final HlsChunkSource chunkSource; private final Allocator allocator; diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java index efac82d4c1..d7acee8b97 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java @@ -60,7 +60,7 @@ public class SsManifest implements FilterableManifest { private static final String URL_PLACEHOLDER_BITRATE_1 = "{bitrate}"; private static final String URL_PLACEHOLDER_BITRATE_2 = "{Bitrate}"; - @C.TrackType public final int type; + public final @C.TrackType int type; public final String subType; public final long timescale; public final String name; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java index e400630d5e..6127fd567a 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java @@ -51,7 +51,7 @@ import java.nio.ByteBuffer; private int trackCount; private int trackFormatCount; private boolean isReady; - private int previousTrackType; + private @C.TrackType int previousTrackType; private long minTrackTimeUs; public MuxerWrapper(Muxer muxer) { @@ -99,7 +99,7 @@ import java.nio.ByteBuffer; boolean isAudio = MimeTypes.isAudio(sampleMimeType); boolean isVideo = MimeTypes.isVideo(sampleMimeType); checkState(isAudio || isVideo, "Unsupported track format: " + sampleMimeType); - int trackType = MimeTypes.getTrackType(sampleMimeType); + @C.TrackType int trackType = MimeTypes.getTrackType(sampleMimeType); checkState( trackTypeToIndex.get(trackType, /* valueIfKeyNotFound= */ C.INDEX_UNSET) == C.INDEX_UNSET, "There is already a track of type " + trackType); @@ -116,8 +116,7 @@ import java.nio.ByteBuffer; /** * Attempts to write a sample to the muxer. * - * @param trackType The track type of the sample, defined by the {@code TRACK_TYPE_*} constants in - * {@link C}. + * @param trackType The {@link C.TrackType track type} of the sample. * @param data The sample to write, or {@code null} if the sample is empty. * @param isKeyFrame Whether the sample is a key frame. * @param presentationTimeUs The presentation time of the sample in microseconds. @@ -129,7 +128,10 @@ import java.nio.ByteBuffer; * track of the given track type. */ public boolean writeSample( - int trackType, @Nullable ByteBuffer data, boolean isKeyFrame, long presentationTimeUs) { + @C.TrackType int trackType, + @Nullable ByteBuffer data, + boolean isKeyFrame, + long presentationTimeUs) { int trackIndex = trackTypeToIndex.get(trackType, /* valueIfKeyNotFound= */ C.INDEX_UNSET); checkState( trackIndex != C.INDEX_UNSET, @@ -151,9 +153,9 @@ import java.nio.ByteBuffer; * Notifies the muxer that all the samples have been {@link #writeSample(int, ByteBuffer, boolean, * long) written} for a given track. * - * @param trackType The track type, defined by the {@code TRACK_TYPE_*} constants in {@link C}. + * @param trackType The {@link C.TrackType track type}. */ - public void endTrack(int trackType) { + public void endTrack(@C.TrackType int trackType) { trackTypeToIndex.delete(trackType); trackTypeToTimeUs.delete(trackType); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMediaClock.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMediaClock.java index 210eaf0ecd..65baf7d0c3 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMediaClock.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMediaClock.java @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.util.MediaClock; * Updates the time for a given track type. The clock time is computed based on the different * track times. */ - public void updateTimeForTrackType(int trackType, long timeUs) { + public void updateTimeForTrackType(@C.TrackType int trackType, long timeUs) { long previousTimeUs = trackTypeToTimeUs.get(trackType, /* valueIfKeyNotFound= */ C.TIME_UNSET); if (previousTimeUs != C.TIME_UNSET && timeUs <= previousTimeUs) { // Make sure that the track times are increasing and therefore that the clock time is From 4940f21d48e17c63a1ceebf4f16f2e7fabac56a3 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 13 Sep 2021 15:50:14 +0100 Subject: [PATCH 164/441] Make position-out-of-range errors non-retryable PiperOrigin-RevId: 396354920 --- .../exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.java index 8544a294a8..4f32344638 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultLoadErrorHandlingPolicy.java @@ -101,8 +101,9 @@ public class DefaultLoadErrorHandlingPolicy implements LoadErrorHandlingPolicy { /** * Retries for any exception that is not a subclass of {@link ParserException}, {@link * FileNotFoundException}, {@link CleartextNotPermittedException} or {@link - * UnexpectedLoaderException}. The retry delay is calculated as {@code Math.min((errorCount - 1) * - * 1000, 5000)}. + * UnexpectedLoaderException}, and for which {@link + * DataSourceException#isCausedByPositionOutOfRange} returns {@code false}. The retry delay is + * calculated as {@code Math.min((errorCount - 1) * 1000, 5000)}. */ @Override public long getRetryDelayMsFor(LoadErrorInfo loadErrorInfo) { @@ -111,6 +112,7 @@ public class DefaultLoadErrorHandlingPolicy implements LoadErrorHandlingPolicy { || exception instanceof FileNotFoundException || exception instanceof CleartextNotPermittedException || exception instanceof UnexpectedLoaderException + || DataSourceException.isCausedByPositionOutOfRange(exception) ? C.TIME_UNSET : min((loadErrorInfo.errorCount - 1) * 1000, 5000); } From cf0ec91934b957fd455b96c11ecd761cfa18d1ef Mon Sep 17 00:00:00 2001 From: krocard Date: Mon, 13 Sep 2021 16:10:00 +0100 Subject: [PATCH 165/441] Simplify rendererDisabledFlags bundling Align redererDisableFlags (un)bundling with the other field by using an explicit temporary data structure (int array). PiperOrigin-RevId: 396358143 --- .../trackselection/DefaultTrackSelector.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) 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 ccb826d3b1..19fd32187f 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 @@ -302,8 +302,10 @@ public class DefaultTrackSelector extends MappingTrackSelector { selectionOverrides = new SparseArray<>(); setSelectionOverridesFromBundle(bundle); - rendererDisabledFlags = new SparseBooleanArray(); - setRendererDisabledFlagsFromBundle(bundle); + rendererDisabledFlags = + makeSparseBooleanArrayFromTrueKeys( + bundle.getIntArray( + Parameters.keyForField(Parameters.FIELD_RENDERER_DISABLED_INDEXES))); } @Override @@ -827,15 +829,15 @@ public class DefaultTrackSelector extends MappingTrackSelector { } } - private void setRendererDisabledFlagsFromBundle(Bundle bundle) { - int[] rendererIndexes = - bundle.getIntArray(Parameters.keyForField(Parameters.FIELD_RENDERER_DISABLED_INDEXES)); - if (rendererIndexes == null) { - return; + private SparseBooleanArray makeSparseBooleanArrayFromTrueKeys(@Nullable int[] trueKeys) { + if (trueKeys == null) { + return new SparseBooleanArray(); } - for (int rendererIndex : rendererIndexes) { - setRendererDisabled(rendererIndex, true); + SparseBooleanArray sparseBooleanArray = new SparseBooleanArray(trueKeys.length); + for (int trueKey : trueKeys) { + sparseBooleanArray.append(trueKey, true); } + return sparseBooleanArray; } } @@ -1145,7 +1147,10 @@ public class DefaultTrackSelector extends MappingTrackSelector { keyForField(FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS), allowMultipleAdaptiveSelections); putSelectionOverridesToBundle(bundle, selectionOverrides); - putRendererDisabledFlagsToBundle(bundle, rendererDisabledFlags); + // Only true values are put into rendererDisabledFlags. + bundle.putIntArray( + keyForField(FIELD_RENDERER_DISABLED_INDEXES), + getKeysFromSparseBooleanArray(rendererDisabledFlags)); return bundle; } @@ -1192,13 +1197,12 @@ public class DefaultTrackSelector extends MappingTrackSelector { } } - private static void putRendererDisabledFlagsToBundle( - Bundle bundle, SparseBooleanArray rendererDisabledFlags) { - int[] rendererIndexes = new int[rendererDisabledFlags.size()]; - for (int i = 0; i < rendererDisabledFlags.size(); i++) { - rendererIndexes[i] = rendererDisabledFlags.keyAt(i); + private static int[] getKeysFromSparseBooleanArray(SparseBooleanArray sparseBooleanArray) { + int[] keys = new int[sparseBooleanArray.size()]; + for (int i = 0; i < sparseBooleanArray.size(); i++) { + keys[i] = sparseBooleanArray.keyAt(i); } - bundle.putIntArray(keyForField(FIELD_RENDERER_DISABLED_INDEXES), rendererIndexes); + return keys; } private static boolean areRendererDisabledFlagsEqual( From f8d60e2bbba3cc54053ed56b78e82e012cc43f3e Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 13 Sep 2021 16:38:05 +0100 Subject: [PATCH 166/441] Add flag for constant bitrate seeking even if input length is unknown PiperOrigin-RevId: 396363113 --- .../extractor/ConstantBitrateSeekMap.java | 48 ++++++++++++++++--- .../extractor/DefaultExtractorsFactory.java | 36 ++++++++++++++ .../extractor/amr/AmrExtractor.java | 33 ++++++++++--- .../extractor/mp3/ConstantBitrateSeeker.java | 14 +++++- .../extractor/mp3/Mp3Extractor.java | 41 ++++++++++++---- .../extractor/ts/AdtsExtractor.java | 46 +++++++++++++----- 6 files changed, 184 insertions(+), 34 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMap.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMap.java index 4db7edf685..5e2b743442 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMap.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ConstantBitrateSeekMap.java @@ -16,9 +16,9 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.max; +import static java.lang.Math.min; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.util.Util; /** * A {@link SeekMap} implementation that assumes the stream has a constant bitrate and consists of @@ -33,9 +33,10 @@ public class ConstantBitrateSeekMap implements SeekMap { private final long dataSize; private final int bitrate; private final long durationUs; + private final boolean allowSeeksIfLengthUnknown; /** - * Constructs a new instance from a stream. + * Creates an instance with {@code allowSeeksIfLengthUnknown} set to {@code false}. * * @param inputLength The length of the stream in bytes, or {@link C#LENGTH_UNSET} if unknown. * @param firstFrameBytePosition The byte-position of the first frame in the stream. @@ -45,10 +46,36 @@ public class ConstantBitrateSeekMap implements SeekMap { */ public ConstantBitrateSeekMap( long inputLength, long firstFrameBytePosition, int bitrate, int frameSize) { + this( + inputLength, + firstFrameBytePosition, + bitrate, + frameSize, + /* allowSeeksIfLengthUnknown= */ false); + } + + /** + * Creates an instance. + * + * @param inputLength The length of the stream in bytes, or {@link C#LENGTH_UNSET} if unknown. + * @param firstFrameBytePosition The byte-position of the first frame in the stream. + * @param bitrate The bitrate (which is assumed to be constant in the stream). + * @param frameSize The size of each frame in the stream in bytes. May be {@link C#LENGTH_UNSET} + * if unknown. + * @param allowSeeksIfLengthUnknown Whether to allow seeking even if the length of the content is + * unknown. + */ + public ConstantBitrateSeekMap( + long inputLength, + long firstFrameBytePosition, + int bitrate, + int frameSize, + boolean allowSeeksIfLengthUnknown) { this.inputLength = inputLength; this.firstFrameBytePosition = firstFrameBytePosition; this.frameSize = frameSize == C.LENGTH_UNSET ? 1 : frameSize; this.bitrate = bitrate; + this.allowSeeksIfLengthUnknown = allowSeeksIfLengthUnknown; if (inputLength == C.LENGTH_UNSET) { dataSize = C.LENGTH_UNSET; @@ -61,18 +88,23 @@ public class ConstantBitrateSeekMap implements SeekMap { @Override public boolean isSeekable() { - return dataSize != C.LENGTH_UNSET; + return dataSize != C.LENGTH_UNSET || allowSeeksIfLengthUnknown; } @Override public SeekPoints getSeekPoints(long timeUs) { - if (dataSize == C.LENGTH_UNSET) { + if (dataSize == C.LENGTH_UNSET && !allowSeeksIfLengthUnknown) { return new SeekPoints(new SeekPoint(0, firstFrameBytePosition)); } long seekFramePosition = getFramePositionForTimeUs(timeUs); long seekTimeUs = getTimeUsAtPosition(seekFramePosition); SeekPoint seekPoint = new SeekPoint(seekTimeUs, seekFramePosition); - if (seekTimeUs >= timeUs || seekFramePosition + frameSize >= inputLength) { + // We only return a single seek point if the length is unknown, to avoid generating a second + // seek point beyond the end of the data in the case that the requested seek position is valid, + // but very close to the end of the content. + if (dataSize == C.LENGTH_UNSET + || seekTimeUs >= timeUs + || seekFramePosition + frameSize >= inputLength) { return new SeekPoints(seekPoint); } else { long secondSeekPosition = seekFramePosition + frameSize; @@ -118,8 +150,10 @@ public class ConstantBitrateSeekMap implements SeekMap { long positionOffset = (timeUs * bitrate) / (C.MICROS_PER_SECOND * C.BITS_PER_BYTE); // Constrain to nearest preceding frame offset. positionOffset = (positionOffset / frameSize) * frameSize; - positionOffset = - Util.constrainValue(positionOffset, /* min= */ 0, /* max= */ dataSize - frameSize); + if (dataSize != C.LENGTH_UNSET) { + positionOffset = min(positionOffset, dataSize - frameSize); + } + positionOffset = max(positionOffset, 0); return firstFrameBytePosition + positionOffset; } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java index 0cbde6ab86..abaefe2547 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java @@ -20,6 +20,8 @@ import static com.google.android.exoplayer2.util.FileTypes.inferFileTypeFromUri; import android.net.Uri; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.extractor.amr.AmrExtractor; import com.google.android.exoplayer2.extractor.flac.FlacExtractor; import com.google.android.exoplayer2.extractor.flv.FlvExtractor; @@ -125,6 +127,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { } private boolean constantBitrateSeekingEnabled; + private boolean constantBitrateSeekingAlwaysEnabled; @AdtsExtractor.Flags private int adtsFlags; @AmrExtractor.Flags private int amrFlags; @FlacExtractor.Flags private int flacFlags; @@ -158,6 +161,30 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { return this; } + /** + * Convenience method to set whether approximate seeking using constant bitrate assumptions should + * be enabled for all extractors that support it, and if it should be enabled even if the content + * length (and hence the duration of the media) is unknown. If set to true, the flags required to + * enable this functionality will be OR'd with those passed to the setters when creating extractor + * instances. If set to false then the flags passed to the setters will be used without + * modification. + * + *

    When seeking into content where the length is unknown, application code should ensure that + * requested seek positions are valid, or should be ready to handle playback failures reported + * through {@link Player.Listener#onPlayerError} with {@link PlaybackException#errorCode} set to + * {@link PlaybackException#ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE}. + * + * @param constantBitrateSeekingAlwaysEnabled Whether approximate seeking using a constant bitrate + * assumption should be enabled for all extractors that support it, including when the content + * duration is unknown. + * @return The factory, for convenience. + */ + public synchronized DefaultExtractorsFactory setConstantBitrateSeekingAlwaysEnabled( + boolean constantBitrateSeekingAlwaysEnabled) { + this.constantBitrateSeekingAlwaysEnabled = constantBitrateSeekingAlwaysEnabled; + return this; + } + /** * Sets flags for {@link AdtsExtractor} instances created by the factory. * @@ -333,6 +360,9 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { adtsFlags | (constantBitrateSeekingEnabled ? AdtsExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING + : 0) + | (constantBitrateSeekingAlwaysEnabled + ? AdtsExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS : 0))); break; case FileTypes.AMR: @@ -341,6 +371,9 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { amrFlags | (constantBitrateSeekingEnabled ? AmrExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING + : 0) + | (constantBitrateSeekingAlwaysEnabled + ? AmrExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS : 0))); break; case FileTypes.FLAC: @@ -367,6 +400,9 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { mp3Flags | (constantBitrateSeekingEnabled ? Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING + : 0) + | (constantBitrateSeekingAlwaysEnabled + ? Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS : 0))); break; case FileTypes.MP4: diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java index 92821daf13..2ba8b0d599 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java @@ -19,6 +19,8 @@ import androidx.annotation.IntDef; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; @@ -52,20 +54,33 @@ public final class AmrExtractor implements Extractor { public static final ExtractorsFactory FACTORY = () -> new Extractor[] {new AmrExtractor()}; /** - * Flags controlling the behavior of the extractor. Possible flag value is {@link - * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}. + * Flags controlling the behavior of the extractor. Possible flag values are {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING} and {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}. */ @Documented @Retention(RetentionPolicy.SOURCE) @IntDef( flag = true, - value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}) + value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}) public @interface Flags {} /** * Flag to force enable seeking using a constant bitrate assumption in cases where seeking would * otherwise not be possible. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** + * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in + * cases where the content length (and hence the duration of the media) is unknown. Application + * code should ensure that requested seek positions are valid when using this flag, or be ready to + * handle playback failures reported through {@link Player.Listener#onPlayerError} with {@link + * PlaybackException#errorCode} set to {@link + * PlaybackException#ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE}. + * + *

    If this flag is set, then the behavior enabled by {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING} is implicitly enabled as well. + */ + public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS = 1 << 1; /** * The frame size in bytes, including header (1 byte), for each of the 16 frame types for AMR @@ -152,6 +167,9 @@ public final class AmrExtractor implements Extractor { /** @param flags Flags that control the extractor's behavior. */ public AmrExtractor(@Flags int flags) { + if ((flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0) { + flags |= FLAG_ENABLE_CONSTANT_BITRATE_SEEKING; + } this.flags = flags; scratch = new byte[1]; firstSampleSize = C.LENGTH_UNSET; @@ -360,15 +378,18 @@ public final class AmrExtractor implements Extractor { hasOutputSeekMap = true; } else if (numSamplesWithSameSize >= NUM_SAME_SIZE_CONSTANT_BIT_RATE_THRESHOLD || sampleReadResult == RESULT_END_OF_INPUT) { - seekMap = getConstantBitrateSeekMap(inputLength); + seekMap = + getConstantBitrateSeekMap( + inputLength, (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0); extractorOutput.seekMap(seekMap); hasOutputSeekMap = true; } } - private SeekMap getConstantBitrateSeekMap(long inputLength) { + private SeekMap getConstantBitrateSeekMap(long inputLength, boolean allowSeeksIfLengthUnknown) { int bitrate = getBitrateFromFrameSize(firstSampleSize, SAMPLE_TIME_PER_FRAME_US); - return new ConstantBitrateSeekMap(inputLength, firstSamplePosition, bitrate, firstSampleSize); + return new ConstantBitrateSeekMap( + inputLength, firstSamplePosition, bitrate, firstSampleSize, allowSeeksIfLengthUnknown); } @EnsuresNonNull({"extractorOutput", "trackOutput"}) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java index f74c3fbc33..9762f2d0e5 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java @@ -28,13 +28,23 @@ import com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap; * @param inputLength The length of the stream in bytes, or {@link C#LENGTH_UNSET} if unknown. * @param firstFramePosition The position of the first frame in the stream. * @param mpegAudioHeader The MPEG audio header associated with the first frame. + * @param allowSeeksIfLengthUnknown Whether to allow seeking even if the length of the content is + * unknown. */ public ConstantBitrateSeeker( - long inputLength, long firstFramePosition, MpegAudioUtil.Header mpegAudioHeader) { + long inputLength, + long firstFramePosition, + MpegAudioUtil.Header mpegAudioHeader, + boolean allowSeeksIfLengthUnknown) { // Set the seeker frame size to the size of the first frame (even though some constant bitrate // streams have variable frame sizes) to avoid the need to re-synchronize for constant frame // size streams. - super(inputLength, firstFramePosition, mpegAudioHeader.bitrate, mpegAudioHeader.frameSize); + super( + inputLength, + firstFramePosition, + mpegAudioHeader.bitrate, + mpegAudioHeader.frameSize, + allowSeeksIfLengthUnknown); } @Override diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java index 468e31e30a..4e22637144 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java @@ -20,6 +20,8 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.audio.MpegAudioUtil; import com.google.android.exoplayer2.extractor.DummyTrackOutput; import com.google.android.exoplayer2.extractor.Extractor; @@ -56,8 +58,8 @@ public final class Mp3Extractor implements Extractor { /** * Flags controlling the behavior of the extractor. Possible flag values are {@link - * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, {@link #FLAG_ENABLE_INDEX_SEEKING} and {@link - * #FLAG_DISABLE_ID3_METADATA}. + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}, + * {@link #FLAG_ENABLE_INDEX_SEEKING} and {@link #FLAG_DISABLE_ID3_METADATA}. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -65,6 +67,7 @@ public final class Mp3Extractor implements Extractor { flag = true, value = { FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, + FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS, FLAG_ENABLE_INDEX_SEEKING, FLAG_DISABLE_ID3_METADATA }) @@ -76,6 +79,21 @@ public final class Mp3Extractor implements Extractor { *

    This flag is ignored if {@link #FLAG_ENABLE_INDEX_SEEKING} is set. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** + * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in + * cases where the content length (and hence the duration of the media) is unknown. Application + * code should ensure that requested seek positions are valid when using this flag, or be ready to + * handle playback failures reported through {@link Player.Listener#onPlayerError} with {@link + * PlaybackException#errorCode} set to {@link + * PlaybackException#ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE}. + * + *

    If this flag is set, then the behavior enabled by {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING} is implicitly enabled. + * + *

    This flag is ignored if {@link #FLAG_ENABLE_INDEX_SEEKING} is set. + */ + public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS = 1 << 1; + /** * Flag to force index seeking, in which a time-to-byte mapping is built as the file is read. * @@ -88,12 +106,12 @@ public final class Mp3Extractor implements Extractor { * provide precise enough seeking metadata. * */ - public static final int FLAG_ENABLE_INDEX_SEEKING = 1 << 1; + public static final int FLAG_ENABLE_INDEX_SEEKING = 1 << 2; /** * Flag to disable parsing of ID3 metadata. Can be set to save memory if ID3 metadata is not * required. */ - public static final int FLAG_DISABLE_ID3_METADATA = 1 << 2; + public static final int FLAG_DISABLE_ID3_METADATA = 1 << 3; /** Predicate that matches ID3 frames containing only required gapless/seeking metadata. */ private static final FramePredicate REQUIRED_ID3_FRAME_PREDICATE = @@ -158,6 +176,9 @@ public final class Mp3Extractor implements Extractor { * C#TIME_UNSET} if forcing is not required. */ public Mp3Extractor(@Flags int flags, long forcedFirstSampleTimestampUs) { + if ((flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0) { + flags |= FLAG_ENABLE_CONSTANT_BITRATE_SEEKING; + } this.flags = flags; this.forcedFirstSampleTimestampUs = forcedFirstSampleTimestampUs; scratch = new ParsableByteArray(SCRATCH_LENGTH); @@ -446,7 +467,9 @@ public final class Mp3Extractor implements Extractor { if (resultSeeker == null || (!resultSeeker.isSeekable() && (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0)) { - resultSeeker = getConstantBitrateSeeker(input); + resultSeeker = + getConstantBitrateSeeker( + input, (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0); } return resultSeeker; @@ -485,7 +508,7 @@ public final class Mp3Extractor implements Extractor { input.skipFully(synchronizedHeader.frameSize); if (seeker != null && !seeker.isSeekable() && seekHeader == SEEK_HEADER_INFO) { // Fall back to constant bitrate seeking for Info headers missing a table of contents. - return getConstantBitrateSeeker(input); + return getConstantBitrateSeeker(input, /* allowSeeksIfLengthUnknown= */ false); } } else if (seekHeader == SEEK_HEADER_VBRI) { seeker = VbriSeeker.create(input.getLength(), input.getPosition(), synchronizedHeader, frame); @@ -499,11 +522,13 @@ public final class Mp3Extractor implements Extractor { } /** Peeks the next frame and returns a {@link ConstantBitrateSeeker} based on its bitrate. */ - private Seeker getConstantBitrateSeeker(ExtractorInput input) throws IOException { + private Seeker getConstantBitrateSeeker(ExtractorInput input, boolean allowSeeksIfLengthUnknown) + throws IOException { input.peekFully(scratch.getData(), 0, 4); scratch.setPosition(0); synchronizedHeader.setForHeaderData(scratch.readInt()); - return new ConstantBitrateSeeker(input.getLength(), input.getPosition(), synchronizedHeader); + return new ConstantBitrateSeeker( + input.getLength(), input.getPosition(), synchronizedHeader, allowSeeksIfLengthUnknown); } @EnsuresNonNull({"extractorOutput", "realTrackOutput"}) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java index f4fc317fdc..cccef4ef08 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java @@ -22,6 +22,8 @@ import static com.google.android.exoplayer2.metadata.id3.Id3Decoder.ID3_TAG; import androidx.annotation.IntDef; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; @@ -48,14 +50,15 @@ public final class AdtsExtractor implements Extractor { public static final ExtractorsFactory FACTORY = () -> new Extractor[] {new AdtsExtractor()}; /** - * Flags controlling the behavior of the extractor. Possible flag value is {@link - * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}. + * Flags controlling the behavior of the extractor. Possible flag values are {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING} and {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}. */ @Documented @Retention(RetentionPolicy.SOURCE) @IntDef( flag = true, - value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}) + value = {FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS}) public @interface Flags {} /** * Flag to force enable seeking using a constant bitrate assumption in cases where seeking would @@ -65,6 +68,18 @@ public final class AdtsExtractor implements Extractor { * are not precise, especially when the stream bitrate varies a lot. */ public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING = 1; + /** + * Like {@link #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING}, except that seeking is also enabled in + * cases where the content length (and hence the duration of the media) is unknown. Application + * code should ensure that requested seek positions are valid when using this flag, or be ready to + * handle playback failures reported through {@link Player.Listener#onPlayerError} with {@link + * PlaybackException#errorCode} set to {@link + * PlaybackException#ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE}. + * + *

    If this flag is set, then the behavior enabled by {@link + * #FLAG_ENABLE_CONSTANT_BITRATE_SEEKING} is implicitly enabled as well. + */ + public static final int FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS = 1 << 1; private static final int MAX_PACKET_SIZE = 2 * 1024; /** @@ -105,6 +120,9 @@ public final class AdtsExtractor implements Extractor { * @param flags Flags that control the extractor's behavior. */ public AdtsExtractor(@Flags int flags) { + if ((flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0) { + flags |= FLAG_ENABLE_CONSTANT_BITRATE_SEEKING; + } this.flags = flags; reader = new AdtsReader(true); packetBuffer = new ParsableByteArray(MAX_PACKET_SIZE); @@ -182,14 +200,16 @@ public final class AdtsExtractor implements Extractor { long inputLength = input.getLength(); boolean canUseConstantBitrateSeeking = - (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0 && inputLength != C.LENGTH_UNSET; + (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0 + || ((flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0 + && inputLength != C.LENGTH_UNSET); if (canUseConstantBitrateSeeking) { calculateAverageFrameSize(input); } int bytesRead = input.read(packetBuffer.getData(), 0, MAX_PACKET_SIZE); boolean readEndOfStream = bytesRead == RESULT_END_OF_INPUT; - maybeOutputSeekMap(inputLength, canUseConstantBitrateSeeking, readEndOfStream); + maybeOutputSeekMap(inputLength, readEndOfStream); if (readEndOfStream) { return RESULT_END_OF_INPUT; } @@ -231,12 +251,13 @@ public final class AdtsExtractor implements Extractor { } @RequiresNonNull("extractorOutput") - private void maybeOutputSeekMap( - long inputLength, boolean canUseConstantBitrateSeeking, boolean readEndOfStream) { + private void maybeOutputSeekMap(long inputLength, boolean readEndOfStream) { if (hasOutputSeekMap) { return; } - boolean useConstantBitrateSeeking = canUseConstantBitrateSeeking && averageFrameSize > 0; + + boolean useConstantBitrateSeeking = + (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING) != 0 && averageFrameSize > 0; if (useConstantBitrateSeeking && reader.getSampleDurationUs() == C.TIME_UNSET && !readEndOfStream) { @@ -246,7 +267,9 @@ public final class AdtsExtractor implements Extractor { } if (useConstantBitrateSeeking && reader.getSampleDurationUs() != C.TIME_UNSET) { - extractorOutput.seekMap(getConstantBitrateSeekMap(inputLength)); + extractorOutput.seekMap( + getConstantBitrateSeekMap( + inputLength, (flags & FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS) != 0)); } else { extractorOutput.seekMap(new SeekMap.Unseekable(C.TIME_UNSET)); } @@ -314,9 +337,10 @@ public final class AdtsExtractor implements Extractor { hasCalculatedAverageFrameSize = true; } - private SeekMap getConstantBitrateSeekMap(long inputLength) { + private SeekMap getConstantBitrateSeekMap(long inputLength, boolean allowSeeksIfLengthUnknown) { int bitrate = getBitrateFromFrameSize(averageFrameSize, reader.getSampleDurationUs()); - return new ConstantBitrateSeekMap(inputLength, firstFramePosition, bitrate, averageFrameSize); + return new ConstantBitrateSeekMap( + inputLength, firstFramePosition, bitrate, averageFrameSize, allowSeeksIfLengthUnknown); } /** From ee11d087604becfd4f0c4945dd6a5b26e84d5162 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 13 Sep 2021 17:44:54 +0100 Subject: [PATCH 167/441] Fix `DashChunkSource` @param name This needs to match with the implementation for Dackka javadoc generation to succeed. PiperOrigin-RevId: 396377019 --- .../android/exoplayer2/source/dash/DashChunkSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 48865510d1..0cd6ac1c11 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 @@ -40,7 +40,7 @@ public interface DashChunkSource extends ChunkSource { * @param periodIndex The index of the corresponding period in the manifest. * @param adaptationSetIndices The indices of the corresponding adaptation sets in the period. * @param trackSelection The track selection. - * @param type The {@link C.TrackType track type}. + * @param trackType The {@link C.TrackType track type}. * @param elapsedRealtimeOffsetMs If known, an estimate of the instantaneous difference between * server-side unix time and {@link SystemClock#elapsedRealtime()} in milliseconds, * specified as the server's unix time minus the local elapsed time. Or {@link C#TIME_UNSET} @@ -58,7 +58,7 @@ public interface DashChunkSource extends ChunkSource { int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - @C.TrackType int type, + @C.TrackType int trackType, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List closedCaptionFormats, From 4d668f1b7bc0e375cc0063d387fd2d8769a56f58 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 14 Sep 2021 17:26:48 +0100 Subject: [PATCH 168/441] Fix how preacquired DRM sessions are released under resource contention Previously the released preacquired sessions would start their keepalive timeout, and so no additional resources would be freed in time for the manager to retry the session acquisition. This change adds an additional purge of keepalive sessions *after* the preacquired sessions are released, which fixes the problem. #exofixit #minor-release PiperOrigin-RevId: 396613352 --- RELEASENOTES.md | 3 + .../drm/DefaultDrmSessionManager.java | 22 +++++-- .../drm/DefaultDrmSessionManagerTest.java | 65 ++++++++++++++++++- 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fd02527b4d..2237810a19 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -41,6 +41,9 @@ * Request smaller decoder input buffers for Dolby Vision. This fixes an issue that could cause UHD Dolby Vision playbacks to fail on some devices, including Amazon Fire TV 4K. +* DRM: + * Fix `DefaultDrmSessionManager` to correctly eagerly release preacquired + DRM sessions when there's a shortage of DRM resources on the device. * UI * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index ad5ba1427b..cd40555205 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -684,13 +684,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { // If we're short on DRM session resources, first try eagerly releasing all our keepalive // sessions and then retry the acquisition. if (acquisitionFailedIndicatingResourceShortage(session) && !keepaliveSessions.isEmpty()) { - // Make a local copy, because sessions are removed from this.keepaliveSessions during - // release (via callback). - ImmutableSet keepaliveSessions = - ImmutableSet.copyOf(this.keepaliveSessions); - for (DrmSession keepaliveSession : keepaliveSessions) { - keepaliveSession.release(/* eventDispatcher= */ null); - } + releaseAllKeepaliveSessions(); undoAcquisition(session, eventDispatcher); session = createAndAcquireSession(schemeDatas, isPlaceholderSession, eventDispatcher); } @@ -702,6 +696,11 @@ public class DefaultDrmSessionManager implements DrmSessionManager { && shouldReleasePreacquiredSessionsBeforeRetrying && !preacquiredSessionReferences.isEmpty()) { releaseAllPreacquiredSessions(); + if (!keepaliveSessions.isEmpty()) { + // Some preacquired sessions released above are now in their keepalive timeout phase. We + // release the keepalive references immediately. + releaseAllKeepaliveSessions(); + } undoAcquisition(session, eventDispatcher); session = createAndAcquireSession(schemeDatas, isPlaceholderSession, eventDispatcher); } @@ -728,6 +727,15 @@ public class DefaultDrmSessionManager implements DrmSessionManager { } } + private void releaseAllKeepaliveSessions() { + // Make a local copy, because sessions are removed from this.keepaliveSessions during + // release (via callback). + ImmutableSet keepaliveSessions = ImmutableSet.copyOf(this.keepaliveSessions); + for (DrmSession keepaliveSession : keepaliveSessions) { + keepaliveSession.release(/* eventDispatcher= */ null); + } + } + private void releaseAllPreacquiredSessions() { // Make a local copy, because sessions are removed from this.preacquiredSessionReferences // during release (via callback). diff --git a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java index e5375012f7..ea8e91628b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java @@ -25,6 +25,7 @@ import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference; import com.google.android.exoplayer2.drm.ExoMediaDrm.AppManagedProvider; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.testutil.FakeExoMediaDrm; @@ -302,6 +303,64 @@ public class DefaultDrmSessionManagerTest { assertThat(secondDrmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); } + @Test(timeout = 10_000) + public void maxConcurrentSessionsExceeded_allPreacquiredAndKeepaliveSessionsEagerlyReleased() + throws Exception { + ImmutableList secondSchemeDatas = + ImmutableList.of(DRM_SCHEME_DATAS.get(0).copyWithData(TestUtil.createByteArray(4, 5, 6))); + FakeExoMediaDrm.LicenseServer licenseServer = + FakeExoMediaDrm.LicenseServer.allowingSchemeDatas(DRM_SCHEME_DATAS, secondSchemeDatas); + Format secondFormatWithDrmInitData = + new Format.Builder().setDrmInitData(new DrmInitData(secondSchemeDatas)).build(); + DrmSessionManager drmSessionManager = + new DefaultDrmSessionManager.Builder() + .setUuidAndExoMediaDrmProvider( + DRM_SCHEME_UUID, + uuid -> new FakeExoMediaDrm.Builder().setMaxConcurrentSessions(1).build()) + .setSessionKeepaliveMs(10_000) + .setMultiSession(true) + .build(/* mediaDrmCallback= */ licenseServer); + + drmSessionManager.prepare(); + DrmSessionReference firstDrmSessionReference = + checkNotNull( + drmSessionManager.preacquireSession( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + FORMAT_WITH_DRM_INIT_DATA)); + DrmSession firstDrmSession = + checkNotNull( + drmSessionManager.acquireSession( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + FORMAT_WITH_DRM_INIT_DATA)); + waitForOpenedWithKeys(firstDrmSession); + firstDrmSession.release(/* eventDispatcher= */ null); + + // The direct reference to firstDrmSession has been released, it's being kept alive by both + // firstDrmSessionReference and drmSessionManager's internal reference. + assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); + DrmSession secondDrmSession = + checkNotNull( + drmSessionManager.acquireSession( + /* playbackLooper= */ checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + secondFormatWithDrmInitData)); + // The drmSessionManager had to release both it's internal keep-alive reference and the + // reference represented by firstDrmSessionReference in order to acquire secondDrmSession. + assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED); + + waitForOpenedWithKeys(secondDrmSession); + assertThat(secondDrmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); + + // Not needed (because the manager has already released this reference) but we call it anyway + // for completeness. + firstDrmSessionReference.release(); + // Clean-up + secondDrmSession.release(/* eventDispatcher= */ null); + drmSessionManager.release(); + } + @Test(timeout = 10_000) public void sessionReacquired_keepaliveTimeOutCancelled() throws Exception { FakeExoMediaDrm.LicenseServer licenseServer = @@ -364,7 +423,7 @@ public class DefaultDrmSessionManagerTest { drmSessionManager.prepare(); - DrmSessionManager.DrmSessionReference sessionReference = + DrmSessionReference sessionReference = drmSessionManager.preacquireSession( /* playbackLooper= */ checkNotNull(Looper.myLooper()), eventDispatcher, @@ -413,7 +472,7 @@ public class DefaultDrmSessionManagerTest { drmSessionManager.prepare(); - DrmSessionManager.DrmSessionReference sessionReference = + DrmSessionReference sessionReference = drmSessionManager.preacquireSession( /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, @@ -453,7 +512,7 @@ public class DefaultDrmSessionManagerTest { drmSessionManager.prepare(); - DrmSessionManager.DrmSessionReference sessionReference = + DrmSessionReference sessionReference = drmSessionManager.preacquireSession( /* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, From 92bf5d80c78ba2842b38b688cdb35be5bcd03574 Mon Sep 17 00:00:00 2001 From: krocard Date: Tue, 14 Sep 2021 20:42:35 +0100 Subject: [PATCH 169/441] Add nullness annotations to TsExtractors #exofixit PiperOrigin-RevId: 396658717 --- .../exoplayer2/extractor/ts/TsExtractor.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java index 1ff9c06e79..1fc399d6a5 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java @@ -48,6 +48,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.checkerframework.checker.nullness.compatqual.NullableType; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Extracts data from the MPEG-2 TS container format. */ public final class TsExtractor implements Extractor { @@ -110,7 +112,7 @@ public final class TsExtractor implements Extractor { private static final int BUFFER_SIZE = TS_PACKET_SIZE * 50; private static final int SNIFF_TS_PACKET_COUNT = 5; - private final @Mode int mode; + @Mode private final int mode; private final int timestampSearchBytes; private final List timestampAdjusters; private final ParsableByteArray tsPacketBuffer; @@ -122,13 +124,13 @@ public final class TsExtractor implements Extractor { private final TsDurationReader durationReader; // Accessed only by the loading thread. - private TsBinarySearchSeeker tsBinarySearchSeeker; + private @MonotonicNonNull TsBinarySearchSeeker tsBinarySearchSeeker; private ExtractorOutput output; private int remainingPmts; private boolean tracksEnded; private boolean hasOutputSeekMap; private boolean pendingSeekToStart; - private TsPayloadReader id3Reader; + @Nullable private TsPayloadReader id3Reader; private int bytesSinceLastSync; private int pcrPid; @@ -214,6 +216,7 @@ public final class TsExtractor implements Extractor { tsPayloadReaders = new SparseArray<>(); continuityCounters = new SparseIntArray(); durationReader = new TsDurationReader(timestampSearchBytes); + output = ExtractorOutput.PLACEHOLDER; pcrPid = -1; resetPayloadReaders(); } @@ -289,8 +292,8 @@ public final class TsExtractor implements Extractor { } @Override - public @ReadResult int read(ExtractorInput input, PositionHolder seekPosition) - throws IOException { + @ReadResult + public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { long inputLength = input.getLength(); if (tracksEnded) { boolean canReadDuration = inputLength != C.LENGTH_UNSET && mode != MODE_HLS; @@ -549,7 +552,7 @@ public final class TsExtractor implements Extractor { private static final int TS_PMT_DESC_DVB_EXT_AC4 = 0x15; private final ParsableBitArray pmtScratch; - private final SparseArray trackIdToReaderScratch; + private final SparseArray<@NullableType TsPayloadReader> trackIdToReaderScratch; private final SparseIntArray trackIdToPidScratch; private final int pid; @@ -618,10 +621,12 @@ public final class TsExtractor implements Extractor { // appears intermittently during playback. See [Internal: b/20261500]. EsInfo id3EsInfo = new EsInfo(TS_STREAM_TYPE_ID3, null, null, Util.EMPTY_BYTE_ARRAY); id3Reader = payloadReaderFactory.createPayloadReader(TS_STREAM_TYPE_ID3, id3EsInfo); - id3Reader.init( - timestampAdjuster, - output, - new TrackIdGenerator(programNumber, TS_STREAM_TYPE_ID3, MAX_PID_PLUS_ONE)); + if (id3Reader != null) { + id3Reader.init( + timestampAdjuster, + output, + new TrackIdGenerator(programNumber, TS_STREAM_TYPE_ID3, MAX_PID_PLUS_ONE)); + } } trackIdToReaderScratch.clear(); From 005336315cd2b79a69ad4f4788dcff80f9c294c2 Mon Sep 17 00:00:00 2001 From: jaeholee104 Date: Fri, 10 Sep 2021 04:57:52 +0900 Subject: [PATCH 170/441] Add the options for the maximum resolution values for which the selector may choose to discard when switching up to a higher quality --- .../AdaptiveTrackSelection.java | 46 +++++++++-- .../AdaptiveTrackSelectionTest.java | 80 +++++++++++++++++++ 2 files changed, 121 insertions(+), 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java index 95df027ac2..080c0de00b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java @@ -53,6 +53,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { private final int minDurationForQualityIncreaseMs; private final int maxDurationForQualityDecreaseMs; private final int minDurationToRetainAfterDiscardMs; + private final int maxWidthToDiscard; + private final int maxHeightToDiscard; private final float bandwidthFraction; private final float bufferedFractionToLiveEdgeForQualityIncrease; private final Clock clock; @@ -63,6 +65,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + DEFAULT_MAX_WIDTH_TO_DISCARD, + DEFAULT_MAX_HEIGHT_TO_DISCARD, DEFAULT_BANDWIDTH_FRACTION, DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, Clock.DEFAULT); @@ -80,6 +84,10 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { * be discarded to speed up the switch. This is the minimum duration of media that must be * retained at the lower quality. It must be at least {@code * minDurationForQualityIncreaseMs}. + * @param maxWidthToDiscard This is the maximum width for which the selector may choose to + * discard when switching up to a higher quality. + * @param maxHeightToDiscard This is the maximum height for which the selector may choose to + * discard when switching up to a higher quality. * @param bandwidthFraction The fraction of the available bandwidth that the selection should * consider available for use. Setting to a value less than 1 is recommended to account for * inaccuracies in the bandwidth estimator. @@ -88,11 +96,15 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { int minDurationForQualityIncreaseMs, int maxDurationForQualityDecreaseMs, int minDurationToRetainAfterDiscardMs, + int maxWidthToDiscard, + int maxHeightToDiscard, float bandwidthFraction) { this( minDurationForQualityIncreaseMs, maxDurationForQualityDecreaseMs, minDurationToRetainAfterDiscardMs, + maxWidthToDiscard, + maxHeightToDiscard, bandwidthFraction, DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, Clock.DEFAULT); @@ -110,6 +122,10 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { * be discarded to speed up the switch. This is the minimum duration of media that must be * retained at the lower quality. It must be at least {@code * minDurationForQualityIncreaseMs}. + * @param maxWidthToDiscard This is the maximum width for which the selector may choose to + * discard when switching up to a higher quality. + * @param maxHeightToDiscard This is the maximum height for which the selector may choose to + * discard when switching up to a higher quality. * @param bandwidthFraction The fraction of the available bandwidth that the selection should * consider available for use. Setting to a value less than 1 is recommended to account for * inaccuracies in the bandwidth estimator. @@ -125,12 +141,16 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { int minDurationForQualityIncreaseMs, int maxDurationForQualityDecreaseMs, int minDurationToRetainAfterDiscardMs, + int maxWidthToDiscard, + int maxHeightToDiscard, float bandwidthFraction, float bufferedFractionToLiveEdgeForQualityIncrease, Clock clock) { this.minDurationForQualityIncreaseMs = minDurationForQualityIncreaseMs; this.maxDurationForQualityDecreaseMs = maxDurationForQualityDecreaseMs; this.minDurationToRetainAfterDiscardMs = minDurationToRetainAfterDiscardMs; + this.maxWidthToDiscard = maxWidthToDiscard; + this.maxHeightToDiscard = maxHeightToDiscard; this.bandwidthFraction = bandwidthFraction; this.bufferedFractionToLiveEdgeForQualityIncrease = bufferedFractionToLiveEdgeForQualityIncrease; @@ -192,6 +212,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { minDurationForQualityIncreaseMs, maxDurationForQualityDecreaseMs, minDurationToRetainAfterDiscardMs, + maxWidthToDiscard, + maxHeightToDiscard, bandwidthFraction, bufferedFractionToLiveEdgeForQualityIncrease, adaptationCheckpoints, @@ -202,6 +224,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { public static final int DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS = 10_000; public static final int DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS = 25_000; public static final int DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS = 25_000; + public static final int DEFAULT_MAX_WIDTH_TO_DISCARD = 1279; + public static final int DEFAULT_MAX_HEIGHT_TO_DISCARD = 719; public static final float DEFAULT_BANDWIDTH_FRACTION = 0.7f; public static final float DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE = 0.75f; @@ -211,6 +235,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { private final long minDurationForQualityIncreaseUs; private final long maxDurationForQualityDecreaseUs; private final long minDurationToRetainAfterDiscardUs; + private final int maxWidthToDiscard; + private final int maxHeightToDiscard; private final float bandwidthFraction; private final float bufferedFractionToLiveEdgeForQualityIncrease; private final ImmutableList adaptationCheckpoints; @@ -237,6 +263,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + DEFAULT_MAX_WIDTH_TO_DISCARD, + DEFAULT_MAX_HEIGHT_TO_DISCARD, DEFAULT_BANDWIDTH_FRACTION, DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, /* adaptationCheckpoints= */ ImmutableList.of(), @@ -257,6 +285,10 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { * quality, the selection may indicate that media already buffered at the lower quality can be * discarded to speed up the switch. This is the minimum duration of media that must be * retained at the lower quality. It must be at least {@code minDurationForQualityIncreaseMs}. + * @param maxWidthToDiscard This is the maximum width for which the selector may choose to + * discard when switching up to a higher quality. + * @param maxHeightToDiscard This is the maximum height for which the selector may choose to + * discard when switching up to a higher quality. * @param bandwidthFraction The fraction of the available bandwidth that the selection should * consider available for use. Setting to a value less than 1 is recommended to account for * inaccuracies in the bandwidth estimator. @@ -278,6 +310,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { long minDurationForQualityIncreaseMs, long maxDurationForQualityDecreaseMs, long minDurationToRetainAfterDiscardMs, + int maxWidthToDiscard, + int maxHeightToDiscard, float bandwidthFraction, float bufferedFractionToLiveEdgeForQualityIncrease, List adaptationCheckpoints, @@ -294,6 +328,8 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { this.minDurationForQualityIncreaseUs = minDurationForQualityIncreaseMs * 1000L; this.maxDurationForQualityDecreaseUs = maxDurationForQualityDecreaseMs * 1000L; this.minDurationToRetainAfterDiscardUs = minDurationToRetainAfterDiscardMs * 1000L; + this.maxWidthToDiscard = maxWidthToDiscard; + this.maxHeightToDiscard = maxHeightToDiscard; this.bandwidthFraction = bandwidthFraction; this.bufferedFractionToLiveEdgeForQualityIncrease = bufferedFractionToLiveEdgeForQualityIncrease; @@ -410,9 +446,9 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { } int idealSelectedIndex = determineIdealSelectedIndex(nowMs, getLastChunkDurationUs(queue)); Format idealFormat = getFormat(idealSelectedIndex); - // If the chunks contain video, discard from the first SD chunk beyond - // minDurationToRetainAfterDiscardUs whose resolution and bitrate are both lower than the ideal - // track. + // If the chunks contain video, discard from the first chunk less than or equal to + // maxWidthToDiscard and maxHeightToDiscard beyond minDurationToRetainAfterDiscardUs + // whose resolution and bitrate are both lower than the ideal track. for (int i = 0; i < queueSize; i++) { MediaChunk chunk = queue.get(i); Format format = chunk.trackFormat; @@ -422,9 +458,9 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { if (playoutDurationBeforeThisChunkUs >= minDurationToRetainAfterDiscardUs && format.bitrate < idealFormat.bitrate && format.height != Format.NO_VALUE - && format.height < 720 + && format.height <= maxHeightToDiscard && format.width != Format.NO_VALUE - && format.width < 1280 + && format.width <= maxWidthToDiscard && format.height < idealFormat.height) { return i; } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelectionTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelectionTest.java index 021694eb23..5f231c91cd 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelectionTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelectionTest.java @@ -321,6 +321,52 @@ public final class AdaptiveTrackSelectionTest { assertThat(newSize).isEqualTo(2); } + @Test + public void evaluateQueueSizeDiscardChunksLessThanOrEqualToMaximumResolution() { + Format format1 = videoFormat(/* bitrate= */ 500, /* width= */ 320, /* height= */ 240); + Format format2 = videoFormat(/* bitrate= */ 1000, /* width= */ 640, /* height= */ 480); + Format format3 = videoFormat(/* bitrate= */ 2000, /* width= */ 960, /* height= */ 720); + TrackGroup trackGroup = new TrackGroup(format1, format2, format3); + + FakeMediaChunk chunk1 = + new FakeMediaChunk(format2, /* startTimeUs= */ 0, /* endTimeUs= */ 10_000_000); + FakeMediaChunk chunk2 = + new FakeMediaChunk(format2, /* startTimeUs= */ 10_000_000, /* endTimeUs= */ 20_000_000); + FakeMediaChunk chunk3 = + new FakeMediaChunk(format2, /* startTimeUs= */ 20_000_000, /* endTimeUs= */ 30_000_000); + FakeMediaChunk chunk4 = + new FakeMediaChunk(format2, /* startTimeUs= */ 30_000_000, /* endTimeUs= */ 40_000_000); + FakeMediaChunk chunk5 = + new FakeMediaChunk(format1, /* startTimeUs= */ 40_000_000, /* endTimeUs= */ 50_000_000); + + List queue = new ArrayList<>(); + queue.add(chunk1); + queue.add(chunk2); + queue.add(chunk3); + queue.add(chunk4); + queue.add(chunk5); + + when(mockBandwidthMeter.getBitrateEstimate()).thenReturn(500L); + AdaptiveTrackSelection adaptiveTrackSelection = + prepareAdaptiveTrackSelectionWithMaxResolutionToDiscard( + trackGroup, + /* maxWidthToDiscard= */320, + /* maxHeightToDiscard= */240 + ); + + int initialQueueSize = adaptiveTrackSelection.evaluateQueueSize(0, queue); + assertThat(initialQueueSize).isEqualTo(5); + + fakeClock.advanceTime(2000); + when(mockBandwidthMeter.getBitrateEstimate()).thenReturn(2000L); + + // When bandwidth estimation is updated and time has advanced enough, we can discard chunks at + // the end of the queue now. + // In this case, only chunks less than or equal to width = 320 and height = 240 are discarded. + int newSize = adaptiveTrackSelection.evaluateQueueSize(0, queue); + assertThat(newSize).isEqualTo(4); + } + @Test public void updateSelectedTrack_usesFormatOfLastChunkInTheQueueForSelection() { Format format1 = videoFormat(/* bitrate= */ 500, /* width= */ 320, /* height= */ 240); @@ -331,6 +377,8 @@ public final class AdaptiveTrackSelectionTest { /* minDurationForQualityIncreaseMs= */ 10_000, /* maxDurationForQualityDecreaseMs= */ 10_000, /* minDurationToRetainAfterDiscardMs= */ 25_000, + /* maxWidthToDiscard= */ 1279, + /* maxHeightToDiscard= */ 719, /* bandwidthFraction= */ 1f) .createAdaptiveTrackSelection( trackGroup, @@ -616,6 +664,8 @@ public final class AdaptiveTrackSelectionTest { AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + AdaptiveTrackSelection.DEFAULT_MAX_WIDTH_TO_DISCARD, + AdaptiveTrackSelection.DEFAULT_MAX_HEIGHT_TO_DISCARD, bandwidthFraction, AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, /* adaptationCheckpoints= */ ImmutableList.of(), @@ -633,6 +683,8 @@ public final class AdaptiveTrackSelectionTest { minDurationForQualityIncreaseMs, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + AdaptiveTrackSelection.DEFAULT_MAX_WIDTH_TO_DISCARD, + AdaptiveTrackSelection.DEFAULT_MAX_HEIGHT_TO_DISCARD, /* bandwidthFraction= */ 1.0f, AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, /* adaptationCheckpoints= */ ImmutableList.of(), @@ -650,6 +702,8 @@ public final class AdaptiveTrackSelectionTest { AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, maxDurationForQualityDecreaseMs, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + AdaptiveTrackSelection.DEFAULT_MAX_WIDTH_TO_DISCARD, + AdaptiveTrackSelection.DEFAULT_MAX_HEIGHT_TO_DISCARD, /* bandwidthFraction= */ 1.0f, AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, /* adaptationCheckpoints= */ ImmutableList.of(), @@ -668,6 +722,30 @@ public final class AdaptiveTrackSelectionTest { AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, durationToRetainAfterDiscardMs, + AdaptiveTrackSelection.DEFAULT_MAX_WIDTH_TO_DISCARD, + AdaptiveTrackSelection.DEFAULT_MAX_HEIGHT_TO_DISCARD, + /* bandwidthFraction= */ 1.0f, + AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, + /* adaptationCheckpoints= */ ImmutableList.of(), + fakeClock)); + } + + private AdaptiveTrackSelection + prepareAdaptiveTrackSelectionWithMaxResolutionToDiscard( + TrackGroup trackGroup, + int maxWidthToDiscard, + int maxHeightToDiscard) { + return prepareTrackSelection( + new AdaptiveTrackSelection( + trackGroup, + selectedAllTracksInGroup(trackGroup), + TrackSelection.TYPE_UNSET, + mockBandwidthMeter, + AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, + AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, + AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + maxWidthToDiscard, + maxHeightToDiscard, /* bandwidthFraction= */ 1.0f, AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, /* adaptationCheckpoints= */ ImmutableList.of(), @@ -685,6 +763,8 @@ public final class AdaptiveTrackSelectionTest { AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, + AdaptiveTrackSelection.DEFAULT_MAX_WIDTH_TO_DISCARD, + AdaptiveTrackSelection.DEFAULT_MAX_HEIGHT_TO_DISCARD, /* bandwidthFraction= */ 1.0f, AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE, adaptationCheckpoints, From aa8fe5df86014d38910894d8e0dae727f8c6fd81 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 15 Sep 2021 09:01:10 +0100 Subject: [PATCH 171/441] Add a test for MediaItem equality when using whole-object setters Follow-up to https://github.com/google/ExoPlayer/commit/9f3c2fb5e10a4e17a753e3791c9e4e07a79005d1 PiperOrigin-RevId: 396776798 --- .../android/exoplayer2/MediaItemTest.java | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 1da3443512..a10707a4f5 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -23,6 +23,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -432,7 +433,8 @@ public class MediaItemTest { } @Test - public void buildUpon_equalsToOriginal() { + @SuppressWarnings("deprecation") // Testing deprecated setter methods + public void buildUpon_individualSetters_equalsToOriginal() { MediaItem mediaItem = new MediaItem.Builder() .setAdTagUri(URI_STRING) @@ -478,6 +480,54 @@ public class MediaItemTest { assertThat(copy).isEqualTo(mediaItem); } + @Test + public void buildUpon_wholeObjectSetters_equalsToOriginal() { + MediaItem mediaItem = + new MediaItem.Builder() + .setAdTagUri(URI_STRING) + .setClipEndPositionMs(1000) + .setClipRelativeToDefaultPosition(true) + .setClipRelativeToLiveWindow(true) + .setClipStartPositionMs(100) + .setClipStartsAtKeyFrame(true) + .setCustomCacheKey("key") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(URI_STRING + "/license") + .setLicenseRequestHeaders(ImmutableMap.of("Referer", "http://www.google.com")) + .setMultiSession(true) + .setForceDefaultLicenseUri(true) + .setPlayClearContentWithoutKey(true) + .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .setKeySetId(new byte[] {1, 2, 3}) + .build()) + .setMediaId("mediaId") + .setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build()) + .setMimeType(MimeTypes.APPLICATION_MP4) + .setUri(URI_STRING) + .setStreamKeys(ImmutableList.of(new StreamKey(1, 0, 0))) + .setLiveTargetOffsetMs(20_000) + .setLiveMinPlaybackSpeed(.9f) + .setLiveMaxPlaybackSpeed(1.1f) + .setLiveMinOffsetMs(2222) + .setLiveMaxOffsetMs(4444) + .setSubtitles( + ImmutableList.of( + new MediaItem.Subtitle( + Uri.parse(URI_STRING + "/en"), + MimeTypes.APPLICATION_TTML, + /* language= */ "en", + C.SELECTION_FLAG_FORCED, + C.ROLE_FLAG_ALTERNATE, + "label"))) + .setTag(new Object()) + .build(); + + MediaItem copy = mediaItem.buildUpon().build(); + + assertThat(copy).isEqualTo(mediaItem); + } + @Test public void roundTripViaBundle_withoutPlaybackProperties_yieldsEqualInstance() { MediaItem mediaItem = From 8540b7266c2c07502c52fb1e9117fc97a1a90018 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 15 Sep 2021 09:28:54 +0100 Subject: [PATCH 172/441] Add open @IntDef for track selection type #exofixit PiperOrigin-RevId: 396780460 --- .../trackselection/TrackSelection.java | 18 ++++++++++++++++++ .../trackselection/AdaptiveTrackSelection.java | 2 +- .../trackselection/BaseTrackSelection.java | 4 ++-- .../trackselection/DefaultTrackSelector.java | 4 ++-- .../trackselection/ExoTrackSelection.java | 4 ++-- .../trackselection/FixedTrackSelection.java | 13 ++++--------- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java index e439b5d00e..6ba2687326 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java @@ -15,9 +15,15 @@ */ package com.google.android.exoplayer2.trackselection; +import androidx.annotation.IntDef; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.source.TrackGroup; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * A track selection consisting of a static subset of selected tracks belonging to a {@link @@ -27,6 +33,17 @@ import com.google.android.exoplayer2.source.TrackGroup; */ public interface TrackSelection { + /** + * Represents a type track selection. Either {@link #TYPE_UNSET} or an app-defined value (see + * {@link #TYPE_CUSTOM_BASE}). + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @Target({ElementType.TYPE_USE}) + @IntDef( + open = true, + value = {TYPE_UNSET}) + @interface Type {} /** An unspecified track selection type. */ int TYPE_UNSET = 0; /** The first value that can be used for application specific track selection types. */ @@ -40,6 +57,7 @@ public interface TrackSelection { * starting from {@link #TYPE_CUSTOM_BASE} to ensure they don't conflict with any types that may * be added to the library in the future. */ + @Type int getType(); /** Returns the {@link TrackGroup} to which the selected tracks belong. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java index 95df027ac2..73fa081a86 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java @@ -273,7 +273,7 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { protected AdaptiveTrackSelection( TrackGroup group, int[] tracks, - int type, + @Type int type, BandwidthMeter bandwidthMeter, long minDurationForQualityIncreaseMs, long maxDurationForQualityDecreaseMs, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/BaseTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/BaseTrackSelection.java index 670f319f90..d0ddf18b8f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/BaseTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/BaseTrackSelection.java @@ -39,7 +39,7 @@ public abstract class BaseTrackSelection implements ExoTrackSelection { protected final int[] tracks; /** The type of the selection. */ - private final int type; + private final @Type int type; /** The {@link Format}s of the selected tracks, in order of decreasing bandwidth. */ private final Format[] formats; /** Selected track exclusion timestamps, in order of decreasing bandwidth. */ @@ -63,7 +63,7 @@ public abstract class BaseTrackSelection implements ExoTrackSelection { * null or empty. May be in any order. * @param type The type that will be returned from {@link TrackSelection#getType()}. */ - public BaseTrackSelection(TrackGroup group, int[] tracks, int type) { + public BaseTrackSelection(TrackGroup group, int[] tracks, @Type int type) { Assertions.checkState(tracks.length > 0); this.type = type; this.group = Assertions.checkNotNull(group); 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 19fd32187f..fc9e188e16 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 @@ -1262,7 +1262,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { public final int groupIndex; public final int[] tracks; public final int length; - public final int type; + public final @TrackSelection.Type int type; /** * Constructs a {@code SelectionOverride} to override tracks of a group. @@ -1281,7 +1281,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { * @param tracks The overriding track indices within the track group. * @param type The type that will be returned from {@link TrackSelection#getType()}. */ - public SelectionOverride(int groupIndex, int[] tracks, int type) { + public SelectionOverride(int groupIndex, int[] tracks, @TrackSelection.Type int type) { this.groupIndex = groupIndex; this.tracks = Arrays.copyOf(tracks, tracks.length); this.length = tracks.length; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/ExoTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/ExoTrackSelection.java index ca4445362d..6f2772fb81 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/ExoTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/ExoTrackSelection.java @@ -43,7 +43,7 @@ public interface ExoTrackSelection extends TrackSelection { /** The indices of the selected tracks in {@link #group}. */ public final int[] tracks; /** The type that will be returned from {@link TrackSelection#getType()}. */ - public final int type; + public final @Type int type; /** * @param group The {@link TrackGroup}. Must not be null. @@ -60,7 +60,7 @@ public interface ExoTrackSelection extends TrackSelection { * null or empty. May be in any order. * @param type The type that will be returned from {@link TrackSelection#getType()}. */ - public Definition(TrackGroup group, int[] tracks, int type) { + public Definition(TrackGroup group, int[] tracks, @Type int type) { this.group = group; this.tracks = tracks; this.type = type; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java index 7995526408..df198f6fe0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java @@ -41,13 +41,8 @@ public final class FixedTrackSelection extends BaseTrackSelection { * @param track The index of the selected track within the {@link TrackGroup}. * @param type The type that will be returned from {@link TrackSelection#getType()}. */ - public FixedTrackSelection(TrackGroup group, int track, int type) { - this( - group, - /* track= */ track, - /* type= */ type, - /* reason= */ C.SELECTION_REASON_UNKNOWN, - null); + public FixedTrackSelection(TrackGroup group, int track, @Type int type) { + this(group, track, type, C.SELECTION_REASON_UNKNOWN, /* data= */ null); } /** @@ -58,8 +53,8 @@ public final class FixedTrackSelection extends BaseTrackSelection { * @param data Optional data associated with the track selection. */ public FixedTrackSelection( - TrackGroup group, int track, int type, int reason, @Nullable Object data) { - super(group, /* tracks= */ new int[] {track}, /* type= */ type); + TrackGroup group, int track, @Type int type, int reason, @Nullable Object data) { + super(group, /* tracks= */ new int[] {track}, type); this.reason = reason; this.data = data; } From 7947d27819ab78c09d79f6a3701586cf8031067b Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Wed, 15 Sep 2021 10:01:03 +0100 Subject: [PATCH 173/441] Docs: Add demos and testapps documentation. * Add new README files for the Transformer demo and media/testapps/. * Add an androidx demos README in media/github/ PiperOrigin-RevId: 396784430 --- .../media/github/README-androidx-demos.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md diff --git a/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md b/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md new file mode 100644 index 0000000000..b752df19ab --- /dev/null +++ b/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md @@ -0,0 +1,26 @@ +# Android media demos # + +This directory contains applications that demonstrate how to use Android media +projects, like ExoPlayer. +Browse the individual demos and their READMEs to learn more. + +## Running a demo ## + +### From Android Studio ### + +* File -> New -> Import Project -> Specify the root `media` folder. +* Choose the demo from the run configuration dropdown list. +* Click Run. + +### Using gradle from the command line: ### + +* Open a Terminal window at the root `media` folder. +* Run `./gradlew projects` to show all projects. Demo projects start with `demo`. +* Run `./gradlew ::tasks` to view the list of available tasks for +the demo project. Choose an install option from the `Install tasks` section. +* Run `./gradlew ::`. + +**Example**: + +`./gradlew :demo:installNoExtensionsDebug` installs the main ExoPlayer demo app + in debug mode with no extensions. From 416ec75b94072fd0f52742fcb895fcfec360a588 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 15 Sep 2021 10:57:42 +0100 Subject: [PATCH 174/441] Add factory methods to create MediaCodecAdapter.Configuration #exofixit PiperOrigin-RevId: 396793873 --- .../audio/MediaCodecAudioRenderer.java | 4 +- .../mediacodec/MediaCodecAdapter.java | 110 ++++++++++++++++-- .../video/MediaCodecVideoRenderer.java | 4 +- .../AsynchronousMediaCodecAdapterTest.java | 10 +- .../transformer/MediaCodecAdapterWrapper.java | 50 +++----- 5 files changed, 120 insertions(+), 58 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index 66a56cf15e..82f09f0b27 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -367,8 +367,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media MimeTypes.AUDIO_RAW.equals(codecInfo.mimeType) && !MimeTypes.AUDIO_RAW.equals(format.sampleMimeType); decryptOnlyCodecFormat = decryptOnlyCodecEnabled ? format : null; - return new MediaCodecAdapter.Configuration( - codecInfo, mediaFormat, format, /* surface= */ null, crypto, /* flags= */ 0); + return MediaCodecAdapter.Configuration.createForAudioDecoding( + codecInfo, mediaFormat, format, crypto); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index 7dd15954b1..2353baf516 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -39,13 +39,109 @@ import java.nio.ByteBuffer; public interface MediaCodecAdapter { /** Configuration parameters for a {@link MediaCodecAdapter}. */ final class Configuration { + + /** + * Creates a configuration for audio decoding. + * + * @param codecInfo See {@link #codecInfo}. + * @param mediaFormat See {@link #mediaFormat}. + * @param format See {@link #format}. + * @param crypto See {@link #crypto}. + * @return The created instance. + */ + public static Configuration createForAudioDecoding( + MediaCodecInfo codecInfo, + MediaFormat mediaFormat, + Format format, + @Nullable MediaCrypto crypto) { + return new Configuration( + codecInfo, + mediaFormat, + format, + /* surface= */ null, + crypto, + /* flags= */ 0, + /* createInputSurface= */ false); + } + + /** + * Creates a configuration for video decoding. + * + * @param codecInfo See {@link #codecInfo}. + * @param mediaFormat See {@link #mediaFormat}. + * @param format See {@link #format}. + * @param surface See {@link #surface}. + * @param crypto See {@link #crypto}. + * @return The created instance. + */ + public static Configuration createForVideoDecoding( + MediaCodecInfo codecInfo, + MediaFormat mediaFormat, + Format format, + @Nullable Surface surface, + @Nullable MediaCrypto crypto) { + return new Configuration( + codecInfo, + mediaFormat, + format, + surface, + crypto, + /* flags= */ 0, + /* createInputSurface= */ false); + } + + /** + * Creates a configuration for audio encoding. + * + * @param codecInfo See {@link #codecInfo}. + * @param mediaFormat See {@link #mediaFormat}. + * @param format See {@link #format}. + * @return The created instance. + */ + public static Configuration createForAudioEncoding( + MediaCodecInfo codecInfo, MediaFormat mediaFormat, Format format) { + return new Configuration( + codecInfo, + mediaFormat, + format, + /* surface= */ null, + /* crypto= */ null, + MediaCodec.CONFIGURE_FLAG_ENCODE, + /* createInputSurface= */ false); + } + + /** + * Creates a configuration for video encoding. + * + * @param codecInfo See {@link #codecInfo}. + * @param mediaFormat See {@link #mediaFormat}. + * @param format See {@link #format}. + * @return The created instance. + */ + @RequiresApi(18) + public static Configuration createForVideoEncoding( + MediaCodecInfo codecInfo, MediaFormat mediaFormat, Format format) { + return new Configuration( + codecInfo, + mediaFormat, + format, + /* surface= */ null, + /* crypto= */ null, + MediaCodec.CONFIGURE_FLAG_ENCODE, + /* createInputSurface= */ true); + } + /** Information about the {@link MediaCodec} being configured. */ public final MediaCodecInfo codecInfo; /** The {@link MediaFormat} for which the codec is being configured. */ public final MediaFormat mediaFormat; /** The {@link Format} for which the codec is being configured. */ public final Format format; - /** For video decoding, the output where the object will render the decoded frames. */ + /** + * For video decoding, the output where the object will render the decoded frames. This must be + * null if the codec is not a video decoder, or if it is configured for {@link ByteBuffer} + * output. + */ @Nullable public final Surface surface; /** For DRM protected playbacks, a {@link MediaCrypto} to use for decryption. */ @Nullable public final MediaCrypto crypto; @@ -61,17 +157,7 @@ public interface MediaCodecAdapter { */ public final boolean createInputSurface; - public Configuration( - MediaCodecInfo codecInfo, - MediaFormat mediaFormat, - Format format, - @Nullable Surface surface, - @Nullable MediaCrypto crypto, - int flags) { - this(codecInfo, mediaFormat, format, surface, crypto, flags, /* createInputSurface= */ false); - } - - public Configuration( + private Configuration( MediaCodecInfo codecInfo, MediaFormat mediaFormat, Format format, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 2640eb3c56..3bb6acee03 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -640,8 +640,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } surface = dummySurface; } - return new MediaCodecAdapter.Configuration( - codecInfo, mediaFormat, format, surface, crypto, /* flags= */ 0); + return MediaCodecAdapter.Configuration.createForVideoDecoding( + codecInfo, mediaFormat, format, surface, crypto); } @Override diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java index a7034dab2e..94410ab11f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java @@ -41,15 +41,13 @@ public class AsynchronousMediaCodecAdapterTest { @Before public void setUp() throws Exception { - MediaCodecInfo codecInfo = createMediaCodecInfo("h264", "video/mp4"); + MediaCodecInfo codecInfo = createMediaCodecInfo("aac", "audio/aac"); MediaCodecAdapter.Configuration configuration = - new MediaCodecAdapter.Configuration( + MediaCodecAdapter.Configuration.createForAudioDecoding( codecInfo, createMediaFormat("format"), - /* format= */ new Format.Builder().build(), - /* surface= */ null, - /* crypto= */ null, - /* flags= */ 0); + new Format.Builder().build(), + /* crypto= */ null); callbackThread = new HandlerThread("TestCallbackThread"); queueingThread = new HandlerThread("TestQueueingThread"); adapter = diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 348d45ad06..3177166e95 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -67,17 +67,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private boolean outputStreamEnded; private static class Factory extends SynchronousMediaCodecAdapter.Factory { - private final boolean decoder; - - public Factory(boolean decoder) { - this.decoder = decoder; - } - @Override protected MediaCodec createCodec(Configuration configuration) throws IOException { String sampleMimeType = checkNotNull(configuration.mediaFormat.getString(MediaFormat.KEY_MIME)); - return decoder + boolean isDecoder = (configuration.flags & MediaCodec.CONFIGURE_FLAG_ENCODE) == 0; + return isDecoder ? MediaCodec.createDecoderByType(checkNotNull(sampleMimeType)) : MediaCodec.createEncoderByType(checkNotNull(sampleMimeType)); } @@ -115,15 +110,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; mediaFormat, MediaFormat.KEY_MAX_INPUT_SIZE, format.maxInputSize); MediaFormatUtil.setCsdBuffers(mediaFormat, format.initializationData); adapter = - new Factory(/* decoder= */ true) + new Factory() .createAdapter( - new MediaCodecAdapter.Configuration( - createPlaceholderMediaCodecInfo(), - mediaFormat, - format, - /* surface= */ null, - /* crypto= */ null, - /* flags= */ 0)); + MediaCodecAdapter.Configuration.createForAudioDecoding( + createPlaceholderMediaCodecInfo(), mediaFormat, format, /* crypto= */ null)); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { @@ -154,15 +144,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; mediaFormat, MediaFormat.KEY_MAX_INPUT_SIZE, format.maxInputSize); MediaFormatUtil.setCsdBuffers(mediaFormat, format.initializationData); adapter = - new Factory(/* decoder= */ true) + new Factory() .createAdapter( - new MediaCodecAdapter.Configuration( + MediaCodecAdapter.Configuration.createForVideoDecoding( createPlaceholderMediaCodecInfo(), mediaFormat, format, surface, - /* crypto= */ null, - /* flags= */ 0)); + /* crypto= */ null)); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { @@ -190,15 +179,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; checkNotNull(format.sampleMimeType), format.sampleRate, format.channelCount); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, format.bitrate); adapter = - new Factory(/* decoder= */ false) + new Factory() .createAdapter( - new MediaCodecAdapter.Configuration( - createPlaceholderMediaCodecInfo(), - mediaFormat, - format, - /* surface= */ null, - /* crypto= */ null, - /* flags= */ MediaCodec.CONFIGURE_FLAG_ENCODE)); + MediaCodecAdapter.Configuration.createForAudioEncoding( + createPlaceholderMediaCodecInfo(), mediaFormat, format)); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { @@ -232,16 +216,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 5_000_000); adapter = - new Factory(/* decoder= */ false) + new Factory() .createAdapter( - new MediaCodecAdapter.Configuration( - createPlaceholderMediaCodecInfo(), - mediaFormat, - format, - /* surface= */ null, - /* crypto= */ null, - MediaCodec.CONFIGURE_FLAG_ENCODE, - /* createInputSurface= */ true)); + MediaCodecAdapter.Configuration.createForVideoEncoding( + createPlaceholderMediaCodecInfo(), mediaFormat, format)); return new MediaCodecAdapterWrapper(adapter); } catch (Exception e) { if (adapter != null) { From 5f0395ee2d648d2e2f421ce246d781c5eccd7581 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 15 Sep 2021 11:34:20 +0100 Subject: [PATCH 175/441] Add RTSP state machine. Please reference RFC2326 Section A.1 for the state transitions. PiperOrigin-RevId: 396799104 --- .../exoplayer2/source/rtsp/RtspClient.java | 51 +++++++++++++++++++ .../source/rtsp/RtspClientTest.java | 5 ++ 2 files changed, 56 insertions(+) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java index 665a387466..715212d211 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java @@ -40,6 +40,7 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.util.SparseArray; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; @@ -57,6 +58,9 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; import java.io.Closeable; import java.io.IOException; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.net.Socket; import java.util.ArrayDeque; import java.util.HashMap; @@ -68,6 +72,23 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** The RTSP client. */ /* package */ final class RtspClient implements Closeable { + /** + * The RTSP session state (RFC2326, Section A.1). One of {@link #RTSP_STATE_UNINITIALIZED}, {@link + * #RTSP_STATE_INIT}, {@link #RTSP_STATE_READY}, or {@link #RTSP_STATE_PLAYING}. + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({RTSP_STATE_UNINITIALIZED, RTSP_STATE_INIT, RTSP_STATE_READY, RTSP_STATE_PLAYING}) + public @interface RtspState {} + /** RTSP uninitialized state, the state before sending any SETUP request. */ + public static final int RTSP_STATE_UNINITIALIZED = -1; + /** RTSP initial state, the state after sending SETUP REQUEST. */ + public static final int RTSP_STATE_INIT = 0; + /** RTSP ready state, the state after receiving SETUP, or PAUSE response. */ + public static final int RTSP_STATE_READY = 1; + /** RTSP playing state, the state after receiving PLAY response. */ + public static final int RTSP_STATE_PLAYING = 2; + private static final String TAG = "RtspClient"; private static final long DEFAULT_RTSP_KEEP_ALIVE_INTERVAL_MS = 30_000; @@ -116,6 +137,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Nullable private String sessionId; @Nullable private KeepAliveMonitor keepAliveMonitor; @Nullable private RtspAuthenticationInfo rtspAuthenticationInfo; + @RtspState private int rtspState; private boolean hasUpdatedTimelineAndTracks; private boolean receivedAuthorizationRequest; private long pendingSeekPositionUs; @@ -151,6 +173,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; this.messageChannel = new RtspMessageChannel(new MessageListener()); this.rtspAuthUserInfo = RtspMessageUtil.parseUserInfo(uri); this.pendingSeekPositionUs = C.TIME_UNSET; + this.rtspState = RTSP_STATE_UNINITIALIZED; } /** @@ -171,6 +194,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; messageSender.sendOptionsRequest(uri, sessionId); } + /** Returns the current {@link RtspState RTSP state}. */ + @RtspState + public int getState() { + return rtspState; + } + /** * Triggers RTSP SETUP requests after track selection. * @@ -327,6 +356,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } public void sendSetupRequest(Uri trackUri, String transport, @Nullable String sessionId) { + rtspState = RTSP_STATE_INIT; sendRequest( getRequestWithCommonHeaders( METHOD_SETUP, @@ -336,6 +366,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } public void sendPlayRequest(Uri uri, long offsetMs, String sessionId) { + checkState(rtspState == RTSP_STATE_READY || rtspState == RTSP_STATE_PLAYING); sendRequest( getRequestWithCommonHeaders( METHOD_PLAY, @@ -346,12 +377,20 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } public void sendTeardownRequest(Uri uri, String sessionId) { + if (rtspState == RTSP_STATE_UNINITIALIZED || rtspState == RTSP_STATE_INIT) { + // No need to perform session teardown before a session is set up, where the state is + // RTSP_STATE_READY or RTSP_STATE_PLAYING. + return; + } + + rtspState = RTSP_STATE_INIT; sendRequest( getRequestWithCommonHeaders( METHOD_TEARDOWN, sessionId, /* additionalHeaders= */ ImmutableMap.of(), uri)); } public void sendPauseRequest(Uri uri, String sessionId) { + checkState(rtspState == RTSP_STATE_PLAYING); sendRequest( getRequestWithCommonHeaders( METHOD_PAUSE, sessionId, /* additionalHeaders= */ ImmutableMap.of(), uri)); @@ -487,6 +526,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; case 301: case 302: // Redirection request. + if (rtspState != RTSP_STATE_UNINITIALIZED) { + rtspState = RTSP_STATE_INIT; + } @Nullable String redirectionUriString = response.headers.get(RtspHeaders.LOCATION); if (redirectionUriString == null) { sessionInfoListener.onSessionTimelineRequestFailed( @@ -627,11 +669,17 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } private void onSetupResponseReceived(RtspSetupResponse response) { + checkState(rtspState != RTSP_STATE_UNINITIALIZED); + + rtspState = RTSP_STATE_READY; sessionId = response.sessionHeader.sessionId; continueSetupRtspTrack(); } private void onPlayResponseReceived(RtspPlayResponse response) { + checkState(rtspState == RTSP_STATE_READY); + + rtspState = RTSP_STATE_PLAYING; if (keepAliveMonitor == null) { keepAliveMonitor = new KeepAliveMonitor(DEFAULT_RTSP_KEEP_ALIVE_INTERVAL_MS); keepAliveMonitor.start(); @@ -643,6 +691,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } private void onPauseResponseReceived() { + checkState(rtspState == RTSP_STATE_PLAYING); + + rtspState = RTSP_STATE_READY; if (pendingSeekPositionUs != C.TIME_UNSET) { startPlayback(C.usToMs(pendingSeekPositionUs)); } diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java index 2ab0154b63..0018c8a9e4 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java @@ -118,6 +118,7 @@ public final class RtspClientTest { RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); assertThat(tracksInSession.get()).hasSize(2); + assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED); } @Test @@ -168,6 +169,7 @@ public final class RtspClientTest { RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); assertThat(tracksInSession.get()).hasSize(2); + assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED); } @Test @@ -210,6 +212,7 @@ public final class RtspClientTest { RobolectricUtil.runMainLooperUntil(() -> tracksInSession.get() != null); assertThat(tracksInSession.get()).hasSize(2); + assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED); } @Test @@ -256,6 +259,7 @@ public final class RtspClientTest { assertThat(failureMessage.get()).contains("DESCRIBE not supported."); assertThat(clientHasSentDescribeRequest.get()).isFalse(); + assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED); } @Test @@ -300,5 +304,6 @@ public final class RtspClientTest { RobolectricUtil.runMainLooperUntil(() -> failureCause.get() != null); assertThat(failureCause.get()).hasCauseThat().isInstanceOf(ParserException.class); + assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED); } } From 4433ac5a2ae244deaa614425e2d8273936bb3c59 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 15 Sep 2021 18:03:35 +0100 Subject: [PATCH 176/441] Rollback of https://github.com/google/ExoPlayer/commit/ee8df7afcb7982519b9375b590f8bdb086f0b08c *** Original commit *** Ensure MediaSourceFactory instances can be re-used This fixes DefaultDrmSessionManager so it can be used by a new Player instance (by nulling out its reference to the playback thread, which is unique per-Player instance). This only works if the DefaultDrmSessionManager is 'fully released' before being used by the second Player instance, meaning that the reference count of the manager and all its sessions is zero. #exofixit Issue: #9099 *** PiperOrigin-RevId: 396861138 --- RELEASENOTES.md | 4 - ...MediaSourceFactoryInstrumentationTest.java | 99 ------------------- .../drm/DefaultDrmSessionManager.java | 20 ++-- .../exoplayer2/source/MediaSourceFactory.java | 9 +- 4 files changed, 8 insertions(+), 124 deletions(-) delete mode 100644 library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2237810a19..187c6114e6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -20,10 +20,6 @@ * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with a relative path ([#9403](https://github.com/google/ExoPlayer/issues/9403)). - * Fix bug in `DefaultDrmSessionManager` which prevented - `MediaSourceFactory` instances from being re-used by `ExoPlayer` - instances with non-overlapping lifecycles - ([#9099](https://github.com/google/ExoPlayer/issues/9099)). * Better handle invalid seek requests. Seeks to positions that are before the start or after the end of the media are now handled as seeks to the start and end respectively diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java deleted file mode 100644 index 921fd0f027..0000000000 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryInstrumentationTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.source; - -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; -import static com.google.common.truth.Truth.assertThat; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.PlaybackException; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.util.ConditionVariable; -import java.util.concurrent.atomic.AtomicReference; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Instrumentation tests for {@link DefaultMediaSourceFactory}. */ -@RunWith(AndroidJUnit4.class) -public final class DefaultMediaSourceFactoryInstrumentationTest { - - // https://github.com/google/ExoPlayer/issues/9099 - @Test - public void reuseMediaSourceFactoryBetweenPlayerInstances() throws Exception { - MediaItem mediaItem = - new MediaItem.Builder() - .setUri("asset:///media/mp4/sample.mp4") - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmSessionForClearPeriods(true) - .build(); - AtomicReference player = new AtomicReference<>(); - DefaultMediaSourceFactory defaultMediaSourceFactory = - new DefaultMediaSourceFactory(getInstrumentation().getContext()); - getInstrumentation() - .runOnMainSync( - () -> - player.set( - new ExoPlayer.Builder(getInstrumentation().getContext()) - .setMediaSourceFactory(defaultMediaSourceFactory) - .build())); - playUntilEndAndRelease(player.get(), mediaItem); - getInstrumentation() - .runOnMainSync( - () -> - player.set( - new ExoPlayer.Builder(getInstrumentation().getContext()) - .setMediaSourceFactory(defaultMediaSourceFactory) - .build())); - playUntilEndAndRelease(player.get(), mediaItem); - } - - private void playUntilEndAndRelease(Player player, MediaItem mediaItem) - throws InterruptedException { - ConditionVariable playbackComplete = new ConditionVariable(); - AtomicReference playbackException = new AtomicReference<>(); - getInstrumentation() - .runOnMainSync( - () -> { - player.addListener( - new Player.Listener() { - @Override - public void onPlaybackStateChanged(@Player.State int playbackState) { - if (playbackState == Player.STATE_ENDED) { - playbackComplete.open(); - } - } - - @Override - public void onPlayerError(PlaybackException error) { - playbackException.set(error); - playbackComplete.open(); - } - }); - player.setMediaItem(mediaItem); - player.prepare(); - player.play(); - }); - - playbackComplete.block(); - getInstrumentation().runOnMainSync(player::release); - getInstrumentation().waitForIdleSync(); - assertThat(playbackException.get()).isNull(); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index cd40555205..786c4a1302 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -53,6 +53,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** * A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. @@ -297,8 +298,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager { @Nullable private ExoMediaDrm exoMediaDrm; @Nullable private DefaultDrmSession placeholderDrmSession; @Nullable private DefaultDrmSession noMultiSessionDrmSession; - @Nullable private Looper playbackLooper; - @Nullable private Handler playbackHandler; + private @MonotonicNonNull Looper playbackLooper; + private @MonotonicNonNull Handler playbackHandler; private int mode; @Nullable private byte[] offlineLicenseKeySetId; @@ -483,7 +484,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { } releaseAllPreacquiredSessions(); - maybeFullyReleaseManager(); + maybeReleaseMediaDrm(); } @Override @@ -662,7 +663,6 @@ public class DefaultDrmSessionManager implements DrmSessionManager { this.playbackLooper = playbackLooper; this.playbackHandler = new Handler(playbackLooper); } else { - // Check this manager is only being used by a single player at a time. checkState(this.playbackLooper == playbackLooper); checkNotNull(playbackHandler); } @@ -787,18 +787,12 @@ public class DefaultDrmSessionManager implements DrmSessionManager { return session; } - private void maybeFullyReleaseManager() { + private void maybeReleaseMediaDrm() { if (exoMediaDrm != null && prepareCallsCount == 0 && sessions.isEmpty() && preacquiredSessionReferences.isEmpty()) { - // This manager and all its sessions are fully released so we can null out the looper & - // handler references and release exoMediaDrm. - if (playbackLooper != null) { - checkNotNull(playbackHandler).removeCallbacksAndMessages(/* token= */ null); - playbackHandler = null; - playbackLooper = null; - } + // This manager and all its sessions are fully released so we can release exoMediaDrm. checkNotNull(exoMediaDrm).release(); exoMediaDrm = null; } @@ -949,7 +943,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { keepaliveSessions.remove(session); } } - maybeFullyReleaseManager(); + maybeReleaseMediaDrm(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index cbdae8aa41..755096bbe9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -19,7 +19,6 @@ import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DefaultDrmSessionManagerProvider; import com.google.android.exoplayer2.drm.DrmSessionManager; @@ -32,13 +31,7 @@ import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import java.util.List; -/** - * Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. - * - *

    A factory must only be used by a single {@link Player} at a time. A factory can only be - * re-used by a second {@link Player} if the previous {@link Player} and all associated resources - * are fully released. - */ +/** Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. */ public interface MediaSourceFactory { /** @deprecated Use {@link MediaItem.PlaybackProperties#streamKeys} instead. */ From 5a2fd983a91e48d51fc04058ed04c0d2094cf1dd Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 15 Sep 2021 23:22:23 +0100 Subject: [PATCH 177/441] Move database package to common module PiperOrigin-RevId: 396936785 --- .../android/exoplayer2/database/DatabaseIOException.java | 0 .../android/exoplayer2/database/DatabaseProvider.java | 4 ++-- .../exoplayer2/database/DefaultDatabaseProvider.java | 0 .../android/exoplayer2/database/ExoDatabaseProvider.java | 9 +++++---- .../google/android/exoplayer2/database/VersionTable.java | 4 ++-- .../google/android/exoplayer2/database/package-info.java | 0 .../android/exoplayer2/database/VersionTableTest.java | 0 7 files changed, 9 insertions(+), 8 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java (92%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java (91%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/VersionTable.java (97%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/database/package-info.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java b/library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java b/library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java similarity index 92% rename from library/core/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java index 2bb5f260ba..2d6130400e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java @@ -19,12 +19,12 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; /** - * Provides {@link SQLiteDatabase} instances to ExoPlayer components, which may read and write + * Provides {@link SQLiteDatabase} instances to media library components, which may read and write * tables prefixed with {@link #TABLE_PREFIX}. */ public interface DatabaseProvider { - /** Prefix for tables that can be read and written by ExoPlayer components. */ + /** Prefix for tables that can be read and written by media library components. */ String TABLE_PREFIX = "ExoPlayer"; /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java b/library/common/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java b/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java similarity index 91% rename from library/core/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java index 32dda5965c..4996c7e17d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java @@ -23,15 +23,16 @@ import android.database.sqlite.SQLiteOpenHelper; import com.google.android.exoplayer2.util.Log; /** - * An {@link SQLiteOpenHelper} that provides instances of a standalone ExoPlayer database. + * An {@link SQLiteOpenHelper} that provides instances of a standalone database. * *

    Suitable for use by applications that do not already have their own database, or that would - * prefer to keep ExoPlayer tables isolated in their own database. Other applications should prefer - * to use {@link DefaultDatabaseProvider} with their own {@link SQLiteOpenHelper}. + * prefer to keep tables used by media library components isolated in their own database. Other + * applications should prefer to use {@link DefaultDatabaseProvider} with their own {@link + * SQLiteOpenHelper}. */ public final class ExoDatabaseProvider extends SQLiteOpenHelper implements DatabaseProvider { - /** The file name used for the standalone ExoPlayer database. */ + /** The file name used for the standalone database. */ public static final String DATABASE_NAME = "exoplayer_internal.db"; private static final int VERSION = 1; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/VersionTable.java b/library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java similarity index 97% rename from library/core/src/main/java/com/google/android/exoplayer2/database/VersionTable.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java index e69b9576dd..d6d2a1cb7d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/database/VersionTable.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java @@ -26,8 +26,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Utility methods for accessing versions of ExoPlayer database components. This allows them to be - * versioned independently to the version of the containing database. + * Utility methods for accessing versions of media library database components. This allows them to + * be versioned independently to the version of the containing database. */ public final class VersionTable { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/database/package-info.java b/library/common/src/main/java/com/google/android/exoplayer2/database/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/database/package-info.java rename to library/common/src/main/java/com/google/android/exoplayer2/database/package-info.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java b/library/common/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java From 86dc31f291770b87c3625bfc36295a476f63e9a8 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 15 Sep 2021 23:29:37 +0100 Subject: [PATCH 178/441] Reset only renderers that have been enabled #exofixit PiperOrigin-RevId: 396938258 --- .../exoplayer2/ExoPlayerImplInternal.java | 22 ++- .../android/exoplayer2/ExoPlayerTest.java | 140 ++++++++++++++++++ .../exoplayer2/testutil/FakeRenderer.java | 13 ++ 3 files changed, 167 insertions(+), 8 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 93b8311894..02cf785eed 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -57,10 +57,12 @@ import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** Implements the internal behavior of {@link ExoPlayerImpl}. */ @@ -165,6 +167,7 @@ import java.util.concurrent.atomic.AtomicBoolean; private static final long MIN_RENDERER_SLEEP_DURATION_MS = 2000; private final Renderer[] renderers; + private final Set renderersToReset; private final RendererCapabilities[] rendererCapabilities; private final TrackSelector trackSelector; private final TrackSelectorResult emptyTrackSelectorResult; @@ -254,6 +257,7 @@ import java.util.concurrent.atomic.AtomicBoolean; } mediaClock = new DefaultMediaClock(this, clock); pendingMessages = new ArrayList<>(); + renderersToReset = Sets.newIdentityHashSet(); window = new Timeline.Window(); period = new Timeline.Period(); trackSelector.init(/* listener= */ this, bandwidthMeter); @@ -1322,7 +1326,7 @@ import java.util.concurrent.atomic.AtomicBoolean; this.foregroundMode = foregroundMode; if (!foregroundMode) { for (Renderer renderer : renderers) { - if (!isRendererEnabled(renderer)) { + if (!isRendererEnabled(renderer) && renderersToReset.remove(renderer)) { renderer.reset(); } } @@ -1382,11 +1386,13 @@ import java.util.concurrent.atomic.AtomicBoolean; } if (resetRenderers) { for (Renderer renderer : renderers) { - try { - renderer.reset(); - } catch (RuntimeException e) { - // There's nothing we can do. - Log.e(TAG, "Reset failed.", e); + if (renderersToReset.remove(renderer)) { + try { + renderer.reset(); + } catch (RuntimeException e) { + // There's nothing we can do. + Log.e(TAG, "Reset failed.", e); + } } } } @@ -2385,7 +2391,7 @@ import java.util.concurrent.atomic.AtomicBoolean; // Reset all disabled renderers before enabling any new ones. This makes sure resources released // by the disabled renderers will be available to renderers that are being enabled. for (int i = 0; i < renderers.length; i++) { - if (!trackSelectorResult.isRendererEnabled(i)) { + if (!trackSelectorResult.isRendererEnabled(i) && renderersToReset.remove(renderers[i])) { renderers[i].reset(); } } @@ -2417,6 +2423,7 @@ import java.util.concurrent.atomic.AtomicBoolean; boolean joining = !wasRendererEnabled && playing; // Enable the renderer. enabledRendererCount++; + renderersToReset.add(renderer); renderer.enable( rendererConfiguration, formats, @@ -2426,7 +2433,6 @@ import java.util.concurrent.atomic.AtomicBoolean; mayRenderStartOfStream, periodHolder.getStartPositionRendererTime(), periodHolder.getRendererOffset()); - renderer.handleMessage( Renderer.MSG_SET_WAKEUP_LISTENER, new Renderer.WakeupListener() { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index e004a19a99..fab7b86a16 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -335,6 +335,146 @@ public final class ExoPlayerTest { assertThat(renderer.isEnded).isTrue(); } + @Test + public void renderersLifecycle_renderersThatAreNeverEnabled_areNotReset() throws Exception { + Timeline timeline = new FakeTimeline(); + final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); + SimpleExoPlayer player = + new TestExoPlayerBuilder(context).setRenderers(videoRenderer, audioRenderer).build(); + Player.Listener mockPlayerListener = mock(Player.Listener.class); + player.addListener(mockPlayerListener); + player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); + player.prepare(); + + player.play(); + runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + + assertThat(audioRenderer.enabledCount).isEqualTo(1); + assertThat(audioRenderer.resetCount).isEqualTo(1); + assertThat(videoRenderer.enabledCount).isEqualTo(0); + assertThat(videoRenderer.resetCount).isEqualTo(0); + } + + @Test + public void renderersLifecycle_setForegroundMode_resetsDisabledRenderersThatHaveBeenEnabled() + throws Exception { + Timeline timeline = new FakeTimeline(); + final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); + final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); + SimpleExoPlayer player = + new TestExoPlayerBuilder(context).setRenderers(videoRenderer, audioRenderer).build(); + Player.Listener mockPlayerListener = mock(Player.Listener.class); + player.addListener(mockPlayerListener); + player.setMediaSources( + ImmutableList.of( + new FakeMediaSource( + timeline, ExoPlayerTestRunner.AUDIO_FORMAT, ExoPlayerTestRunner.VIDEO_FORMAT), + new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT))); + player.prepare(); + + player.play(); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); + player.setForegroundMode(/* foregroundMode= */ true); + // Only the video renderer that is disabled in the second window has been reset. + assertThat(audioRenderer.resetCount).isEqualTo(0); + assertThat(videoRenderer.resetCount).isEqualTo(1); + + runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + // After release the audio renderer is reset as well. + assertThat(audioRenderer.enabledCount).isEqualTo(1); + assertThat(audioRenderer.resetCount).isEqualTo(1); + assertThat(videoRenderer.enabledCount).isEqualTo(1); + assertThat(videoRenderer.resetCount).isEqualTo(1); + assertThat(textRenderer.enabledCount).isEqualTo(0); + assertThat(textRenderer.resetCount).isEqualTo(0); + } + + @Test + public void renderersLifecycle_selectTextTracksWhilePlaying_textRendererEnabledAndReset() + throws Exception { + Timeline timeline = new FakeTimeline(); + final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); + final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); + Format textFormat = + new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).setLanguage("en").build(); + SimpleExoPlayer player = + new TestExoPlayerBuilder(context).setRenderers(audioRenderer, textRenderer).build(); + Player.Listener mockPlayerListener = mock(Player.Listener.class); + player.addListener(mockPlayerListener); + player.setMediaSources( + ImmutableList.of( + new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT), + new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT, textFormat))); + player.prepare(); + + player.play(); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); + // Only the audio renderer enabled so far. + assertThat(audioRenderer.enabledCount).isEqualTo(1); + assertThat(textRenderer.enabledCount).isEqualTo(0); + player.setTrackSelectionParameters( + player.getTrackSelectionParameters().buildUpon().setPreferredTextLanguage("en").build()); + runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + + assertThat(audioRenderer.enabledCount).isEqualTo(1); + assertThat(audioRenderer.resetCount).isEqualTo(1); + assertThat(textRenderer.enabledCount).isEqualTo(1); + assertThat(textRenderer.resetCount).isEqualTo(1); + assertThat(videoRenderer.enabledCount).isEqualTo(0); + assertThat(videoRenderer.resetCount).isEqualTo(0); + } + + @Test + public void renderersLifecycle_seekTo_resetsDisabledRenderersIfRequired() throws Exception { + Timeline timeline = new FakeTimeline(); + final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); + final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); + final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); + Format textFormat = + new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).setLanguage("en").build(); + SimpleExoPlayer player = + new TestExoPlayerBuilder(context) + .setRenderers(videoRenderer, audioRenderer, textRenderer) + .build(); + Player.Listener mockPlayerListener = mock(Player.Listener.class); + player.addListener(mockPlayerListener); + player.setTrackSelectionParameters( + player.getTrackSelectionParameters().buildUpon().setPreferredTextLanguage("en").build()); + player.setMediaSources( + ImmutableList.of( + new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT), + new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT, textFormat))); + player.prepare(); + + player.play(); + runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); + // Disable text renderer by selecting a language that is not available. + player.setTrackSelectionParameters( + player.getTrackSelectionParameters().buildUpon().setPreferredTextLanguage("de").build()); + player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 1000); + runUntilPlaybackState(player, Player.STATE_READY); + // Expect formerly enabled renderers to be reset after seek. + assertThat(textRenderer.resetCount).isEqualTo(1); + assertThat(audioRenderer.resetCount).isEqualTo(0); + assertThat(videoRenderer.resetCount).isEqualTo(0); + runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + + // Verify that the text renderer has not been reset a second time. + assertThat(audioRenderer.enabledCount).isEqualTo(2); + assertThat(audioRenderer.resetCount).isEqualTo(1); + assertThat(textRenderer.enabledCount).isEqualTo(1); + assertThat(textRenderer.resetCount).isEqualTo(1); + assertThat(videoRenderer.enabledCount).isEqualTo(0); + assertThat(videoRenderer.resetCount).isEqualTo(0); + } + /** * Tests that the player does not unnecessarily reset renderers when playing a multi-period * source. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java index 3aab64eab6..1018207de1 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java @@ -61,6 +61,8 @@ public class FakeRenderer extends BaseRenderer { public boolean isEnded; public int positionResetCount; public int sampleBufferReadCount; + public int enabledCount; + public int resetCount; public FakeRenderer(@C.TrackType int trackType) { super(trackType); @@ -136,6 +138,17 @@ public class FakeRenderer extends BaseRenderer { } } + @Override + protected void onEnabled(boolean joining, boolean mayRenderStartOfStream) + throws ExoPlaybackException { + enabledCount++; + } + + @Override + protected void onReset() { + resetCount++; + } + @Override public boolean isReady() { return lastSamplePositionUs >= playbackPositionUs || hasPendingBuffer || isSourceReady(); From f5498ec4bfa004bfab6ca0daf1bab0789fc6d716 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 16 Sep 2021 01:17:47 +0100 Subject: [PATCH 179/441] Rename ExoDatabaseProvider to StandaloneDatabaseProvider PiperOrigin-RevId: 396959703 --- .../database/ExoDatabaseProvider.java | 77 +-------------- .../database/StandaloneDatabaseProvider.java | 97 +++++++++++++++++++ 2 files changed, 101 insertions(+), 73 deletions(-) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java b/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java index 4996c7e17d..ca59be690e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java @@ -16,81 +16,12 @@ package com.google.android.exoplayer2.database; import android.content.Context; -import android.database.Cursor; -import android.database.SQLException; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import com.google.android.exoplayer2.util.Log; -/** - * An {@link SQLiteOpenHelper} that provides instances of a standalone database. - * - *

    Suitable for use by applications that do not already have their own database, or that would - * prefer to keep tables used by media library components isolated in their own database. Other - * applications should prefer to use {@link DefaultDatabaseProvider} with their own {@link - * SQLiteOpenHelper}. - */ -public final class ExoDatabaseProvider extends SQLiteOpenHelper implements DatabaseProvider { +/** @deprecated Use {@link StandaloneDatabaseProvider}. */ +@Deprecated +public final class ExoDatabaseProvider extends StandaloneDatabaseProvider { - /** The file name used for the standalone database. */ - public static final String DATABASE_NAME = "exoplayer_internal.db"; - - private static final int VERSION = 1; - private static final String TAG = "ExoDatabaseProvider"; - - /** - * Provides instances of the database located by passing {@link #DATABASE_NAME} to {@link - * Context#getDatabasePath(String)}. - * - * @param context Any context. - */ public ExoDatabaseProvider(Context context) { - super(context.getApplicationContext(), DATABASE_NAME, /* factory= */ null, VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - // Features create their own tables. - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // Features handle their own upgrades. - } - - @Override - public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - wipeDatabase(db); - } - - /** - * Makes a best effort to wipe the existing database. The wipe may be incomplete if the database - * contains foreign key constraints. - */ - private static void wipeDatabase(SQLiteDatabase db) { - String[] columns = {"type", "name"}; - try (Cursor cursor = - db.query( - "sqlite_master", - columns, - /* selection= */ null, - /* selectionArgs= */ null, - /* groupBy= */ null, - /* having= */ null, - /* orderBy= */ null)) { - while (cursor.moveToNext()) { - String type = cursor.getString(0); - String name = cursor.getString(1); - if (!"sqlite_sequence".equals(name)) { - // If it's not an SQL-controlled entity, drop it - String sql = "DROP " + type + " IF EXISTS " + name; - try { - db.execSQL(sql); - } catch (SQLException e) { - Log.e(TAG, "Error executing " + sql, e); - } - } - } - } + super(context); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java b/library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java new file mode 100644 index 0000000000..244cd39490 --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.database; + +import android.content.Context; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import com.google.android.exoplayer2.util.Log; + +/** + * An {@link SQLiteOpenHelper} that provides instances of a standalone database. + * + *

    Suitable for use by applications that do not already have their own database, or that would + * prefer to keep tables used by media library components isolated in their own database. Other + * applications should prefer to use {@link DefaultDatabaseProvider} with their own {@link + * SQLiteOpenHelper}. + */ +// TODO: Make this class final when ExoDatabaseProvider is removed. +public class StandaloneDatabaseProvider extends SQLiteOpenHelper implements DatabaseProvider { + + /** The file name used for the standalone database. */ + public static final String DATABASE_NAME = "exoplayer_internal.db"; + + private static final int VERSION = 1; + private static final String TAG = "SADatabaseProvider"; + + /** + * Provides instances of the database located by passing {@link #DATABASE_NAME} to {@link + * Context#getDatabasePath(String)}. + * + * @param context Any context. + */ + public StandaloneDatabaseProvider(Context context) { + super(context.getApplicationContext(), DATABASE_NAME, /* factory= */ null, VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // Features create their own tables. + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Features handle their own upgrades. + } + + @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + wipeDatabase(db); + } + + /** + * Makes a best effort to wipe the existing database. The wipe may be incomplete if the database + * contains foreign key constraints. + */ + private static void wipeDatabase(SQLiteDatabase db) { + String[] columns = {"type", "name"}; + try (Cursor cursor = + db.query( + "sqlite_master", + columns, + /* selection= */ null, + /* selectionArgs= */ null, + /* groupBy= */ null, + /* having= */ null, + /* orderBy= */ null)) { + while (cursor.moveToNext()) { + String type = cursor.getString(0); + String name = cursor.getString(1); + if (!"sqlite_sequence".equals(name)) { + // If it's not an SQL-controlled entity, drop it + String sql = "DROP " + type + " IF EXISTS " + name; + try { + db.execSQL(sql); + } catch (SQLException e) { + Log.e(TAG, "Error executing " + sql, e); + } + } + } + } + } +} From 78fc27a1c6f4e343c39dd67028712a6c0c319663 Mon Sep 17 00:00:00 2001 From: christosts Date: Thu, 16 Sep 2021 11:55:10 +0100 Subject: [PATCH 180/441] Fix HLS endless retrying on load errors This was originally reported on #9390. There was a bug that when HLS loads failed, the player would endlessly retry and never fail with a player error. This change fixes a bug in HlsSampleStreamWrapper.onPlaylistError() which would return true for a playlist whose load encountered an error but could not be excluded, whereas the method should return false. Issue: #9390 #minor-release PiperOrigin-RevId: 397045802 --- RELEASENOTES.md | 4 ++++ .../source/hls/HlsSampleStreamWrapper.java | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 187c6114e6..05f0ff7d52 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -56,6 +56,10 @@ ([#9370](https://github.com/google/ExoPlayer/issues/9370)). * Fix base URL selection and load error handling when base URLs are shared across adaptation sets. +* HLS + * Fix bug where the player would get stuck if all download attempts fail + and would not raise an error to the application. + ([#9390](https://github.com/google/ExoPlayer/issues/9390)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 1f0f92d158..8f639518bc 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -555,6 +555,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; chunkSource.setIsTimestampMaster(isTimestampMaster); } + /** + * Called if an error is encountered while loading a playlist. + * + * @param playlistUrl The {@link Uri} of the playlist whose load encountered an error. + * @param loadErrorInfo The load error info. + * @param forceRetry Whether retry should be forced without considering exclusion. + * @return True if excluding did not encounter errors. False otherwise. + */ public boolean onPlaylistError(Uri playlistUrl, LoadErrorInfo loadErrorInfo, boolean forceRetry) { if (!chunkSource.obtainsChunksForPlaylist(playlistUrl)) { // Return early if the chunk source doesn't deliver chunks for the failing playlist. @@ -571,7 +579,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; exclusionDurationMs = fallbackSelection.exclusionDurationMs; } } - return chunkSource.onPlaylistError(playlistUrl, exclusionDurationMs); + // We must call ChunkSource.onPlaylistError in any case to give the chunk source the chance to + // mark the playlist as failing. + return chunkSource.onPlaylistError(playlistUrl, exclusionDurationMs) + && exclusionDurationMs != C.TIME_UNSET; } // SampleStream implementation. From 2f0aae0d5fccb60dc366141408ac46dc5668516d Mon Sep 17 00:00:00 2001 From: claincly Date: Thu, 16 Sep 2021 14:12:19 +0100 Subject: [PATCH 181/441] Fix RTSP WWW-Authenticate header parsing. Issue: #9428 #minor-release PiperOrigin-RevId: 397064086 --- RELEASENOTES.md | 2 ++ .../exoplayer2/source/rtsp/RtspMessageUtil.java | 10 +++++----- .../exoplayer2/source/rtsp/RtspMessageUtilTest.java | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 05f0ff7d52..d30bce256c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -103,6 +103,8 @@ ([#9346](https://github.com/google/ExoPlayer/issues/9346)). * Fix RTSP Session header handling ([#9416](https://github.com/google/ExoPlayer/issues/9416)). + * Fix RTSP WWW-Authenticate header parsing + ([#9428](https://github.com/google/ExoPlayer/issues/9428)). * Extractors: * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings ([#9087](https://github.com/google/ExoPlayer/issues/9087)). diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java index 4e8b7a08d0..8f46b43e74 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java @@ -99,13 +99,13 @@ import java.util.regex.Pattern; // WWW-Authenticate header pattern, see RFC2068 Sections 14.46 and RFC2069. private static final Pattern WWW_AUTHENTICATION_HEADER_DIGEST_PATTERN = Pattern.compile( - "Digest realm=\"([\\w\\s@.]+)\"" - + ",\\s?(?:domain=\"(.+)\",\\s?)?" - + "nonce=\"(\\w+)\"" - + "(?:,\\s?opaque=\"(\\w+)\")?"); + "Digest realm=\"([^\"\\x00-\\x08\\x0A-\\x1f\\x7f]+)\"" + + ",\\s?(?:domain=\"(.+)\"" + + ",\\s?)?nonce=\"([^\"\\x00-\\x08\\x0A-\\x1f\\x7f]+)\"" + + "(?:,\\s?opaque=\"([^\"\\x00-\\x08\\x0A-\\x1f\\x7f]+)\")?"); // WWW-Authenticate header pattern, see RFC2068 Section 11.1 and RFC2069. private static final Pattern WWW_AUTHENTICATION_HEADER_BASIC_PATTERN = - Pattern.compile("Basic realm=\"([\\w\\s@.]+)\""); + Pattern.compile("Basic realm=\"([^\"\\x00-\\x08\\x0A-\\x1f\\x7f]+)\""); private static final String RTSP_VERSION = "RTSP/1.0"; private static final String LF = new String(new byte[] {Ascii.LF}); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java index d6a37965c0..3cf2d27768 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtilTest.java @@ -499,10 +499,10 @@ public final class RtspMessageUtilTest { @Test public void parseWWWAuthenticateHeader_withBasicAuthentication_succeeds() throws Exception { RtspAuthenticationInfo authenticationInfo = - RtspMessageUtil.parseWwwAuthenticateHeader("Basic realm=\"WallyWorld\""); + RtspMessageUtil.parseWwwAuthenticateHeader("Basic realm=\"Wally - World\""); assertThat(authenticationInfo.authenticationMechanism).isEqualTo(RtspAuthenticationInfo.BASIC); assertThat(authenticationInfo.nonce).isEmpty(); - assertThat(authenticationInfo.realm).isEqualTo("WallyWorld"); + assertThat(authenticationInfo.realm).isEqualTo("Wally - World"); } @Test @@ -510,13 +510,13 @@ public final class RtspMessageUtilTest { throws Exception { RtspAuthenticationInfo authenticationInfo = RtspMessageUtil.parseWwwAuthenticateHeader( - "Digest realm=\"testrealm@host.com\", domain=\"host.com\"," + "Digest realm=\"test-realm@host.com\", domain=\"host.com\"," + " nonce=\"dcd98b7102dd2f0e8b11d0f600bfb0c093\", " + " opaque=\"5ccc069c403ebaf9f0171e9517f40e41\""); assertThat(authenticationInfo.authenticationMechanism).isEqualTo(RtspAuthenticationInfo.DIGEST); assertThat(authenticationInfo.nonce).isEqualTo("dcd98b7102dd2f0e8b11d0f600bfb0c093"); - assertThat(authenticationInfo.realm).isEqualTo("testrealm@host.com"); + assertThat(authenticationInfo.realm).isEqualTo("test-realm@host.com"); assertThat(authenticationInfo.opaque).isEmpty(); } From e5e8d9dc176f379fad7c32515b4ae8e3e187530d Mon Sep 17 00:00:00 2001 From: samrobinson Date: Thu, 16 Sep 2021 14:21:56 +0100 Subject: [PATCH 182/441] Make StubExoPlayer take a context in constructor. This is a pre-requisite step for merging SimpleExoPlayer into ExoPlayer, because when StubExoPlayer extends ExoPlayer, it needs a matching constructor. PiperOrigin-RevId: 397065374 --- .../android/exoplayer2/ext/ima/FakePlayer.java | 4 +++- .../exoplayer2/ext/ima/ImaAdsLoaderTest.java | 2 +- .../android/exoplayer2/ForwardingPlayerTest.java | 16 +++++++++++----- .../exoplayer2/testutil/StubExoPlayer.java | 5 +++++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index 3e1cbc128b..66612a17a2 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.ext.ima; +import android.content.Context; import android.os.Looper; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; @@ -45,7 +46,8 @@ import com.google.android.exoplayer2.util.ListenerSet; private int adGroupIndex; private int adIndexInAdGroup; - public FakePlayer() { + public FakePlayer(Context context) { + super(context); listeners = new ListenerSet<>( Looper.getMainLooper(), diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java index 24c3574257..06711d6055 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java @@ -145,7 +145,7 @@ public final class ImaAdsLoaderTest { @Before public void setUp() { setupMocks(); - fakePlayer = new FakePlayer(); + fakePlayer = new FakePlayer(getApplicationContext()); adViewGroup = new FrameLayout(getApplicationContext()); View adOverlayView = new View(getApplicationContext()); adViewProvider = diff --git a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java index 38bf115135..2446efaf8b 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java @@ -24,6 +24,8 @@ import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import android.content.Context; +import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.testutil.StubExoPlayer; import com.google.android.exoplayer2.util.FlagSet; @@ -46,7 +48,7 @@ public class ForwardingPlayerTest { @Test public void addListener_addsForwardingListener() { - FakePlayer player = new FakePlayer(); + FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); Player.Listener listener1 = mock(Player.Listener.class); Player.Listener listener2 = mock(Player.Listener.class); @@ -62,7 +64,7 @@ public class ForwardingPlayerTest { @Test @SuppressWarnings("deprecation") // Testing backwards compatibility with deprecated method. public void addEventListener_addsForwardingListener() { - FakePlayer player = new FakePlayer(); + FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); Player.EventListener listener1 = mock(Player.EventListener.class); Player.EventListener listener2 = mock(Player.EventListener.class); @@ -77,7 +79,7 @@ public class ForwardingPlayerTest { @Test public void removeListener_removesForwardingListener() { - FakePlayer player = new FakePlayer(); + FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); Player.Listener listener1 = mock(Player.Listener.class); Player.Listener listener2 = mock(Player.Listener.class); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); @@ -96,7 +98,7 @@ public class ForwardingPlayerTest { @Test @SuppressWarnings("deprecation") // Testing backwards compatibility with deprecated method. public void removeEventListener_removesForwardingListener() { - FakePlayer player = new FakePlayer(); + FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); Player.EventListener listener1 = mock(Player.EventListener.class); Player.EventListener listener2 = mock(Player.EventListener.class); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); @@ -114,7 +116,7 @@ public class ForwardingPlayerTest { @Test public void onEvents_passesForwardingPlayerAsArgument() { - FakePlayer player = new FakePlayer(); + FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); Player.Listener listener = mock(Player.Listener.class); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); forwardingPlayer.addListener(listener); @@ -220,6 +222,10 @@ public class ForwardingPlayerTest { private final Set listeners = new HashSet<>(); + public FakePlayer(Context context) { + super(context); + } + @Override @SuppressWarnings("deprecation") // Implementing deprecated method. public void addListener(EventListener listener) { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index fece3444e5..f37bf72a78 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.testutil; +import android.content.Context; import android.os.Looper; import android.view.Surface; import android.view.SurfaceHolder; @@ -53,6 +54,10 @@ import java.util.List; */ public class StubExoPlayer extends BasePlayer implements ExoPlayer { + public StubExoPlayer(Context context) { + super(); + } + @Override @Deprecated public AudioComponent getAudioComponent() { From f8dde8ed5f1bfbfe1e976ffd252dd147aae19379 Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 16 Sep 2021 14:31:49 +0100 Subject: [PATCH 183/441] Move classes from util package in lib-exoplayer PiperOrigin-RevId: 397066804 --- .../java/com/google/android/exoplayer2/util/AtomicFile.java | 0 .../com/google/android/exoplayer2/util/ColorParser.java | 0 .../google/android/exoplayer2/util/EGLSurfaceTexture.java | 0 .../google/android/exoplayer2/util/NetworkTypeObserver.java | 0 .../google/android/exoplayer2/util/NotificationUtil.java | 0 .../google/android/exoplayer2/util/PriorityTaskManager.java | 0 .../google/android/exoplayer2/util/RunnableFutureTask.java | 0 .../java/com/google/android/exoplayer2/util/UriUtil.java | 0 .../com/google/android/exoplayer2/util/AtomicFileTest.java | 0 .../com/google/android/exoplayer2/util/ColorParserTest.java | 0 .../android/exoplayer2/util/RunnableFutureTaskTest.java | 0 .../google/android/exoplayer2/util/TimedValueQueueTest.java | 0 .../com/google/android/exoplayer2/util/UriUtilTest.java | 0 .../android/exoplayer2/upstream/DefaultBandwidthMeter.java | 1 - .../exoplayer2/{util => upstream}/SlidingPercentile.java | 2 +- .../android/exoplayer2/upstream/cache/CacheDataSink.java | 1 - .../exoplayer2/upstream/cache/CachedContentIndex.java | 1 - .../cache}/ReusableBufferedOutputStream.java | 6 ++++-- .../cache}/ReusableBufferedOutputStreamTest.java | 3 ++- 19 files changed, 7 insertions(+), 7 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/ColorParser.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/EGLSurfaceTexture.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/NotificationUtil.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/RunnableFutureTask.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/util/UriUtil.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/util/ColorParserTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/util/RunnableFutureTaskTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/util/TimedValueQueueTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/util/UriUtilTest.java (100%) rename library/core/src/main/java/com/google/android/exoplayer2/{util => upstream}/SlidingPercentile.java (99%) rename library/core/src/main/java/com/google/android/exoplayer2/{util => upstream/cache}/ReusableBufferedOutputStream.java (88%) rename library/core/src/test/java/com/google/android/exoplayer2/{util => upstream/cache}/ReusableBufferedOutputStreamTest.java (94%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java b/library/common/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/AtomicFile.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java b/library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EGLSurfaceTexture.java b/library/common/src/main/java/com/google/android/exoplayer2/util/EGLSurfaceTexture.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/EGLSurfaceTexture.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/EGLSurfaceTexture.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/NetworkTypeObserver.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/NotificationUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NotificationUtil.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/NotificationUtil.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/NotificationUtil.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java b/library/common/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/PriorityTaskManager.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/RunnableFutureTask.java b/library/common/src/main/java/com/google/android/exoplayer2/util/RunnableFutureTask.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/RunnableFutureTask.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/RunnableFutureTask.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/UriUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/UriUtil.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/util/UriUtil.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/UriUtil.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/ColorParserTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/ColorParserTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/util/ColorParserTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/util/ColorParserTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/RunnableFutureTaskTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/RunnableFutureTaskTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/util/RunnableFutureTaskTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/util/RunnableFutureTaskTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/TimedValueQueueTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/TimedValueQueueTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/util/TimedValueQueueTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/util/TimedValueQueueTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/UriUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/UriUtilTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/util/UriUtilTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/util/UriUtilTest.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java index 7fd0928c61..c046ca8d45 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java @@ -23,7 +23,6 @@ import com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener.Event import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.NetworkTypeObserver; -import com.google.android.exoplayer2.util.SlidingPercentile; import com.google.android.exoplayer2.util.Util; import com.google.common.base.Ascii; import com.google.common.collect.ImmutableList; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/SlidingPercentile.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/SlidingPercentile.java similarity index 99% rename from library/core/src/main/java/com/google/android/exoplayer2/util/SlidingPercentile.java rename to library/core/src/main/java/com/google/android/exoplayer2/upstream/SlidingPercentile.java index ebe5c2a5f4..b7385c8eda 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/SlidingPercentile.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/SlidingPercentile.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.upstream; import java.util.ArrayList; import java.util.Collections; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java index 7661171e4c..93e520b042 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.cache.Cache.CacheException; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; -import com.google.android.exoplayer2.util.ReusableBufferedOutputStream; import com.google.android.exoplayer2.util.Util; import java.io.File; import java.io.FileOutputStream; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java index f8289809f8..e8ba423a0a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java @@ -36,7 +36,6 @@ import com.google.android.exoplayer2.database.DatabaseProvider; import com.google.android.exoplayer2.database.VersionTable; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.AtomicFile; -import com.google.android.exoplayer2.util.ReusableBufferedOutputStream; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableSet; import java.io.BufferedInputStream; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java similarity index 88% rename from library/core/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java rename to library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java index 1db3d2c1f4..b952fdc1b9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.upstream.cache; +import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Util; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -23,7 +25,7 @@ import java.io.OutputStream; * This is a subclass of {@link BufferedOutputStream} with a {@link #reset(OutputStream)} method * that allows an instance to be re-used with another underlying output stream. */ -public final class ReusableBufferedOutputStream extends BufferedOutputStream { +/* package */ final class ReusableBufferedOutputStream extends BufferedOutputStream { private boolean closed; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStreamTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java similarity index 94% rename from library/core/src/test/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStreamTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java index bc1cc8a5cb..13a4099706 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStreamTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.upstream.cache; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.util.Util; import java.io.ByteArrayOutputStream; import org.junit.Test; import org.junit.runner.RunWith; From 4455554e9eb6bf4d1527b24e7d4ecd72afbbef03 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 16 Sep 2021 14:54:19 +0100 Subject: [PATCH 184/441] Use Android 12's AudioManager.getPlaybackOffloadSupport Previously gapless offload support was hardcoded to Pixel only. PiperOrigin-RevId: 397070378 --- .../java/com/google/android/exoplayer2/C.java | 20 ++++++++ .../exoplayer2/audio/DefaultAudioSink.java | 46 +++++++++++-------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 6a2755fe6c..ac7c5d8e04 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -459,6 +459,26 @@ public final class C { public static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; + /** + * Playback offload mode. One of {@link #PLAYBACK_OFFLOAD_NOT_SUPPORTED},{@link + * PLAYBACK_OFFLOAD_SUPPORTED} or {@link PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED}. + */ + @IntDef({ + PLAYBACK_OFFLOAD_NOT_SUPPORTED, + PLAYBACK_OFFLOAD_SUPPORTED, + PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AudioManagerOffloadMode {} + /** See AudioManager#PLAYBACK_OFFLOAD_NOT_SUPPORTED */ + public static final int PLAYBACK_OFFLOAD_NOT_SUPPORTED = + AudioManager.PLAYBACK_OFFLOAD_NOT_SUPPORTED; + /** See AudioManager#PLAYBACK_OFFLOAD_SUPPORTED */ + public static final int PLAYBACK_OFFLOAD_SUPPORTED = AudioManager.PLAYBACK_OFFLOAD_SUPPORTED; + /** See AudioManager#PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED */ + public static final int PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED = + AudioManager.PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED; + /** * Flags which can apply to a buffer containing a media sample. Possible flag values are {@link * #BUFFER_FLAG_KEY_FRAME}, {@link #BUFFER_FLAG_END_OF_STREAM}, {@link #BUFFER_FLAG_LAST_SAMPLE}, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 376776575b..3592aef8bb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -1619,33 +1619,41 @@ public final class DefaultAudioSink implements AudioSink { return false; } AudioFormat audioFormat = getAudioFormat(format.sampleRate, channelConfig, encoding); - if (!AudioManager.isOffloadedPlaybackSupported( - audioFormat, audioAttributes.getAudioAttributesV21())) { - return false; + + switch (getOffloadedPlaybackSupport(audioFormat, audioAttributes.getAudioAttributesV21())) { + case C.PLAYBACK_OFFLOAD_NOT_SUPPORTED: + return false; + case C.PLAYBACK_OFFLOAD_SUPPORTED: + boolean isGapless = format.encoderDelay != 0 || format.encoderPadding != 0; + boolean gaplessSupportRequired = offloadMode == OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED; + return !isGapless || !gaplessSupportRequired; + case C.PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED: + return true; + default: + throw new IllegalStateException(); } - boolean isGapless = format.encoderDelay != 0 || format.encoderPadding != 0; - boolean offloadRequiresGaplessSupport = offloadMode == OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED; - if (isGapless && offloadRequiresGaplessSupport && !isOffloadedGaplessPlaybackSupported()) { - return false; + } + + @C.AudioManagerOffloadMode + private int getOffloadedPlaybackSupport( + AudioFormat audioFormat, android.media.AudioAttributes audioAttributes) { + if (Util.SDK_INT >= 31) { + return AudioManager.getPlaybackOffloadSupport(audioFormat, audioAttributes); } - return true; + if (!AudioManager.isOffloadedPlaybackSupported(audioFormat, audioAttributes)) { + return C.PLAYBACK_OFFLOAD_NOT_SUPPORTED; + } + // Manual testing has shown that Pixels on Android 11 support gapless offload. + if (Util.SDK_INT == 30 && Util.MODEL.startsWith("Pixel")) { + return C.PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED; + } + return C.PLAYBACK_OFFLOAD_SUPPORTED; } private static boolean isOffloadedPlayback(AudioTrack audioTrack) { return Util.SDK_INT >= 29 && audioTrack.isOffloadedPlayback(); } - /** - * Returns whether the device supports gapless in offload playback. - * - *

    Gapless offload is not supported by all devices and there is no API to query its support. As - * a result this detection is currently based on manual testing. - */ - // TODO(internal b/158191844): Add an SDK API to query offload gapless support. - private static boolean isOffloadedGaplessPlaybackSupported() { - return Util.SDK_INT >= 30 && Util.MODEL.startsWith("Pixel"); - } - private static int getMaximumEncodedRateBytesPerSecond(@C.Encoding int encoding) { switch (encoding) { case C.ENCODING_MP3: From f6d8cfeb1feb6b76ff3a648c8d2c283524410289 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 16 Sep 2021 20:18:41 +0100 Subject: [PATCH 185/441] DownloadService: Remove deprecated protected methods PiperOrigin-RevId: 397138908 --- RELEASENOTES.md | 5 +++ .../exoplayer2/offline/DownloadService.java | 35 ++----------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d30bce256c..bfe440a713 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -85,6 +85,11 @@ `HttpDataSource.Factory.setDefaultRequestProperties` instead. * Remove `GvrAudioProcessor` and the GVR extension, which has been deprecated since 2.11.0. + * Remove `DownloadService.onDownloadChanged` and + `DownloadService.onDownloadRemoved`. Instead, use + `DownloadManager.addListener` to register a listener directly to + the `DownloadManager` returned through + `DownloadService.getDownloadManager`. * Cast extension: * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to support setting the playback speed diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index 25ca27bdce..200e2decda 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -763,27 +763,6 @@ public abstract class DownloadService extends Service { } } - /** - * @deprecated Some state change events may not be delivered to this method. Instead, use {@link - * DownloadManager#addListener(DownloadManager.Listener)} to register a listener directly to - * the {@link DownloadManager} that you return through {@link #getDownloadManager()}. - */ - @Deprecated - protected void onDownloadChanged(Download download) { - // Do nothing. - } - - /** - * @deprecated Some download removal events may not be delivered to this method. Instead, use - * {@link DownloadManager#addListener(DownloadManager.Listener)} to register a listener - * directly to the {@link DownloadManager} that you return through {@link - * #getDownloadManager()}. - */ - @Deprecated - protected void onDownloadRemoved(Download download) { - // Do nothing. - } - /** * Called after the service is created, once the downloads are known. * @@ -805,9 +784,7 @@ public abstract class DownloadService extends Service { * * @param download The state of the download. */ - @SuppressWarnings("deprecation") private void notifyDownloadChanged(Download download) { - onDownloadChanged(download); if (foregroundNotificationUpdater != null) { if (needsStartedService(download.state)) { foregroundNotificationUpdater.startPeriodicUpdates(); @@ -817,14 +794,8 @@ public abstract class DownloadService extends Service { } } - /** - * Called when a download is removed. - * - * @param download The last state of the download before it was removed. - */ - @SuppressWarnings("deprecation") - private void notifyDownloadRemoved(Download download) { - onDownloadRemoved(download); + /** Called when a download is removed. */ + private void notifyDownloadRemoved() { if (foregroundNotificationUpdater != null) { foregroundNotificationUpdater.invalidate(); } @@ -996,7 +967,7 @@ public abstract class DownloadService extends Service { @Override public void onDownloadRemoved(DownloadManager downloadManager, Download download) { if (downloadService != null) { - downloadService.notifyDownloadRemoved(download); + downloadService.notifyDownloadRemoved(); } } From c21d5c7f3392cba9b7d622a4de21b03b591b61c3 Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 16 Sep 2021 20:31:33 +0100 Subject: [PATCH 186/441] Remove fully qualified link tag PiperOrigin-RevId: 397141742 --- .../android/exoplayer2/ExoPlayerLibraryInfo.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 cafe4f5b04..7e558c3a1b 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 @@ -16,6 +16,8 @@ package com.google.android.exoplayer2; import android.os.Build; +import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.TraceUtil; import java.util.HashSet; /** Information about the ExoPlayer library. */ @@ -51,16 +53,10 @@ public final class ExoPlayerLibraryInfo { public static final String DEFAULT_USER_AGENT = VERSION_SLASHY + " (Linux; Android " + Build.VERSION.RELEASE + ") " + VERSION_SLASHY; - /** - * Whether the library was compiled with {@link com.google.android.exoplayer2.util.Assertions} - * checks enabled. - */ + /** Whether the library was compiled with {@link Assertions} checks enabled. */ public static final boolean ASSERTIONS_ENABLED = true; - /** - * Whether the library was compiled with {@link com.google.android.exoplayer2.util.TraceUtil} - * trace enabled. - */ + /** Whether the library was compiled with {@link TraceUtil} trace enabled. */ public static final boolean TRACE_ENABLED = true; private static final HashSet registeredModules = new HashSet<>(); From f7abce6aea54705815c78fe7536696bcac767bfd Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 16 Sep 2021 21:32:05 +0100 Subject: [PATCH 187/441] Move FlacConstant to lib-extractor PiperOrigin-RevId: 397156268 --- .../android/exoplayer2/ext/flac/FlacBinarySearchSeeker.java | 6 +++--- .../android/exoplayer2/ext/flac/LibflacAudioRenderer.java | 6 +++--- .../android/exoplayer2/extractor/FlacFrameReader.java | 2 +- .../android/exoplayer2/extractor/FlacMetadataReader.java | 2 +- .../exoplayer2/extractor/flac/FlacBinarySearchSeeker.java | 1 - .../android/exoplayer2/extractor/flac}/FlacConstants.java | 2 +- .../android/exoplayer2/extractor/flac/FlacExtractor.java | 1 - .../google/android/exoplayer2/extractor/ogg/FlacReader.java | 2 +- .../android/exoplayer2/extractor/FlacFrameReaderTest.java | 2 +- .../exoplayer2/extractor/FlacMetadataReaderTest.java | 2 +- .../exoplayer2/extractor/FlacStreamMetadataTest.java | 2 +- 11 files changed, 13 insertions(+), 15 deletions(-) rename library/{common/src/main/java/com/google/android/exoplayer2/util => extractor/src/main/java/com/google/android/exoplayer2/extractor/flac}/FlacConstants.java (96%) diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacBinarySearchSeeker.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacBinarySearchSeeker.java index b736c4d743..3cbc8fe1a9 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacBinarySearchSeeker.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacBinarySearchSeeker.java @@ -22,7 +22,6 @@ import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.FlacStreamMetadata; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.FlacConstants; import java.io.IOException; import java.nio.ByteBuffer; @@ -50,6 +49,8 @@ import java.nio.ByteBuffer; } } + private static final int MIN_FRAME_HEADER_SIZE = 6; + private final FlacDecoderJni decoderJni; /** @@ -76,8 +77,7 @@ import java.nio.ByteBuffer; /* floorBytePosition= */ firstFramePosition, /* ceilingBytePosition= */ inputLength, /* approxBytesPerFrame= */ streamMetadata.getApproxBytesPerFrame(), - /* minimumSearchRange= */ max( - FlacConstants.MIN_FRAME_HEADER_SIZE, streamMetadata.minFrameSize)); + /* minimumSearchRange= */ max(MIN_FRAME_HEADER_SIZE, streamMetadata.minFrameSize)); this.decoderJni = Assertions.checkNotNull(decoderJni); } diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java index 4c6d9f4c5b..8b2d706951 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java @@ -25,7 +25,6 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.DecoderAudioRenderer; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.extractor.FlacStreamMetadata; -import com.google.android.exoplayer2.util.FlacConstants; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; @@ -35,6 +34,8 @@ public final class LibflacAudioRenderer extends DecoderAudioRenderer Date: Thu, 16 Sep 2021 22:08:36 +0100 Subject: [PATCH 188/441] Move release note entry to correct section #minor-release PiperOrigin-RevId: 397164973 --- RELEASENOTES.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bfe440a713..285db4aac2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -40,6 +40,11 @@ * DRM: * Fix `DefaultDrmSessionManager` to correctly eagerly release preacquired DRM sessions when there's a shortage of DRM resources on the device. +* Downloads and caching: + * Workaround platform issue that can cause a `SecurityException` to be + thrown from `Requirements.isInternetConnectivityValidated` on devices + running Android 11 + ([#9002](https://github.com/google/ExoPlayer/issues/9002)). * UI * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with @@ -338,11 +343,6 @@ ([#9183](https://github.com/google/ExoPlayer/issues/9183)). * Allow the timeout to be customised via `RtspMediaSource.Factory.setTimeoutMs`. -* Downloads and caching: - * Workaround platform issue that can cause a `SecurityException` to be - thrown from `Requirements.isInternetConnectivityValidated` on devices - running Android 11 - ([#9002](https://github.com/google/ExoPlayer/issues/9002)). ### 2.14.1 (2021-06-11) From 6edf9c31bfff4e40bc299c39f5e12e16fc2888ea Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 16 Sep 2021 22:20:04 +0100 Subject: [PATCH 189/441] DownloadService: Only call getScheduler once The second getScheduler() call violates the documentation of the class, which states that getScheduler() is not called if foregroundNotificationId if FOREGROUND_NOTIFICATION_ID_NONE. Presumably implementing subclasses would return null, in which case this didn't do any harm, but we should make sure the implementation behaves as documented regardless. PiperOrigin-RevId: 397167603 --- .../android/exoplayer2/offline/DownloadService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index 200e2decda..0bccbb31b3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -178,6 +178,7 @@ public abstract class DownloadService extends Service { @StringRes private final int channelNameResourceId; @StringRes private final int channelDescriptionResourceId; + private @MonotonicNonNull Scheduler scheduler; private @MonotonicNonNull DownloadManager downloadManager; private int lastStartId; private boolean startedInForeground; @@ -582,6 +583,9 @@ public abstract class DownloadService extends Service { if (downloadManagerHelper == null) { boolean foregroundAllowed = foregroundNotificationUpdater != null; @Nullable Scheduler scheduler = foregroundAllowed ? getScheduler() : null; + if (scheduler != null) { + this.scheduler = scheduler; + } downloadManager = getDownloadManager(); downloadManager.resumeDownloads(); downloadManagerHelper = @@ -589,6 +593,9 @@ public abstract class DownloadService extends Service { getApplicationContext(), downloadManager, foregroundAllowed, scheduler, clazz); downloadManagerHelpers.put(clazz, downloadManagerHelper); } else { + if (downloadManagerHelper.scheduler != null) { + scheduler = downloadManagerHelper.scheduler; + } downloadManager = downloadManagerHelper.downloadManager; } downloadManagerHelper.attachService(this); @@ -658,7 +665,6 @@ public abstract class DownloadService extends Service { if (requirements == null) { Log.e(TAG, "Ignored SET_REQUIREMENTS: Missing " + KEY_REQUIREMENTS + " extra"); } else { - @Nullable Scheduler scheduler = getScheduler(); if (scheduler != null) { Requirements supportedRequirements = scheduler.getSupportedRequirements(requirements); if (!supportedRequirements.equals(requirements)) { From 4ff4263af321821cf94ac92fc731ac09299e2e87 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 16 Sep 2021 23:10:59 +0100 Subject: [PATCH 190/441] DownloadService: Minor improvements * Avoid ActivityManager log spam by only calling startForeground once, and subsequently updating the notification via NotificationManager. * Tweak demo app service to make it a tiny bit easier to swap the Scheduler. PiperOrigin-RevId: 397179398 --- .../exoplayer2/demo/DemoDownloadService.java | 3 ++- .../android/exoplayer2/offline/DownloadService.java | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java index 87d45148fe..e32f72f39f 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.offline.DownloadManager; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.scheduler.PlatformScheduler; import com.google.android.exoplayer2.scheduler.Requirements; +import com.google.android.exoplayer2.scheduler.Scheduler; import com.google.android.exoplayer2.ui.DownloadNotificationHelper; import com.google.android.exoplayer2.util.NotificationUtil; import com.google.android.exoplayer2.util.Util; @@ -61,7 +62,7 @@ public class DemoDownloadService extends DownloadService { } @Override - protected PlatformScheduler getScheduler() { + protected Scheduler getScheduler() { return Util.SDK_INT >= 21 ? new PlatformScheduler(this, JOB_ID) : null; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index 0bccbb31b3..f0f22af1ac 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.offline; import static com.google.android.exoplayer2.offline.Download.STOP_REASON_NONE; import android.app.Notification; +import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; @@ -889,8 +890,16 @@ public abstract class DownloadService extends Service { List downloads = Assertions.checkNotNull(downloadManager).getCurrentDownloads(); @Requirements.RequirementFlags int notMetRequirements = downloadManager.getNotMetRequirements(); - startForeground(notificationId, getForegroundNotification(downloads, notMetRequirements)); - notificationDisplayed = true; + Notification notification = getForegroundNotification(downloads, notMetRequirements); + if (!notificationDisplayed) { + startForeground(notificationId, notification); + notificationDisplayed = true; + } else { + // Update the notification via NotificationManager rather than by repeatedly calling + // startForeground, since the latter can cause ActivityManager log spam. + ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)) + .notify(notificationId, notification); + } if (periodicUpdatesStarted) { handler.removeCallbacksAndMessages(null); handler.postDelayed(this::update, updateInterval); From a75f902c810baf4068efb41225d4b12797e7d9d6 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 16 Sep 2021 23:31:59 +0100 Subject: [PATCH 191/441] Add track type disabling to Track selection parameters This will allow to disable video/audio... through the player interface. PiperOrigin-RevId: 397183548 --- .../TrackSelectionParameters.java | 41 +++++++++++- .../trackselection/DefaultTrackSelector.java | 14 +++- .../DefaultTrackSelectorTest.java | 64 +++++++++++++++++-- 3 files changed, 111 insertions(+), 8 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index 53b52af133..68e5b3c54f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -31,10 +31,13 @@ import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.primitives.Ints; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Locale; +import java.util.Set; import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; @@ -90,6 +93,7 @@ public class TrackSelectionParameters implements Bundleable { // General private boolean forceLowestBitrate; private boolean forceHighestSupportedBitrate; + private ImmutableSet<@C.TrackType Integer> disabledTrackTypes; /** * @deprecated {@link Context} constraints will not be set using this constructor. Use {@link @@ -119,6 +123,7 @@ public class TrackSelectionParameters implements Bundleable { // General forceLowestBitrate = false; forceHighestSupportedBitrate = false; + disabledTrackTypes = ImmutableSet.of(); } /** @@ -219,6 +224,12 @@ public class TrackSelectionParameters implements Bundleable { bundle.getBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); + + disabledTrackTypes = + ImmutableSet.copyOf( + Ints.asList( + firstNonNull( + bundle.getIntArray(keyForField(FIELD_DISABLED_TRACK_TYPE)), new int[0]))); } /** Overrides the value of the builder with the value of {@link TrackSelectionParameters}. */ @@ -226,7 +237,8 @@ public class TrackSelectionParameters implements Bundleable { "preferredVideoMimeTypes", "preferredAudioLanguages", "preferredAudioMimeTypes", - "preferredTextLanguages" + "preferredTextLanguages", + "disabledTrackTypes", }) private void init(@UnknownInitialization Builder this, TrackSelectionParameters parameters) { // Video @@ -255,6 +267,7 @@ public class TrackSelectionParameters implements Bundleable { // General forceLowestBitrate = parameters.forceLowestBitrate; forceHighestSupportedBitrate = parameters.forceHighestSupportedBitrate; + disabledTrackTypes = parameters.disabledTrackTypes; } /** Overrides the value of the builder with the value of {@link TrackSelectionParameters}. */ @@ -602,6 +615,18 @@ public class TrackSelectionParameters implements Bundleable { return this; } + /** + * Sets the disabled track types, preventing all tracks of those types from being selected for + * playback. + * + * @param disabledTrackTypes The track types to disable. + * @return This builder. + */ + public Builder setDisabledTrackTypes(Set<@C.TrackType Integer> disabledTrackTypes) { + this.disabledTrackTypes = ImmutableSet.copyOf(disabledTrackTypes); + return this; + } + /** Builds a {@link TrackSelectionParameters} instance with the selected values. */ public TrackSelectionParameters build() { return new TrackSelectionParameters(this); @@ -785,6 +810,12 @@ public class TrackSelectionParameters implements Bundleable { * other constraints. The default value is {@code false}. */ public final boolean forceHighestSupportedBitrate; + /** + * The track types that are disabled. No track of a disabled type will be selected, thus no track + * type contained in the set will be played. The default value is that no track type is disabled + * (empty set). + */ + public final ImmutableSet<@C.TrackType Integer> disabledTrackTypes; protected TrackSelectionParameters(Builder builder) { // Video @@ -813,6 +844,7 @@ public class TrackSelectionParameters implements Bundleable { // General this.forceLowestBitrate = builder.forceLowestBitrate; this.forceHighestSupportedBitrate = builder.forceHighestSupportedBitrate; + this.disabledTrackTypes = builder.disabledTrackTypes; } /** Creates a new {@link Builder}, copying the initial values from this instance. */ @@ -854,7 +886,8 @@ public class TrackSelectionParameters implements Bundleable { && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage // General && forceLowestBitrate == other.forceLowestBitrate - && forceHighestSupportedBitrate == other.forceHighestSupportedBitrate; + && forceHighestSupportedBitrate == other.forceHighestSupportedBitrate + && disabledTrackTypes.equals(other.disabledTrackTypes); } @Override @@ -886,6 +919,7 @@ public class TrackSelectionParameters implements Bundleable { // General result = 31 * result + (forceLowestBitrate ? 1 : 0); result = 31 * result + (forceHighestSupportedBitrate ? 1 : 0); + result = 31 * result + disabledTrackTypes.hashCode(); return result; } @@ -916,6 +950,7 @@ public class TrackSelectionParameters implements Bundleable { FIELD_PREFERRED_AUDIO_MIME_TYPES, FIELD_FORCE_LOWEST_BITRATE, FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, + FIELD_DISABLED_TRACK_TYPE, }) private @interface FieldNumber {} @@ -941,6 +976,7 @@ public class TrackSelectionParameters implements Bundleable { private static final int FIELD_PREFERRED_AUDIO_MIME_TYPES = 20; private static final int FIELD_FORCE_LOWEST_BITRATE = 21; private static final int FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE = 22; + private static final int FIELD_DISABLED_TRACK_TYPE = 23; @Override @CallSuper @@ -983,6 +1019,7 @@ public class TrackSelectionParameters implements Bundleable { bundle.putBoolean(keyForField(FIELD_FORCE_LOWEST_BITRATE), forceLowestBitrate); bundle.putBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), forceHighestSupportedBitrate); + bundle.putIntArray(keyForField(FIELD_DISABLED_TRACK_TYPE), Ints.toArray(disabledTrackTypes)); return bundle; } 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 fc9e188e16..0572e89a0e 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 @@ -55,6 +55,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import org.checkerframework.checker.nullness.compatqual.NullableType; @@ -607,6 +608,12 @@ public class DefaultTrackSelector extends MappingTrackSelector { return this; } + @Override + public ParametersBuilder setDisabledTrackTypes(Set<@C.TrackType Integer> trackTypes) { + super.setDisabledTrackTypes(trackTypes); + return this; + } + /** * Sets whether to exceed renderer capabilities when no selection can be made otherwise. * @@ -1484,7 +1491,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Apply track disabling and overriding. for (int i = 0; i < rendererCount; i++) { - if (params.getRendererDisabled(i)) { + @C.TrackType int rendererType = mappedTrackInfo.getRendererType(i); + if (params.getRendererDisabled(i) || params.disabledTrackTypes.contains(rendererType)) { definitions[i] = null; continue; } @@ -1509,7 +1517,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { @NullableType RendererConfiguration[] rendererConfigurations = new RendererConfiguration[rendererCount]; for (int i = 0; i < rendererCount; i++) { - boolean forceRendererDisabled = params.getRendererDisabled(i); + @C.TrackType int rendererType = mappedTrackInfo.getRendererType(i); + boolean forceRendererDisabled = + params.getRendererDisabled(i) || params.disabledTrackTypes.contains(rendererType); boolean rendererEnabled = !forceRendererDisabled && (mappedTrackInfo.getRendererType(i) == C.TRACK_TYPE_NONE diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index eb2a052d87..5630d5d832 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -49,6 +49,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationLi import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableSet; import java.util.HashMap; import java.util.Map; import org.junit.Before; @@ -101,12 +102,14 @@ public final class DefaultTrackSelectorTest { private static final TrackGroup AUDIO_TRACK_GROUP = new TrackGroup(AUDIO_FORMAT); private static final TrackGroupArray TRACK_GROUPS = new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP); + private static final TrackSelection VIDEO_TRACK_SELECTION = + new FixedTrackSelection(VIDEO_TRACK_GROUP, 0); + private static final TrackSelection AUDIO_TRACK_SELECTION = + new FixedTrackSelection(AUDIO_TRACK_GROUP, 0); private static final TrackSelection[] TRACK_SELECTIONS = - new TrackSelection[] { - new FixedTrackSelection(VIDEO_TRACK_GROUP, 0), new FixedTrackSelection(AUDIO_TRACK_GROUP, 0) - }; + new TrackSelection[] {VIDEO_TRACK_SELECTION, AUDIO_TRACK_SELECTION}; private static final TrackSelection[] TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER = - new TrackSelection[] {new FixedTrackSelection(VIDEO_TRACK_GROUP, 0), null}; + new TrackSelection[] {VIDEO_TRACK_SELECTION, null}; private static final Timeline TIMELINE = new FakeTimeline(); @@ -208,6 +211,58 @@ public final class DefaultTrackSelectorTest { .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); } + /** Tests disabling a track type. */ + @Test + public void selectVideoAudioTracks_withDisabledAudioType_onlyVideoIsSelected() + throws ExoPlaybackException { + trackSelector.setParameters( + defaultParameters.buildUpon().setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO))); + + TrackSelectorResult result = + trackSelector.selectTracks( + RENDERER_CAPABILITIES, + new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP), + periodId, + TIMELINE); + + assertThat(result.selections).asList().containsExactly(VIDEO_TRACK_SELECTION, null).inOrder(); + assertThat(result.rendererConfigurations).asList().containsExactly(DEFAULT, null); + } + + /** Tests that a disabled track type can be enabled again. */ + @Test + public void selectTracks_withClearedDisabledTrackType_selectsAll() throws ExoPlaybackException { + trackSelector.setParameters( + trackSelector + .buildUponParameters() + .setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO)) + .setDisabledTrackTypes(ImmutableSet.of())); + + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); + + assertThat(result.selections).asList().containsExactlyElementsIn(TRACK_SELECTIONS).inOrder(); + assertThat(result.rendererConfigurations).asList().containsExactly(DEFAULT, DEFAULT).inOrder(); + } + + /** Tests disabling NONE track type rendering. */ + @Test + public void selectTracks_withDisabledNoneTracksAndNoSampleRenderer_disablesNoSampleRenderer() + throws ExoPlaybackException { + trackSelector.setParameters( + defaultParameters.buildUpon().setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_NONE))); + + TrackSelectorResult result = + trackSelector.selectTracks( + new RendererCapabilities[] {VIDEO_CAPABILITIES, NO_SAMPLE_CAPABILITIES}, + TRACK_GROUPS, + periodId, + TIMELINE); + + assertThat(result.selections).asList().containsExactly(VIDEO_TRACK_SELECTION, null).inOrder(); + assertThat(result.rendererConfigurations).asList().containsExactly(DEFAULT, null).inOrder(); + } + /** Tests disabling a renderer. */ @Test public void selectTracksWithDisabledRenderer() throws ExoPlaybackException { @@ -1760,6 +1815,7 @@ public final class DefaultTrackSelectorTest { .setRendererDisabled(1, true) .setRendererDisabled(3, true) .setRendererDisabled(5, false) + .setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO)) .build(); } From 74c6ef9ba096fe64e767a739b97debca5185a375 Mon Sep 17 00:00:00 2001 From: krocard Date: Fri, 17 Sep 2021 10:11:04 +0100 Subject: [PATCH 192/441] Move EventListener registration down from Player The deprecated `Player.addListener(EventListener)` is moved out of Player into its subclasses (CastPlayer and ExoPlayer). This is unlikely to break users because: - the method has been deprecated in the last major version - the method is still present in the major implementations If an users is affected, they can either: - use ExoPlayer instead of Player - (recommended) switch to Player.Listener. Additionally update the threading guarantees that did not reflect the current implementation. PiperOrigin-RevId: 397272144 --- RELEASENOTES.md | 7 +-- .../exoplayer2/ext/cast/CastPlayer.java | 22 +++++++- .../android/exoplayer2/ForwardingPlayer.java | 14 +----- .../com/google/android/exoplayer2/Player.java | 28 +---------- .../exoplayer2/ForwardingPlayerTest.java | 50 ------------------- .../google/android/exoplayer2/ExoPlayer.java | 24 +++++++++ .../android/exoplayer2/ExoPlayerImpl.java | 22 ++++---- .../android/exoplayer2/SimpleExoPlayer.java | 6 +-- 8 files changed, 64 insertions(+), 109 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 285db4aac2..c08799302d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,8 @@ the start or after the end of the media are now handled as seeks to the start and end respectively ([#8906](https://github.com/google/ExoPlayer/issues/8906)). + * Move `Player.addListener(EventListener)` and + `Player.removeListener(EventListener)` out of `Player` into subclasses. * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). @@ -92,9 +94,8 @@ deprecated since 2.11.0. * Remove `DownloadService.onDownloadChanged` and `DownloadService.onDownloadRemoved`. Instead, use - `DownloadManager.addListener` to register a listener directly to - the `DownloadManager` returned through - `DownloadService.getDownloadManager`. + `DownloadManager.addListener` to register a listener directly to the + `DownloadManager` returned through `DownloadService.getDownloadManager`. * Cast extension: * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to support setting the playback speed diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index e42e7bbee4..97b0567222 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -276,7 +276,17 @@ public final class CastPlayer extends BasePlayer { addListener(eventListener); } - @Override + /** + * Registers a listener to receive events from the player. + * + *

    The listener's methods will be called on the thread associated with {@link + * #getApplicationLooper()}. + * + * @param listener The listener to register. + * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. + */ + @Deprecated + @SuppressWarnings("deprecation") public void addListener(EventListener listener) { listeners.add(listener); } @@ -287,7 +297,15 @@ public final class CastPlayer extends BasePlayer { removeListener(eventListener); } - @Override + /** + * Unregister a listener registered through {@link #addListener(EventListener)}. The listener will + * no longer receive events from the player. + * + * @param listener The listener to unregister. + * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. + */ + @Deprecated + @SuppressWarnings("deprecation") public void removeListener(EventListener listener) { listeners.remove(listener); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 1f990befef..4fa547d2dc 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -43,28 +43,16 @@ public class ForwardingPlayer implements Player { this.player = player; } - @Override + @Deprecated public Looper getApplicationLooper() { return player.getApplicationLooper(); } @Deprecated - @Override - public void addListener(EventListener listener) { - player.addListener(new ForwardingEventListener(this, listener)); - } - - @Override public void addListener(Listener listener) { player.addListener(new ForwardingListener(this, listener)); } - @Deprecated - @Override - public void removeListener(EventListener listener) { - player.removeListener(new ForwardingEventListener(this, listener)); - } - @Override public void removeListener(Listener listener) { player.removeListener(new ForwardingListener(this, listener)); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index f1eb502d08..45f181d47e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -1434,40 +1434,16 @@ public interface Player { */ Looper getApplicationLooper(); - /** - * Registers a listener to receive events from the player. - * - *

    The listener's methods will be called on the thread that was used to construct the player. - * However, if the thread used to construct the player does not have a {@link Looper}, then the - * listener will be called on the main thread. - * - * @param listener The listener to register. - * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. - */ - @Deprecated - void addListener(EventListener listener); - /** * Registers a listener to receive all events from the player. * - *

    The listener's methods will be called on the thread that was used to construct the player. - * However, if the thread used to construct the player does not have a {@link Looper}, then the - * listener will be called on the main thread. + *

    The listener's methods will be called on the thread associated with {@link + * #getApplicationLooper()}. * * @param listener The listener to register. */ void addListener(Listener listener); - /** - * Unregister a listener registered through {@link #addListener(EventListener)}. The listener will - * no longer receive events from the player. - * - * @param listener The listener to unregister. - * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. - */ - @Deprecated - void removeListener(EventListener listener); - /** * Unregister a listener registered through {@link #addListener(Listener)}. The listener will no * longer receive events. diff --git a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java index 2446efaf8b..41f590ed03 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java @@ -61,22 +61,6 @@ public class ForwardingPlayerTest { assertThat(player.listeners).hasSize(2); } - @Test - @SuppressWarnings("deprecation") // Testing backwards compatibility with deprecated method. - public void addEventListener_addsForwardingListener() { - FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); - Player.EventListener listener1 = mock(Player.EventListener.class); - Player.EventListener listener2 = mock(Player.EventListener.class); - - ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); - forwardingPlayer.addListener(listener1); - // Add listener1 again. - forwardingPlayer.addListener(listener1); - forwardingPlayer.addListener(listener2); - - assertThat(player.eventListeners).hasSize(2); - } - @Test public void removeListener_removesForwardingListener() { FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); @@ -95,25 +79,6 @@ public class ForwardingPlayerTest { assertThat(player.listeners).isEmpty(); } - @Test - @SuppressWarnings("deprecation") // Testing backwards compatibility with deprecated method. - public void removeEventListener_removesForwardingListener() { - FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); - Player.EventListener listener1 = mock(Player.EventListener.class); - Player.EventListener listener2 = mock(Player.EventListener.class); - ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); - forwardingPlayer.addListener(listener1); - forwardingPlayer.addListener(listener2); - - forwardingPlayer.removeListener(listener1); - assertThat(player.eventListeners).hasSize(1); - // Remove same listener again. - forwardingPlayer.removeListener(listener1); - assertThat(player.eventListeners).hasSize(1); - forwardingPlayer.removeListener(listener2); - assertThat(player.eventListeners).isEmpty(); - } - @Test public void onEvents_passesForwardingPlayerAsArgument() { FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); @@ -217,32 +182,17 @@ public class ForwardingPlayerTest { private static class FakePlayer extends StubExoPlayer { - @SuppressWarnings("deprecation") // Use of deprecated type for backwards compatibility. - private final Set eventListeners = new HashSet<>(); - private final Set listeners = new HashSet<>(); public FakePlayer(Context context) { super(context); } - @Override - @SuppressWarnings("deprecation") // Implementing deprecated method. - public void addListener(EventListener listener) { - eventListeners.add(listener); - } - @Override public void addListener(Listener listener) { listeners.add(listener); } - @Override - @SuppressWarnings("deprecation") // Implementing deprecated method. - public void removeListener(EventListener listener) { - eventListeners.remove(listener); - } - @Override public void removeListener(Listener listener) { listeners.remove(listener); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 990c4b9f3e..c44d5677ff 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -873,6 +873,30 @@ public interface ExoPlayer extends Player { @Deprecated DeviceComponent getDeviceComponent(); + /** + * Registers a listener to receive events from the player. + * + *

    The listener's methods will be called on the thread associated with {@link + * #getApplicationLooper()}. + * + * @param listener The listener to register. + * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. + */ + @Deprecated + @SuppressWarnings("deprecation") + void addListener(EventListener listener); + + /** + * Unregister a listener registered through {@link #addListener(EventListener)}. The listener will + * no longer receive events from the player. + * + * @param listener The listener to unregister. + * @deprecated Use {@link #addListener(Listener)} and {@link #removeListener(Listener)} instead. + */ + @Deprecated + @SuppressWarnings("deprecation") + void removeListener(EventListener listener); + /** * Adds a listener to receive audio offload events. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 96015815ae..d2c4f1e716 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -289,24 +289,22 @@ import java.util.concurrent.CopyOnWriteArraySet; @Override public void addListener(Listener listener) { - EventListener eventListener = listener; - addListener(eventListener); - } - - @Override - public void addListener(Player.EventListener listener) { - listeners.add(listener); + addEventListener(listener); } @Override public void removeListener(Listener listener) { - EventListener eventListener = listener; - removeListener(eventListener); + removeEventListener(listener); } - @Override - public void removeListener(Player.EventListener listener) { - listeners.remove(listener); + @SuppressWarnings("deprecation") // Register deprecated EventListener. + public void addEventListener(Player.EventListener eventListener) { + listeners.add(eventListener); + } + + @SuppressWarnings("deprecation") // Deregister deprecated EventListener. + public void removeEventListener(Player.EventListener eventListener) { + listeners.remove(eventListener); } public void addAudioOffloadListener(AudioOffloadListener listener) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index d6413fb4ac..480ca348fc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -558,7 +558,7 @@ public class SimpleExoPlayer extends BasePlayer builder.looper, /* wrappingPlayer= */ this, additionalPermanentAvailableCommands); - player.addListener(componentListener); + player.addEventListener(componentListener); player.addAudioOffloadListener(componentListener); if (builder.foregroundModeTimeoutMs > 0) { player.experimentalSetForegroundModeTimeoutMs(builder.foregroundModeTimeoutMs); @@ -1082,7 +1082,7 @@ public class SimpleExoPlayer extends BasePlayer public void addListener(Player.EventListener listener) { // Don't verify application thread. We allow calls to this method from any thread. Assertions.checkNotNull(listener); - player.addListener(listener); + player.addEventListener(listener); } @Override @@ -1097,7 +1097,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void removeListener(Player.EventListener listener) { // Don't verify application thread. We allow calls to this method from any thread. - player.removeListener(listener); + player.removeEventListener(listener); } @Override From 985e73dec8bc09f44877ce309c76ecc6990b83ba Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 17 Sep 2021 10:22:31 +0100 Subject: [PATCH 193/441] Fix documention for specifying a custom exolist.json Issue: #9437 #minor-release PiperOrigin-RevId: 397273931 --- docs/demo-application.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/demo-application.md b/docs/demo-application.md index 4e548edb60..e9a50c34d4 100644 --- a/docs/demo-application.md +++ b/docs/demo-application.md @@ -174,7 +174,7 @@ file at `https://yourdomain.com/samples.exolist.json`, you can open it in the demo app using: ~~~ -adb shell am start -a com.android.action.VIEW \ +adb shell am start -a android.intent.action.VIEW \ -d https://yourdomain.com/samples.exolist.json ~~~ {: .language-shell} From 6f728a43ad3af426012990a3f1a094945ee1061a Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 17 Sep 2021 11:08:59 +0100 Subject: [PATCH 194/441] Remove obsolete imports PiperOrigin-RevId: 397280475 --- .../android/exoplayer2/audio/MediaCodecAudioRenderer.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index 82f09f0b27..43a39c7940 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -15,11 +15,6 @@ */ package com.google.android.exoplayer2.audio; -import static com.google.android.exoplayer2.Renderer.MSG_SET_CAMERA_MOTION_LISTENER; -import static com.google.android.exoplayer2.Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY; -import static com.google.android.exoplayer2.Renderer.MSG_SET_SCALING_MODE; -import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; -import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED; import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.REUSE_RESULT_NO; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; From 73aece635671dff8bb20eca9c6a69b48af162c38 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 17 Sep 2021 11:55:01 +0100 Subject: [PATCH 195/441] Improve AdtsExtractor#sniff when trying different sync word offsets The previous implementation did the following (after skipping any ID3 headers at the start of the stream): 1. Skip forward byte-by-byte looking for a sync word (0xFFF) 2. Assume this indicates the start of an ADTS frame and read the size a) If frameSize <= 6 immediately return false 3. Skip forward by frameSize and expect to find another ADTS sync word (with no further scanning). b) If we find one, great! Loop from step 2. a) If we don't find one then assume the **last** sync word we found wasn't actually one, so loop from step 1 starting one extra byte into the stream. This means we're looking for a sync word we would have skipped over in step 3. The asymmetry here comes from the different handling of frameSize <= 6 (immediately return false) and frameSize being 'wrong because it doesn't lead to another sync word' (scan the file again from the beginning for alternative sync words). With this change both these cases are handled symmetrically (always scan for alternative sync words). Step 2a) becomes the same as 3b): Loop back to the beginning of the stream with an incremented offset and scan for another sync word. #minor-release PiperOrigin-RevId: 397285756 --- .../extractor/ts/AdtsExtractor.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java index cccef4ef08..6ebf9d31b5 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java @@ -149,12 +149,12 @@ public final class AdtsExtractor implements Extractor { scratch.setPosition(0); int syncBytes = scratch.readUnsignedShort(); if (!AdtsReader.isAdtsSyncWord(syncBytes)) { + // We didn't find an ADTS sync word. Start searching again from one byte further into the + // start of the stream. validFramesCount = 0; totalValidFramesSize = 0; + headerPosition++; input.resetPeekPosition(); - if (++headerPosition - startPosition >= MAX_SNIFF_BYTES) { - return false; - } input.advancePeekPosition(headerPosition); } else { if (++validFramesCount >= 4 && totalValidFramesSize > TsExtractor.TS_PACKET_SIZE) { @@ -165,12 +165,21 @@ public final class AdtsExtractor implements Extractor { input.peekFully(scratch.getData(), 0, 4); scratchBits.setPosition(14); int frameSize = scratchBits.readBits(13); - // Either the stream is malformed OR we're not parsing an ADTS stream. if (frameSize <= 6) { - return false; + // The size is too small, so we're probably not reading an ADTS frame. Start searching + // again from one byte further into the start of the stream. + validFramesCount = 0; + totalValidFramesSize = 0; + headerPosition++; + input.resetPeekPosition(); + input.advancePeekPosition(headerPosition); + } else { + input.advancePeekPosition(frameSize - 6); + totalValidFramesSize += frameSize; } - input.advancePeekPosition(frameSize - 6); - totalValidFramesSize += frameSize; + } + if (headerPosition - startPosition >= MAX_SNIFF_BYTES) { + return false; } } } From 13827186aa7d0a54ca18227ed771ce9aafe109c4 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 17 Sep 2021 12:36:20 +0100 Subject: [PATCH 196/441] Use the new MediaItem.Builder#setDrmConfiguration method PiperOrigin-RevId: 397290953 --- .../android/exoplayer2/castdemo/DemoUtil.java | 18 ++++++---- .../android/exoplayer2/demo/IntentUtil.java | 26 ++++++++------ .../exoplayer2/demo/PlayerActivity.java | 14 ++++++-- .../demo/SampleChooserActivity.java | 35 +++++++++++++------ docs/media-items.md | 10 +++--- .../ext/cast/DefaultMediaItemConverter.java | 10 +++--- .../cast/DefaultMediaItemConverterTest.java | 10 +++--- .../exoplayer2/source/ads/AdsMediaSource.java | 17 ++------- .../DefaultDrmSessionManagerProviderTest.java | 16 +++++---- 9 files changed, 92 insertions(+), 64 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java index 50343f9205..1354a275da 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/DemoUtil.java @@ -65,8 +65,10 @@ import java.util.List; .setMediaMetadata( new MediaMetadata.Builder().setTitle("Widevine DASH cenc: Tears").build()) .setMimeType(MIME_TYPE_DASH) - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .build()) .build()); samples.add( new MediaItem.Builder() @@ -74,8 +76,10 @@ import java.util.List; .setMediaMetadata( new MediaMetadata.Builder().setTitle("Widevine DASH cbc1: Tears").build()) .setMimeType(MIME_TYPE_DASH) - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .build()) .build()); samples.add( new MediaItem.Builder() @@ -83,8 +87,10 @@ import java.util.List; .setMediaMetadata( new MediaMetadata.Builder().setTitle("Widevine DASH cbcs: Tears").build()) .setMimeType(MIME_TYPE_DASH) - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri("https://proxy.uat.widevine.com/proxy?provider=widevine_test") + .build()) .build()); SAMPLES = Collections.unmodifiableList(samples); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 903c031491..c679c871ae 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -26,12 +26,12 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; -import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; /** Util to read from and populate an intent. */ public class IntentUtil { @@ -162,16 +162,20 @@ public class IntentUtil { headers.put(keyRequestPropertiesArray[i], keyRequestPropertiesArray[i + 1]); } } - builder - .setDrmUuid(Util.getDrmUuid(Util.castNonNull(drmSchemeExtra))) - .setDrmLicenseUri(intent.getStringExtra(DRM_LICENSE_URI_EXTRA + extrasKeySuffix)) - .setDrmMultiSession( - intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false)) - .setDrmForceDefaultLicenseUri( - intent.getBooleanExtra(DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false)) - .setDrmLicenseRequestHeaders(headers); - if (intent.getBooleanExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, false)) { - builder.setDrmSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO)); + @Nullable UUID drmUuid = Util.getDrmUuid(Util.castNonNull(drmSchemeExtra)); + if (drmUuid != null) { + builder.setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(drmUuid) + .setLicenseUri(intent.getStringExtra(DRM_LICENSE_URI_EXTRA + extrasKeySuffix)) + .setMultiSession( + intent.getBooleanExtra(DRM_MULTI_SESSION_EXTRA + extrasKeySuffix, false)) + .setForceDefaultLicenseUri( + intent.getBooleanExtra( + DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false)) + .setLicenseRequestHeaders(headers) + .setSessionForClearPeriods( + intent.getBooleanExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, false)) + .build()); } return builder; } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index a3e89cd753..f8310066cd 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -504,9 +504,17 @@ public class PlayerActivity extends AppCompatActivity .setUri(downloadRequest.uri) .setCustomCacheKey(downloadRequest.customCacheKey) .setMimeType(downloadRequest.mimeType) - .setStreamKeys(downloadRequest.streamKeys) - .setDrmKeySetId(downloadRequest.keySetId) - .setDrmLicenseRequestHeaders(getDrmRequestHeaders(item)); + .setStreamKeys(downloadRequest.streamKeys); + @Nullable + MediaItem.DrmConfiguration drmConfiguration = item.playbackProperties.drmConfiguration; + if (drmConfiguration != null) { + builder.setDrmConfiguration( + drmConfiguration + .buildUpon() + .setKeySetId(downloadRequest.keySetId) + .setLicenseRequestHeaders(getDrmRequestHeaders(item)) + .build()); + } mediaItems.add(builder.build()); } else { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index c655179fe3..16174d5a3f 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -43,7 +43,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.ParserException; @@ -54,7 +53,7 @@ import com.google.android.exoplayer2.upstream.DataSourceInputStream; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -64,6 +63,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; /** An activity for selecting from a list of media samples. */ public class SampleChooserActivity extends AppCompatActivity @@ -345,6 +345,12 @@ public class SampleChooserActivity extends AppCompatActivity Uri subtitleUri = null; String subtitleMimeType = null; String subtitleLanguage = null; + UUID drmUuid = null; + String drmLicenseUri = null; + ImmutableMap drmLicenseRequestHeaders = null; + boolean drmSessionForClearContent = false; + boolean drmMultiSession = false; + boolean drmForceDefaultLicenseUri = false; MediaItem.Builder mediaItem = new MediaItem.Builder(); reader.beginObject(); @@ -370,11 +376,11 @@ public class SampleChooserActivity extends AppCompatActivity mediaItem.setAdTagUri(reader.nextString()); break; case "drm_scheme": - mediaItem.setDrmUuid(Util.getDrmUuid(reader.nextString())); + drmUuid = Util.getDrmUuid(reader.nextString()); break; case "drm_license_uri": case "drm_license_url": // For backward compatibility only. - mediaItem.setDrmLicenseUri(reader.nextString()); + drmLicenseUri = reader.nextString(); break; case "drm_key_request_properties": Map requestHeaders = new HashMap<>(); @@ -383,19 +389,16 @@ public class SampleChooserActivity extends AppCompatActivity requestHeaders.put(reader.nextName(), reader.nextString()); } reader.endObject(); - mediaItem.setDrmLicenseRequestHeaders(requestHeaders); + drmLicenseRequestHeaders = ImmutableMap.copyOf(requestHeaders); break; case "drm_session_for_clear_content": - if (reader.nextBoolean()) { - mediaItem.setDrmSessionForClearTypes( - ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO)); - } + drmSessionForClearContent = reader.nextBoolean(); break; case "drm_multi_session": - mediaItem.setDrmMultiSession(reader.nextBoolean()); + drmMultiSession = reader.nextBoolean(); break; case "drm_force_default_license_uri": - mediaItem.setDrmForceDefaultLicenseUri(reader.nextBoolean()); + drmForceDefaultLicenseUri = reader.nextBoolean(); break; case "subtitle_uri": subtitleUri = Uri.parse(reader.nextString()); @@ -436,6 +439,16 @@ public class SampleChooserActivity extends AppCompatActivity .setUri(uri) .setMediaMetadata(new MediaMetadata.Builder().setTitle(title).build()) .setMimeType(adaptiveMimeType); + if (drmUuid != null) { + mediaItem.setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(drmUuid) + .setLicenseUri(drmLicenseUri) + .setLicenseRequestHeaders(drmLicenseRequestHeaders) + .setSessionForClearPeriods(drmSessionForClearContent) + .setMultiSession(drmMultiSession) + .setForceDefaultLicenseUri(drmForceDefaultLicenseUri) + .build()); + } if (subtitleUri != null) { MediaItem.Subtitle subtitle = new MediaItem.Subtitle( diff --git a/docs/media-items.md b/docs/media-items.md index 2e26584aee..bede066c90 100644 --- a/docs/media-items.md +++ b/docs/media-items.md @@ -63,10 +63,12 @@ For protected content, the media item's DRM properties should be set: ~~~ MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri(licenseUri) - .setDrmLicenseRequestHeaders(httpRequestHeaders) - .setDrmMultiSession(true) + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(licenseUri) + .setMultiSession(true) + .setLicenseRequestHeaders(httpRequestHeaders) + .build()) .build(); ~~~ {: .language-java} diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index 09bf339f0e..e03c9a4a7c 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -96,17 +96,19 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { } } - private static void populateDrmConfiguration(JSONObject json, MediaItem.Builder builder) + private static void populateDrmConfiguration(JSONObject json, MediaItem.Builder mediaItem) throws JSONException { - builder.setDrmUuid(UUID.fromString(json.getString(KEY_UUID))); - builder.setDrmLicenseUri(json.getString(KEY_LICENSE_URI)); + MediaItem.DrmConfiguration.Builder drmConfiguration = + new MediaItem.DrmConfiguration.Builder(UUID.fromString(json.getString(KEY_UUID))) + .setLicenseUri(json.getString(KEY_LICENSE_URI)); JSONObject requestHeadersJson = json.getJSONObject(KEY_REQUEST_HEADERS); HashMap requestHeaders = new HashMap<>(); for (Iterator iterator = requestHeadersJson.keys(); iterator.hasNext(); ) { String key = iterator.next(); requestHeaders.put(key, requestHeadersJson.getString(key)); } - builder.setDrmLicenseRequestHeaders(requestHeaders); + drmConfiguration.setLicenseRequestHeaders(requestHeaders); + mediaItem.setDrmConfiguration(drmConfiguration.build()); } // Serialization. diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java index 9d80725c56..1092ecd8da 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverterTest.java @@ -24,7 +24,7 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.gms.cast.MediaQueueItem; -import java.util.Collections; +import com.google.common.collect.ImmutableMap; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,9 +53,11 @@ public class DefaultMediaItemConverterTest { .setUri(Uri.parse("http://example.com")) .setMediaMetadata(MediaMetadata.EMPTY) .setMimeType(MimeTypes.APPLICATION_MPD) - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri("http://license.com") - .setDrmLicenseRequestHeaders(Collections.singletonMap("key", "value")) + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri("http://license.com") + .setLicenseRequestHeaders(ImmutableMap.of("key", "value")) + .build()) .build(); DefaultMediaItemConverter converter = new DefaultMediaItemConverter(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 182ead64d1..23bdc14dc4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -316,21 +316,8 @@ public final class AdsMediaSource extends CompositeMediaSource { @Nullable MediaItem.PlaybackProperties contentPlaybackProperties = contentMediaSource.getMediaItem().playbackProperties; - if (contentPlaybackProperties != null - && contentPlaybackProperties.drmConfiguration != null) { - MediaItem.DrmConfiguration drmConfiguration = - contentPlaybackProperties.drmConfiguration; - // TODO(internal b/179984779): Use MediaItem.Builder#setDrmConfiguration() when it's - // available. - adMediaItem.setDrmUuid(drmConfiguration.uuid); - adMediaItem.setDrmKeySetId(drmConfiguration.getKeySetId()); - adMediaItem.setDrmLicenseUri(drmConfiguration.licenseUri); - adMediaItem.setDrmForceDefaultLicenseUri(drmConfiguration.forceDefaultLicenseUri); - adMediaItem.setDrmLicenseRequestHeaders(drmConfiguration.requestHeaders); - adMediaItem.setDrmMultiSession(drmConfiguration.multiSession); - adMediaItem.setDrmPlayClearContentWithoutKey( - drmConfiguration.playClearContentWithoutKey); - adMediaItem.setDrmSessionForClearTypes(drmConfiguration.sessionForClearTypes); + if (contentPlaybackProperties != null) { + adMediaItem.setDrmConfiguration(contentPlaybackProperties.drmConfiguration); } MediaSource adMediaSource = adMediaSourceFactory.createMediaSource(adMediaItem.build()); adMediaSourceHolder.initializeWithMediaSource(adMediaSource, adUri); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java index 0c830ca5ab..a887b1b124 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultDrmSessionManagerProviderTest.java @@ -43,8 +43,10 @@ public class DefaultDrmSessionManagerProviderTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setDrmLicenseUri(Uri.EMPTY) - .setDrmUuid(C.WIDEVINE_UUID) + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(Uri.EMPTY) + .build()) .build(); DrmSessionManager drmSessionManager = new DefaultDrmSessionManagerProvider().get(mediaItem); @@ -57,20 +59,22 @@ public class DefaultDrmSessionManagerProviderTest { MediaItem mediaItem1 = new MediaItem.Builder() .setUri("https://example.test/content-1") - .setDrmUuid(C.WIDEVINE_UUID) + .setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).build()) .build(); // Same DRM info as item1, but different URL to check it doesn't prevent re-using a manager. MediaItem mediaItem2 = new MediaItem.Builder() .setUri("https://example.test/content-2") - .setDrmUuid(C.WIDEVINE_UUID) + .setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID).build()) .build(); // Different DRM info to 1 and 2, needs a different manager instance. MediaItem mediaItem3 = new MediaItem.Builder() .setUri("https://example.test/content-3") - .setDrmUuid(C.WIDEVINE_UUID) - .setDrmLicenseUri("https://example.test/license") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri("https://example.test/license") + .build()) .build(); DefaultDrmSessionManagerProvider provider = new DefaultDrmSessionManagerProvider(); From 04943db71c138e25352aa5f5cea1db806dce597c Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 17 Sep 2021 12:36:52 +0100 Subject: [PATCH 197/441] Don't call `MediaItem.Builder#setKeySetId` without setting the DRM UUID This is known to silently drop the value. This setter is now deprecated in favour of `MediaItem.Builder#setDrmConfiguration(MediaItem.DrmConfiguration)`, which requires a UUID in order to construct the `DrmConfiguration` instance. Issue: #9378 tracks correctly propagating the DRM info out of `DownloadRequest#toMediaItem`. PiperOrigin-RevId: 397291013 --- .../android/exoplayer2/offline/DefaultDownloaderFactory.java | 1 - .../com/google/android/exoplayer2/offline/DownloadRequest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java index bed0bb26a3..eb7dc31240 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloaderFactory.java @@ -98,7 +98,6 @@ public class DefaultDownloaderFactory implements DownloaderFactory { .setUri(request.uri) .setStreamKeys(request.streamKeys) .setCustomCacheKey(request.customCacheKey) - .setDrmKeySetId(request.keySetId) .build(); try { return constructor.newInstance(mediaItem, cacheDataSourceFactory, executor); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java index 1fa1655445..e6b16f70cc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java @@ -229,7 +229,6 @@ public final class DownloadRequest implements Parcelable { .setCustomCacheKey(customCacheKey) .setMimeType(mimeType) .setStreamKeys(streamKeys) - .setDrmKeySetId(keySetId) .build(); } From fd6a6ec8df40fea2d19af34091b59f2e0d8fd58d Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 17 Sep 2021 13:55:51 +0100 Subject: [PATCH 198/441] Support RFC4566 SDP attribute. Issue: #9430 The current supported SDP (RFC2327) spec only allows for alpha-numeric characters in the attribute-field. RFC4566 (section 9, token type) allowed extra characters, and this CL adds the support. PiperOrigin-RevId: 397301173 --- RELEASENOTES.md | 2 ++ .../source/rtsp/SessionDescriptionParser.java | 7 +++++-- .../source/rtsp/SessionDescriptionTest.java | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c08799302d..6b28d6b1ba 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,6 +116,8 @@ ([#9416](https://github.com/google/ExoPlayer/issues/9416)). * Fix RTSP WWW-Authenticate header parsing ([#9428](https://github.com/google/ExoPlayer/issues/9428)). + * Support RFC4566 SDP attribute field grammar + ([#9430](https://github.com/google/ExoPlayer/issues/9430)). * Extractors: * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings ([#9087](https://github.com/google/ExoPlayer/issues/9087)). diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java index 6d37b12c89..d85dd216db 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java @@ -34,8 +34,11 @@ import java.util.regex.Pattern; // under the given tag follows an optional space. private static final Pattern SDP_LINE_PATTERN = Pattern.compile("([a-z])=\\s?(.+)"); // Matches an attribute line (with a= sdp tag removed. Example: range:npt=0-50.0). - // Attribute can also be a flag, i.e. without a value, like recvonly. - private static final Pattern ATTRIBUTE_PATTERN = Pattern.compile("([0-9A-Za-z-]+)(?::(.*))?"); + // Attribute can also be a flag, i.e. without a value, like recvonly. Reference RFC4566 Section 9 + // Page 43, under "token-char". + private static final Pattern ATTRIBUTE_PATTERN = + Pattern.compile( + "([\\x21\\x23-\\x27\\x2a\\x2b\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5e-\\x7e]+)(?::(.*))?"); // SDP media description line: // For instance: audio 0 RTP/AVP 97 private static final Pattern MEDIA_DESCRIPTION_PATTERN = diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java index cd2f6c3266..d28b0b902e 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java @@ -170,6 +170,24 @@ public class SessionDescriptionTest { .containsEntry(ATTR_CONTROL, "audio"); } + @Test + public void parse_sdpStringWithSpecialAttributeField_succeeds() throws Exception { + String testMediaSdpInfo = + "v=0\r\n" + + "o=MNobody 2890844526 2890842807 IN IP4 192.0.2.46\r\n" + + "s=SDP Seminar\r\n" + + "t=0 0\r\n" + + "i=A Seminar on the session description protocol\r\n" + + "m=audio 3456 RTP/AVP 0\r\n" + + "a=rtpmap:97 AC3/44100\r\n" + + "a=A!#$%&'*+-.^_`{|}~:special\r\n"; + + SessionDescription sessionDescription = SessionDescriptionParser.parse(testMediaSdpInfo); + + assertThat(sessionDescription.mediaDescriptionList.get(0).attributes) + .containsEntry("A!#$%&'*+-.^_`{|}~", "special"); + } + @Test public void parse_sdpStringWithDuplicatedSessionAttribute_recordsTheMostRecentValue() throws Exception { From 0f0e11aaeb59dc7f5774e86b7d333153c8a6bf00 Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 17 Sep 2021 15:56:15 +0100 Subject: [PATCH 199/441] Make README structure match the desired androidx structure PiperOrigin-RevId: 397319051 --- .../media/github/README-androidx-demos.md | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md diff --git a/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md b/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md deleted file mode 100644 index b752df19ab..0000000000 --- a/google3/third_party/java_src/android_libs/media/github/README-androidx-demos.md +++ /dev/null @@ -1,26 +0,0 @@ -# Android media demos # - -This directory contains applications that demonstrate how to use Android media -projects, like ExoPlayer. -Browse the individual demos and their READMEs to learn more. - -## Running a demo ## - -### From Android Studio ### - -* File -> New -> Import Project -> Specify the root `media` folder. -* Choose the demo from the run configuration dropdown list. -* Click Run. - -### Using gradle from the command line: ### - -* Open a Terminal window at the root `media` folder. -* Run `./gradlew projects` to show all projects. Demo projects start with `demo`. -* Run `./gradlew ::tasks` to view the list of available tasks for -the demo project. Choose an install option from the `Install tasks` section. -* Run `./gradlew ::`. - -**Example**: - -`./gradlew :demo:installNoExtensionsDebug` installs the main ExoPlayer demo app - in debug mode with no extensions. From 701be41534bcab4d25e92de9816d54da8e7aa717 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 17 Sep 2021 16:47:12 +0100 Subject: [PATCH 200/441] Demo app: Fail fast if parsing invalid DRM config from JSON These fields can't be used if `drm_uuid` isn't set. Make that case throw an exception, so it's obvious to a developer what's wrong. Most of the fields 'obviously' need `drm_uuid` to be set, but it's not obvious for `drm_session_for_clear_content` (because it might be reasonable to assume it's possible to play clear content without specifying a UUID). This tripped me up in https://github.com/google/ExoPlayer/issues/8842#issuecomment-833659808. PiperOrigin-RevId: 397328556 --- .../exoplayer2/demo/SampleChooserActivity.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 16174d5a3f..ac6a5037d4 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -448,6 +448,18 @@ public class SampleChooserActivity extends AppCompatActivity .setMultiSession(drmMultiSession) .setForceDefaultLicenseUri(drmForceDefaultLicenseUri) .build()); + } else { + checkState(drmLicenseUri == null, "drm_uuid is required if drm_license_uri is set."); + checkState( + drmLicenseRequestHeaders == null, + "drm_uuid is required if drm_key_request_properties is set."); + checkState( + !drmSessionForClearContent, + "drm_uuid is required if drm_session_for_clear_content is set."); + checkState(!drmMultiSession, "drm_uuid is required if drm_multi_session is set."); + checkState( + !drmForceDefaultLicenseUri, + "drm_uuid is required if drm_force_default_license_uri is set."); } if (subtitleUri != null) { MediaItem.Subtitle subtitle = From 8d3cad570eb520f05d2bb2329cd73511976d08f6 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 20 Sep 2021 09:52:12 +0100 Subject: [PATCH 201/441] Document MediaItem.DrmConfiguration#buildUpon() PiperOrigin-RevId: 397697019 --- .../src/main/java/com/google/android/exoplayer2/MediaItem.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 0e3e17d5a9..ec01e973e7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -771,6 +771,7 @@ public final class MediaItem implements Bundleable { return keySetId != null ? Arrays.copyOf(keySetId, keySetId.length) : null; } + /** Returns a {@link Builder} initialized with the values of this instance. */ public Builder buildUpon() { return new Builder(this); } From 0f3a86b89de92f1fddc527f868dc8d894013d1d2 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 20 Sep 2021 11:04:31 +0100 Subject: [PATCH 202/441] Remove accidental log line. PiperOrigin-RevId: 397707790 --- .../src/main/java/com/google/android/exoplayer2/Timeline.java | 4 ---- 1 file changed, 4 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 31bea4d806..c3d1500ba5 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 @@ -30,7 +30,6 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.BundleUtil; -import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import java.lang.annotation.Documented; @@ -1206,9 +1205,6 @@ public abstract class Timeline implements Bundleable { } // Period positions cannot be negative. periodPositionUs = max(0, periodPositionUs); - if (periodPositionUs == 9) { - Log.e("XXX", "YYY"); - } return Pair.create(Assertions.checkNotNull(period.uid), periodPositionUs); } From 8a910fd0aad2abb759c524c0779d73a755ffd2ec Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 20 Sep 2021 12:21:53 +0100 Subject: [PATCH 203/441] Make @HlsMediaSource.MetadataType `TYPE_USE` PiperOrigin-RevId: 397717018 --- .../google/android/exoplayer2/source/hls/HlsMediaSource.java | 5 ++++- .../exoplayer2/source/hls/HlsSampleStreamWrapper.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 4b225d7743..7736b26b4c 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -57,7 +57,9 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.util.Collections; import java.util.List; @@ -83,6 +85,7 @@ public final class HlsMediaSource extends BaseMediaSource */ @Documented @Retention(SOURCE) + @Target({ElementType.TYPE_USE}) @IntDef({METADATA_TYPE_ID3, METADATA_TYPE_EMSG}) public @interface MetadataType {} @@ -104,7 +107,7 @@ public final class HlsMediaSource extends BaseMediaSource private DrmSessionManagerProvider drmSessionManagerProvider; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private boolean allowChunklessPreparation; - @MetadataType private int metadataType; + private @MetadataType int metadataType; private boolean useSessionKeys; private List streamKeys; @Nullable private Object tag; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 8f639518bc..ca72c5516d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -135,7 +135,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; private final Loader loader; private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher; - @HlsMediaSource.MetadataType private final int metadataType; + private final @HlsMediaSource.MetadataType int metadataType; private final HlsChunkSource.HlsChunkHolder nextChunkHolder; private final ArrayList mediaChunks; private final List readOnlyMediaChunks; From 46d97bdd39fc29678e7450707e23a44148fb5d2f Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 20 Sep 2021 12:28:43 +0100 Subject: [PATCH 204/441] Fix DTS_X audio mime type Issue: #9429 #minor-release PiperOrigin-RevId: 397717740 --- RELEASENOTES.md | 3 +++ .../java/com/google/android/exoplayer2/util/MimeTypes.java | 4 ++-- .../com/google/android/exoplayer2/util/MimeTypesTest.java | 2 +- .../google/android/exoplayer2/extractor/mp4/AtomParsers.java | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6b28d6b1ba..66c453707e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -26,6 +26,9 @@ ([#8906](https://github.com/google/ExoPlayer/issues/8906)). * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. + * Rename `MimeTypes.AUDIO_DTS_UHD` to `MimeTypes.AUDIO_DTS_X` and add + required profile to its value + ([#9429](https://github.com/google/ExoPlayer/issues/9429)). * Extractors: * Support TS packets without PTS flag ([#9294](https://github.com/google/ExoPlayer/issues/9294)). diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index f729621172..3e82accd71 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -78,7 +78,7 @@ public final class MimeTypes { public static final String AUDIO_DTS = BASE_TYPE_AUDIO + "/vnd.dts"; public static final String AUDIO_DTS_HD = BASE_TYPE_AUDIO + "/vnd.dts.hd"; public static final String AUDIO_DTS_EXPRESS = BASE_TYPE_AUDIO + "/vnd.dts.hd;profile=lbr"; - public static final String AUDIO_DTS_UHD = BASE_TYPE_AUDIO + "/vnd.dts.uhd"; + public static final String AUDIO_DTS_X = BASE_TYPE_AUDIO + "/vnd.dts.uhd;profile=p2"; public static final String AUDIO_VORBIS = BASE_TYPE_AUDIO + "/vorbis"; public static final String AUDIO_OPUS = BASE_TYPE_AUDIO + "/opus"; public static final String AUDIO_AMR = BASE_TYPE_AUDIO + "/amr"; @@ -410,7 +410,7 @@ public final class MimeTypes { } else if (codec.startsWith("dtsh") || codec.startsWith("dtsl")) { return MimeTypes.AUDIO_DTS_HD; } else if (codec.startsWith("dtsx")) { - return MimeTypes.AUDIO_DTS_UHD; + return MimeTypes.AUDIO_DTS_X; } else if (codec.startsWith("opus")) { return MimeTypes.AUDIO_OPUS; } else if (codec.startsWith("vorbis")) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java index 490a68d0ab..3309c972c4 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java @@ -140,7 +140,7 @@ public final class MimeTypesTest { assertThat(MimeTypes.getMediaMimeType("dtse")).isEqualTo(MimeTypes.AUDIO_DTS_EXPRESS); assertThat(MimeTypes.getMediaMimeType("dtsh")).isEqualTo(MimeTypes.AUDIO_DTS_HD); assertThat(MimeTypes.getMediaMimeType("dtsl")).isEqualTo(MimeTypes.AUDIO_DTS_HD); - assertThat(MimeTypes.getMediaMimeType("dtsx")).isEqualTo(MimeTypes.AUDIO_DTS_UHD); + assertThat(MimeTypes.getMediaMimeType("dtsx")).isEqualTo(MimeTypes.AUDIO_DTS_X); assertThat(MimeTypes.getMediaMimeType("opus")).isEqualTo(MimeTypes.AUDIO_OPUS); assertThat(MimeTypes.getMediaMimeType("vorbis")).isEqualTo(MimeTypes.AUDIO_VORBIS); assertThat(MimeTypes.getMediaMimeType("mp4a")).isEqualTo(MimeTypes.AUDIO_AAC); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index 5964c95164..3d392070da 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -1374,7 +1374,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } else if (atomType == Atom.TYPE_dtse) { mimeType = MimeTypes.AUDIO_DTS_EXPRESS; } else if (atomType == Atom.TYPE_dtsx) { - mimeType = MimeTypes.AUDIO_DTS_UHD; + mimeType = MimeTypes.AUDIO_DTS_X; } else if (atomType == Atom.TYPE_samr) { mimeType = MimeTypes.AUDIO_AMR_NB; } else if (atomType == Atom.TYPE_sawb) { From 47b82cdc457a136e6c1647ee2a089251452dbab0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 20 Sep 2021 12:37:45 +0100 Subject: [PATCH 205/441] Add MediaItem.AdsConfiguration.Builder PiperOrigin-RevId: 397718885 --- .../google/android/exoplayer2/MediaItem.java | 127 ++++++++++-------- .../android/exoplayer2/MediaItemTest.java | 34 ++++- 2 files changed, 107 insertions(+), 54 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index ec01e973e7..140f27aa90 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -78,8 +78,7 @@ public final class MediaItem implements Bundleable { private List streamKeys; @Nullable private String customCacheKey; private List subtitles; - @Nullable private Uri adTagUri; - @Nullable private Object adsId; + @Nullable private AdsConfiguration adsConfiguration; @Nullable private Object tag; @Nullable private MediaMetadata mediaMetadata; private long liveTargetOffsetMs; @@ -128,11 +127,7 @@ public final class MediaItem implements Bundleable { playbackProperties.drmConfiguration != null ? playbackProperties.drmConfiguration.buildUpon() : new DrmConfiguration.Builder(); - @Nullable AdsConfiguration adsConfiguration = playbackProperties.adsConfiguration; - if (adsConfiguration != null) { - adTagUri = adsConfiguration.adTagUri; - adsId = adsConfiguration.adsId; - } + adsConfiguration = playbackProperties.adsConfiguration; } } @@ -384,54 +379,43 @@ public final class MediaItem implements Bundleable { } /** - * Sets the optional ad tag {@link Uri}. - * - *

    Media items in the playlist with the same ad tag URI, media ID and ads loader will share - * the same ad playback state. To resume ad playback when recreating the playlist on returning - * from the background, pass media items with the same ad tag URIs and media IDs to the player. + * Sets the optional {@link AdsConfiguration}. * *

    This method should only be called if {@link #setUri} is passed a non-null value. - * - * @param adTagUri The ad tag URI to load. */ + public Builder setAdsConfiguration(@Nullable AdsConfiguration adsConfiguration) { + this.adsConfiguration = adsConfiguration; + return this; + } + + /** + * @deprecated Use {@link #setAdsConfiguration(AdsConfiguration)}, parse the {@code adTagUri} + * with {@link Uri#parse(String)} and pass the result to {@link + * AdsConfiguration.Builder#Builder(Uri)} instead. + */ + @Deprecated public Builder setAdTagUri(@Nullable String adTagUri) { return setAdTagUri(adTagUri != null ? Uri.parse(adTagUri) : null); } /** - * Sets the optional ad tag {@link Uri}. - * - *

    Media items in the playlist with the same ad tag URI, media ID and ads loader will share - * the same ad playback state. To resume ad playback when recreating the playlist on returning - * from the background, pass media items with the same ad tag URIs and media IDs to the player. - * - *

    This method should only be called if {@link #setUri} is passed a non-null value. - * - * @param adTagUri The ad tag URI to load. + * @deprecated Use {@link #setAdsConfiguration(AdsConfiguration)} and pass the {@code adTagUri} + * to {@link AdsConfiguration.Builder#Builder(Uri)} instead. */ + @Deprecated public Builder setAdTagUri(@Nullable Uri adTagUri) { return setAdTagUri(adTagUri, /* adsId= */ null); } /** - * Sets the optional ad tag {@link Uri} and ads identifier. - * - *

    Media items in the playlist that have the same ads identifier and ads loader share the - * same ad playback state. To resume ad playback when recreating the playlist on returning from - * the background, pass the same ads IDs to the player. - * - *

    This method should only be called if {@link #setUri} is passed a non-null value. - * - * @param adTagUri The ad tag URI to load. - * @param adsId An opaque identifier for ad playback state associated with this item. Ad loading - * and playback state is shared among all media items that have the same ads ID (by {@link - * Object#equals(Object) equality}) and ads loader, so it is important to pass the same - * identifiers when constructing playlist items each time the player returns to the - * foreground. + * @deprecated Use {@link #setAdsConfiguration(AdsConfiguration)}, pass the {@code adTagUri} to + * {@link AdsConfiguration.Builder#Builder(Uri)} and the {@code adsId} to {@link + * AdsConfiguration.Builder#setAdsId(Object)} instead. */ + @Deprecated public Builder setAdTagUri(@Nullable Uri adTagUri, @Nullable Object adsId) { - this.adTagUri = adTagUri; - this.adsId = adsId; + this.adsConfiguration = + adTagUri != null ? new AdsConfiguration.Builder(adTagUri).setAdsId(adsId).build() : null; return this; } @@ -530,7 +514,7 @@ public final class MediaItem implements Bundleable { uri, mimeType, drmConfiguration.uuid != null ? drmConfiguration.build() : null, - adTagUri != null ? new AdsConfiguration(adTagUri, adsId) : null, + adsConfiguration, streamKeys, customCacheKey, subtitles, @@ -813,28 +797,65 @@ public final class MediaItem implements Bundleable { /** Configuration for playing back linear ads with a media item. */ public static final class AdsConfiguration { + /** Builder for {@link AdsConfiguration} instances. */ + public static final class Builder { + + private Uri adTagUri; + @Nullable private Object adsId; + + /** + * Constructs a new instance. + * + * @param adTagUri The ad tag URI to load. + */ + public Builder(Uri adTagUri) { + this.adTagUri = adTagUri; + } + + /** Sets the ad tag URI to load. */ + public Builder setAdTagUri(Uri adTagUri) { + this.adTagUri = adTagUri; + return this; + } + + /** + * Sets the ads identifier. + * + *

    See details on {@link AdsConfiguration#adsId} for how the ads identifier is used and how + * it's calculated if not explicitly set. + */ + public Builder setAdsId(@Nullable Object adsId) { + this.adsId = adsId; + return this; + } + + public AdsConfiguration build() { + return new AdsConfiguration(this); + } + } + /** The ad tag URI to load. */ public final Uri adTagUri; + /** * An opaque identifier for ad playback state associated with this item, or {@code null} if the * combination of the {@link MediaItem.Builder#setMediaId(String) media ID} and {@link #adTagUri * ad tag URI} should be used as the ads identifier. + * + *

    Media items in the playlist that have the same ads identifier and ads loader share the + * same ad playback state. To resume ad playback when recreating the playlist on returning from + * the background, pass the same ads identifiers to the player. */ @Nullable public final Object adsId; - /** - * Creates an ads configuration with the given ad tag URI and ads identifier. - * - * @param adTagUri The ad tag URI to load. - * @param adsId An opaque identifier for ad playback state associated with this item. Ad loading - * and playback state is shared among all media items that have the same ads ID (by {@link - * Object#equals(Object) equality}) and ads loader, so it is important to pass the same - * identifiers when constructing playlist items each time the player returns to the - * foreground. - */ - private AdsConfiguration(Uri adTagUri, @Nullable Object adsId) { - this.adTagUri = adTagUri; - this.adsId = adsId; + private AdsConfiguration(Builder builder) { + this.adTagUri = builder.adTagUri; + this.adsId = builder.adsId; + } + + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(adTagUri).setAdsId(adsId); } @Override diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index a10707a4f5..7068437b5c 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -361,6 +361,36 @@ public class MediaItemTest { } @Test + public void builderSetAdsConfiguration_justUri() { + Uri adTagUri = Uri.parse(URI_STRING + "/ad"); + + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) + .build(); + + assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isNull(); + } + + @Test + public void builderSetAdsConfiguration_withAdsId() { + Uri adTagUri = Uri.parse(URI_STRING + "/ad"); + Object adsId = new Object(); + + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adsId).build()) + .build(); + assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isEqualTo(adsId); + } + + @Test + @SuppressWarnings("deprecation") // Testing deprecated setter public void builderSetAdTagUri_setsAdTagUri() { Uri adTagUri = Uri.parse(URI_STRING + "/ad"); @@ -371,6 +401,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated setter public void builderSetAdTagUriAndAdsId_setsAdsConfiguration() { Uri adTagUri = Uri.parse(URI_STRING + "/ad"); Object adsId = new Object(); @@ -484,7 +515,8 @@ public class MediaItemTest { public void buildUpon_wholeObjectSetters_equalsToOriginal() { MediaItem mediaItem = new MediaItem.Builder() - .setAdTagUri(URI_STRING) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(Uri.parse(URI_STRING)).build()) .setClipEndPositionMs(1000) .setClipRelativeToDefaultPosition(true) .setClipRelativeToLiveWindow(true) From 9666fbdda6a14bd0375c907e52529bb8e11b9395 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 20 Sep 2021 15:48:03 +0100 Subject: [PATCH 206/441] Add MediaItem.LiveConfiguration.Builder PiperOrigin-RevId: 397748657 --- .../google/android/exoplayer2/MediaItem.java | 219 +++++++++++------- .../android/exoplayer2/MediaItemTest.java | 53 ++++- 2 files changed, 184 insertions(+), 88 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 140f27aa90..46fa2afa07 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -81,11 +81,9 @@ public final class MediaItem implements Bundleable { @Nullable private AdsConfiguration adsConfiguration; @Nullable private Object tag; @Nullable private MediaMetadata mediaMetadata; - private long liveTargetOffsetMs; - private long liveMinOffsetMs; - private long liveMaxOffsetMs; - private float liveMinPlaybackSpeed; - private float liveMaxPlaybackSpeed; + // TODO: Change this to LiveConfiguration once all the deprecated individual setters + // are removed. + private LiveConfiguration.Builder liveConfiguration; /** Creates a builder. */ @SuppressWarnings("deprecation") // Temporarily uses DrmConfiguration.Builder() constructor. @@ -94,11 +92,7 @@ public final class MediaItem implements Bundleable { drmConfiguration = new DrmConfiguration.Builder(); streamKeys = Collections.emptyList(); subtitles = Collections.emptyList(); - liveTargetOffsetMs = C.TIME_UNSET; - liveMinOffsetMs = C.TIME_UNSET; - liveMaxOffsetMs = C.TIME_UNSET; - liveMinPlaybackSpeed = C.RATE_UNSET; - liveMaxPlaybackSpeed = C.RATE_UNSET; + liveConfiguration = new LiveConfiguration.Builder(); } private Builder(MediaItem mediaItem) { @@ -110,11 +104,7 @@ public final class MediaItem implements Bundleable { clipStartsAtKeyFrame = mediaItem.clippingProperties.startsAtKeyFrame; mediaId = mediaItem.mediaId; mediaMetadata = mediaItem.mediaMetadata; - liveTargetOffsetMs = mediaItem.liveConfiguration.targetOffsetMs; - liveMinOffsetMs = mediaItem.liveConfiguration.minOffsetMs; - liveMaxOffsetMs = mediaItem.liveConfiguration.maxOffsetMs; - liveMinPlaybackSpeed = mediaItem.liveConfiguration.minPlaybackSpeed; - liveMaxPlaybackSpeed = mediaItem.liveConfiguration.maxPlaybackSpeed; + liveConfiguration = mediaItem.liveConfiguration.buildUpon(); @Nullable PlaybackProperties playbackProperties = mediaItem.playbackProperties; if (playbackProperties != null) { customCacheKey = playbackProperties.customCacheKey; @@ -419,68 +409,59 @@ public final class MediaItem implements Bundleable { return this; } + /** Sets the {@link LiveConfiguration}. Defaults to {@link LiveConfiguration#UNSET}. */ + public Builder setLiveConfiguration(LiveConfiguration liveConfiguration) { + this.liveConfiguration = liveConfiguration.buildUpon(); + return this; + } + /** - * Sets the optional target offset from the live edge for live streams, in milliseconds. - * - *

    See {@code Player#getCurrentLiveOffset()}. - * - * @param liveTargetOffsetMs The target offset, in milliseconds, or {@link C#TIME_UNSET} to use - * the media-defined default. + * @deprecated Use {@link #setLiveConfiguration(LiveConfiguration)} and {@link + * LiveConfiguration.Builder#setTargetOffsetMs(long)}. */ + @Deprecated public Builder setLiveTargetOffsetMs(long liveTargetOffsetMs) { - this.liveTargetOffsetMs = liveTargetOffsetMs; + liveConfiguration.setTargetOffsetMs(liveTargetOffsetMs); return this; } /** - * Sets the optional minimum offset from the live edge for live streams, in milliseconds. - * - *

    See {@code Player#getCurrentLiveOffset()}. - * - * @param liveMinOffsetMs The minimum allowed offset, in milliseconds, or {@link C#TIME_UNSET} - * to use the media-defined default. + * @deprecated Use {@link #setLiveConfiguration(LiveConfiguration)} and {@link + * LiveConfiguration.Builder#setMinOffsetMs(long)}. */ + @Deprecated public Builder setLiveMinOffsetMs(long liveMinOffsetMs) { - this.liveMinOffsetMs = liveMinOffsetMs; + liveConfiguration.setMinOffsetMs(liveMinOffsetMs); return this; } /** - * Sets the optional maximum offset from the live edge for live streams, in milliseconds. - * - *

    See {@code Player#getCurrentLiveOffset()}. - * - * @param liveMaxOffsetMs The maximum allowed offset, in milliseconds, or {@link C#TIME_UNSET} - * to use the media-defined default. + * @deprecated Use {@link #setLiveConfiguration(LiveConfiguration)} and {@link + * LiveConfiguration.Builder#setMaxOffsetMs(long)}. */ + @Deprecated public Builder setLiveMaxOffsetMs(long liveMaxOffsetMs) { - this.liveMaxOffsetMs = liveMaxOffsetMs; + liveConfiguration.setMaxOffsetMs(liveMaxOffsetMs); return this; } /** - * Sets the optional minimum playback speed for live stream speed adjustment. - * - *

    This value is ignored for other stream types. - * - * @param minPlaybackSpeed The minimum factor by which playback can be sped up for live streams, - * or {@link C#RATE_UNSET} to use the media-defined default. + * @deprecated Use {@link #setLiveConfiguration(LiveConfiguration)} and {@link + * LiveConfiguration.Builder#setMinPlaybackSpeed(float)}. */ + @Deprecated public Builder setLiveMinPlaybackSpeed(float minPlaybackSpeed) { - this.liveMinPlaybackSpeed = minPlaybackSpeed; + liveConfiguration.setMinPlaybackSpeed(minPlaybackSpeed); return this; } /** - * Sets the optional maximum playback speed for live stream speed adjustment. - * - *

    This value is ignored for other stream types. - * - * @param maxPlaybackSpeed The maximum factor by which playback can be sped up for live streams, - * or {@link C#RATE_UNSET} to use the media-defined default. + * @deprecated Use {@link #setLiveConfiguration(LiveConfiguration)} and {@link + * LiveConfiguration.Builder#setMaxPlaybackSpeed(float)}. */ + @Deprecated public Builder setLiveMaxPlaybackSpeed(float maxPlaybackSpeed) { - this.liveMaxPlaybackSpeed = maxPlaybackSpeed; + liveConfiguration.setMaxPlaybackSpeed(maxPlaybackSpeed); return this; } @@ -529,12 +510,7 @@ public final class MediaItem implements Bundleable { clipRelativeToDefaultPosition, clipStartsAtKeyFrame), playbackProperties, - new LiveConfiguration( - liveTargetOffsetMs, - liveMinOffsetMs, - liveMaxOffsetMs, - liveMinPlaybackSpeed, - liveMaxPlaybackSpeed), + liveConfiguration.build(), mediaMetadata != null ? mediaMetadata : MediaMetadata.EMPTY); } } @@ -971,14 +947,98 @@ public final class MediaItem implements Bundleable { /** Live playback configuration. */ public static final class LiveConfiguration implements Bundleable { - /** A live playback configuration with unset values. */ - public static final LiveConfiguration UNSET = - new LiveConfiguration( - /* targetLiveOffsetMs= */ C.TIME_UNSET, - /* minLiveOffsetMs= */ C.TIME_UNSET, - /* maxLiveOffsetMs= */ C.TIME_UNSET, - /* minPlaybackSpeed= */ C.RATE_UNSET, - /* maxPlaybackSpeed= */ C.RATE_UNSET); + /** Builder for {@link LiveConfiguration} instances. */ + public static final class Builder { + private long targetOffsetMs; + private long minOffsetMs; + private long maxOffsetMs; + private float minPlaybackSpeed; + private float maxPlaybackSpeed; + + /** Constructs an instance. */ + public Builder() { + this.targetOffsetMs = C.TIME_UNSET; + this.minOffsetMs = C.TIME_UNSET; + this.maxOffsetMs = C.TIME_UNSET; + this.minPlaybackSpeed = C.RATE_UNSET; + this.maxPlaybackSpeed = C.RATE_UNSET; + } + + private Builder(LiveConfiguration liveConfiguration) { + this.targetOffsetMs = liveConfiguration.targetOffsetMs; + this.minOffsetMs = liveConfiguration.minOffsetMs; + this.maxOffsetMs = liveConfiguration.maxOffsetMs; + this.minPlaybackSpeed = liveConfiguration.minPlaybackSpeed; + this.maxPlaybackSpeed = liveConfiguration.maxPlaybackSpeed; + } + + /** + * Sets the target live offset, in milliseconds. + * + *

    See {@code Player#getCurrentLiveOffset()}. + * + *

    Defaults to {@link C#TIME_UNSET}, indicating the media-defined default will be used. + */ + public Builder setTargetOffsetMs(long targetOffsetMs) { + this.targetOffsetMs = targetOffsetMs; + return this; + } + + /** + * Sets the minimum allowed live offset, in milliseconds. + * + *

    See {@code Player#getCurrentLiveOffset()}. + * + *

    Defaults to {@link C#TIME_UNSET}, indicating the media-defined default will be used. + */ + public Builder setMinOffsetMs(long minOffsetMs) { + this.minOffsetMs = minOffsetMs; + return this; + } + + /** + * Sets the maximum allowed live offset, in milliseconds. + * + *

    See {@code Player#getCurrentLiveOffset()}. + * + *

    Defaults to {@link C#TIME_UNSET}, indicating the media-defined default will be used. + */ + public Builder setMaxOffsetMs(long maxOffsetMs) { + this.maxOffsetMs = maxOffsetMs; + return this; + } + + /** + * Sets the minimum playback speed. + * + *

    Defaults to {@link C#RATE_UNSET}, indicating the media-defined default will be used. + */ + public Builder setMinPlaybackSpeed(float minPlaybackSpeed) { + this.minPlaybackSpeed = minPlaybackSpeed; + return this; + } + + /** + * Sets the maximum playback speed. + * + *

    Defaults to {@link C#RATE_UNSET}, indicating the media-defined default will be used. + */ + public Builder setMaxPlaybackSpeed(float maxPlaybackSpeed) { + this.maxPlaybackSpeed = maxPlaybackSpeed; + return this; + } + + /** Creates a {@link LiveConfiguration} with the values from this builder. */ + public LiveConfiguration build() { + return new LiveConfiguration(this); + } + } + + /** + * A live playback configuration with unset values, meaning media-defined default values will be + * used. + */ + public static final LiveConfiguration UNSET = new LiveConfiguration.Builder().build(); /** * Target offset from the live edge, in milliseconds, or {@link C#TIME_UNSET} to use the @@ -1010,20 +1070,18 @@ public final class MediaItem implements Bundleable { */ public final float maxPlaybackSpeed; - /** - * Creates a live playback configuration. - * - * @param targetOffsetMs Target live offset, in milliseconds, or {@link C#TIME_UNSET} to use the - * media-defined default. - * @param minOffsetMs The minimum allowed live offset, in milliseconds, or {@link C#TIME_UNSET} - * to use the media-defined default. - * @param maxOffsetMs The maximum allowed live offset, in milliseconds, or {@link C#TIME_UNSET} - * to use the media-defined default. - * @param minPlaybackSpeed Minimum playback speed, or {@link C#RATE_UNSET} to use the - * media-defined default. - * @param maxPlaybackSpeed Maximum playback speed, or {@link C#RATE_UNSET} to use the - * media-defined default. - */ + @SuppressWarnings("deprecation") // Using the deprecated constructor while it exists. + private LiveConfiguration(Builder builder) { + this( + builder.targetOffsetMs, + builder.minOffsetMs, + builder.maxOffsetMs, + builder.minPlaybackSpeed, + builder.maxPlaybackSpeed); + } + + /** @deprecated Use {@link Builder} instead. */ + @Deprecated public LiveConfiguration( long targetOffsetMs, long minOffsetMs, @@ -1037,6 +1095,11 @@ public final class MediaItem implements Bundleable { this.maxPlaybackSpeed = maxPlaybackSpeed; } + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(this); + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 7068437b5c..207a4ad28f 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -424,6 +424,29 @@ public class MediaItemTest { } @Test + public void builderSetLiveConfiguration() { + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(10_000) + .setMinOffsetMs(20_000) + .setMaxOffsetMs(30_000) + .setMinPlaybackSpeed(0.5f) + .setMaxPlaybackSpeed(2f) + .build()) + .build(); + + assertThat(mediaItem.liveConfiguration.targetOffsetMs).isEqualTo(10_000); + assertThat(mediaItem.liveConfiguration.minOffsetMs).isEqualTo(20_000); + assertThat(mediaItem.liveConfiguration.maxOffsetMs).isEqualTo(30_000); + assertThat(mediaItem.liveConfiguration.minPlaybackSpeed).isEqualTo(0.5f); + assertThat(mediaItem.liveConfiguration.maxPlaybackSpeed).isEqualTo(2f); + } + + @Test + @SuppressWarnings("deprecation") // Tests deprecated setter public void builderSetLiveTargetOffsetMs_setsLiveTargetOffsetMs() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setLiveTargetOffsetMs(10_000).build(); @@ -432,6 +455,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Tests deprecated setter public void builderSetMinLivePlaybackSpeed_setsMinLivePlaybackSpeed() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setLiveMinPlaybackSpeed(.9f).build(); @@ -440,6 +464,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Tests deprecated setter public void builderSetMaxLivePlaybackSpeed_setsMaxLivePlaybackSpeed() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setLiveMaxPlaybackSpeed(1.1f).build(); @@ -448,6 +473,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Tests deprecated setter public void builderSetMinLiveOffset_setsMinLiveOffset() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setLiveMinOffsetMs(1234).build(); @@ -456,6 +482,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Tests deprecated setter public void builderSetMaxLiveOffset_setsMaxLiveOffset() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setLiveMaxOffsetMs(1234).build(); @@ -538,11 +565,14 @@ public class MediaItemTest { .setMimeType(MimeTypes.APPLICATION_MP4) .setUri(URI_STRING) .setStreamKeys(ImmutableList.of(new StreamKey(1, 0, 0))) - .setLiveTargetOffsetMs(20_000) - .setLiveMinPlaybackSpeed(.9f) - .setLiveMaxPlaybackSpeed(1.1f) - .setLiveMinOffsetMs(2222) - .setLiveMaxOffsetMs(4444) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(20_000) + .setMinPlaybackSpeed(.9f) + .setMaxPlaybackSpeed(1.1f) + .setMinOffsetMs(2222) + .setMaxOffsetMs(4444) + .build()) .setSubtitles( ImmutableList.of( new MediaItem.Subtitle( @@ -565,11 +595,14 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder() .setMediaId("mediaId") - .setLiveTargetOffsetMs(20_000) - .setLiveMinOffsetMs(2_222) - .setLiveMaxOffsetMs(4_444) - .setLiveMinPlaybackSpeed(.9f) - .setLiveMaxPlaybackSpeed(1.1f) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(20_000) + .setMinOffsetMs(2_222) + .setMaxOffsetMs(4_444) + .setMinPlaybackSpeed(.9f) + .setMaxPlaybackSpeed(1.1f) + .build()) .setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build()) .setClipStartPositionMs(100) .setClipEndPositionMs(1_000) From 7d524d6d6f5642bd4382ba1c40eda99c032dd339 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 20 Sep 2021 16:15:25 +0100 Subject: [PATCH 207/441] Fix incorrect @IntRange PiperOrigin-RevId: 397753634 --- .../android/exoplayer2/source/ads/AdPlaybackState.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java index 319b5cc12d..3c1427a2ec 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java @@ -118,9 +118,10 @@ public final class AdPlaybackState implements Bundleable { /** * Returns the index of the next ad in the ad group that should be played after playing {@code - * lastPlayedAdIndex}, or {@link #count} if no later ads should be played. + * lastPlayedAdIndex}, or {@link #count} if no later ads should be played. If no ads have been + * played, pass -1 to get the index of the first ad to play. */ - public int getNextAdIndexToPlay(@IntRange(from = 0) int lastPlayedAdIndex) { + public int getNextAdIndexToPlay(@IntRange(from = -1) int lastPlayedAdIndex) { int nextAdIndexToPlay = lastPlayedAdIndex + 1; while (nextAdIndexToPlay < states.length) { if (isServerSideInserted From 276d2e9d0d0db0e717a69e2a78d2de37c0a6f8f6 Mon Sep 17 00:00:00 2001 From: christosts Date: Mon, 20 Sep 2021 16:38:09 +0100 Subject: [PATCH 208/441] Bump version to 2.15.1 and tidy release notes #minor-release PiperOrigin-RevId: 397758146 --- RELEASENOTES.md | 119 +++++++++--------- constants.gradle | 4 +- .../exoplayer2/ExoPlayerLibraryInfo.java | 6 +- 3 files changed, 67 insertions(+), 62 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 66c453707e..eb04bdb5e4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -9,67 +9,23 @@ `com.google.android.exoplayer2.decoder.CryptoException`. * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. - * Fix track selection in `StyledPlayerControlView` when using - `ForwardingPlayer`. * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use `GlUtil.glAssertionsEnabled` instead. - * Fix `FlagSet#equals` on API levels below 24. - * Fix `NullPointerException` being thrown from `CacheDataSource` when - reading a fully cached resource with `DataSpec.position` equal to the - resource length. - * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with - a relative path - ([#9403](https://github.com/google/ExoPlayer/issues/9403)). - * Better handle invalid seek requests. Seeks to positions that are before - the start or after the end of the media are now handled as seeks to the - start and end respectively - ([#8906](https://github.com/google/ExoPlayer/issues/8906)). * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. - * Rename `MimeTypes.AUDIO_DTS_UHD` to `MimeTypes.AUDIO_DTS_X` and add - required profile to its value - ([#9429](https://github.com/google/ExoPlayer/issues/9429)). -* Extractors: - * Support TS packets without PTS flag - ([#9294](https://github.com/google/ExoPlayer/issues/9294)). * Android 12 compatibility: * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of calls from the player to `Surface.setFrameRate`. This is useful for applications wanting to call `Surface.setFrameRate` directly from application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. -* Video - * Request smaller decoder input buffers for Dolby Vision. This fixes an - issue that could cause UHD Dolby Vision playbacks to fail on some - devices, including Amazon Fire TV 4K. -* DRM: - * Fix `DefaultDrmSessionManager` to correctly eagerly release preacquired - DRM sessions when there's a shortage of DRM resources on the device. -* Downloads and caching: - * Workaround platform issue that can cause a `SecurityException` to be - thrown from `Requirements.isInternetConnectivityValidated` on devices - running Android 11 - ([#9002](https://github.com/google/ExoPlayer/issues/9002)). -* UI +* UI: * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with `Player.addListener`. - * Use `defStyleAttr` when obtaining styled attributes in - `StyledPlayerView`, `PlayerView` and `PlayerControlView` - ([#9024](https://github.com/google/ExoPlayer/issues/9024)). - * Fix accessibility focus in `PlayerControlView` - ([#9111](https://github.com/google/ExoPlayer/issues/9111)). - * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI when - available player commands change. -* DASH - * Use identical cache keys for downloading and playing DASH segments - ([#9370](https://github.com/google/ExoPlayer/issues/9370)). - * Fix base URL selection and load error handling when base URLs are shared - across adaptation sets. -* HLS - * Fix bug where the player would get stuck if all download attempts fail - and would not raise an error to the application. - ([#9390](https://github.com/google/ExoPlayer/issues/9390)). +* RTSP: + * Support RFC4566 SDP attribute field grammar + ([#9430](https://github.com/google/ExoPlayer/issues/9430)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. @@ -99,10 +55,6 @@ `DownloadService.onDownloadRemoved`. Instead, use `DownloadManager.addListener` to register a listener directly to the `DownloadManager` returned through `DownloadService.getDownloadManager`. -* Cast extension: - * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to - support setting the playback speed - ([#6784](https://github.com/google/ExoPlayer/issues/6784)). * Remove `Player.getCurrentStaticMetadata`, `Player.Listener.onStaticMetadataChanged` and `Player.EVENT_STATIC_METADATA_CHANGED`. Use `Player.getMediaMetadata`, @@ -110,6 +62,52 @@ `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to structured metadata, or access the raw static metadata directly from the `TrackSelection#getFormat()`. + +### 2.15.1 (2021-09-20) + +* Core Library: + * Fix track selection in `StyledPlayerControlView` when using + `ForwardingPlayer`. + * Fix `FlagSet#equals` on API levels below 24. + * Fix `NullPointerException` being thrown from `CacheDataSource` when + reading a fully cached resource with `DataSpec.position` equal to the + resource length. + * Fix a bug when [depending on ExoPlayer locally](README.md#locally) with + a relative path + ([#9403](https://github.com/google/ExoPlayer/issues/9403)). + * Better handle invalid seek requests. Seeks to positions that are before + the start or after the end of the media are now handled as seeks to the + start and end respectively + ([8906](https://github.com/google/ExoPlayer/issues/8906)). + * Rename `MimeTypes.AUDIO_DTS_UHD` to `MimeTypes.AUDIO_DTS_X` and add + required profile to its value + ([#9429](https://github.com/google/ExoPlayer/issues/9429)). +* Extractors: + * Support TS packets without PTS flag + ([#9294](https://github.com/google/ExoPlayer/issues/9294)). + * Fix issue decoding ID3 tags containing UTF-16 encoded strings + ([#9087](https://github.com/google/ExoPlayer/issues/9087)). +* Video: + * Request smaller decoder input buffers for Dolby Vision. This fixes an + issue that could cause UHD Dolby Vision playbacks to fail on some + devices, including Amazon Fire TV 4K. +* DRM: + * Fix `DefaultDrmSessionManager` to correctly eagerly release preacquired + DRM sessions when there's a shortage of DRM resources on the device. +* Downloads and caching: + * Workaround platform issue that can cause a `SecurityException` to be + thrown from `Requirements.isInternetConnectivityValidated` on devices + running Android 11 + ([#9002](https://github.com/google/ExoPlayer/issues/9002)). +* DASH: + * Use identical cache keys for downloading and playing DASH segments + ([#9370](https://github.com/google/ExoPlayer/issues/9370)). + * Fix base URL selection and load error handling when base URLs are shared + across adaptation sets. +* HLS: + * Fix bug where the player would get stuck if all download attempts fail + and would not raise an error to the application + ([#9390](https://github.com/google/ExoPlayer/issues/9390)). * RTSP: * Handle when additional spaces are in SDP's RTPMAP atrribute ([#9379](https://github.com/google/ExoPlayer/issues/9379)). @@ -119,11 +117,18 @@ ([#9416](https://github.com/google/ExoPlayer/issues/9416)). * Fix RTSP WWW-Authenticate header parsing ([#9428](https://github.com/google/ExoPlayer/issues/9428)). - * Support RFC4566 SDP attribute field grammar - ([#9430](https://github.com/google/ExoPlayer/issues/9430)). -* Extractors: - * ID3: Fix issue decoding ID3 tags containing UTF-16 encoded strings - ([#9087](https://github.com/google/ExoPlayer/issues/9087)). +* UI: + * Use `defStyleAttr` when obtaining styled attributes in + `StyledPlayerView`, `PlayerView` and `PlayerControlView` + ([#9024](https://github.com/google/ExoPlayer/issues/9024)). + * Fix accessibility focus in `PlayerControlView` + ([#9111](https://github.com/google/ExoPlayer/issues/9111)). + * Fix issue that `StyledPlayerView` and `PlayerView` don't update UI when + available player commands change. +* Cast extension: + * Implement `CastPlayer.setPlaybackParameters(PlaybackParameters)` to + support setting the playback speed + ([#6784](https://github.com/google/ExoPlayer/issues/6784)). ### 2.15.0 (2021-08-10) diff --git a/constants.gradle b/constants.gradle index 4037f925ad..a891e3ad87 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.15.0' - releaseVersionCode = 2015000 + releaseVersion = '2.15.1' + releaseVersionCode = 2015001 minSdkVersion = 16 appTargetSdkVersion = 29 // Upgrading this requires [Internal ref: b/193254928] to be fixed, or some 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 7e558c3a1b..3751d05322 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 @@ -28,11 +28,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.15.0"; + public static final String VERSION = "2.15.1"; /** The version of the library expressed as {@code "ExoPlayerLib/" + VERSION}. */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final String VERSION_SLASHY = "ExoPlayerLib/2.15.0"; + public static final String VERSION_SLASHY = "ExoPlayerLib/2.15.1"; /** * The version of the library expressed as an integer, for example 1002003. @@ -42,7 +42,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 = 2015000; + public static final int VERSION_INT = 2015001; /** * The default user agent for requests made by the library. From ad99a44083c509b60bca90b6b221aec7c349312f Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 20 Sep 2021 17:46:15 +0100 Subject: [PATCH 209/441] Add empty sdk-version node to all AndroidManifest.xml files PiperOrigin-RevId: 397772916 --- extensions/av1/src/main/AndroidManifest.xml | 4 +++- extensions/cast/src/main/AndroidManifest.xml | 4 +++- extensions/cronet/src/main/AndroidManifest.xml | 1 + extensions/ffmpeg/src/main/AndroidManifest.xml | 4 +++- extensions/flac/src/main/AndroidManifest.xml | 4 +++- extensions/ima/src/main/AndroidManifest.xml | 1 + extensions/leanback/src/main/AndroidManifest.xml | 4 +++- extensions/media2/src/main/AndroidManifest.xml | 4 +++- extensions/mediasession/src/main/AndroidManifest.xml | 4 +++- extensions/okhttp/src/main/AndroidManifest.xml | 4 +++- extensions/opus/src/main/AndroidManifest.xml | 4 +++- extensions/rtmp/src/main/AndroidManifest.xml | 4 +++- extensions/vp9/src/main/AndroidManifest.xml | 1 + extensions/workmanager/src/main/AndroidManifest.xml | 4 +++- library/common/src/main/AndroidManifest.xml | 1 + library/core/src/main/AndroidManifest.xml | 1 + library/dash/src/main/AndroidManifest.xml | 4 +++- library/extractor/src/main/AndroidManifest.xml | 4 +++- library/hls/src/main/AndroidManifest.xml | 4 +++- library/rtsp/src/main/AndroidManifest.xml | 4 +++- library/smoothstreaming/src/main/AndroidManifest.xml | 4 +++- library/transformer/src/main/AndroidManifest.xml | 4 +++- library/ui/src/main/AndroidManifest.xml | 4 +++- robolectricutils/src/main/AndroidManifest.xml | 4 +++- testutils/src/main/AndroidManifest.xml | 4 +++- 25 files changed, 65 insertions(+), 20 deletions(-) diff --git a/extensions/av1/src/main/AndroidManifest.xml b/extensions/av1/src/main/AndroidManifest.xml index af85bacdf6..cc7dfbd761 100644 --- a/extensions/av1/src/main/AndroidManifest.xml +++ b/extensions/av1/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/cast/src/main/AndroidManifest.xml b/extensions/cast/src/main/AndroidManifest.xml index c12fc1289f..7b9427f72e 100644 --- a/extensions/cast/src/main/AndroidManifest.xml +++ b/extensions/cast/src/main/AndroidManifest.xml @@ -13,4 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - + + + diff --git a/extensions/cronet/src/main/AndroidManifest.xml b/extensions/cronet/src/main/AndroidManifest.xml index 5ba54999f4..b97531f592 100644 --- a/extensions/cronet/src/main/AndroidManifest.xml +++ b/extensions/cronet/src/main/AndroidManifest.xml @@ -17,5 +17,6 @@ package="com.google.android.exoplayer2.ext.cronet"> + diff --git a/extensions/ffmpeg/src/main/AndroidManifest.xml b/extensions/ffmpeg/src/main/AndroidManifest.xml index 9b5c5b4126..23f59dbaea 100644 --- a/extensions/ffmpeg/src/main/AndroidManifest.xml +++ b/extensions/ffmpeg/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/flac/src/main/AndroidManifest.xml b/extensions/flac/src/main/AndroidManifest.xml index 1d68b376ac..4c236bfbb3 100644 --- a/extensions/flac/src/main/AndroidManifest.xml +++ b/extensions/flac/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/ima/src/main/AndroidManifest.xml b/extensions/ima/src/main/AndroidManifest.xml index 226b15cb34..75d4940ba9 100644 --- a/extensions/ima/src/main/AndroidManifest.xml +++ b/extensions/ima/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ --> + diff --git a/extensions/leanback/src/main/AndroidManifest.xml b/extensions/leanback/src/main/AndroidManifest.xml index 20cc9bf285..e385551143 100644 --- a/extensions/leanback/src/main/AndroidManifest.xml +++ b/extensions/leanback/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/media2/src/main/AndroidManifest.xml b/extensions/media2/src/main/AndroidManifest.xml index 3b87ee9dfa..f4bf400dc6 100644 --- a/extensions/media2/src/main/AndroidManifest.xml +++ b/extensions/media2/src/main/AndroidManifest.xml @@ -13,4 +13,6 @@ See the License for the specific language governing permissions and limitations under the License. --> - + + + diff --git a/extensions/mediasession/src/main/AndroidManifest.xml b/extensions/mediasession/src/main/AndroidManifest.xml index 8ed6ef2011..c46d92cf68 100644 --- a/extensions/mediasession/src/main/AndroidManifest.xml +++ b/extensions/mediasession/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/okhttp/src/main/AndroidManifest.xml b/extensions/okhttp/src/main/AndroidManifest.xml index eeb181014a..e5c72477ec 100644 --- a/extensions/okhttp/src/main/AndroidManifest.xml +++ b/extensions/okhttp/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/opus/src/main/AndroidManifest.xml b/extensions/opus/src/main/AndroidManifest.xml index 220b74d494..d2d4852b61 100644 --- a/extensions/opus/src/main/AndroidManifest.xml +++ b/extensions/opus/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/rtmp/src/main/AndroidManifest.xml b/extensions/rtmp/src/main/AndroidManifest.xml index 7c5e92c198..b6e4383586 100644 --- a/extensions/rtmp/src/main/AndroidManifest.xml +++ b/extensions/rtmp/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/extensions/vp9/src/main/AndroidManifest.xml b/extensions/vp9/src/main/AndroidManifest.xml index fc49a2a8a2..e1ee12bd06 100644 --- a/extensions/vp9/src/main/AndroidManifest.xml +++ b/extensions/vp9/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ + diff --git a/extensions/workmanager/src/main/AndroidManifest.xml b/extensions/workmanager/src/main/AndroidManifest.xml index 1daf50bd00..de761a93a5 100644 --- a/extensions/workmanager/src/main/AndroidManifest.xml +++ b/extensions/workmanager/src/main/AndroidManifest.xml @@ -15,4 +15,6 @@ ~ limitations under the License. --> - + + + diff --git a/library/common/src/main/AndroidManifest.xml b/library/common/src/main/AndroidManifest.xml index 83cb0cbde6..27a8cf0d80 100644 --- a/library/common/src/main/AndroidManifest.xml +++ b/library/common/src/main/AndroidManifest.xml @@ -17,4 +17,5 @@ + diff --git a/library/core/src/main/AndroidManifest.xml b/library/core/src/main/AndroidManifest.xml index 1a6971fdcc..0d82a187da 100644 --- a/library/core/src/main/AndroidManifest.xml +++ b/library/core/src/main/AndroidManifest.xml @@ -17,4 +17,5 @@ + diff --git a/library/dash/src/main/AndroidManifest.xml b/library/dash/src/main/AndroidManifest.xml index 6c2d93510a..6212f18a32 100644 --- a/library/dash/src/main/AndroidManifest.xml +++ b/library/dash/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/extractor/src/main/AndroidManifest.xml b/library/extractor/src/main/AndroidManifest.xml index 8748afd2cf..84e55a1d83 100644 --- a/library/extractor/src/main/AndroidManifest.xml +++ b/library/extractor/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/hls/src/main/AndroidManifest.xml b/library/hls/src/main/AndroidManifest.xml index 1ed28f4c7a..e0f39f167e 100644 --- a/library/hls/src/main/AndroidManifest.xml +++ b/library/hls/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/rtsp/src/main/AndroidManifest.xml b/library/rtsp/src/main/AndroidManifest.xml index 4becfcc68e..c5236ac1ac 100644 --- a/library/rtsp/src/main/AndroidManifest.xml +++ b/library/rtsp/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/smoothstreaming/src/main/AndroidManifest.xml b/library/smoothstreaming/src/main/AndroidManifest.xml index 49b47f0916..5ed691b4e6 100644 --- a/library/smoothstreaming/src/main/AndroidManifest.xml +++ b/library/smoothstreaming/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/transformer/src/main/AndroidManifest.xml b/library/transformer/src/main/AndroidManifest.xml index 3c3792d7a2..1c44948533 100644 --- a/library/transformer/src/main/AndroidManifest.xml +++ b/library/transformer/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/library/ui/src/main/AndroidManifest.xml b/library/ui/src/main/AndroidManifest.xml index 72189e22a7..4a5920c200 100644 --- a/library/ui/src/main/AndroidManifest.xml +++ b/library/ui/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/robolectricutils/src/main/AndroidManifest.xml b/robolectricutils/src/main/AndroidManifest.xml index 0548a1b32b..efb0de32a9 100644 --- a/robolectricutils/src/main/AndroidManifest.xml +++ b/robolectricutils/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + diff --git a/testutils/src/main/AndroidManifest.xml b/testutils/src/main/AndroidManifest.xml index ef1411d737..2e9f5431bf 100644 --- a/testutils/src/main/AndroidManifest.xml +++ b/testutils/src/main/AndroidManifest.xml @@ -14,4 +14,6 @@ limitations under the License. --> - + + + From ea45f9ffb85cfd7b5acc2e7aa354dd5c9595f4c5 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 09:29:10 +0100 Subject: [PATCH 210/441] Remove @RequiresApi(16) from SynchronousMediaCodecAdapter This isn't needed since the whole library's min API is already 16 PiperOrigin-RevId: 397939444 --- .../exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index 1af545c6d0..5995e122c0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java @@ -43,7 +43,6 @@ public class SynchronousMediaCodecAdapter implements MediaCodecAdapter { public static class Factory implements MediaCodecAdapter.Factory { @Override - @RequiresApi(16) public MediaCodecAdapter createAdapter(Configuration configuration) throws IOException { @Nullable MediaCodec codec = null; @Nullable Surface inputSurface = null; From ab484a4b1168a028ab83fed77afb1e04a6bee64b Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 12:10:22 +0100 Subject: [PATCH 211/441] Simplify MediaItem.Builder interactions in DefaultMediaSourceFactory This takes advantage of the new MediaItem.LiveConfiguration.Builder This change will always allocate a new LiveConfiguration.Builder and LiveConfiguration, but preserves the behaviour of keeping the same MediaItem instance if no values have changed. PiperOrigin-RevId: 397961427 --- .../source/DefaultMediaSourceFactory.java | 57 +++++++------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 2ade14753f..72039bce80 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -350,42 +350,29 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { Assertions.checkNotNull( mediaSourceFactory, "No suitable media source factory found for content type: " + type); - // Make sure to retain the very same media item instance, if no value needs to be overridden. - if ((mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET - && liveTargetOffsetMs != C.TIME_UNSET) - || (mediaItem.liveConfiguration.minPlaybackSpeed == C.RATE_UNSET - && liveMinSpeed != C.RATE_UNSET) - || (mediaItem.liveConfiguration.maxPlaybackSpeed == C.RATE_UNSET - && liveMaxSpeed != C.RATE_UNSET) - || (mediaItem.liveConfiguration.minOffsetMs == C.TIME_UNSET - && liveMinOffsetMs != C.TIME_UNSET) - || (mediaItem.liveConfiguration.maxOffsetMs == C.TIME_UNSET - && liveMaxOffsetMs != C.TIME_UNSET)) { - mediaItem = - mediaItem - .buildUpon() - .setLiveTargetOffsetMs( - mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET - ? liveTargetOffsetMs - : mediaItem.liveConfiguration.targetOffsetMs) - .setLiveMinPlaybackSpeed( - mediaItem.liveConfiguration.minPlaybackSpeed == C.RATE_UNSET - ? liveMinSpeed - : mediaItem.liveConfiguration.minPlaybackSpeed) - .setLiveMaxPlaybackSpeed( - mediaItem.liveConfiguration.maxPlaybackSpeed == C.RATE_UNSET - ? liveMaxSpeed - : mediaItem.liveConfiguration.maxPlaybackSpeed) - .setLiveMinOffsetMs( - mediaItem.liveConfiguration.minOffsetMs == C.TIME_UNSET - ? liveMinOffsetMs - : mediaItem.liveConfiguration.minOffsetMs) - .setLiveMaxOffsetMs( - mediaItem.liveConfiguration.maxOffsetMs == C.TIME_UNSET - ? liveMaxOffsetMs - : mediaItem.liveConfiguration.maxOffsetMs) - .build(); + MediaItem.LiveConfiguration.Builder liveConfigurationBuilder = + mediaItem.liveConfiguration.buildUpon(); + if (mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET) { + liveConfigurationBuilder.setTargetOffsetMs(liveTargetOffsetMs); } + if (mediaItem.liveConfiguration.minPlaybackSpeed == C.RATE_UNSET) { + liveConfigurationBuilder.setMinPlaybackSpeed(liveMinSpeed); + } + if (mediaItem.liveConfiguration.maxPlaybackSpeed == C.RATE_UNSET) { + liveConfigurationBuilder.setMaxPlaybackSpeed(liveMaxSpeed); + } + if (mediaItem.liveConfiguration.minOffsetMs == C.TIME_UNSET) { + liveConfigurationBuilder.setMinOffsetMs(liveMinOffsetMs); + } + if (mediaItem.liveConfiguration.maxOffsetMs == C.TIME_UNSET) { + liveConfigurationBuilder.setMaxOffsetMs(liveMaxOffsetMs); + } + MediaItem.LiveConfiguration liveConfiguration = liveConfigurationBuilder.build(); + // Make sure to retain the very same media item instance, if no value needs to be overridden. + if (!liveConfiguration.equals(mediaItem.liveConfiguration)) { + mediaItem = mediaItem.buildUpon().setLiveConfiguration(liveConfiguration).build(); + } + MediaSource mediaSource = mediaSourceFactory.createMediaSource(mediaItem); List subtitles = castNonNull(mediaItem.playbackProperties).subtitles; From e804df8c1f577bc45d6bd3fd328da9f097895879 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 12:11:07 +0100 Subject: [PATCH 212/441] Rename MediaItem.DrmConfiguration.uuid to scheme The type is already UUID so there's no need to duplicate that info in the field name, and 'scheme' is a widely used term throughout both ExoPlayer and android.os.MediaDrm documentation. The old field remains deprecated for backwards compatibility. The MediaItem.DrmConfiguration.Builder#setUuid method is renamed directly (without deprecation) because it's not yet part of a released ExoPlayer version. PiperOrigin-RevId: 397961553 --- .../android/exoplayer2/demo/IntentUtil.java | 2 +- .../exoplayer2/demo/PlayerActivity.java | 2 +- .../ext/cast/DefaultMediaItemConverter.java | 6 ++-- .../google/android/exoplayer2/MediaItem.java | 36 ++++++++++--------- .../android/exoplayer2/MediaItemTest.java | 3 ++ .../drm/DefaultDrmSessionManagerProvider.java | 2 +- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index c679c871ae..ec0495202f 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -203,7 +203,7 @@ public class IntentUtil { private static void addDrmConfigurationToIntent( MediaItem.DrmConfiguration drmConfiguration, Intent intent, String extrasKeySuffix) { - intent.putExtra(DRM_SCHEME_EXTRA + extrasKeySuffix, drmConfiguration.uuid.toString()); + intent.putExtra(DRM_SCHEME_EXTRA + extrasKeySuffix, drmConfiguration.scheme.toString()); intent.putExtra( DRM_LICENSE_URI_EXTRA + extrasKeySuffix, drmConfiguration.licenseUri != null ? drmConfiguration.licenseUri.toString() : null); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index f8310066cd..43e134b565 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -329,7 +329,7 @@ public class PlayerActivity extends AppCompatActivity showToast(R.string.error_drm_unsupported_before_api_18); finish(); return Collections.emptyList(); - } else if (!FrameworkMediaDrm.isCryptoSchemeSupported(drmConfiguration.uuid)) { + } else if (!FrameworkMediaDrm.isCryptoSchemeSupported(drmConfiguration.scheme)) { showToast(R.string.error_drm_unsupported_scheme); finish(); return Collections.emptyList(); diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index e03c9a4a7c..d3ef14cf73 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -144,7 +144,7 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { private static JSONObject getDrmConfigurationJson(MediaItem.DrmConfiguration drmConfiguration) throws JSONException { JSONObject json = new JSONObject(); - json.put(KEY_UUID, drmConfiguration.uuid); + json.put(KEY_UUID, drmConfiguration.scheme); json.put(KEY_LICENSE_URI, drmConfiguration.licenseUri); json.put(KEY_REQUEST_HEADERS, new JSONObject(drmConfiguration.requestHeaders)); return json; @@ -159,9 +159,9 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { MediaItem.DrmConfiguration drmConfiguration = mediaItem.playbackProperties.drmConfiguration; String drmScheme; - if (C.WIDEVINE_UUID.equals(drmConfiguration.uuid)) { + if (C.WIDEVINE_UUID.equals(drmConfiguration.scheme)) { drmScheme = "widevine"; - } else if (C.PLAYREADY_UUID.equals(drmConfiguration.uuid)) { + } else if (C.PLAYREADY_UUID.equals(drmConfiguration.scheme)) { drmScheme = "playready"; } else { return null; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 46fa2afa07..ad6167042f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -261,7 +261,7 @@ public final class MediaItem implements Bundleable { */ @Deprecated public Builder setDrmUuid(@Nullable UUID uuid) { - drmConfiguration.setNullableUuid(uuid); + drmConfiguration.setNullableScheme(uuid); return this; } @@ -486,7 +486,7 @@ public final class MediaItem implements Bundleable { /** Returns a new {@link MediaItem} instance with the current builder values. */ public MediaItem build() { // TODO: remove this check once all the deprecated individual DRM setters are removed. - checkState(drmConfiguration.licenseUri == null || drmConfiguration.uuid != null); + checkState(drmConfiguration.licenseUri == null || drmConfiguration.scheme != null); @Nullable PlaybackProperties playbackProperties = null; @Nullable Uri uri = this.uri; if (uri != null) { @@ -494,7 +494,7 @@ public final class MediaItem implements Bundleable { new PlaybackProperties( uri, mimeType, - drmConfiguration.uuid != null ? drmConfiguration.build() : null, + drmConfiguration.scheme != null ? drmConfiguration.build() : null, adsConfiguration, streamKeys, customCacheKey, @@ -522,7 +522,7 @@ public final class MediaItem implements Bundleable { public static final class Builder { // TODO remove @Nullable annotation when the deprecated zero-arg constructor is removed. - @Nullable private UUID uuid; + @Nullable private UUID scheme; @Nullable private Uri licenseUri; private ImmutableMap licenseRequestHeaders; private boolean multiSession; @@ -534,10 +534,10 @@ public final class MediaItem implements Bundleable { /** * Constructs an instance. * - * @param uuid The {@link UUID} of the protection scheme. + * @param scheme The {@link UUID} of the protection scheme. */ - public Builder(UUID uuid) { - this.uuid = uuid; + public Builder(UUID scheme) { + this.scheme = scheme; this.licenseRequestHeaders = ImmutableMap.of(); this.sessionForClearTypes = ImmutableList.of(); } @@ -553,7 +553,7 @@ public final class MediaItem implements Bundleable { } private Builder(DrmConfiguration drmConfiguration) { - this.uuid = drmConfiguration.uuid; + this.scheme = drmConfiguration.scheme; this.licenseUri = drmConfiguration.licenseUri; this.licenseRequestHeaders = drmConfiguration.requestHeaders; this.multiSession = drmConfiguration.multiSession; @@ -564,8 +564,8 @@ public final class MediaItem implements Bundleable { } /** Sets the {@link UUID} of the protection scheme. */ - public Builder setUuid(UUID uuid) { - this.uuid = uuid; + public Builder setScheme(UUID scheme) { + this.scheme = scheme; return this; } @@ -574,8 +574,8 @@ public final class MediaItem implements Bundleable { * MediaItem.Builder#setDrmUuid(UUID)}. */ @Deprecated - private Builder setNullableUuid(@Nullable UUID uuid) { - this.uuid = uuid; + private Builder setNullableScheme(@Nullable UUID scheme) { + this.scheme = scheme; return this; } @@ -679,7 +679,10 @@ public final class MediaItem implements Bundleable { } /** The UUID of the protection scheme. */ - public final UUID uuid; + public final UUID scheme; + + /** @deprecated Use {@link #scheme} instead. */ + @Deprecated public final UUID uuid; /** * Optional default DRM license server {@link Uri}. If {@code null} then the DRM license server @@ -712,7 +715,8 @@ public final class MediaItem implements Bundleable { private DrmConfiguration(Builder builder) { checkState(!(builder.forceDefaultLicenseUri && builder.licenseUri == null)); - this.uuid = checkNotNull(builder.uuid); + this.scheme = checkNotNull(builder.scheme); + this.uuid = scheme; this.licenseUri = builder.licenseUri; this.requestHeaders = builder.licenseRequestHeaders; this.multiSession = builder.multiSession; @@ -746,7 +750,7 @@ public final class MediaItem implements Bundleable { } DrmConfiguration other = (DrmConfiguration) obj; - return uuid.equals(other.uuid) + return scheme.equals(other.scheme) && Util.areEqual(licenseUri, other.licenseUri) && Util.areEqual(requestHeaders, other.requestHeaders) && multiSession == other.multiSession @@ -758,7 +762,7 @@ public final class MediaItem implements Bundleable { @Override public int hashCode() { - int result = uuid.hashCode(); + int result = scheme.hashCode(); result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0); result = 31 * result + requestHeaders.hashCode(); result = 31 * result + (multiSession ? 1 : 0); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 207a4ad28f..dc232c4bcf 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -106,6 +106,7 @@ public class MediaItemTest { .build(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) @@ -140,6 +141,7 @@ public class MediaItemTest { .build(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.CLEARKEY_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isNull(); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders).isEmpty(); @@ -172,6 +174,7 @@ public class MediaItemTest { .build(); assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); + assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java index a11af2f8a0..e9cd7aa1de 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java @@ -107,7 +107,7 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager DefaultDrmSessionManager drmSessionManager = new DefaultDrmSessionManager.Builder() .setUuidAndExoMediaDrmProvider( - drmConfiguration.uuid, FrameworkMediaDrm.DEFAULT_PROVIDER) + drmConfiguration.scheme, FrameworkMediaDrm.DEFAULT_PROVIDER) .setMultiSession(drmConfiguration.multiSession) .setPlayClearSamplesWithoutKeys(drmConfiguration.playClearContentWithoutKey) .setUseDrmSessionsForClearContent(Ints.toArray(drmConfiguration.sessionForClearTypes)) From a0b235c53793bbee138920559d8538ce552df201 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 21 Sep 2021 14:01:19 +0100 Subject: [PATCH 213/441] Update javadoc for 2.15.1 #minor-release PiperOrigin-RevId: 397976212 --- docs/doc/reference/allclasses-index.html | 4 +- .../android/exoplayer2/ForwardingPlayer.html | 151 +++++---- .../com/google/android/exoplayer2/Player.html | 12 +- .../google/android/exoplayer2/Timeline.html | 7 +- .../android/exoplayer2/audio/AudioSink.html | 4 +- .../exoplayer2/audio/DefaultAudioSink.html | 4 +- .../exoplayer2/audio/ForwardingAudioSink.html | 4 +- .../audio/MediaCodecAudioRenderer.html | 4 +- .../exoplayer2/ext/cast/CastPlayer.html | 96 ++++-- .../mediacodec/MediaCodecRenderer.html | 4 +- .../android/exoplayer2/offline/StreamKey.html | 63 +++- .../exoplayer2/offline/package-summary.html | 2 +- .../source/dash/BaseUrlExclusionList.html | 2 +- .../exoplayer2/source/dash/DashUtil.html | 43 ++- .../source/dash/DefaultDashChunkSource.html | 1 + .../source/dash/package-summary.html | 2 +- .../testutil/CapturingAudioSink.html | 4 +- .../testutil/DataSourceContractTest.html | 20 +- .../trackselection/DefaultTrackSelector.html | 2 +- .../ui/PlayerNotificationManager.Builder.html | 291 +++++++++++++++++- .../ui/PlayerNotificationManager.html | 99 +++++- .../video/MediaCodecVideoRenderer.html | 4 +- docs/doc/reference/constant-values.html | 32 +- docs/doc/reference/deprecated-list.html | 216 +++++++------ docs/doc/reference/index-all.html | 98 +++++- docs/doc/reference/member-search-index.js | 2 +- docs/doc/reference/member-search-index.zip | Bin 136087 -> 136486 bytes docs/doc/reference/package-search-index.zip | Bin 706 -> 706 bytes docs/doc/reference/type-search-index.zip | Bin 10091 -> 10091 bytes 29 files changed, 895 insertions(+), 276 deletions(-) diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html index 661b198996..0b597a9f2a 100644 --- a/docs/doc/reference/allclasses-index.html +++ b/docs/doc/reference/allclasses-index.html @@ -879,7 +879,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); BaseUrlExclusionList -

    Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
    +
    Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
    @@ -6270,7 +6270,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); StreamKey -
    A key for a subset of media which can be separately loaded (a "stream").
    +
    A key for a subset of media that can be separately loaded (a "stream").
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html index ec8d4c572d..2d40c14602 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":42,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":42,"i57":10,"i58":42,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":42,"i72":10,"i73":10,"i74":10,"i75":42,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10}; +var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":42,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":42,"i58":10,"i59":42,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":42,"i73":10,"i74":10,"i75":10,"i76":42,"i77":10,"i78":42,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10,"i112":42}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -219,7 +219,7 @@ implements void addListener​(Player.EventListener listener) -
    Registers a listener to receive events from the player.
    +
    Deprecated.
    @@ -628,13 +628,20 @@ implements +Player +getWrappedPlayer() + +
    Returns the Player to which operations are forwarded.
    + + + boolean hasNext()
    Deprecated.
    - + boolean hasNextWindow() @@ -642,14 +649,14 @@ implements + boolean hasPrevious()
    Deprecated.
    - + boolean hasPreviousWindow() @@ -657,21 +664,21 @@ implements + void increaseDeviceVolume()
    Increases the volume of the device.
    - + boolean isCommandAvailable​(int command)
    Returns whether the provided Player.Command is available.
    - + boolean isCurrentWindowDynamic() @@ -679,14 +686,14 @@ implements + boolean isCurrentWindowLive()
    Returns whether the current window is live, or false if the Timeline is empty.
    - + boolean isCurrentWindowSeekable() @@ -694,35 +701,35 @@ implements + boolean isDeviceMuted()
    Gets whether the device is muted or not.
    - + boolean isLoading()
    Whether the player is currently loading the source.
    - + boolean isPlaying()
    Returns whether the player is playing, i.e.
    - + boolean isPlayingAd()
    Returns whether the player is currently playing an ad.
    - + void moveMediaItem​(int currentIndex, int newIndex) @@ -730,7 +737,7 @@ implements Moves the media item at the current index to the new index. - + void moveMediaItems​(int fromIndex, int toIndex, @@ -739,70 +746,70 @@ implements Moves the media item range to the new index. - + void next()
    Deprecated.
    - + void pause()
    Pauses playback.
    - + void play()
    Resumes playback as soon as Player.getPlaybackState() == Player.STATE_READY.
    - + void prepare()
    Prepares the player.
    - + void previous()
    Deprecated.
    - + void release()
    Releases the player.
    - + void removeListener​(Player.EventListener listener) -
    Unregister a listener registered through Player.addListener(EventListener).
    +
    Deprecated.
    - + void removeListener​(Player.Listener listener)
    Unregister a listener registered through Player.addListener(Listener).
    - + void removeMediaItem​(int index)
    Removes the media item at the given index of the playlist.
    - + void removeMediaItems​(int fromIndex, int toIndex) @@ -810,21 +817,21 @@ implements Removes a range of media items from the playlist. - + void seekBack()
    Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
    - + void seekForward()
    Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
    - + void seekTo​(int windowIndex, long positionMs) @@ -832,35 +839,35 @@ implements Seeks to a position specified in milliseconds in the specified window. - + void seekTo​(long positionMs)
    Seeks to a position specified in milliseconds in the current window.
    - + void seekToDefaultPosition()
    Seeks to the default position associated with the current window.
    - + void seekToDefaultPosition​(int windowIndex)
    Seeks to the default position associated with the specified window.
    - + void seekToNext()
    Seeks to a later position in the current or next window (if available).
    - + void seekToNextWindow() @@ -868,14 +875,14 @@ implements + void seekToPrevious()
    Seeks to an earlier position in the current or previous window (if available).
    - + void seekToPreviousWindow() @@ -883,21 +890,21 @@ implements + void setDeviceMuted​(boolean muted)
    Sets the mute state of the device.
    - + void setDeviceVolume​(int volume)
    Sets the volume of the device.
    - + void setMediaItem​(MediaItem mediaItem) @@ -905,7 +912,7 @@ implements + void setMediaItem​(MediaItem mediaItem, boolean resetPosition) @@ -913,7 +920,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItem​(MediaItem mediaItem, long startPositionMs) @@ -921,7 +928,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItems​(List<MediaItem> mediaItems) @@ -929,7 +936,7 @@ implements + void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) @@ -937,7 +944,7 @@ implements Clears the playlist and adds the specified MediaItems. - + void setMediaItems​(List<MediaItem> mediaItems, int startWindowIndex, @@ -946,56 +953,56 @@ implements Clears the playlist and adds the specified MediaItems. - + void setPlaybackParameters​(PlaybackParameters playbackParameters)
    Attempts to set the playback parameters.
    - + void setPlaybackSpeed​(float speed)
    Changes the rate at which playback occurs.
    - + void setPlaylistMetadata​(MediaMetadata mediaMetadata)
    Sets the playlist MediaMetadata.
    - + void setPlayWhenReady​(boolean playWhenReady)
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    - + void setRepeatMode​(int repeatMode)
    Sets the Player.RepeatMode to be used for playback.
    - + void setShuffleModeEnabled​(boolean shuffleModeEnabled)
    Sets whether shuffling of windows is enabled.
    - + void setVideoSurface​(Surface surface)
    Sets the Surface onto which video will be rendered.
    - + void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) @@ -1003,38 +1010,40 @@ implements + void setVideoSurfaceView​(SurfaceView surfaceView)
    Sets the SurfaceView onto which video will be rendered.
    - + void setVideoTextureView​(TextureView textureView)
    Sets the TextureView onto which video will be rendered.
    - + void setVolume​(float audioVolume)
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    - + void stop()
    Stops playback without resetting the player.
    - + void stop​(boolean reset) -  + +
    Deprecated.
    +
      @@ -1102,7 +1111,9 @@ implements
    • addListener

      -
      public void addListener​(Player.EventListener listener)
      +
      @Deprecated
      +public void addListener​(Player.EventListener listener)
      +
      Deprecated.
      Description copied from interface: Player
      Registers a listener to receive events from the player. @@ -1144,7 +1155,9 @@ implements
    • removeListener

      -
      public void removeListener​(Player.EventListener listener)
      +
      @Deprecated
      +public void removeListener​(Player.EventListener listener)
      +
      Deprecated.
      Description copied from interface: Player
      Unregister a listener registered through Player.addListener(EventListener). The listener will no longer receive events from the player.
      @@ -2232,7 +2245,9 @@ public void next() @@ -181,6 +181,24 @@ extends +Fields  + +Modifier and Type +Field +Description + + +static float +MAX_SPEED_SUPPORTED +  + + +static float +MIN_SPEED_SUPPORTED +  + +
      • @@ -796,6 +814,42 @@ extends
        • + +
          + +
          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 5fc130e4f1..1d886e6561 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html @@ -1717,7 +1717,9 @@ protected void onProcessedOutputBuffer​(long presentationTi
          bufferPresentationTimeUs - The presentation time of the output buffer in microseconds.
          isDecodeOnlyBuffer - Whether the buffer was marked with C.BUFFER_FLAG_DECODE_ONLY by the source.
          -
          isLastBuffer - Whether the buffer is the last sample of the current stream.
          +
          isLastBuffer - Whether the buffer is known to contain the last sample of the current + stream. This flag is set on a best effort basis, and any logic relying on it should degrade + gracefully to handle cases where it's not set.
          format - The Format associated with the buffer.
          Returns:
          Whether the output buffer was fully processed (for example, rendered or skipped).
          diff --git a/docs/doc/reference/com/google/android/exoplayer2/offline/StreamKey.html b/docs/doc/reference/com/google/android/exoplayer2/offline/StreamKey.html index 0111e5a3bd..e9679a59a8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/offline/StreamKey.html +++ b/docs/doc/reference/com/google/android/exoplayer2/offline/StreamKey.html @@ -136,11 +136,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
          public final class StreamKey
           extends Object
           implements Comparable<StreamKey>, Parcelable
          -
          A key for a subset of media which can be separately loaded (a "stream"). +
          A key for a subset of media that can be separately loaded (a "stream"). -

          The stream key consists of a period index, a group index within the period and a track index +

          The stream key consists of a period index, a group index within the period and a stream index within the group. The interpretation of these indices depends on the type of media for which the - stream key is used.

          + stream key is used. Note that they are not the same as track group and track indices, + because multiple tracks can be multiplexed into a single stream. + +

          Application code should not generally attempt to build StreamKey instances directly. Instead, + DownloadHelper.getDownloadRequest can be used to generate download requests with the + correct StreamKeys for the track selections that have been configured on the helper. + MediaPeriod.getStreamKeys provides a lower level way of generating StreamKeys corresponding to a + particular track selection.

        @@ -199,9 +206,18 @@ implements int +streamIndex + +
        The stream index.
        + + + +int trackIndex -
        The track index.
        +
        Deprecated. + +
        @@ -230,14 +246,18 @@ implements StreamKey​(int groupIndex, - int trackIndex) -  + int streamIndex)
        + +
        Creates an instance with periodIndex set to 0.
        + StreamKey​(int periodIndex, int groupIndex, - int trackIndex) -  + int streamIndex)
        + +
        Creates an instance.
        +
      • @@ -332,14 +352,27 @@ implements The group index.
      + + + +
        +
      • +

        streamIndex

        +
        public final int streamIndex
        +
        The stream index.
        +
      • +
      • trackIndex

        -
        public final int trackIndex
        -
        The track index.
        +
        @Deprecated
        +public final int trackIndex
        +
        Deprecated. + +
      @@ -368,11 +401,12 @@ implements

      StreamKey

      public StreamKey​(int groupIndex,
      -                 int trackIndex)
      + int streamIndex) +
      Parameters:
      groupIndex - The group index.
      -
      trackIndex - The track index.
      +
      streamIndex - The stream index.
    @@ -384,12 +418,13 @@ implements Creates an instance.
    Parameters:
    periodIndex - The period index.
    groupIndex - The group index.
    -
    trackIndex - The track index.
    +
    streamIndex - The stream index.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/offline/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/offline/package-summary.html index d7a075abe0..ce9db43d20 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/offline/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/offline/package-summary.html @@ -263,7 +263,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); StreamKey -
    A key for a subset of media which can be separately loaded (a "stream").
    +
    A key for a subset of media that can be separately loaded (a "stream").
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html index 91eaaad68d..124bad9534 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/BaseUrlExclusionList.html @@ -131,7 +131,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public final class BaseUrlExclusionList
     extends Object
    -
    Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
    +
    Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html index 6ffa975c31..66e631b456 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -163,9 +163,9 @@ extends static DataSpec -buildDataSpec​(String baseUrl, +buildDataSpec​(Representation representation, + String baseUrl, RangedUri requestUri, - String cacheKey, int flags)
    Builds a DataSpec for a given RangedUri belonging to Representation.
    @@ -236,6 +236,14 @@ extends Loads initialization data for the representation and returns the sample Format. + +static String +resolveCacheKey​(Representation representation, + RangedUri rangedUri) + +
    Resolves the cache key to be used when requesting the given ranged URI for the given Representation.
    + +

    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 M0000t0RjL30I(6GbN~PV diff --git a/docs/doc/reference/overview-tree.html b/docs/doc/reference/overview-tree.html index 2040e675f5..5104fc92a2 100644 --- a/docs/doc/reference/overview-tree.html +++ b/docs/doc/reference/overview-tree.html @@ -313,6 +313,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    -
    isLastBuffer - Whether the buffer is the last sample of the current stream.
    +
    isLastBuffer - Whether the buffer is known to contain the last sample of the current + stream. This flag is set on a best effort basis, and any logic relying on it should degrade + gracefully to handle cases where it's not set.
    format - The Format associated with the buffer.
    Returns:
    Whether the output buffer was fully processed (for example, rendered or skipped).
    diff --git a/docs/doc/reference/constant-values.html b/docs/doc/reference/constant-values.html index 968bfa5ccb..9b0e8293ec 100644 --- a/docs/doc/reference/constant-values.html +++ b/docs/doc/reference/constant-values.html @@ -1850,21 +1850,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); public static final String VERSION -"2.14.2" +"2.15.1" public static final int VERSION_INT -2014002 +2015001 public static final String VERSION_SLASHY -"ExoPlayerLib/2.14.2" +"ExoPlayerLib/2.15.1" @@ -5001,6 +5001,32 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • + + + + + + + + + + + + + + + + + + +
      com.google.android.exoplayer2.ext.cast.CastPlayer 
      Modifier and TypeConstant FieldValue
      + +public static final floatMAX_SPEED_SUPPORTED2.0f
      + +public static final floatMIN_SPEED_SUPPORTED0.5f
      +
    • +
    • + diff --git a/docs/doc/reference/deprecated-list.html b/docs/doc/reference/deprecated-list.html index 67ef370dbb..79f9854e95 100644 --- a/docs/doc/reference/deprecated-list.html +++ b/docs/doc/reference/deprecated-list.html @@ -400,96 +400,102 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -219,7 +219,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -238,13 +238,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -262,19 +262,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -299,7 +299,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -317,7 +317,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -353,27 +353,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -655,61 +655,61 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + + + + - + - + - + - + - + - + - + - - - - - + @@ -1040,1041 +1040,1089 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); + + + + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + + + + + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - - - - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - - + + - + + + + + + + + + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - - + + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - - + - - - - - - + - - + - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + + + + + + + + + - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - - + + - + + + + + + + + + - + + + + + - - + + + + + + - + + + + + + + + + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + + + + - - + - - + - - - - - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - - - - - - + + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html index 460a936697..6dfc96dea1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/AbstractConcatenatedTimeline.html @@ -316,8 +316,8 @@ extends T - - + + + + - + - + - - - - - - + + + + + + - + - + + + + + + - + - + + + + + + - + + + + + + - + - + + + + + + - + - + - + - + - + + + + + + - + + + + + + + + + + + + + + + + - + - + - + - + @@ -411,107 +474,122 @@ implements Moves the media item at the current index to the new index. - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + - + + + + + + - + @@ -527,7 +605,7 @@ implements Clears the playlist and adds the specified MediaItem. - + @@ -535,7 +613,7 @@ implements Clears the playlist and adds the specified MediaItem. - + - - - - -
      com.google.android.exoplayer2.ext.cast.DefaultCastOptionsProvider 
      Modifier and Type
      com.google.android.exoplayer2.offline.StreamKey.trackIndex + +
      com.google.android.exoplayer2.Player.EVENT_STATIC_METADATA_CHANGED
      Use Player.EVENT_MEDIA_METADATA_CHANGED for structured metadata changes.
      com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_DEFAULT
      Use C.VIDEO_SCALING_MODE_DEFAULT.
      com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_SCALE_TO_FIT
      com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
      com.google.android.exoplayer2.RendererCapabilities.FORMAT_EXCEEDS_CAPABILITIES
      com.google.android.exoplayer2.RendererCapabilities.FORMAT_HANDLED
      Use C.FORMAT_HANDLED instead.
      com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_DRM
      com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_SUBTYPE
      com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_TYPE
      com.google.android.exoplayer2.source.dash.DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
      com.google.android.exoplayer2.Timeline.Window.isLive
      com.google.android.exoplayer2.Timeline.Window.tag
      com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters.DEFAULT
      This instance is not configured using Context constraints. Use DefaultTrackSelector.Parameters.getDefaults(Context) instead.
      com.google.android.exoplayer2.trackselection.TrackSelectionParameters.DEFAULT
      This instance is not configured using Context constraints. Use TrackSelectionParameters.getDefaults(Context) instead.
      com.google.android.exoplayer2.upstream.DataSourceException.POSITION_OUT_OF_RANGE
      com.google.android.exoplayer2.upstream.DataSpec.absoluteStreamPosition
      Use DataSpec.position except for specific use cases where the absolute position @@ -497,7 +503,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); position is required, use uriPositionOffset + position.
      com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS @@ -886,78 +892,90 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      com.google.android.exoplayer2.ForwardingPlayer.addListener​(Player.EventListener)
      com.google.android.exoplayer2.ForwardingPlayer.getCurrentStaticMetadata()
      com.google.android.exoplayer2.ForwardingPlayer.hasNext()
      com.google.android.exoplayer2.ForwardingPlayer.hasPrevious()
      com.google.android.exoplayer2.ForwardingPlayer.next()
      com.google.android.exoplayer2.ForwardingPlayer.previous()
      com.google.android.exoplayer2.ForwardingPlayer.removeListener​(Player.EventListener)
      com.google.android.exoplayer2.ForwardingPlayer.stop​(boolean)
      com.google.android.exoplayer2.mediacodec.MediaCodecInfo.isSeamlessAdaptationSupported​(Format, Format, boolean)
      com.google.android.exoplayer2.MediaMetadata.Builder.setArtworkData​(byte[])
      com.google.android.exoplayer2.MediaMetadata.Builder.setYear​(Integer)
      com.google.android.exoplayer2.offline.DownloadHelper.forDash​(Context, Uri, DataSource.Factory, RenderersFactory)
      com.google.android.exoplayer2.offline.DownloadHelper.forHls​(Context, Uri, DataSource.Factory, RenderersFactory)
      com.google.android.exoplayer2.offline.DownloadHelper.forProgressive​(Context, Uri)
      com.google.android.exoplayer2.offline.DownloadHelper.forSmoothStreaming​(Uri, DataSource.Factory, RenderersFactory)
      com.google.android.exoplayer2.offline.DownloadService.onDownloadChanged​(Download)
      Some state change events may not be delivered to this method. Instead, use DownloadManager.addListener(DownloadManager.Listener) to register a listener directly to the DownloadManager that you return through DownloadService.getDownloadManager().
      com.google.android.exoplayer2.offline.DownloadService.onDownloadRemoved​(Download)
      Some download removal events may not be delivered to this method. Instead, use @@ -965,37 +983,37 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); directly to the DownloadManager that you return through DownloadService.getDownloadManager().
      com.google.android.exoplayer2.Player.addListener​(Player.EventListener)
      com.google.android.exoplayer2.Player.EventListener.onLoadingChanged​(boolean)
      com.google.android.exoplayer2.Player.EventListener.onPlayerStateChanged​(boolean, int)
      com.google.android.exoplayer2.Player.EventListener.onPositionDiscontinuity​(int)
      com.google.android.exoplayer2.Player.EventListener.onSeekProcessed()
      com.google.android.exoplayer2.Player.EventListener.onStaticMetadataChanged​(List<Metadata>)
      Use Player.getMediaMetadata() and Player.EventListener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or access the @@ -1003,7 +1021,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); selections' formats.
      com.google.android.exoplayer2.Player.getCurrentStaticMetadata()
      Use Player.getMediaMetadata() and Player.Listener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or @@ -1011,37 +1029,37 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); selections' formats.
      com.google.android.exoplayer2.Player.hasNext()
      com.google.android.exoplayer2.Player.hasPrevious()
      com.google.android.exoplayer2.Player.next()
      com.google.android.exoplayer2.Player.previous()
      com.google.android.exoplayer2.Player.removeListener​(Player.EventListener)
      com.google.android.exoplayer2.Player.stop​(boolean)
      Use Player.stop() and Player.clearMediaItems() (if reset is true) or @@ -1049,149 +1067,149 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); re-preparing the player.
      com.google.android.exoplayer2.PlayerMessage.setHandler​(Handler)
      com.google.android.exoplayer2.SimpleExoPlayer.addAudioListener​(AudioListener)
      com.google.android.exoplayer2.SimpleExoPlayer.addDeviceListener​(DeviceListener)
      com.google.android.exoplayer2.SimpleExoPlayer.addListener​(Player.EventListener)
      com.google.android.exoplayer2.SimpleExoPlayer.addMetadataOutput​(MetadataOutput)
      com.google.android.exoplayer2.SimpleExoPlayer.addTextOutput​(TextOutput)
      com.google.android.exoplayer2.SimpleExoPlayer.addVideoListener​(VideoListener)
      com.google.android.exoplayer2.SimpleExoPlayer.getCurrentStaticMetadata()
      com.google.android.exoplayer2.SimpleExoPlayer.prepare​(MediaSource)
      com.google.android.exoplayer2.SimpleExoPlayer.removeAudioListener​(AudioListener)
      com.google.android.exoplayer2.SimpleExoPlayer.removeDeviceListener​(DeviceListener)
      com.google.android.exoplayer2.SimpleExoPlayer.removeListener​(Player.EventListener)
      com.google.android.exoplayer2.SimpleExoPlayer.removeMetadataOutput​(MetadataOutput)
      com.google.android.exoplayer2.SimpleExoPlayer.removeTextOutput​(TextOutput)
      com.google.android.exoplayer2.SimpleExoPlayer.removeVideoListener​(VideoListener)
      com.google.android.exoplayer2.SimpleExoPlayer.retry()
      com.google.android.exoplayer2.SimpleExoPlayer.setHandleWakeLock​(boolean)
      com.google.android.exoplayer2.SimpleExoPlayer.setThrowsWhenUsingWrongThread​(boolean)
      Disabling the enforcement can result in hard-to-detect bugs. Do not use this method except to ease the transition while wrong thread access problems are fixed.
      com.google.android.exoplayer2.SimpleExoPlayer.stop​(boolean)
      com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.createMediaSource​(Uri)
      com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setLivePresentationDelayMs​(long, boolean)
      com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setStreamKeys​(List<StreamKey>)
      com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setTag​(Object)
      com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setStreamKeys​(List<StreamKey>)
      com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.createMediaSource​(Uri)
      com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setStreamKeys​(List<StreamKey>)
      com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setTag​(Object)
      com.google.android.exoplayer2.source.MediaSourceFactory.createMediaSource​(Uri)
      com.google.android.exoplayer2.source.MediaSourceFactory.setDrmHttpDataSourceFactory​(HttpDataSource.Factory)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an @@ -1199,14 +1217,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); HttpDataSource.Factory.
      com.google.android.exoplayer2.source.MediaSourceFactory.setDrmSessionManager​(DrmSessionManager)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an implementation that always returns the same instance.
      com.google.android.exoplayer2.source.MediaSourceFactory.setDrmUserAgent​(String)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an @@ -1214,25 +1232,25 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); userAgent.
      com.google.android.exoplayer2.source.MediaSourceFactory.setStreamKeys​(List<StreamKey>)
      com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.createMediaSource​(Uri)
      com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setCustomCacheKey​(String)
      com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setExtractorsFactory​(ExtractorsFactory)
      com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setTag​(Object)
      com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmHttpDataSourceFactory​(HttpDataSource.Factory)
      RtspMediaSource does not support DRM.
      com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmSessionManager​(DrmSessionManager)
      RtspMediaSource does not support DRM.
      com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmUserAgent​(String)
      RtspMediaSource does not support DRM.
      com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory.createMediaSource​(Uri, Format, long)
      com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.createMediaSource​(Uri)
      com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setStreamKeys​(List<StreamKey>)
      com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setTag​(Object)
      com.google.android.exoplayer2.testutil.StubExoPlayer.getCurrentStaticMetadata()
      com.google.android.exoplayer2.testutil.StubExoPlayer.prepare()
      com.google.android.exoplayer2.testutil.StubExoPlayer.retry()
      com.google.android.exoplayer2.ui.PlayerControlView.setControlDispatcher​(ControlDispatcher)
      Use a ForwardingPlayer and pass it to PlayerControlView.setPlayer(Player) instead. @@ -1312,7 +1330,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      com.google.android.exoplayer2.ui.PlayerNotificationManager.setControlDispatcher​(ControlDispatcher)
      Use a ForwardingPlayer and pass it to PlayerNotificationManager.setPlayer(Player) instead. @@ -1322,7 +1340,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); and PlayerNotificationManager.setUseFastForwardAction(boolean).
      com.google.android.exoplayer2.ui.PlayerView.setControlDispatcher​(ControlDispatcher)
      Use a ForwardingPlayer and pass it to PlayerView.setPlayer(Player) instead. @@ -1330,7 +1348,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      com.google.android.exoplayer2.ui.StyledPlayerControlView.setControlDispatcher​(ControlDispatcher)
      Use a ForwardingPlayer and pass it to StyledPlayerControlView.setPlayer(Player) instead. @@ -1338,7 +1356,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      com.google.android.exoplayer2.ui.StyledPlayerView.setControlDispatcher​(ControlDispatcher)
      Use a ForwardingPlayer and pass it to StyledPlayerView.setPlayer(Player) instead. @@ -1346,44 +1364,44 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory.getDefaultRequestProperties()
      com.google.android.exoplayer2.upstream.DefaultHttpDataSource.setContentTypePredicate​(Predicate<String>)
      com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory.getDefaultRequestProperties()
      com.google.android.exoplayer2.upstream.HttpDataSource.Factory.getDefaultRequestProperties()
      com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView.getVideoDecoderOutputBufferRenderer()
      This class implements VideoDecoderOutputBufferRenderer directly.
      com.google.android.exoplayer2.video.VideoListener.onVideoSizeChanged​(int, int, int, float)
      com.google.android.exoplayer2.video.VideoRendererEventListener.onVideoInputFormatChanged​(Format) diff --git a/docs/doc/reference/index-all.html b/docs/doc/reference/index-all.html index 5b75c9c163..5d4ed97aaf 100644 --- a/docs/doc/reference/index-all.html +++ b/docs/doc/reference/index-all.html @@ -761,7 +761,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      addListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.Player
      Deprecated. @@ -2240,7 +2242,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      BaseUrlExclusionList - Class in com.google.android.exoplayer2.source.dash
      -
      Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
      +
      Holds the state of excluded base URLs to be used to select a base URL based on these exclusions.
      BaseUrlExclusionList() - Constructor for class com.google.android.exoplayer2.source.dash.BaseUrlExclusionList
      @@ -2728,7 +2730,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Builds a DataSpec for a given RangedUri belonging to Representation.
      -
      buildDataSpec(String, RangedUri, String, int) - Static method in class com.google.android.exoplayer2.source.dash.DashUtil
      +
      buildDataSpec(Representation, String, RangedUri, int) - Static method in class com.google.android.exoplayer2.source.dash.DashUtil
      Builds a DataSpec for a given RangedUri belonging to Representation.
      @@ -3715,6 +3717,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The number of audio channels, or Format.NO_VALUE if unknown or not applicable.
      +
      channelDescriptionResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      +
      channelId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      +
      channelImportance - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      +
      channelNameResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      channels - Variable in class com.google.android.exoplayer2.audio.MpegAudioUtil.Header
      Number of audio channels in the frame.
      @@ -5126,6 +5136,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      contentType - Variable in exception com.google.android.exoplayer2.upstream.HttpDataSource.InvalidContentTypeException
       
      +
      context - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      continueLoading(long) - Method in class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
       
      continueLoading(long) - Method in class com.google.android.exoplayer2.source.ClippingMediaPeriod
      @@ -6640,6 +6652,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Player implementations that want to surface custom errors can use error codes greater than this value, so as to avoid collision with other error codes defined in this class.
      +
      customActionReceiver - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      customCacheKey - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      Optional custom cache key (only used for progressive streams).
      @@ -7015,9 +7029,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      dataSpecWithPositionAndLength_readExpectedRange() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
       
      -
      dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
      +
      dataSpecWithPositionAtEnd_readsZeroBytes() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
       
      -
      dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
      +
      dataSpecWithPositionAtEndAndLength_readsZeroBytes() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
       
      dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest
       
      @@ -11777,6 +11791,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an instance.
      +
      fastForwardActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      fatalErrorCount - Variable in class com.google.android.exoplayer2.analytics.PlaybackStats
      The total number of fatal errors.
      @@ -15762,7 +15778,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long) - Method in class com.google.android.exoplayer2.Timeline
      -
      Converts (windowIndex, windowPositionUs) to the corresponding (periodUid, periodPositionUs).
      +
      Converts (windowIndex, windowPositionUs) to the corresponding (periodUid, + periodPositionUs).
      getPixelCount() - Method in class com.google.android.exoplayer2.Format
      @@ -17474,6 +17491,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the Format that can be used to decode the wrapped metadata in Metadata.Entry.getWrappedMetadataBytes(), or null if this Entry doesn't contain wrapped metadata.
      +
      getWrappedPlayer() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
      +
      Returns the Player to which operations are forwarded.
      +
      getWritableDatabase() - Method in interface com.google.android.exoplayer2.database.DatabaseProvider
      Creates and/or opens a database that will be used for reading and writing.
      @@ -17532,6 +17553,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      groupIndex - Variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
       
      +
      groupKey - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      GvrAudioProcessor - Class in com.google.android.exoplayer2.ext.gvr
      Deprecated. @@ -20868,6 +20891,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      MAX_SIZE - Static variable in class com.google.android.exoplayer2.source.rtsp.RtpPacket
       
      +
      MAX_SPEED_SUPPORTED - Static variable in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      MAX_SUPPORTED_INSTANCES_UNKNOWN - Static variable in class com.google.android.exoplayer2.mediacodec.MediaCodecInfo
      The value returned by MediaCodecInfo.getMaxSupportedInstances() if the upper bound on the maximum @@ -21259,6 +21284,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      MediaCodecVideoRenderer.CodecMaxValues - Class in com.google.android.exoplayer2.video
       
      +
      mediaDescriptionAdapter - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      MediaDrmCallback - Interface in com.google.android.exoplayer2.drm
      Performs ExoMediaDrm key and provisioning requests.
      @@ -21802,6 +21829,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      MIN_SEQUENCE_NUMBER - Static variable in class com.google.android.exoplayer2.source.rtsp.RtpPacket
       
      +
      MIN_SPEED_SUPPORTED - Static variable in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      minBlockSizeSamples - Variable in class com.google.android.exoplayer2.extractor.FlacStreamMetadata
      Minimum number of samples per block.
      @@ -22421,6 +22450,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parameters for seeking to the sync point immediately after a requested seek position.
      +
      nextActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      nextAdGroupIndex - Variable in class com.google.android.exoplayer2.source.MediaPeriodId
      The index of the next ad group to which the media period's content is clipped, or C.INDEX_UNSET if there is no following ad group or if this media period is an ad.
      @@ -22490,6 +22521,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      NOT_SET - Static variable in class com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat
       
      +
      notificationId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      +
      notificationListener - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      NotificationUtil - Class in com.google.android.exoplayer2.util
      Utility methods for displaying Notifications.
      @@ -25688,6 +25723,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Schedules a pause action.
      +
      pauseActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      pauseDownloads() - Method in class com.google.android.exoplayer2.offline.DownloadManager
      Pauses downloads.
      @@ -26003,6 +26040,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Playback has been started or paused by a call to Player.setPlayWhenReady(boolean).
      +
      playActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      PLAYBACK_STATE_ABANDONED - Static variable in class com.google.android.exoplayer2.analytics.PlaybackStats
      Playback is abandoned before reaching the end of the media.
      @@ -26313,6 +26352,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Starts, updates and cancels a media style notification reflecting the player state.
      +
      PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener, PlayerNotificationManager.CustomActionReceiver, int, int, int, int, int, int, int, int, String) - Constructor for class com.google.android.exoplayer2.ui.PlayerNotificationManager
      +
       
      PlayerNotificationManager.BitmapCallback - Class in com.google.android.exoplayer2.ui
      Receives a Bitmap.
      @@ -26785,6 +26826,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parameters for seeking to the sync point immediately before a requested seek position.
      +
      previousActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      primaryTrackType - Variable in class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
       
      priority - Variable in class com.google.android.exoplayer2.source.dash.manifest.BaseUrl
      @@ -28366,7 +28409,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.Player
      Deprecated. @@ -28889,7 +28934,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      reset() - Method in interface com.google.android.exoplayer2.audio.AudioSink
      -
      Resets the renderer, releasing any resources that it currently holds.
      +
      Resets the sink, releasing any resources that it currently holds.
      reset() - Method in class com.google.android.exoplayer2.audio.BaseAudioProcessor
       
      @@ -29068,6 +29113,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Performs relative resolution of a referenceUri with respect to a baseUri.
      +
      resolveCacheKey(Representation, RangedUri) - Static method in class com.google.android.exoplayer2.source.dash.DashUtil
      +
      +
      Resolves the cache key to be used when requesting the given ranged URI for the given Representation.
      +
      resolveDataSpec(DataSpec) - Method in interface com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver
      Resolves a DataSpec before forwarding it to the wrapped DataSource.
      @@ -29270,6 +29319,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Identifies the revision of the media contained within the representation.
      +
      rewindActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      RIFF_FOURCC - Static variable in class com.google.android.exoplayer2.audio.WavUtil
      Four character code for "RIFF".
      @@ -35058,6 +35109,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Holds information about a single segment of slow motion playback within a track.
      +
      smallIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      SmtaMetadataEntry - Class in com.google.android.exoplayer2.metadata.mp4
      Stores metadata from the Samsung smta box.
      @@ -35551,7 +35604,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      STATE_BUFFERING - Static variable in interface com.google.android.exoplayer2.Player
      -
      The player is not able to immediately play from its current position.
      +
      The player is not able to immediately play the media, but is doing work toward being able to do + so.
      STATE_COMPLETED - Static variable in class com.google.android.exoplayer2.offline.Download
      @@ -35583,7 +35637,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      STATE_IDLE - Static variable in interface com.google.android.exoplayer2.Player
      -
      The player does not have any media to play.
      +
      The player is idle, and must be prepared before it will play the media.
      STATE_OPENED - Static variable in interface com.google.android.exoplayer2.drm.DrmSession
      @@ -35700,7 +35754,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      stop(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      stop(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      stop(boolean) - Method in interface com.google.android.exoplayer2.Player
      Deprecated. @@ -35737,6 +35793,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The download isn't stopped.
      +
      stopActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
      +
       
      stopReason - Variable in class com.google.android.exoplayer2.offline.Download
      The reason the download is stopped, or Download.STOP_REASON_NONE.
      @@ -35789,14 +35847,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The contained stream elements.
      +
      streamIndex - Variable in class com.google.android.exoplayer2.offline.StreamKey
      +
      +
      The stream index.
      +
      StreamKey - Class in com.google.android.exoplayer2.offline
      -
      A key for a subset of media which can be separately loaded (a "stream").
      +
      A key for a subset of media that can be separately loaded (a "stream").
      StreamKey(int, int) - Constructor for class com.google.android.exoplayer2.offline.StreamKey
      -
       
      +
      +
      Creates an instance with StreamKey.periodIndex set to 0.
      +
      StreamKey(int, int, int) - Constructor for class com.google.android.exoplayer2.offline.StreamKey
      -
       
      +
      +
      Creates an instance.
      +
      streamKeys - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      Optional stream keys by which the manifest is filtered.
      @@ -37010,7 +37076,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      trackIndex - Variable in class com.google.android.exoplayer2.offline.StreamKey
      -
      The track index.
      +
      Deprecated. + +
      TrackNameProvider - Interface in com.google.android.exoplayer2.ui
      diff --git a/docs/doc/reference/member-search-index.js b/docs/doc/reference/member-search-index.js index 41bac2c724..0a5c9c8738 100644 --- a/docs/doc/reference/member-search-index.js +++ b/docs/doc/reference/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, int, List, List, List, List)","url":"%3Cinit%3E(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"addAdGroupToAdPlaybackState(AdPlaybackState, long, long, long)","url":"addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(FlagSet)","url":"addAll(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAllCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkDataType"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, int)","url":"assertExtensionRendererCreated(java.lang.Class,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionedSame(MediaItem...)","url":"assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionReasonsEqual(Integer...)","url":"assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTrackGroupsEqual(TrackGroupArray)","url":"assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_UHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String, String, int, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"BaseUrlExclusionList()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrls"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrls"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, int, List, List, List, List)","url":"buildAdaptationSet(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context, String, boolean)","url":"buildCronetEngine(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(String, RangedUri, String, int)","url":"buildDataSpec(java.lang.String,com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, Renderer...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(TrackSelectionParameters)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecStringFromSps(ParsableNalUnitBitArray)","url":"buildHevcCodecStringFromSps(com.google.android.exoplayer2.util.ParsableNalUnitBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"capacity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter, long, long)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter,long,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"checkContainerInput(boolean, String)","url":"checkContainerInput(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(int,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TIMELINE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_INVALID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE_STOP"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_BACK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_FORWARD"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"compilation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String, String)","url":"compileProgram(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String[], String[])","url":"compileProgram(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"composer"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"conductor"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException, int)","url":"%3Cinit%3E(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"contentIsMalformed"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"contentResumeOffsetUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithExoMediaCryptoType(Class)","url":"copyWithExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createFallbackOptions(ExoTrackSelection)","url":"createFallbackOptions(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"createForIOException(IOException, DataSpec, int)","url":"createForIOException(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedContainer(String, Throwable)","url":"createForMalformedContainer(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedDataOfUnknownType(String, Throwable)","url":"createForMalformedDataOfUnknownType(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedManifest(String, Throwable)","url":"createForMalformedManifest(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForManifestWithUnsupportedFeature(String, Throwable)","url":"createForManifestWithUnsupportedFeature(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean, int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException, int)","url":"createForSource(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException, int)","url":"createForUnexpected(java.lang.RuntimeException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForUnsupportedContainerFeature(String)","url":"createForUnsupportedContainerFeature(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.Subtitle, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.Subtitle,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(Uri, Format, long)","url":"createMediaSource(android.net.Uri,com.google.android.exoplayer2.Format,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(int,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, int, boolean, boolean, String, HttpDataSource.RequestProperties, Predicate, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,int,boolean,boolean,java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,com.google.common.base.Predicate,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CUSTOM_ERROR_CODE_BASE"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"dataType"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(SimpleExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"DecryptionException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_LOCATION_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_PRIORITY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_BACK_INCREMENT_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_FORWARD_INCREMENT_MS"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"DEFAULT_USER_AGENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_WEIGHT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"DefaultMediaDescriptionAdapter(PendingIntent)","url":"%3Cinit%3E(android.app.PendingIntent)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Config","l":"disable5GNsaDisambiguation()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"discNumber"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(int, Format, int, Object, long)","url":"downstreamFormatChanged(int,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_JOC_CODEC_STRING"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_BEHIND_LIVE_WINDOW"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_QUERY_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_CONTENT_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DEVICE_REVOKED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DISALLOWED_OPERATION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_EXPIRED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_PROVISIONING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SCHEME_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SYSTEM_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_FAILED_RUNTIME_CHECK"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_BAD_HTTP_STATUS"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_FILE_NOT_FOUND"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NO_PERMISSION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_REMOTE_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_EXO_MEDIA_DRM"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_LICENSE_ACQUISITION"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_PROVISIONING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorCode"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(FlagSet, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(FlagSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"exclude(BaseUrl, long)","url":"exclude(com.google.android.exoplayer2.source.dash.manifest.BaseUrl,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"exclusionDurationMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"exoMediaCryptoType"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_LOCATION"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_TRACK"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"FallbackOptions(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"FallbackSelection(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"FIELD_CUSTOM_ID_BASE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Exception)","url":"%3Cinit%3E(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"ForwardingPlayer(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"FrameworkMediaCrypto(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromBundleList(Bundleable.Creator, List)","url":"fromBundleList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle, T)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle,T)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getAdCountInGroup(AdPlaybackState, int)","url":"getAdCountInGroup(com.google.android.exoplayer2.source.ads.AdPlaybackState,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getAttributes(int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, int)","url":"getCodecCountOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, int)","url":"getCodecsOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getContentResumeOffsetUs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"getEncodingForAudioObjectType(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2","c":"C","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"getErrorCodeForMediaDrmException(Exception, int)","url":"getErrorCodeForMediaDrmException(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeFromPlatformDiagnosticsInfo(String)","url":"getErrorCodeFromPlatformDiagnosticsInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName(int)"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getFastForwardIncrementMs(Player)","url":"getFastForwardIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List)","url":"getForegroundNotification(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getMediaPeriodPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForAd(long, int, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForContent(long, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(int, int)","url":"getNextRepeatMode(int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getPreSkipSamples(List)","url":"getPreSkipSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCount(List)","url":"getPriorityCount(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCountAfterExclusion(List)","url":"getPriorityCountAfterExclusion(java.util.List)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getRemovedAdGroupCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getRewindIncrementMs(Player)","url":"getRewindIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekBackIncrementMs()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getSeekPreRollSamples(List)","url":"getSeekPreRollSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamDurationUs(Player, AdPlaybackState)","url":"getStreamDurationUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getStreamPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(Player, AdPlaybackState)","url":"getStreamPositionUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForAd(long, int, int, AdPlaybackState)","url":"getStreamPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForContent(long, int, AdPlaybackState)","url":"getStreamPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getUniforms(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getWindowIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"GL_ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"GvrAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(SimpleExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.SimpleExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"hasTrackOfType(TrackSelectionArray, int)","url":"hasTrackOfType(com.google.android.exoplayer2.trackselection.TrackSelectionArray,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"IntArrayQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, IOException, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.io.IOException,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, FlagSet)","url":"invoke(T,com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"isAbsolute(String)","url":"isAbsolute(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"isEligibleForFallback(IOException)","url":"isEligibleForFallback(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"isFallbackAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoColorPrimariesToColorSpace(int)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoTransferCharacteristicsToColorTransfer(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(int, int)","url":"isRepeatModeEnabled(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"isServerSideInserted"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isServerSideInsertedAdGroup(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PCM_ENCODING"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"keyForField(int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation, int)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadInitializationData(ChunkExtractor, DataSource, Representation, boolean)","url":"loadInitializationData(com.google.android.exoplayer2.source.chunk.ChunkExtractor,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Representation,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation, int)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"maybeSetArtworkData(byte[], int)","url":"maybeSetArtworkData(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(int, Format, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_NO_OFFSET"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_SHARED"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SURFACE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, List, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedLocations"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfLocations"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAvailableCommandsChanged(AnalyticsListener.EventTime, Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadChanged(Download)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadRemoved(Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, int)","url":"onMaxSeekToPreviousPositionChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, ControlDispatcher, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaylistMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(VideoDecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.video.VideoDecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekBackIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekBackIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekForwardIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekForwardIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(int, int, int, float)","url":"onVideoSizeChanged(int,int,int,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, ExoMediaCrypto, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.drm.ExoMediaCrypto,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"OutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, List, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, List)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, BaseUrl)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.BaseUrl)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, List, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.util.List,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, List, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.util.List,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable, boolean, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_A_BRIGHT_COLORED_FISH"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BACK_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ARTIST_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ORCHESTRA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_COMPOSER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_CONDUCTOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_PERFORMANCE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_RECORDING"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FRONT_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ILLUSTRATION"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAD_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAFLET_PAGE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LYRICIST"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_PUBLISHER_STUDIO_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_RECORDING_LOCATION"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int, long)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfWindow(ExoPlayer, int)","url":"playUntilStartOfWindow(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfWindow(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"priority"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingDay"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingMonth"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingYear"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(SimpleExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"release()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseDay"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseMonth"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseYear"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"RemotableTimeline(ImmutableList, ImmutableList, int[])","url":"%3Cinit%3E(com.google.common.collect.ImmutableList,com.google.common.collect.ImmutableList,int[])"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"removedAdGroupCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, List, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"reset(OutputStream)","url":"reset(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream, int)","url":"%3Cinit%3E(java.io.OutputStream,int)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream)","url":"%3Cinit%3E(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(SimpleExoPlayer)","url":"run(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(ExoPlayer)","url":"runUntilError(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(SimpleExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"sameAs(MediaMetadataCompat, MediaMetadataCompat)","url":"sameAs(android.support.v4.media.MediaMetadataCompat,android.support.v4.media.MediaMetadataCompat)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekForward()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"selectBaseUrl(List)","url":"selectBaseUrl(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"selectedBaseUrl"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], int)","url":"%3Cinit%3E(int,int[],int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"ServerSideInsertedAdsMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"serviceLocation"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"setAdPlaybackState(AdPlaybackState)","url":"setAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[], Integer)","url":"setArtworkData(byte[],java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setCompilation(CharSequence)","url":"setCompilation(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setComposer(CharSequence)","url":"setComposer(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setConductor(CharSequence)","url":"setConductor(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDiscNumber(Integer)","url":"setDiscNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setDispatchUnsupportedActionsEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setExoMediaCryptoType(Class)","url":"setExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setGenre(CharSequence)","url":"setGenre(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, int)","url":"setLine(float,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter)","url":"setMediaDescriptionAdapter(com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMetadataDeduplicationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.Parameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(int)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingDay(Integer)","url":"setRecordingDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingMonth(Integer)","url":"setRecordingMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingYear(Integer)","url":"setRecordingYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseDay(Integer)","url":"setReleaseDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseMonth(Integer)","url":"setReleaseMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseYear(Integer)","url":"setReleaseYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setRequestPriority(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, int)","url":"setTextSize(float,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalDiscCount(Integer)","url":"setTotalDiscCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(int...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setWriter(CharSequence)","url":"setWriter(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"shouldPlayAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"SimpleOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, List, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int, int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleArrayList(List)","url":"toBundleArrayList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleList(List)","url":"toBundleList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toNullableBundle(Bundleable)","url":"toNullableBundle(com.google.android.exoplayer2.Bundleable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalDiscCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,int,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"TrackSelectionParameters(TrackSelectionParameters.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedMediaCrypto","l":"UnsupportedMediaCrypto()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"updateOrientation(float, float, float, float)","url":"updateOrientation(float,float,float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, ExoMediaCrypto, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.drm.ExoMediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"weight"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(int, long...)","url":"withAdDurationsUs(int,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdGroupTimeUs(int, long)","url":"withAdGroupTimeUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentResumeOffsetUs(int, long)","url":"withContentResumeOffsetUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withContentResumeOffsetUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withIsServerSideInserted(boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withIsServerSideInserted(int, boolean)","url":"withIsServerSideInserted(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withNewAdGroup(int, long)","url":"withNewAdGroup(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withRemovedAdGroupCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withTimeUs(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"writer"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] \ No newline at end of file +memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, int, List, List, List, List)","url":"%3Cinit%3E(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"addAdGroupToAdPlaybackState(AdPlaybackState, long, long, long)","url":"addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(FlagSet)","url":"addAll(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAllCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkDataType"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, int)","url":"assertExtensionRendererCreated(java.lang.Class,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionedSame(MediaItem...)","url":"assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionReasonsEqual(Integer...)","url":"assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTrackGroupsEqual(TrackGroupArray)","url":"assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_UHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String, String, int, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"BaseUrlExclusionList()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrls"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrls"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, int, List, List, List, List)","url":"buildAdaptationSet(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context, String, boolean)","url":"buildCronetEngine(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, String, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, Renderer...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(TrackSelectionParameters)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecStringFromSps(ParsableNalUnitBitArray)","url":"buildHevcCodecStringFromSps(com.google.android.exoplayer2.util.ParsableNalUnitBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"capacity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter, long, long)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter,long,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelDescriptionResourceId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelImportance"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelNameResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"checkContainerInput(boolean, String)","url":"checkContainerInput(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(int,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TIMELINE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_INVALID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE_STOP"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_BACK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_FORWARD"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"compilation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String, String)","url":"compileProgram(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String[], String[])","url":"compileProgram(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"composer"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"conductor"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException, int)","url":"%3Cinit%3E(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"contentIsMalformed"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"contentResumeOffsetUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"context"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithExoMediaCryptoType(Class)","url":"copyWithExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createFallbackOptions(ExoTrackSelection)","url":"createFallbackOptions(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"createForIOException(IOException, DataSpec, int)","url":"createForIOException(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedContainer(String, Throwable)","url":"createForMalformedContainer(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedDataOfUnknownType(String, Throwable)","url":"createForMalformedDataOfUnknownType(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedManifest(String, Throwable)","url":"createForMalformedManifest(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForManifestWithUnsupportedFeature(String, Throwable)","url":"createForManifestWithUnsupportedFeature(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean, int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException, int)","url":"createForSource(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException, int)","url":"createForUnexpected(java.lang.RuntimeException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForUnsupportedContainerFeature(String)","url":"createForUnsupportedContainerFeature(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.Subtitle, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.Subtitle,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(Uri, Format, long)","url":"createMediaSource(android.net.Uri,com.google.android.exoplayer2.Format,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(int,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, int, boolean, boolean, String, HttpDataSource.RequestProperties, Predicate, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,int,boolean,boolean,java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,com.google.common.base.Predicate,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CUSTOM_ERROR_CODE_BASE"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"customActionReceiver"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"dataType"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(SimpleExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"DecryptionException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_LOCATION_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_PRIORITY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_BACK_INCREMENT_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_FORWARD_INCREMENT_MS"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"DEFAULT_USER_AGENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_WEIGHT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"DefaultMediaDescriptionAdapter(PendingIntent)","url":"%3Cinit%3E(android.app.PendingIntent)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Config","l":"disable5GNsaDisambiguation()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"discNumber"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(int, Format, int, Object, long)","url":"downstreamFormatChanged(int,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_JOC_CODEC_STRING"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_BEHIND_LIVE_WINDOW"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_QUERY_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_CONTENT_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DEVICE_REVOKED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DISALLOWED_OPERATION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_EXPIRED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_PROVISIONING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SCHEME_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SYSTEM_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_FAILED_RUNTIME_CHECK"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_BAD_HTTP_STATUS"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_FILE_NOT_FOUND"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NO_PERMISSION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_REMOTE_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_EXO_MEDIA_DRM"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_LICENSE_ACQUISITION"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_PROVISIONING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorCode"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(FlagSet, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(FlagSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"exclude(BaseUrl, long)","url":"exclude(com.google.android.exoplayer2.source.dash.manifest.BaseUrl,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"exclusionDurationMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"exoMediaCryptoType"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_LOCATION"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_TRACK"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"FallbackOptions(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"FallbackSelection(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"fastForwardActionIconResourceId"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"FIELD_CUSTOM_ID_BASE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Exception)","url":"%3Cinit%3E(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"ForwardingPlayer(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"FrameworkMediaCrypto(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromBundleList(Bundleable.Creator, List)","url":"fromBundleList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle, T)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle,T)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getAdCountInGroup(AdPlaybackState, int)","url":"getAdCountInGroup(com.google.android.exoplayer2.source.ads.AdPlaybackState,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getAttributes(int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, int)","url":"getCodecCountOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, int)","url":"getCodecsOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getContentResumeOffsetUs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"getEncodingForAudioObjectType(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2","c":"C","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"getErrorCodeForMediaDrmException(Exception, int)","url":"getErrorCodeForMediaDrmException(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeFromPlatformDiagnosticsInfo(String)","url":"getErrorCodeFromPlatformDiagnosticsInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName(int)"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getFastForwardIncrementMs(Player)","url":"getFastForwardIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List)","url":"getForegroundNotification(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getMediaPeriodPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForAd(long, int, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForContent(long, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(int, int)","url":"getNextRepeatMode(int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getPreSkipSamples(List)","url":"getPreSkipSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCount(List)","url":"getPriorityCount(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCountAfterExclusion(List)","url":"getPriorityCountAfterExclusion(java.util.List)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getRemovedAdGroupCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getRewindIncrementMs(Player)","url":"getRewindIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekBackIncrementMs()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getSeekPreRollSamples(List)","url":"getSeekPreRollSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamDurationUs(Player, AdPlaybackState)","url":"getStreamDurationUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getStreamPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(Player, AdPlaybackState)","url":"getStreamPositionUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForAd(long, int, int, AdPlaybackState)","url":"getStreamPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForContent(long, int, AdPlaybackState)","url":"getStreamPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getUniforms(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getWindowIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getWrappedPlayer()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"GL_ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"groupKey"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"GvrAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(SimpleExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.SimpleExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"hasTrackOfType(TrackSelectionArray, int)","url":"hasTrackOfType(com.google.android.exoplayer2.trackselection.TrackSelectionArray,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"IntArrayQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, IOException, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.io.IOException,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, FlagSet)","url":"invoke(T,com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"isAbsolute(String)","url":"isAbsolute(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"isEligibleForFallback(IOException)","url":"isEligibleForFallback(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"isFallbackAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoColorPrimariesToColorSpace(int)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoTransferCharacteristicsToColorTransfer(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(int, int)","url":"isRepeatModeEnabled(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"isServerSideInserted"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isServerSideInsertedAdGroup(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PCM_ENCODING"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"keyForField(int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation, int)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadInitializationData(ChunkExtractor, DataSource, Representation, boolean)","url":"loadInitializationData(com.google.android.exoplayer2.source.chunk.ChunkExtractor,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Representation,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation, int)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MAX_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"maybeSetArtworkData(byte[], int)","url":"maybeSetArtworkData(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"mediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(int, Format, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MIN_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_NO_OFFSET"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_SHARED"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SURFACE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, List, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"nextActionIconResourceId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationListener"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedLocations"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfLocations"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAvailableCommandsChanged(AnalyticsListener.EventTime, Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadChanged(Download)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadRemoved(Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, int)","url":"onMaxSeekToPreviousPositionChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, ControlDispatcher, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaylistMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(VideoDecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.video.VideoDecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekBackIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekBackIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekForwardIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekForwardIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(int, int, int, float)","url":"onVideoSizeChanged(int,int,int,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, ExoMediaCrypto, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.drm.ExoMediaCrypto,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"OutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, List, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, List)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, BaseUrl)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.BaseUrl)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, List, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.util.List,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, List, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.util.List,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable, boolean, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"pauseActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_A_BRIGHT_COLORED_FISH"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BACK_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ARTIST_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ORCHESTRA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_COMPOSER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_CONDUCTOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_PERFORMANCE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_RECORDING"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FRONT_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ILLUSTRATION"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAD_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAFLET_PAGE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LYRICIST"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_PUBLISHER_STUDIO_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_RECORDING_LOCATION"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"playActionIconResourceId"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int, long)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener, PlayerNotificationManager.CustomActionReceiver, int, int, int, int, int, int, int, int, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener,com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver,int,int,int,int,int,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfWindow(ExoPlayer, int)","url":"playUntilStartOfWindow(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfWindow(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"previousActionIconResourceId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"priority"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingDay"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingMonth"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingYear"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(SimpleExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"release()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseDay"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseMonth"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseYear"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"RemotableTimeline(ImmutableList, ImmutableList, int[])","url":"%3Cinit%3E(com.google.common.collect.ImmutableList,com.google.common.collect.ImmutableList,int[])"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"removedAdGroupCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, List, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"reset(OutputStream)","url":"reset(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"resolveCacheKey(Representation, RangedUri)","url":"resolveCacheKey(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream, int)","url":"%3Cinit%3E(java.io.OutputStream,int)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream)","url":"%3Cinit%3E(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"rewindActionIconResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(SimpleExoPlayer)","url":"run(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(ExoPlayer)","url":"runUntilError(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(SimpleExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"sameAs(MediaMetadataCompat, MediaMetadataCompat)","url":"sameAs(android.support.v4.media.MediaMetadataCompat,android.support.v4.media.MediaMetadataCompat)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekForward()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"selectBaseUrl(List)","url":"selectBaseUrl(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"selectedBaseUrl"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], int)","url":"%3Cinit%3E(int,int[],int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"ServerSideInsertedAdsMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"serviceLocation"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"setAdPlaybackState(AdPlaybackState)","url":"setAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[], Integer)","url":"setArtworkData(byte[],java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setCompilation(CharSequence)","url":"setCompilation(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setComposer(CharSequence)","url":"setComposer(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setConductor(CharSequence)","url":"setConductor(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDiscNumber(Integer)","url":"setDiscNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setDispatchUnsupportedActionsEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setExoMediaCryptoType(Class)","url":"setExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setGenre(CharSequence)","url":"setGenre(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, int)","url":"setLine(float,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter)","url":"setMediaDescriptionAdapter(com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMetadataDeduplicationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.Parameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(int)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingDay(Integer)","url":"setRecordingDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingMonth(Integer)","url":"setRecordingMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingYear(Integer)","url":"setRecordingYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseDay(Integer)","url":"setReleaseDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseMonth(Integer)","url":"setReleaseMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseYear(Integer)","url":"setReleaseYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setRequestPriority(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, int)","url":"setTextSize(float,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalDiscCount(Integer)","url":"setTotalDiscCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(int...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setWriter(CharSequence)","url":"setWriter(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"shouldPlayAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"SimpleOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, List, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"smallIconResourceId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"stopActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"streamIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int, int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleArrayList(List)","url":"toBundleArrayList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleList(List)","url":"toBundleList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toNullableBundle(Bundleable)","url":"toNullableBundle(com.google.android.exoplayer2.Bundleable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalDiscCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,int,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"TrackSelectionParameters(TrackSelectionParameters.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedMediaCrypto","l":"UnsupportedMediaCrypto()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"updateOrientation(float, float, float, float)","url":"updateOrientation(float,float,float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, ExoMediaCrypto, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.drm.ExoMediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"weight"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(int, long...)","url":"withAdDurationsUs(int,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdGroupTimeUs(int, long)","url":"withAdGroupTimeUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentResumeOffsetUs(int, long)","url":"withContentResumeOffsetUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withContentResumeOffsetUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withIsServerSideInserted(boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withIsServerSideInserted(int, boolean)","url":"withIsServerSideInserted(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withNewAdGroup(int, long)","url":"withNewAdGroup(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withRemovedAdGroupCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withTimeUs(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"writer"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] \ No newline at end of file diff --git a/docs/doc/reference/member-search-index.zip b/docs/doc/reference/member-search-index.zip index c5b1a94e4d69893537327b700d4c22a44ca0fb71..db9830057c4a20a66620858a500873fefcfba88c 100644 GIT binary patch delta 135473 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

      (mwuI35OX)$(kj!o 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 LA_mG70ssI2gUlE3 delta 134882 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 m0u%rg00;;O0MdvCQ-{-j0`(FC0HlYP Date: Tue, 21 Sep 2021 14:26:13 +0100 Subject: [PATCH 214/441] Simplify usage of MediaItem.Builder in DashMediaSource This change only calls setters if we need to override the existing value (or more specifically, set a value that's absent). PiperOrigin-RevId: 397979904 --- .../source/dash/DashMediaSource.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index b4ac738372..c9e10b8667 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -312,28 +312,25 @@ public final class DashMediaSource extends BaseMediaSource { */ public DashMediaSource createMediaSource(DashManifest manifest, MediaItem mediaItem) { Assertions.checkArgument(!manifest.dynamic); - List streamKeys = - mediaItem.playbackProperties != null && !mediaItem.playbackProperties.streamKeys.isEmpty() - ? mediaItem.playbackProperties.streamKeys - : this.streamKeys; - if (!streamKeys.isEmpty()) { + MediaItem.Builder mediaItemBuilder = + mediaItem.buildUpon().setMimeType(MimeTypes.APPLICATION_MPD); + if (mediaItem.playbackProperties == null) { + mediaItemBuilder.setUri(Uri.EMPTY); + } + if (mediaItem.playbackProperties == null || mediaItem.playbackProperties.tag == null) { + mediaItemBuilder.setTag(tag); + } + if (mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET) { + mediaItemBuilder.setLiveTargetOffsetMs(targetLiveOffsetOverrideMs); + } + if (mediaItem.playbackProperties == null + || mediaItem.playbackProperties.streamKeys.isEmpty()) { + mediaItemBuilder.setStreamKeys(streamKeys); + } + mediaItem = mediaItemBuilder.build(); + if (!checkNotNull(mediaItem.playbackProperties).streamKeys.isEmpty()) { manifest = manifest.copy(streamKeys); } - boolean hasUri = mediaItem.playbackProperties != null; - boolean hasTag = hasUri && mediaItem.playbackProperties.tag != null; - boolean hasTargetLiveOffset = mediaItem.liveConfiguration.targetOffsetMs != C.TIME_UNSET; - mediaItem = - mediaItem - .buildUpon() - .setMimeType(MimeTypes.APPLICATION_MPD) - .setUri(hasUri ? mediaItem.playbackProperties.uri : Uri.EMPTY) - .setTag(hasTag ? mediaItem.playbackProperties.tag : tag) - .setLiveTargetOffsetMs( - hasTargetLiveOffset - ? mediaItem.liveConfiguration.targetOffsetMs - : targetLiveOffsetOverrideMs) - .setStreamKeys(streamKeys) - .build(); return new DashMediaSource( mediaItem, manifest, From dd39513a2e52c865c724a73639ce48aa242a691c Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 14:27:02 +0100 Subject: [PATCH 215/441] Rename `MediaItem.DrmConfiguration.requestHeaders` to add `license` Both license and provisioning requests could be considered 'DRM requests', and these headers are only sent on license requests, so rename them to reflect that. The old field remains deprecated for backwards compatibility. PiperOrigin-RevId: 397980021 --- .../android/exoplayer2/demo/DownloadTracker.java | 2 +- .../android/exoplayer2/demo/IntentUtil.java | 5 +++-- .../android/exoplayer2/demo/PlayerActivity.java | 2 +- .../ext/cast/DefaultMediaItemConverter.java | 6 +++--- .../com/google/android/exoplayer2/MediaItem.java | 15 ++++++++++----- .../google/android/exoplayer2/MediaItemTest.java | 10 ++++++++-- .../drm/DefaultDrmSessionManagerProvider.java | 2 +- 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index 027d3846cf..caffeb8a6a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -402,7 +402,7 @@ public class DownloadTracker { drmConfiguration.licenseUri.toString(), drmConfiguration.forceDefaultLicenseUri, httpDataSourceFactory, - drmConfiguration.requestHeaders, + drmConfiguration.licenseRequestHeaders, new DrmSessionEventListener.EventDispatcher()); try { keySetId = offlineLicenseHelper.downloadLicense(format); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index ec0495202f..e2bd51582b 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -212,9 +212,10 @@ public class IntentUtil { DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, drmConfiguration.forceDefaultLicenseUri); - String[] drmKeyRequestProperties = new String[drmConfiguration.requestHeaders.size() * 2]; + String[] drmKeyRequestProperties = + new String[drmConfiguration.licenseRequestHeaders.size() * 2]; int index = 0; - for (Map.Entry entry : drmConfiguration.requestHeaders.entrySet()) { + for (Map.Entry entry : drmConfiguration.licenseRequestHeaders.entrySet()) { drmKeyRequestProperties[index++] = entry.getKey(); drmKeyRequestProperties[index++] = entry.getValue(); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 43e134b565..2efd02b0e2 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -527,6 +527,6 @@ public class PlayerActivity extends AppCompatActivity @Nullable private static Map getDrmRequestHeaders(MediaItem item) { MediaItem.DrmConfiguration drmConfiguration = item.playbackProperties.drmConfiguration; - return drmConfiguration != null ? drmConfiguration.requestHeaders : null; + return drmConfiguration != null ? drmConfiguration.licenseRequestHeaders : null; } } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index d3ef14cf73..88b0a47abd 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -146,7 +146,7 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { JSONObject json = new JSONObject(); json.put(KEY_UUID, drmConfiguration.scheme); json.put(KEY_LICENSE_URI, drmConfiguration.licenseUri); - json.put(KEY_REQUEST_HEADERS, new JSONObject(drmConfiguration.requestHeaders)); + json.put(KEY_REQUEST_HEADERS, new JSONObject(drmConfiguration.licenseRequestHeaders)); return json; } @@ -173,8 +173,8 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { if (drmConfiguration.licenseUri != null) { exoPlayerConfigJson.put("licenseUrl", drmConfiguration.licenseUri); } - if (!drmConfiguration.requestHeaders.isEmpty()) { - exoPlayerConfigJson.put("headers", new JSONObject(drmConfiguration.requestHeaders)); + if (!drmConfiguration.licenseRequestHeaders.isEmpty()) { + exoPlayerConfigJson.put("headers", new JSONObject(drmConfiguration.licenseRequestHeaders)); } return exoPlayerConfigJson; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index ad6167042f..ce6adde1b8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -555,7 +555,7 @@ public final class MediaItem implements Bundleable { private Builder(DrmConfiguration drmConfiguration) { this.scheme = drmConfiguration.scheme; this.licenseUri = drmConfiguration.licenseUri; - this.licenseRequestHeaders = drmConfiguration.requestHeaders; + this.licenseRequestHeaders = drmConfiguration.licenseRequestHeaders; this.multiSession = drmConfiguration.multiSession; this.playClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; this.forceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri; @@ -690,8 +690,11 @@ public final class MediaItem implements Bundleable { */ @Nullable public final Uri licenseUri; - /** The headers to attach to the request to the DRM license server. */ - public final ImmutableMap requestHeaders; + /** @deprecated Use {@link #licenseRequestHeaders} instead. */ + @Deprecated public final ImmutableMap requestHeaders; + + /** The headers to attach to requests sent to the DRM license server. */ + public final ImmutableMap licenseRequestHeaders; /** Whether the DRM configuration is multi session enabled. */ public final boolean multiSession; @@ -713,12 +716,14 @@ public final class MediaItem implements Bundleable { @Nullable private final byte[] keySetId; + @SuppressWarnings("deprecation") // Setting deprecated field private DrmConfiguration(Builder builder) { checkState(!(builder.forceDefaultLicenseUri && builder.licenseUri == null)); this.scheme = checkNotNull(builder.scheme); this.uuid = scheme; this.licenseUri = builder.licenseUri; this.requestHeaders = builder.licenseRequestHeaders; + this.licenseRequestHeaders = builder.licenseRequestHeaders; this.multiSession = builder.multiSession; this.forceDefaultLicenseUri = builder.forceDefaultLicenseUri; this.playClearContentWithoutKey = builder.playClearContentWithoutKey; @@ -752,7 +757,7 @@ public final class MediaItem implements Bundleable { DrmConfiguration other = (DrmConfiguration) obj; return scheme.equals(other.scheme) && Util.areEqual(licenseUri, other.licenseUri) - && Util.areEqual(requestHeaders, other.requestHeaders) + && Util.areEqual(licenseRequestHeaders, other.licenseRequestHeaders) && multiSession == other.multiSession && forceDefaultLicenseUri == other.forceDefaultLicenseUri && playClearContentWithoutKey == other.playClearContentWithoutKey @@ -764,7 +769,7 @@ public final class MediaItem implements Bundleable { public int hashCode() { int result = scheme.hashCode(); result = 31 * result + (licenseUri != null ? licenseUri.hashCode() : 0); - result = 31 * result + requestHeaders.hashCode(); + result = 31 * result + licenseRequestHeaders.hashCode(); result = 31 * result + (multiSession ? 1 : 0); result = 31 * result + (forceDefaultLicenseUri ? 1 : 0); result = 31 * result + (playClearContentWithoutKey ? 1 : 0); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index dc232c4bcf..d00a49ab67 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -86,7 +86,7 @@ public class MediaItemTest { } @Test - @SuppressWarnings("deprecation") // Testing deprecated methods + @SuppressWarnings("deprecation") // Testing deprecated methods and fields public void builderSetDrmPropertiesIndividually() { Uri licenseUri = Uri.parse(URI_STRING); Map requestHeaders = new HashMap<>(); @@ -111,6 +111,8 @@ public class MediaItemTest { assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) .isEqualTo(requestHeaders); + assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders) + .isEqualTo(requestHeaders); assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); @@ -120,7 +122,7 @@ public class MediaItemTest { } @Test - @SuppressWarnings("deprecation") // Testing deprecated methods + @SuppressWarnings("deprecation") // Testing deprecated methods and fields public void builderSetDrmConfigurationOverwritesIndividualProperties() { Uri licenseUri = Uri.parse(URI_STRING); Map requestHeaders = new HashMap<>(); @@ -145,6 +147,7 @@ public class MediaItemTest { assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID); assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isNull(); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders).isEmpty(); + assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders).isEmpty(); assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isFalse(); assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isFalse(); assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isFalse(); @@ -153,6 +156,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated field public void builderSetDrmConfiguration() { Uri licenseUri = Uri.parse(URI_STRING); Map requestHeaders = new HashMap<>(); @@ -179,6 +183,8 @@ public class MediaItemTest { assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) .isEqualTo(requestHeaders); + assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders) + .isEqualTo(requestHeaders); assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue(); assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java index e9cd7aa1de..65140c050c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java @@ -101,7 +101,7 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager drmConfiguration.licenseUri == null ? null : drmConfiguration.licenseUri.toString(), drmConfiguration.forceDefaultLicenseUri, dataSourceFactory); - for (Map.Entry entry : drmConfiguration.requestHeaders.entrySet()) { + for (Map.Entry entry : drmConfiguration.licenseRequestHeaders.entrySet()) { httpDrmCallback.setKeyRequestProperty(entry.getKey(), entry.getValue()); } DefaultDrmSessionManager drmSessionManager = From e0a9540cd3959b8244def9644db26488927da166 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 17:16:46 +0100 Subject: [PATCH 216/441] Mark MediaItem.Subtitle.mimeType as @Nullable The MIME type is currently required to select a SubtitleDecoder implementation in the TextRenderer. Future changes might remove this requirement, so we pre-emptively mark the field as @Nullable. The change in SingleSampleMediaSource ensures the track still maps to the TextRenderer, otherwise it shows up as unmapped. Passing null MIME type to MediaItem.Subtitle constructor now results in this from EventLogger: TextRenderer [ Group:0, adaptive_supported=N/A [ [ ] Track:0, id=null, mimeType=text/x-unknown, language=en, supported=NO_UNSUPPORTED_TYPE ] ] PiperOrigin-RevId: 398010809 --- .../java/com/google/android/exoplayer2/MediaItem.java | 8 ++++---- .../com/google/android/exoplayer2/util/MimeTypes.java | 2 ++ .../exoplayer2/source/DefaultMediaSourceFactory.java | 2 +- .../exoplayer2/source/SingleSampleMediaSource.java | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index ce6adde1b8..f891bb9662 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -1189,8 +1189,8 @@ public final class MediaItem implements Bundleable { /** The {@link Uri} to the subtitle file. */ public final Uri uri; - /** The MIME type. */ - public final String mimeType; + /** The optional MIME type of the subtitle file, or {@code null} if unspecified. */ + @Nullable public final String mimeType; /** The language. */ @Nullable public final String language; /** The selection flags. */ @@ -1261,7 +1261,7 @@ public final class MediaItem implements Bundleable { Subtitle other = (Subtitle) obj; return uri.equals(other.uri) - && mimeType.equals(other.mimeType) + && Util.areEqual(mimeType, other.mimeType) && Util.areEqual(language, other.language) && selectionFlags == other.selectionFlags && roleFlags == other.roleFlags @@ -1271,7 +1271,7 @@ public final class MediaItem implements Bundleable { @Override public int hashCode() { int result = uri.hashCode(); - result = 31 * result + mimeType.hashCode(); + result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode()); result = 31 * result + (language == null ? 0 : language.hashCode()); result = 31 * result + selectionFlags; result = 31 * result + roleFlags; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 3e82accd71..493485133a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -98,6 +98,8 @@ public final class MimeTypes { public static final String TEXT_EXOPLAYER_CUES = BASE_TYPE_TEXT + "/x-exoplayer-cues"; + public static final String TEXT_UNKNOWN = BASE_TYPE_TEXT + "/x-unknown"; + // application/ MIME types public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4"; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 72039bce80..a5ffff4998 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -381,7 +381,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { mediaSources[0] = mediaSource; for (int i = 0; i < subtitles.size(); i++) { if (useProgressiveMediaSourceForSubtitles - && subtitles.get(i).mimeType.equals(MimeTypes.TEXT_VTT)) { + && MimeTypes.TEXT_VTT.equals(subtitles.get(i).mimeType)) { int index = i; ProgressiveMediaSource.Factory progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index c0d34d0ff3..887ce26463 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.source; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.common.base.MoreObjects.firstNonNull; import android.net.Uri; import androidx.annotation.Nullable; @@ -28,6 +29,7 @@ import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.TransferListener; +import com.google.android.exoplayer2.util.MimeTypes; import java.util.Collections; /** @@ -163,7 +165,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { format = new Format.Builder() .setId(trackId) - .setSampleMimeType(subtitle.mimeType) + .setSampleMimeType(firstNonNull(subtitle.mimeType, MimeTypes.TEXT_UNKNOWN)) .setLanguage(subtitle.language) .setSelectionFlags(subtitle.selectionFlags) .setRoleFlags(subtitle.roleFlags) From c927bc8358ea49637f76b9a409de0020d1c25ae7 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 17:48:08 +0100 Subject: [PATCH 217/441] Add clearkey-based DRM playback emulator tests These give some documentation-as-code for a clearkey integration with ExoPlayer. #exofixit PiperOrigin-RevId: 398017708 --- library/core/build.gradle | 1 + .../core/src/androidTest/AndroidManifest.xml | 4 +- .../exoplayer2/drm/DrmPlaybackTest.java | 101 ++++++++++++++++++ .../media/drm/sample_fragmented_clearkey.mp4 | Bin 0 -> 107032 bytes 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java create mode 100644 testdata/src/test/assets/media/drm/sample_fragmented_clearkey.mp4 diff --git a/library/core/build.gradle b/library/core/build.gradle index 81e1a3d543..bebd62beb9 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -48,6 +48,7 @@ dependencies { androidTestImplementation(project(modulePrefix + 'testutils')) { exclude module: modulePrefix.substring(1) + 'library-core' } + androidTestImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion testImplementation 'org.robolectric:robolectric:' + robolectricVersion testImplementation project(modulePrefix + 'testutils') diff --git a/library/core/src/androidTest/AndroidManifest.xml b/library/core/src/androidTest/AndroidManifest.xml index 4ffc92ac24..db8d89e66e 100644 --- a/library/core/src/androidTest/AndroidManifest.xml +++ b/library/core/src/androidTest/AndroidManifest.xml @@ -19,11 +19,13 @@ package="com.google.android.exoplayer2.core.test"> + + tools:ignore="MissingApplicationIcon,HardcodedDebugMode" + android:usesCleartextTraffic="true"> diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java new file mode 100644 index 0000000000..c342e9a1a7 --- /dev/null +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java @@ -0,0 +1,101 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.drm; + +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.util.ConditionVariable; +import java.util.concurrent.atomic.AtomicReference; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Instrumentation tests for DRM playback. */ +@RunWith(AndroidJUnit4.class) +public final class DrmPlaybackTest { + + /** The license response needed to play the {@code drm/sample_fragmented_clearkey.mp4} file. */ + // NOTE: Changing this response *should* make the test fail, but it seems the clearkey CDM + // implementation is quite robust. This means an 'invalid' response means it just incorrectly + // decrypts the content, resulting in invalid data fed to the decoder and no video shown on the + // screen (but no error thrown that's detectable by this test). + private static final String CLEARKEY_RESPONSE = + "{\"keys\":" + + "[{" + + "\"kty\":\"oct\"," + + "\"k\":\"Y8tfcYTdS2iaXF_xHuajKA\"," + + "\"kid\":\"zX65_4jzTK6wYYWwACTkwg\"" + + "}]," + + "\"type\":\"temporary\"}"; + + @Test + public void clearkeyPlayback() throws Exception { + MockWebServer mockWebServer = new MockWebServer(); + mockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(CLEARKEY_RESPONSE)); + mockWebServer.start(); + + MediaItem mediaItem = + new MediaItem.Builder() + .setUri("asset:///media/drm/sample_fragmented_clearkey.mp4") + .setDrmConfiguration( + new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID) + .setLicenseUri(mockWebServer.url("license").toString()) + .build()) + .build(); + AtomicReference player = new AtomicReference<>(); + ConditionVariable playbackComplete = new ConditionVariable(); + AtomicReference playbackException = new AtomicReference<>(); + getInstrumentation() + .runOnMainSync( + () -> { + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); + player + .get() + .addListener( + new Player.Listener() { + @Override + public void onPlaybackStateChanged(@Player.State int playbackState) { + if (playbackState == Player.STATE_ENDED) { + playbackComplete.open(); + } + } + + @Override + public void onPlayerError(PlaybackException error) { + playbackException.set(error); + playbackComplete.open(); + } + }); + player.get().setMediaItem(mediaItem); + player.get().prepare(); + player.get().play(); + }); + + playbackComplete.block(); + getInstrumentation().runOnMainSync(() -> player.get().release()); + getInstrumentation().waitForIdleSync(); + assertThat(playbackException.get()).isNull(); + } +} diff --git a/testdata/src/test/assets/media/drm/sample_fragmented_clearkey.mp4 b/testdata/src/test/assets/media/drm/sample_fragmented_clearkey.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1efacc5d224cc71215c22e6e1c87e7e3124e1fe8 GIT binary patch literal 107032 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 Date: Wed, 22 Sep 2021 10:00:53 +0100 Subject: [PATCH 218/441] Use the new MediaItem.Builder#setAdsConfiguration method PiperOrigin-RevId: 398185843 --- .../android/exoplayer2/demo/IntentUtil.java | 6 ++++- .../demo/SampleChooserActivity.java | 3 ++- docs/ad-insertion.md | 16 ++++++++++--- docs/media-items.md | 3 ++- .../source/DefaultMediaSourceFactoryTest.java | 24 ++++++++++++++----- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index e2bd51582b..8b7ea65989 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -117,18 +117,22 @@ public class IntentUtil { Uri uri, Intent intent, String extrasKeySuffix) { @Nullable String mimeType = intent.getStringExtra(MIME_TYPE_EXTRA + extrasKeySuffix); @Nullable String title = intent.getStringExtra(TITLE_EXTRA + extrasKeySuffix); + @Nullable String adTagUri = intent.getStringExtra(AD_TAG_URI_EXTRA + extrasKeySuffix); MediaItem.Builder builder = new MediaItem.Builder() .setUri(uri) .setMimeType(mimeType) .setMediaMetadata(new MediaMetadata.Builder().setTitle(title).build()) - .setAdTagUri(intent.getStringExtra(AD_TAG_URI_EXTRA + extrasKeySuffix)) .setSubtitles(createSubtitlesFromIntent(intent, extrasKeySuffix)) .setClipStartPositionMs( intent.getLongExtra(CLIP_START_POSITION_MS_EXTRA + extrasKeySuffix, 0)) .setClipEndPositionMs( intent.getLongExtra( CLIP_END_POSITION_MS_EXTRA + extrasKeySuffix, C.TIME_END_OF_SOURCE)); + if (adTagUri != null) { + builder.setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(Uri.parse(adTagUri)).build()); + } return populateDrmPropertiesFromIntent(builder, intent, extrasKeySuffix).build(); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index ac6a5037d4..f85aaa97c5 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -373,7 +373,8 @@ public class SampleChooserActivity extends AppCompatActivity mediaItem.setClipEndPositionMs(reader.nextLong()); break; case "ad_tag_uri": - mediaItem.setAdTagUri(reader.nextString()); + mediaItem.setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(Uri.parse(reader.nextString())).build()); break; case "drm_scheme": drmUuid = Util.getDrmUuid(reader.nextString()); diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index be1371f201..544488f14c 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -36,7 +36,11 @@ An ad tag URI can be specified when building a `MediaItem`: ~~~ MediaItem mediaItem = - new MediaItem.Builder().setUri(videoUri).setAdTagUri(adTagUri).build(); + new MediaItem.Builder() + .setUri(videoUri) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUri).build()) + .build(); ~~~ {: .language-java} @@ -88,12 +92,18 @@ playlist from start to finish. MediaItem firstItem = new MediaItem.Builder() .setUri(firstVideoUri) - .setAdTagUri(adTagUri, /* adsId= */ adTagUri) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUri) + .setAdsId(adTagUri) + .build()) .build(); MediaItem secondItem = new MediaItem.Builder() .setUri(secondVideoUri) - .setAdTagUri(adTagUri, /* adsId= */ adTagUri) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUri) + .setAdsId(adTagUri) + .build()) .build(); player.addMediaItem(firstItem); player.addMediaItem(secondItem); diff --git a/docs/media-items.md b/docs/media-items.md index bede066c90..710ded16d6 100644 --- a/docs/media-items.md +++ b/docs/media-items.md @@ -137,7 +137,8 @@ To insert ads, a media item's ad tag URI property should be set: ~~~ MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) - .setAdTagUri(adTagUri) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build(); ~~~ {: .language-java} diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java index 9be9445f47..f15988a8c1 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java @@ -166,9 +166,13 @@ public final class DefaultMediaSourceFactoryTest { } @Test - public void createMediaSource_withAdTagUri_callsAdsLoader() { + public void createMediaSource_withAdsConfiguration_callsAdsLoader() { Uri adTagUri = Uri.parse(URI_MEDIA); - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(adTagUri).build(); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_MEDIA) + .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) + .build(); DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()) .setAdsLoaderProvider(ignoredAdsConfiguration -> mock(AdsLoader.class)) @@ -180,9 +184,13 @@ public final class DefaultMediaSourceFactoryTest { } @Test - public void createMediaSource_withAdTagUri_adProvidersNotSet_playsWithoutAdNoException() { + public void createMediaSource_withAdsConfiguration_adProvidersNotSet_playsWithoutAdNoException() { MediaItem mediaItem = - new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build(); + new MediaItem.Builder() + .setUri(URI_MEDIA) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(Uri.parse(URI_MEDIA)).build()) + .build(); DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory((Context) ApplicationProvider.getApplicationContext()); @@ -192,10 +200,14 @@ public final class DefaultMediaSourceFactoryTest { } @Test - public void createMediaSource_withAdTagUriProvidersNull_playsWithoutAdNoException() { + public void createMediaSource_withAdsConfigurationProvidersNull_playsWithoutAdNoException() { Context applicationContext = ApplicationProvider.getApplicationContext(); MediaItem mediaItem = - new MediaItem.Builder().setUri(URI_MEDIA).setAdTagUri(Uri.parse(URI_MEDIA)).build(); + new MediaItem.Builder() + .setUri(URI_MEDIA) + .setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(Uri.parse(URI_MEDIA)).build()) + .build(); MediaSource mediaSource = new DefaultMediaSourceFactory(applicationContext).createMediaSource(mediaItem); From fefa6cb817e102dc1b91b86441ca639b3258842f Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 22 Sep 2021 11:33:27 +0100 Subject: [PATCH 219/441] Add MediaItem.Subtitle.Builder PiperOrigin-RevId: 398200055 --- .../google/android/exoplayer2/MediaItem.java | 114 ++++++++++++++---- .../android/exoplayer2/MediaItemTest.java | 40 +++--- 2 files changed, 113 insertions(+), 41 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index f891bb9662..ef58571f08 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -1187,6 +1187,75 @@ public final class MediaItem implements Bundleable { /** Properties for a text track. */ public static final class Subtitle { + /** Builder for {@link Subtitle} instances. */ + public static final class Builder { + private Uri uri; + @Nullable private String mimeType; + @Nullable private String language; + @C.SelectionFlags private int selectionFlags; + @C.RoleFlags private int roleFlags; + @Nullable private String label; + + /** + * Constructs an instance. + * + * @param uri The {@link Uri} to the subtitle file. + */ + public Builder(Uri uri) { + this.uri = uri; + } + + private Builder(Subtitle subtitle) { + this.uri = subtitle.uri; + this.mimeType = subtitle.mimeType; + this.language = subtitle.language; + this.selectionFlags = subtitle.selectionFlags; + this.roleFlags = subtitle.roleFlags; + this.label = subtitle.label; + } + + /** Sets the {@link Uri} to the subtitle file. */ + public Builder setUri(Uri uri) { + this.uri = uri; + return this; + } + + /** Sets the MIME type. */ + public Builder setMimeType(String mimeType) { + this.mimeType = mimeType; + return this; + } + + /** Sets the optional language of the subtitle file. */ + public Builder setLanguage(@Nullable String language) { + this.language = language; + return this; + } + + /** Sets the flags used for track selection. */ + public Builder setSelectionFlags(@C.SelectionFlags int selectionFlags) { + this.selectionFlags = selectionFlags; + return this; + } + + /** Sets the role flags. These are used for track selection. */ + public Builder setRoleFlags(@C.RoleFlags int roleFlags) { + this.roleFlags = roleFlags; + return this; + } + + /** Sets the optional label for this subtitle track. */ + public Builder setLabel(@Nullable String label) { + this.label = label; + return this; + } + + /** Creates a {@link Subtitle} from the values of this builder. */ + public Subtitle build() { + return new Subtitle(this); + } + } + /** The {@link Uri} to the subtitle file. */ public final Uri uri; /** The optional MIME type of the subtitle file, or {@code null} if unspecified. */ @@ -1200,40 +1269,21 @@ public final class MediaItem implements Bundleable { /** The label. */ @Nullable public final String label; - /** - * Creates an instance. - * - * @param uri The {@link Uri URI} to the subtitle file. - * @param mimeType The MIME type. - * @param language The optional language. - */ + /** @deprecated Use {@link Builder} instead. */ + @Deprecated public Subtitle(Uri uri, String mimeType, @Nullable String language) { this(uri, mimeType, language, /* selectionFlags= */ 0); } - /** - * Creates an instance. - * - * @param uri The {@link Uri URI} to the subtitle file. - * @param mimeType The MIME type. - * @param language The optional language. - * @param selectionFlags The selection flags. - */ + /** @deprecated Use {@link Builder} instead. */ + @Deprecated public Subtitle( Uri uri, String mimeType, @Nullable String language, @C.SelectionFlags int selectionFlags) { this(uri, mimeType, language, selectionFlags, /* roleFlags= */ 0, /* label= */ null); } - /** - * Creates an instance. - * - * @param uri The {@link Uri URI} to the subtitle file. - * @param mimeType The MIME type. - * @param language The optional language. - * @param selectionFlags The selection flags. - * @param roleFlags The role flags. - * @param label The optional label. - */ + /** @deprecated Use {@link Builder} instead. */ + @Deprecated public Subtitle( Uri uri, String mimeType, @@ -1249,6 +1299,20 @@ public final class MediaItem implements Bundleable { this.label = label; } + private Subtitle(Builder builder) { + this.uri = builder.uri; + this.mimeType = builder.mimeType; + this.language = builder.language; + this.selectionFlags = builder.selectionFlags; + this.roleFlags = builder.roleFlags; + this.label = builder.label; + } + + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(this); + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index d00a49ab67..e503dfa4e4 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -258,9 +258,17 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Using deprecated constructors public void builderSetSubtitles_setsSubtitles() { List subtitles = - Arrays.asList( + ImmutableList.of( + new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/es")) + .setMimeType(MimeTypes.TEXT_SSA) + .setLanguage(/* language= */ "es") + .setSelectionFlags(C.SELECTION_FLAG_FORCED) + .setRoleFlags(C.ROLE_FLAG_ALTERNATE) + .setLabel("label") + .build(), new MediaItem.Subtitle( Uri.parse(URI_STRING + "/en"), MimeTypes.APPLICATION_TTML, /* language= */ "en"), new MediaItem.Subtitle( @@ -531,14 +539,14 @@ public class MediaItemTest { .setLiveMinOffsetMs(2222) .setLiveMaxOffsetMs(4444) .setSubtitles( - Collections.singletonList( - new MediaItem.Subtitle( - Uri.parse(URI_STRING + "/en"), - MimeTypes.APPLICATION_TTML, - /* language= */ "en", - C.SELECTION_FLAG_FORCED, - C.ROLE_FLAG_ALTERNATE, - "label"))) + ImmutableList.of( + new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en")) + .setMimeType(MimeTypes.APPLICATION_TTML) + .setLanguage("en") + .setSelectionFlags(C.SELECTION_FLAG_FORCED) + .setRoleFlags(C.ROLE_FLAG_ALTERNATE) + .setLabel("label") + .build())) .setTag(new Object()) .build(); @@ -584,13 +592,13 @@ public class MediaItemTest { .build()) .setSubtitles( ImmutableList.of( - new MediaItem.Subtitle( - Uri.parse(URI_STRING + "/en"), - MimeTypes.APPLICATION_TTML, - /* language= */ "en", - C.SELECTION_FLAG_FORCED, - C.ROLE_FLAG_ALTERNATE, - "label"))) + new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en")) + .setMimeType(MimeTypes.APPLICATION_TTML) + .setLanguage("en") + .setSelectionFlags(C.SELECTION_FLAG_FORCED) + .setRoleFlags(C.ROLE_FLAG_ALTERNATE) + .setLabel("label") + .build())) .setTag(new Object()) .build(); From a63155975ac9a50310265e57c4b201b930b7ca2e Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 22 Sep 2021 13:26:48 +0100 Subject: [PATCH 220/441] Use the new MediaItem.Builder#setLiveConfiguration method PiperOrigin-RevId: 398215071 --- docs/live-streaming.md | 5 +- .../android/exoplayer2/ExoPlayerTest.java | 72 +++++++++++++++---- .../source/DefaultMediaSourceFactoryTest.java | 13 ++-- .../source/dash/DashMediaSource.java | 17 ++++- .../source/dash/DashMediaSourceTest.java | 51 ++++++++----- .../exoplayer2/source/hls/HlsMediaSource.java | 2 +- .../source/hls/HlsMediaSourceTest.java | 24 +++++-- 7 files changed, 141 insertions(+), 43 deletions(-) diff --git a/docs/live-streaming.md b/docs/live-streaming.md index 368ae11afc..5b09d0af68 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -106,7 +106,10 @@ SimpleExoPlayer player = MediaItem mediaItem = new MediaItem.Builder() .setUri(mediaUri) - .setLiveMaxPlaybackSpeed(1.02f) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setMaxPlaybackSpeed(1.02f) + .build()) .build(); player.setMediaItem(mediaItem); ~~~ diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index fab7b86a16..2fda88cf20 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -9101,7 +9101,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); player.pause(); @@ -9146,7 +9150,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.seekTo(18_000); @@ -9187,7 +9195,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.setMediaSource(new FakeMediaSource(timeline)); player.prepare(); @@ -9230,7 +9242,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline updatedTimeline = new FakeTimeline( new TimelineWindowDefinition( @@ -9244,7 +9260,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs + 50_000), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); FakeMediaSource fakeMediaSource = new FakeMediaSource(initialTimeline); player.pause(); player.setMediaSource(fakeMediaSource); @@ -9304,7 +9324,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 20 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); player.pause(); @@ -9353,7 +9377,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(nonLiveTimeline)); player.addMediaSource(new FakeMediaSource(liveTimeline)); @@ -9393,7 +9421,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline liveTimeline2 = new FakeTimeline( new TimelineWindowDefinition( @@ -9407,7 +9439,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(liveTimeline1)); player.addMediaSource(new FakeMediaSource(liveTimeline2)); @@ -9451,7 +9487,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(9_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(9_000).build()) + .build())); Timeline liveTimeline2 = new FakeTimeline( new TimelineWindowDefinition( @@ -9465,7 +9505,11 @@ public final class ExoPlayerTest { /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build())); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build())); player.pause(); player.addMediaSource(new FakeMediaSource(liveTimeline1)); player.addMediaSource(new FakeMediaSource(liveTimeline2)); @@ -9492,7 +9536,11 @@ public final class ExoPlayerTest { new FakeClock(/* initialTimeMs= */ 987_654_321L, /* isAutoAdvancing= */ true); ExoPlayer player = new TestExoPlayerBuilder(context).setClock(fakeClock).build(); MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(4_000).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(4_000).build()) + .build(); Timeline liveTimeline = new SinglePeriodTimeline( /* presentationStartTimeMs= */ C.TIME_UNSET, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java index f15988a8c1..ed1960b708 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactoryTest.java @@ -264,11 +264,14 @@ public final class DefaultMediaSourceFactoryTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_MEDIA + "/file.mp4") - .setLiveTargetOffsetMs(10) - .setLiveMinOffsetMs(1111) - .setLiveMinOffsetMs(3333) - .setLiveMinPlaybackSpeed(20.0f) - .setLiveMaxPlaybackSpeed(20.0f) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(10) + .setMinOffsetMs(1111) + .setMinOffsetMs(3333) + .setMinPlaybackSpeed(20.0f) + .setMaxPlaybackSpeed(20.0f) + .build()) .build(); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index c9e10b8667..f99e6017b1 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -223,7 +223,8 @@ public final class DashMediaSource extends BaseMediaSource { } /** - * @deprecated Use {@link MediaItem.Builder#setLiveTargetOffsetMs(long)} to override the + * @deprecated Use {@link MediaItem.Builder#setLiveConfiguration(MediaItem.LiveConfiguration)} + * and {@link MediaItem.LiveConfiguration.Builder#setTargetOffsetMs(long)} to override the * manifest, or {@link #setFallbackTargetLiveOffsetMs(long)} to provide a fallback value. */ @Deprecated @@ -321,7 +322,12 @@ public final class DashMediaSource extends BaseMediaSource { mediaItemBuilder.setTag(tag); } if (mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET) { - mediaItemBuilder.setLiveTargetOffsetMs(targetLiveOffsetOverrideMs); + mediaItemBuilder.setLiveConfiguration( + mediaItem + .liveConfiguration + .buildUpon() + .setTargetOffsetMs(targetLiveOffsetOverrideMs) + .build()); } if (mediaItem.playbackProperties == null || mediaItem.playbackProperties.streamKeys.isEmpty()) { @@ -393,7 +399,12 @@ public final class DashMediaSource extends BaseMediaSource { builder.setStreamKeys(streamKeys); } if (needsTargetLiveOffset) { - builder.setLiveTargetOffsetMs(targetLiveOffsetOverrideMs); + builder.setLiveConfiguration( + mediaItem + .liveConfiguration + .buildUpon() + .setTargetOffsetMs(targetLiveOffsetOverrideMs) + .build()); } mediaItem = builder.build(); } diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index 6f82c4f6fd..cc9947b4d3 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -187,7 +187,11 @@ public final class DashMediaSourceTest { @Test public void factorySetFallbackTargetLiveOffsetMs_withMediaLiveTargetOffsetMs_usesMediaOffset() { MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(2L).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(2L).build()) + .build(); DashMediaSource.Factory factory = new DashMediaSource.Factory(new FileDataSource.Factory()) .setFallbackTargetLiveOffsetMs(1234L); @@ -200,7 +204,11 @@ public final class DashMediaSourceTest { @Test public void factorySetLivePresentationDelayMs_withMediaLiveTargetOffset_usesMediaOffset() { MediaItem mediaItem = - new MediaItem.Builder().setUri(Uri.EMPTY).setLiveTargetOffsetMs(2L).build(); + new MediaItem.Builder() + .setUri(Uri.EMPTY) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(2L).build()) + .build(); DashMediaSource.Factory factory = new DashMediaSource.Factory(new FileDataSource.Factory()) .setLivePresentationDelayMs(1234L, /* overridesManifest= */ true); @@ -290,11 +298,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(500L) - .setLiveMaxOffsetMs(20_000L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(500L) + .setMaxOffsetMs(20_000L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( @@ -336,11 +347,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(200L) - .setLiveMaxOffsetMs(999L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(200L) + .setMaxOffsetMs(999L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( @@ -385,11 +399,14 @@ public final class DashMediaSourceTest { MediaItem mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setLiveTargetOffsetMs(876L) - .setLiveMinPlaybackSpeed(23f) - .setLiveMaxPlaybackSpeed(42f) - .setLiveMinOffsetMs(100L) - .setLiveMaxOffsetMs(999L) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder() + .setTargetOffsetMs(876L) + .setMinPlaybackSpeed(23f) + .setMaxPlaybackSpeed(42f) + .setMinOffsetMs(100L) + .setMaxOffsetMs(999L) + .build()) .build(); DashMediaSource mediaSource = new DashMediaSource.Factory( diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 7736b26b4c..6fafd35a46 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -641,7 +641,7 @@ public final class HlsMediaSource extends BaseMediaSource long targetLiveOffsetMs = C.usToMs(targetLiveOffsetUs); if (targetLiveOffsetMs != liveConfiguration.targetOffsetMs) { liveConfiguration = - mediaItem.buildUpon().setLiveTargetOffsetMs(targetLiveOffsetMs).build().liveConfiguration; + liveConfiguration.buildUpon().setTargetOffsetMs(targetLiveOffsetMs).build(); } } diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java index 635c5615e1..aeda359e0a 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java @@ -364,7 +364,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:17.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(3000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(3000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -439,7 +443,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:17.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(3000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(3000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -469,7 +477,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:05.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(1000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(1000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); @@ -502,7 +514,11 @@ public class HlsMediaSourceTest { SystemClock.setCurrentTimeMillis(Util.parseXsDateTime("2020-01-01T00:00:09.0+00:00")); HlsMediaSource.Factory factory = createHlsMediaSourceFactory(playlistUri, playlist); MediaItem mediaItem = - new MediaItem.Builder().setUri(playlistUri).setLiveTargetOffsetMs(20_000).build(); + new MediaItem.Builder() + .setUri(playlistUri) + .setLiveConfiguration( + new MediaItem.LiveConfiguration.Builder().setTargetOffsetMs(20_000).build()) + .build(); HlsMediaSource mediaSource = factory.createMediaSource(mediaItem); Timeline timeline = prepareAndWaitForTimeline(mediaSource); From 137230007354a8d164b9047608a182bd67fdd7b1 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 22 Sep 2021 14:57:46 +0100 Subject: [PATCH 221/441] Fix lint warning that breaks gradle build Calling AudioManager.isOffloadedPlaybackSupported is available since API 29 only. PiperOrigin-RevId: 398229498 --- .../com/google/android/exoplayer2/audio/DefaultAudioSink.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 3592aef8bb..3bfca92b38 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -1634,6 +1634,7 @@ public final class DefaultAudioSink implements AudioSink { } } + @RequiresApi(29) @C.AudioManagerOffloadMode private int getOffloadedPlaybackSupport( AudioFormat audioFormat, android.media.AudioAttributes audioAttributes) { From 59cd783dd49357b163f901c60e783581cda80cf4 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 22 Sep 2021 15:12:09 +0100 Subject: [PATCH 222/441] Add MediaItem.ClippingProperties.Builder PiperOrigin-RevId: 398232186 --- .../google/android/exoplayer2/MediaItem.java | 201 ++++++++++++------ .../android/exoplayer2/MediaItemTest.java | 84 ++++++-- 2 files changed, 205 insertions(+), 80 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index ef58571f08..3621404e4c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -67,11 +67,9 @@ public final class MediaItem implements Bundleable { @Nullable private String mediaId; @Nullable private Uri uri; @Nullable private String mimeType; - private long clipStartPositionMs; - private long clipEndPositionMs; - private boolean clipRelativeToLiveWindow; - private boolean clipRelativeToDefaultPosition; - private boolean clipStartsAtKeyFrame; + // TODO: Change this to ClippingProperties once all the deprecated individual setters are + // removed. + private ClippingProperties.Builder clippingProperties; // TODO: Change this to @Nullable DrmConfiguration once all the deprecated individual setters // are removed. private DrmConfiguration.Builder drmConfiguration; @@ -88,7 +86,7 @@ public final class MediaItem implements Bundleable { /** Creates a builder. */ @SuppressWarnings("deprecation") // Temporarily uses DrmConfiguration.Builder() constructor. public Builder() { - clipEndPositionMs = C.TIME_END_OF_SOURCE; + clippingProperties = new ClippingProperties.Builder(); drmConfiguration = new DrmConfiguration.Builder(); streamKeys = Collections.emptyList(); subtitles = Collections.emptyList(); @@ -97,11 +95,7 @@ public final class MediaItem implements Bundleable { private Builder(MediaItem mediaItem) { this(); - clipEndPositionMs = mediaItem.clippingProperties.endPositionMs; - clipRelativeToLiveWindow = mediaItem.clippingProperties.relativeToLiveWindow; - clipRelativeToDefaultPosition = mediaItem.clippingProperties.relativeToDefaultPosition; - clipStartPositionMs = mediaItem.clippingProperties.startPositionMs; - clipStartsAtKeyFrame = mediaItem.clippingProperties.startsAtKeyFrame; + clippingProperties = mediaItem.clippingProperties.buildUpon(); mediaId = mediaItem.mediaId; mediaMetadata = mediaItem.mediaMetadata; liveConfiguration = mediaItem.liveConfiguration.buildUpon(); @@ -168,52 +162,59 @@ public final class MediaItem implements Bundleable { return this; } + /** Sets the {@link ClippingProperties}, defaults to {@link ClippingProperties#UNSET}. */ + public Builder setClippingProperties(ClippingProperties clippingProperties) { + this.clippingProperties = clippingProperties.buildUpon(); + return this; + } + /** - * Sets the optional start position in milliseconds which must be a value larger than or equal - * to zero (Default: 0). + * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link + * ClippingProperties.Builder#setStartPositionMs(long)} instead. */ + @Deprecated public Builder setClipStartPositionMs(@IntRange(from = 0) long startPositionMs) { - Assertions.checkArgument(startPositionMs >= 0); - this.clipStartPositionMs = startPositionMs; + clippingProperties.setStartPositionMs(startPositionMs); return this; } /** - * Sets the optional end position in milliseconds which must be a value larger than or equal to - * zero, or {@link C#TIME_END_OF_SOURCE} to end when playback reaches the end of media (Default: - * {@link C#TIME_END_OF_SOURCE}). + * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link + * ClippingProperties.Builder#setEndPositionMs(long)} instead. */ + @Deprecated public Builder setClipEndPositionMs(long endPositionMs) { - Assertions.checkArgument(endPositionMs == C.TIME_END_OF_SOURCE || endPositionMs >= 0); - this.clipEndPositionMs = endPositionMs; + clippingProperties.setEndPositionMs(endPositionMs); return this; } /** - * Sets whether the start/end positions should move with the live window for live streams. If - * {@code false}, live streams end when playback reaches the end position in live window seen - * when the media is first loaded (Default: {@code false}). + * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link + * ClippingProperties.Builder#setRelativeToLiveWindow(boolean)} instead. */ + @Deprecated public Builder setClipRelativeToLiveWindow(boolean relativeToLiveWindow) { - this.clipRelativeToLiveWindow = relativeToLiveWindow; + clippingProperties.setRelativeToLiveWindow(relativeToLiveWindow); return this; } /** - * Sets whether the start position and the end position are relative to the default position in - * the window (Default: {@code false}). + * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link + * ClippingProperties.Builder#setRelativeToDefaultPosition(boolean)} instead. */ + @Deprecated public Builder setClipRelativeToDefaultPosition(boolean relativeToDefaultPosition) { - this.clipRelativeToDefaultPosition = relativeToDefaultPosition; + clippingProperties.setRelativeToDefaultPosition(relativeToDefaultPosition); return this; } /** - * Sets whether the start point is guaranteed to be a key frame. If {@code false}, the playback - * transition into the clip may not be seamless (Default: {@code false}). + * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link + * ClippingProperties.Builder#setStartsAtKeyFrame(boolean)} instead. */ + @Deprecated public Builder setClipStartsAtKeyFrame(boolean startsAtKeyFrame) { - this.clipStartsAtKeyFrame = startsAtKeyFrame; + clippingProperties.setStartsAtKeyFrame(startsAtKeyFrame); return this; } @@ -503,12 +504,7 @@ public final class MediaItem implements Bundleable { } return new MediaItem( mediaId != null ? mediaId : DEFAULT_MEDIA_ID, - new ClippingProperties( - clipStartPositionMs, - clipEndPositionMs, - clipRelativeToLiveWindow, - clipRelativeToDefaultPosition, - clipStartsAtKeyFrame), + clippingProperties.build(), playbackProperties, liveConfiguration.build(), mediaMetadata != null ? mediaMetadata : MediaMetadata.EMPTY); @@ -1347,7 +1343,89 @@ public final class MediaItem implements Bundleable { /** Optionally clips the media item to a custom start and end position. */ public static final class ClippingProperties implements Bundleable { + /** A clipping properties configuration with default values. */ + public static final ClippingProperties UNSET = new ClippingProperties.Builder().build(); + + /** Builder for {@link ClippingProperties} instances. */ + public static final class Builder { + private long startPositionMs; + private long endPositionMs; + private boolean relativeToLiveWindow; + private boolean relativeToDefaultPosition; + private boolean startsAtKeyFrame; + + /** Constructs an instance. */ + public Builder() { + endPositionMs = C.TIME_END_OF_SOURCE; + } + + private Builder(ClippingProperties clippingProperties) { + startPositionMs = clippingProperties.startPositionMs; + endPositionMs = clippingProperties.endPositionMs; + relativeToLiveWindow = clippingProperties.relativeToLiveWindow; + relativeToDefaultPosition = clippingProperties.relativeToDefaultPosition; + startsAtKeyFrame = clippingProperties.startsAtKeyFrame; + } + + /** + * Sets the optional start position in milliseconds which must be a value larger than or equal + * to zero (Default: 0). + */ + public Builder setStartPositionMs(@IntRange(from = 0) long startPositionMs) { + Assertions.checkArgument(startPositionMs >= 0); + this.startPositionMs = startPositionMs; + return this; + } + + /** + * Sets the optional end position in milliseconds which must be a value larger than or equal + * to zero, or {@link C#TIME_END_OF_SOURCE} to end when playback reaches the end of media + * (Default: {@link C#TIME_END_OF_SOURCE}). + */ + public Builder setEndPositionMs(long endPositionMs) { + Assertions.checkArgument(endPositionMs == C.TIME_END_OF_SOURCE || endPositionMs >= 0); + this.endPositionMs = endPositionMs; + return this; + } + + /** + * Sets whether the start/end positions should move with the live window for live streams. If + * {@code false}, live streams end when playback reaches the end position in live window seen + * when the media is first loaded (Default: {@code false}). + */ + public Builder setRelativeToLiveWindow(boolean relativeToLiveWindow) { + this.relativeToLiveWindow = relativeToLiveWindow; + return this; + } + + /** + * Sets whether the start position and the end position are relative to the default position + * in the window (Default: {@code false}). + */ + public Builder setRelativeToDefaultPosition(boolean relativeToDefaultPosition) { + this.relativeToDefaultPosition = relativeToDefaultPosition; + return this; + } + + /** + * Sets whether the start point is guaranteed to be a key frame. If {@code false}, the + * playback transition into the clip may not be seamless (Default: {@code false}). + */ + public Builder setStartsAtKeyFrame(boolean startsAtKeyFrame) { + this.startsAtKeyFrame = startsAtKeyFrame; + return this; + } + + /** + * Returns a {@link ClippingProperties} instance initialized with the values of this builder. + */ + public ClippingProperties build() { + return new ClippingProperties(this); + } + } + /** The start position in milliseconds. This is a value larger than or equal to zero. */ + @IntRange(from = 0) public final long startPositionMs; /** @@ -1371,17 +1449,17 @@ public final class MediaItem implements Bundleable { /** Sets whether the start point is guaranteed to be a key frame. */ public final boolean startsAtKeyFrame; - private ClippingProperties( - long startPositionMs, - long endPositionMs, - boolean relativeToLiveWindow, - boolean relativeToDefaultPosition, - boolean startsAtKeyFrame) { - this.startPositionMs = startPositionMs; - this.endPositionMs = endPositionMs; - this.relativeToLiveWindow = relativeToLiveWindow; - this.relativeToDefaultPosition = relativeToDefaultPosition; - this.startsAtKeyFrame = startsAtKeyFrame; + private ClippingProperties(Builder builder) { + this.startPositionMs = builder.startPositionMs; + this.endPositionMs = builder.endPositionMs; + this.relativeToLiveWindow = builder.relativeToLiveWindow; + this.relativeToDefaultPosition = builder.relativeToDefaultPosition; + this.startsAtKeyFrame = builder.startsAtKeyFrame; + } + + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(this); } @Override @@ -1445,13 +1523,20 @@ public final class MediaItem implements Bundleable { /** Object that can restore {@link ClippingProperties} from a {@link Bundle}. */ public static final Creator CREATOR = bundle -> - new ClippingProperties( - bundle.getLong(keyForField(FIELD_START_POSITION_MS), /* defaultValue= */ 0), - bundle.getLong( - keyForField(FIELD_END_POSITION_MS), /* defaultValue= */ C.TIME_END_OF_SOURCE), - bundle.getBoolean(keyForField(FIELD_RELATIVE_TO_LIVE_WINDOW), false), - bundle.getBoolean(keyForField(FIELD_RELATIVE_TO_DEFAULT_POSITION), false), - bundle.getBoolean(keyForField(FIELD_STARTS_AT_KEY_FRAME), false)); + new ClippingProperties.Builder() + .setStartPositionMs( + bundle.getLong(keyForField(FIELD_START_POSITION_MS), /* defaultValue= */ 0)) + .setEndPositionMs( + bundle.getLong( + keyForField(FIELD_END_POSITION_MS), + /* defaultValue= */ C.TIME_END_OF_SOURCE)) + .setRelativeToLiveWindow( + bundle.getBoolean(keyForField(FIELD_RELATIVE_TO_LIVE_WINDOW), false)) + .setRelativeToDefaultPosition( + bundle.getBoolean(keyForField(FIELD_RELATIVE_TO_DEFAULT_POSITION), false)) + .setStartsAtKeyFrame( + bundle.getBoolean(keyForField(FIELD_STARTS_AT_KEY_FRAME), false)) + .build(); private static String keyForField(@ClippingProperties.FieldNumber int field) { return Integer.toString(field, Character.MAX_RADIX); @@ -1589,13 +1674,7 @@ public final class MediaItem implements Bundleable { Bundle clippingPropertiesBundle = bundle.getBundle(keyForField(FIELD_CLIPPING_PROPERTIES)); ClippingProperties clippingProperties; if (clippingPropertiesBundle == null) { - clippingProperties = - new ClippingProperties( - /* startPositionMs= */ 0, - /* endPositionMs= */ C.TIME_END_OF_SOURCE, - /* relativeToLiveWindow= */ false, - /* relativeToDefaultPosition= */ false, - /* startsAtKeyFrame= */ false); + clippingProperties = ClippingProperties.UNSET; } else { clippingProperties = ClippingProperties.CREATOR.fromBundle(clippingPropertiesBundle); } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index e503dfa4e4..b7760bf56a 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -307,6 +307,58 @@ public class MediaItemTest { } @Test + public void builderSetClippingProperties() { + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(URI_STRING) + .setClippingProperties( + new MediaItem.ClippingProperties.Builder() + .setStartPositionMs(1000L) + .setEndPositionMs(2000L) + .setRelativeToLiveWindow(true) + .setRelativeToDefaultPosition(true) + .setStartsAtKeyFrame(true) + .build()) + .build(); + + assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(1000L); + assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(2000L); + assertThat(mediaItem.clippingProperties.relativeToLiveWindow).isTrue(); + assertThat(mediaItem.clippingProperties.relativeToDefaultPosition).isTrue(); + assertThat(mediaItem.clippingProperties.startsAtKeyFrame).isTrue(); + } + + @Test + public void clippingPropertiesDefaults() { + MediaItem.ClippingProperties clippingProperties = + new MediaItem.ClippingProperties.Builder().build(); + + assertThat(clippingProperties.startPositionMs).isEqualTo(0L); + assertThat(clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); + assertThat(clippingProperties.relativeToLiveWindow).isFalse(); + assertThat(clippingProperties.relativeToDefaultPosition).isFalse(); + assertThat(clippingProperties.startsAtKeyFrame).isFalse(); + assertThat(clippingProperties).isEqualTo(MediaItem.ClippingProperties.UNSET); + } + + @Test + public void clippingPropertiesBuilder_throwsOnInvalidValues() { + MediaItem.ClippingProperties.Builder clippingPropertiesBuilder = + new MediaItem.ClippingProperties.Builder(); + assertThrows( + IllegalArgumentException.class, () -> clippingPropertiesBuilder.setStartPositionMs(-1)); + assertThrows( + IllegalArgumentException.class, () -> clippingPropertiesBuilder.setEndPositionMs(-1)); + + MediaItem.ClippingProperties clippingProperties = clippingPropertiesBuilder.build(); + + // Check neither of the setters succeeded in mutating the builder. + assertThat(clippingProperties.startPositionMs).isEqualTo(0L); + assertThat(clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); + } + + @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetStartPositionMs_setsStartPositionMs() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setClipStartPositionMs(1000L).build(); @@ -315,13 +367,7 @@ public class MediaItemTest { } @Test - public void builderSetStartPositionMs_zeroByDefault() { - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); - - assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(0); - } - - @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetStartPositionMs_negativeValue_throws() { MediaItem.Builder builder = new MediaItem.Builder(); @@ -329,6 +375,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetEndPositionMs_setsEndPositionMs() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setClipEndPositionMs(1000L).build(); @@ -337,13 +384,7 @@ public class MediaItemTest { } @Test - public void builderSetEndPositionMs_timeEndOfSourceByDefault() { - MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); - - assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); - } - - @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetEndPositionMs_timeEndOfSource_setsEndPositionMs() { MediaItem mediaItem = new MediaItem.Builder() @@ -356,6 +397,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetEndPositionMs_negativeValue_throws() { MediaItem.Builder builder = new MediaItem.Builder(); @@ -363,6 +405,7 @@ public class MediaItemTest { } @Test + @SuppressWarnings("deprecation") // Testing deprecated setter. public void builderSetClippingFlags_setsClippingFlags() { MediaItem mediaItem = new MediaItem.Builder() @@ -561,11 +604,14 @@ public class MediaItemTest { new MediaItem.Builder() .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(Uri.parse(URI_STRING)).build()) - .setClipEndPositionMs(1000) - .setClipRelativeToDefaultPosition(true) - .setClipRelativeToLiveWindow(true) - .setClipStartPositionMs(100) - .setClipStartsAtKeyFrame(true) + .setClippingProperties( + new MediaItem.ClippingProperties.Builder() + .setEndPositionMs(1000) + .setRelativeToDefaultPosition(true) + .setRelativeToLiveWindow(true) + .setStartPositionMs(100) + .setStartsAtKeyFrame(true) + .build()) .setCustomCacheKey("key") .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) From f2a027e0680cfe24fe0de2e2473de3e8bb79cd0a Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 22 Sep 2021 16:40:14 +0100 Subject: [PATCH 223/441] Move text classes from lib-exoplayer to lib-extractor and lib-common PiperOrigin-RevId: 398247348 --- .../exoplayer2/text/SimpleSubtitleDecoder.java | 0 .../text/SimpleSubtitleOutputBuffer.java | 0 .../HorizontalTextInVerticalContextSpan.java | 0 .../text/span/LanguageFeatureSpan.java | 0 .../android/exoplayer2/text/span/RubySpan.java | 0 .../android/exoplayer2/text/span/SpanUtil.java | 0 .../exoplayer2/text/span/TextAnnotation.java | 0 .../exoplayer2/text/span/TextEmphasisSpan.java | 0 .../exoplayer2/text/span/package-info.java | 0 .../google/android/exoplayer2/text/CueTest.java | 0 .../exoplayer2/text/span/SpanUtilTest.java | 0 .../exoplayer2/text/cea/Cea608Decoder.java | 0 .../exoplayer2/text/cea/Cea708Decoder.java | 0 .../android/exoplayer2/text/cea/CeaDecoder.java | 0 .../android/exoplayer2/text/cea/CeaSubtitle.java | 0 .../exoplayer2/text/cea/package-info.java | 0 .../android/exoplayer2/text/dvb/DvbDecoder.java | 0 .../android/exoplayer2/text/dvb/DvbParser.java | 0 .../android/exoplayer2/text/dvb/DvbSubtitle.java | 0 .../exoplayer2/text/dvb/package-info.java | 0 .../android/exoplayer2/text/pgs/PgsDecoder.java | 0 .../android/exoplayer2/text/pgs/PgsSubtitle.java | 0 .../exoplayer2/text/pgs/package-info.java | 0 .../android/exoplayer2/text/ssa/SsaDecoder.java | 0 .../exoplayer2/text/ssa/SsaDialogueFormat.java | 0 .../android/exoplayer2/text/ssa/SsaStyle.java | 0 .../android/exoplayer2/text/ssa/SsaSubtitle.java | 0 .../exoplayer2/text/ssa/package-info.java | 0 .../exoplayer2/text/subrip/SubripDecoder.java | 0 .../exoplayer2/text/subrip/SubripSubtitle.java | 0 .../exoplayer2/text/subrip/package-info.java | 0 .../exoplayer2/text/ttml/DeleteTextSpan.java | 0 .../exoplayer2/text/ttml/TextEmphasis.java | 0 .../exoplayer2/text/ttml/TtmlDecoder.java | 0 .../android/exoplayer2/text/ttml/TtmlNode.java | 0 .../android/exoplayer2/text/ttml/TtmlRegion.java | 0 .../exoplayer2/text/ttml/TtmlRenderUtil.java | 0 .../android/exoplayer2/text/ttml/TtmlStyle.java | 0 .../exoplayer2/text/ttml/TtmlSubtitle.java | 0 .../exoplayer2/text/ttml/package-info.java | 0 .../exoplayer2/text/tx3g/Tx3gDecoder.java | 0 .../exoplayer2/text/tx3g/Tx3gSubtitle.java | 0 .../exoplayer2/text/tx3g/package-info.java | 0 .../exoplayer2/text/webvtt/Mp4WebvttDecoder.java | 0 .../text/webvtt/Mp4WebvttSubtitle.java | 0 .../exoplayer2/text/webvtt/WebvttCssParser.java | 0 .../exoplayer2/text/webvtt/WebvttCssStyle.java | 0 .../exoplayer2/text/webvtt/WebvttCueInfo.java | 0 .../exoplayer2/text/webvtt/WebvttCueParser.java | 16 ++++++++-------- .../exoplayer2/text/webvtt/WebvttDecoder.java | 0 .../exoplayer2/text/webvtt/WebvttParserUtil.java | 0 .../exoplayer2/text/webvtt/WebvttSubtitle.java | 0 .../exoplayer2/text/webvtt/package-info.java | 0 .../exoplayer2/text/ssa/SsaDecoderTest.java | 0 .../text/subrip/SubripDecoderTest.java | 0 .../exoplayer2/text/ttml/TextEmphasisTest.java | 0 .../exoplayer2/text/ttml/TtmlDecoderTest.java | 0 .../exoplayer2/text/ttml/TtmlRenderUtilTest.java | 0 .../exoplayer2/text/ttml/TtmlStyleTest.java | 0 .../exoplayer2/text/tx3g/Tx3gDecoderTest.java | 0 .../text/webvtt/Mp4WebvttDecoderTest.java | 0 .../text/webvtt/WebvttCssParserTest.java | 0 .../text/webvtt/WebvttCueParserTest.java | 0 .../text/webvtt/WebvttDecoderTest.java | 0 .../text/webvtt/WebvttSubtitleTest.java | 0 65 files changed, 8 insertions(+), 8 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/HorizontalTextInVerticalContextSpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/LanguageFeatureSpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/SpanUtil.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/TextAnnotation.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/TextEmphasisSpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/text/span/package-info.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/text/CueTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/text/span/SpanUtilTest.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/cea/CeaSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/cea/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/dvb/DvbDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/dvb/DvbSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/dvb/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/pgs/PgsSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/pgs/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ssa/SsaSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ssa/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/subrip/SubripSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/subrip/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/DeleteTextSpan.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TextEmphasis.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/ttml/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/tx3g/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueInfo.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java (99%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttParserUtil.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitle.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/text/webvtt/package-info.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/ssa/SsaDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/subrip/SubripDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/ttml/TextEmphasisTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtilTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlStyleTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParserTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitleTest.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/HorizontalTextInVerticalContextSpan.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/HorizontalTextInVerticalContextSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/HorizontalTextInVerticalContextSpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/HorizontalTextInVerticalContextSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/LanguageFeatureSpan.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/LanguageFeatureSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/LanguageFeatureSpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/LanguageFeatureSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/SpanUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/SpanUtil.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/SpanUtil.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/SpanUtil.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/TextAnnotation.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/TextAnnotation.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/TextAnnotation.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/TextAnnotation.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/TextEmphasisSpan.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/TextEmphasisSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/TextEmphasisSpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/TextEmphasisSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/package-info.java b/library/common/src/main/java/com/google/android/exoplayer2/text/span/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/span/package-info.java rename to library/common/src/main/java/com/google/android/exoplayer2/text/span/package-info.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/CueTest.java b/library/common/src/test/java/com/google/android/exoplayer2/text/CueTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/CueTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/text/CueTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/span/SpanUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/text/span/SpanUtilTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/span/SpanUtilTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/text/span/SpanUtilTest.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/CeaDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/CeaSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/CeaSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/dvb/DvbSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/dvb/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/dvb/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/pgs/PgsSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/PgsSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/pgs/PgsSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/PgsSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/pgs/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/pgs/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ssa/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/SubripSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/SubripSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/subrip/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/DeleteTextSpan.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/DeleteTextSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/DeleteTextSpan.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/DeleteTextSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TextEmphasis.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TextEmphasis.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TextEmphasis.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TextEmphasis.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ttml/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/ttml/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/Tx3gSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/tx3g/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/tx3g/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java diff --git a/library/core/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 similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueInfo.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueInfo.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueInfo.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueInfo.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java similarity index 99% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java index 63cfc8b8dd..f49e080d9c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.text.webvtt; -import static com.google.android.exoplayer2.text.span.SpanUtil.addOrReplaceSpan; import static java.lang.Math.min; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -39,6 +38,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.span.HorizontalTextInVerticalContextSpan; import com.google.android.exoplayer2.text.span.RubySpan; +import com.google.android.exoplayer2.text.span.SpanUtil; import com.google.android.exoplayer2.text.span.TextAnnotation; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -662,7 +662,7 @@ public final class WebvttCueParser { return; } if (style.getStyle() != WebvttCssStyle.UNSPECIFIED) { - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new StyleSpan(style.getStyle()), start, @@ -676,7 +676,7 @@ public final class WebvttCueParser { spannedText.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (style.hasFontColor()) { - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new ForegroundColorSpan(style.getFontColor()), start, @@ -684,7 +684,7 @@ public final class WebvttCueParser { Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (style.hasBackgroundColor()) { - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new BackgroundColorSpan(style.getBackgroundColor()), start, @@ -692,7 +692,7 @@ public final class WebvttCueParser { Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (style.getFontFamily() != null) { - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new TypefaceSpan(style.getFontFamily()), start, @@ -701,7 +701,7 @@ public final class WebvttCueParser { } switch (style.getFontSizeUnit()) { case WebvttCssStyle.FONT_SIZE_UNIT_PIXEL: - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new AbsoluteSizeSpan((int) style.getFontSize(), true), start, @@ -709,7 +709,7 @@ public final class WebvttCueParser { Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); break; case WebvttCssStyle.FONT_SIZE_UNIT_EM: - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new RelativeSizeSpan(style.getFontSize()), start, @@ -717,7 +717,7 @@ public final class WebvttCueParser { Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); break; case WebvttCssStyle.FONT_SIZE_UNIT_PERCENT: - addOrReplaceSpan( + SpanUtil.addOrReplaceSpan( spannedText, new RelativeSizeSpan(style.getFontSize() / 100), start, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttParserUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttParserUtil.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttParserUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttParserUtil.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitle.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitle.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/package-info.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ssa/SsaDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/ssa/SsaDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/ssa/SsaDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/ssa/SsaDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/subrip/SubripDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/subrip/SubripDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/subrip/SubripDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/subrip/SubripDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TextEmphasisTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TextEmphasisTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TextEmphasisTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TextEmphasisTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtilTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtilTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtilTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlStyleTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlStyleTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlStyleTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/ttml/TtmlStyleTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/tx3g/Tx3gDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/Mp4WebvttDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParserTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParserTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParserTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParserTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParserTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitleTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitleTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitleTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttSubtitleTest.java From 4fec4b8f6a06e0833bc5fffe0e62f44baf490c5b Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 22 Sep 2021 17:51:04 +0100 Subject: [PATCH 224/441] Move format specific metadata packages to lib-extractor PiperOrigin-RevId: 398262695 --- .../google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java | 0 .../android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java | 0 .../google/android/exoplayer2/metadata/dvbsi/package-info.java | 0 .../com/google/android/exoplayer2/metadata/emsg/EventMessage.java | 0 .../android/exoplayer2/metadata/emsg/EventMessageDecoder.java | 0 .../android/exoplayer2/metadata/emsg/EventMessageEncoder.java | 0 .../com/google/android/exoplayer2/metadata/emsg/package-info.java | 0 .../com/google/android/exoplayer2/metadata/flac/PictureFrame.java | 0 .../google/android/exoplayer2/metadata/flac/VorbisComment.java | 0 .../com/google/android/exoplayer2/metadata/flac/package-info.java | 0 .../com/google/android/exoplayer2/metadata/icy/IcyDecoder.java | 0 .../com/google/android/exoplayer2/metadata/icy/IcyHeaders.java | 0 .../java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java | 0 .../com/google/android/exoplayer2/metadata/icy/package-info.java | 0 .../com/google/android/exoplayer2/metadata/id3/ApicFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/BinaryFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/ChapterFrame.java | 0 .../google/android/exoplayer2/metadata/id3/ChapterTocFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/CommentFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/GeobFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/Id3Decoder.java | 0 .../java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java | 0 .../com/google/android/exoplayer2/metadata/id3/InternalFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/MlltFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/PrivFrame.java | 0 .../android/exoplayer2/metadata/id3/TextInformationFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java | 0 .../com/google/android/exoplayer2/metadata/id3/package-info.java | 0 .../google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java | 0 .../android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java | 0 .../google/android/exoplayer2/metadata/mp4/SlowMotionData.java | 0 .../google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java | 0 .../com/google/android/exoplayer2/metadata/mp4/package-info.java | 0 .../google/android/exoplayer2/metadata/scte35/PrivateCommand.java | 0 .../google/android/exoplayer2/metadata/scte35/SpliceCommand.java | 0 .../android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java | 0 .../android/exoplayer2/metadata/scte35/SpliceInsertCommand.java | 0 .../android/exoplayer2/metadata/scte35/SpliceNullCommand.java | 0 .../android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java | 0 .../android/exoplayer2/metadata/scte35/TimeSignalCommand.java | 0 .../google/android/exoplayer2/metadata/scte35/package-info.java | 0 .../exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java | 0 .../android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java | 0 .../android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java | 0 .../google/android/exoplayer2/metadata/emsg/EventMessageTest.java | 0 .../google/android/exoplayer2/metadata/flac/PictureFrameTest.java | 0 .../android/exoplayer2/metadata/flac/VorbisCommentTest.java | 0 .../google/android/exoplayer2/metadata/icy/IcyDecoderTest.java | 0 .../google/android/exoplayer2/metadata/icy/IcyHeadersTest.java | 0 .../com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java | 0 .../com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java | 0 .../google/android/exoplayer2/metadata/id3/ChapterFrameTest.java | 0 .../android/exoplayer2/metadata/id3/ChapterTocFrameTest.java | 0 .../google/android/exoplayer2/metadata/id3/Id3DecoderTest.java | 0 .../com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java | 0 .../android/exoplayer2/metadata/id3/TextInformationFrameTest.java | 0 .../android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java | 0 .../android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java | 0 .../android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java | 0 .../android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java | 0 60 files changed, 0 insertions(+), 0 deletions(-) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/package-info.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessage.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/emsg/package-info.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/flac/PictureFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/flac/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/icy/package-info.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/ApicFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/BinaryFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/CommentFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/GeobFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/InternalFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/PrivFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/id3/package-info.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/mp4/SlowMotionData.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/mp4/package-info.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/PrivateCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceNullCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/TimeSignalCommand.java (100%) rename library/{core => extractor}/src/main/java/com/google/android/exoplayer2/metadata/scte35/package-info.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/flac/PictureFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/flac/VorbisCommentTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyDecoderTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyHeadersTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrameTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java (100%) rename library/{core => extractor}/src/test/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTable.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/package-info.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessage.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessage.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessage.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessage.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/emsg/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/emsg/package-info.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/PictureFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/PictureFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/PictureFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/PictureFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/VorbisComment.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/flac/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/flac/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyInfo.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/package-info.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ApicFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ApicFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ApicFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ApicFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/BinaryFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/BinaryFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/BinaryFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/BinaryFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/CommentFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/CommentFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/CommentFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/CommentFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/GeobFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/GeobFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/GeobFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/GeobFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Frame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/InternalFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/InternalFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/InternalFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/InternalFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/PrivFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/PrivFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/PrivFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/PrivFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/UrlLinkFrame.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/package-info.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntry.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/SlowMotionData.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/SlowMotionData.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/SlowMotionData.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/SlowMotionData.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntry.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/mp4/package-info.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/PrivateCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/PrivateCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/PrivateCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/PrivateCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoder.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceNullCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceNullCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceNullCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceNullCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/TimeSignalCommand.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/TimeSignalCommand.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/TimeSignalCommand.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/TimeSignalCommand.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/metadata/scte35/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/package-info.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoderTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageDecoderTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageEncoderTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/emsg/EventMessageTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/flac/PictureFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/flac/PictureFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/flac/PictureFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/flac/PictureFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/flac/VorbisCommentTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/flac/VorbisCommentTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/flac/VorbisCommentTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/flac/VorbisCommentTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyDecoderTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyHeadersTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyHeadersTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyHeadersTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyHeadersTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/icy/IcyInfoTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ApicFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/Id3DecoderTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/MlltFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrameTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrameTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrameTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrameTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/MdtaMetadataEntryTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/mp4/SmtaMetadataEntryTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/scte35/SpliceInfoDecoderTest.java From c5abf346464657fff96f5e2322a7af6606ff2a09 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 23 Sep 2021 11:21:39 +0100 Subject: [PATCH 225/441] Add ExoPlayer.Builder#buildExoPlayer method Annotate build() with @InlineMe. I will update build() to return Player in a future change. PiperOrigin-RevId: 398446323 --- library/core/build.gradle | 1 + .../java/com/google/android/exoplayer2/ExoPlayer.java | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/library/core/build.gradle b/library/core/build.gradle index bebd62beb9..98dd2929e7 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -39,6 +39,7 @@ dependencies { api project(modulePrefix + 'library-extractor') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version + compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index c44d5677ff..fe733dd4d1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -54,6 +54,7 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; +import com.google.errorprone.annotations.InlineMe; import java.util.List; /** @@ -820,7 +821,17 @@ public interface ExoPlayer extends Player { * * @throws IllegalStateException If this method has already been called. */ + @InlineMe(replacement = "this.buildExoPlayer()") public SimpleExoPlayer build() { + return buildExoPlayer(); + } + + /** + * Builds a {@link SimpleExoPlayer} instance. + * + * @throws IllegalStateException If this method has already been called. + */ + public SimpleExoPlayer buildExoPlayer() { return wrappedBuilder.build(); } } From aefe02434fc76082aeabf5d07544bd89acb9aad1 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 23 Sep 2021 14:56:59 +0100 Subject: [PATCH 226/441] Upgrade dackka This brings in a fix that prevented documentation generation due to `

      ` tags not being supported. PiperOrigin-RevId: 398475800 --- javadoc_combined.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javadoc_combined.gradle b/javadoc_combined.gradle index 73c80358f6..ed5cc7d075 100644 --- a/javadoc_combined.gradle +++ b/javadoc_combined.gradle @@ -19,8 +19,9 @@ class CombinedJavadocPlugin implements Plugin { static final String JAVADOC_TASK_NAME = "generateCombinedJavadoc" static final String DACKKA_TASK_NAME = "generateCombinedDackka" + # Dackka snapshots are listed at https://androidx.dev/dackka/builds. static final String DACKKA_JAR_URL = - "https://androidx.dev/dackka/builds/7709825/artifacts/dackka-0.0.9.jar" + "https://androidx.dev/dackka/builds/7758117/artifacts/dackka-0.0.10.jar" @Override void apply(Project project) { From 7f99d301998fde59bbbad3e4a66b4c1c5b5e8c78 Mon Sep 17 00:00:00 2001 From: gyumin Date: Thu, 23 Sep 2021 16:09:16 +0100 Subject: [PATCH 227/441] Fix gradle sync error PiperOrigin-RevId: 398489644 --- javadoc_combined.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc_combined.gradle b/javadoc_combined.gradle index ed5cc7d075..19dabbf167 100644 --- a/javadoc_combined.gradle +++ b/javadoc_combined.gradle @@ -19,7 +19,7 @@ class CombinedJavadocPlugin implements Plugin { static final String JAVADOC_TASK_NAME = "generateCombinedJavadoc" static final String DACKKA_TASK_NAME = "generateCombinedDackka" - # Dackka snapshots are listed at https://androidx.dev/dackka/builds. + // Dackka snapshots are listed at https://androidx.dev/dackka/builds. static final String DACKKA_JAR_URL = "https://androidx.dev/dackka/builds/7758117/artifacts/dackka-0.0.10.jar" From fecb8b7ec8bde414c046b1f3f4efda247d717767 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 23 Sep 2021 18:23:24 +0100 Subject: [PATCH 228/441] Make parameter name match inherited doc @param This is currently required to make javadoc generation via Dackka succeed. PiperOrigin-RevId: 398518538 --- .../exoplayer2/trackselection/DefaultTrackSelector.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 0572e89a0e..7f3389ffe7 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 @@ -609,8 +609,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { } @Override - public ParametersBuilder setDisabledTrackTypes(Set<@C.TrackType Integer> trackTypes) { - super.setDisabledTrackTypes(trackTypes); + public ParametersBuilder setDisabledTrackTypes(Set<@C.TrackType Integer> disabledTrackTypes) { + super.setDisabledTrackTypes(disabledTrackTypes); return this; } From a720380e7755e3f532205281a72d9b631cd32cc2 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 24 Sep 2021 14:52:32 +0100 Subject: [PATCH 229/441] Update DownloadService for Android 12 - If DownloadService is configured to run as a foreground service, it will remain started and in the foreground when downloads are waiting for requirements to be met, with a suitable "waiting for XYZ" message in the notification. This is necessary because new foreground service restrictions in Android 12 prevent to service from being restarted from the background. - Cases where requirements are not supported by the Scheduler will be handled in the same way, even on earlier versions of Android. So will cases where a Scheduler is not provided. - The Scheduler will still be used on earlier versions of Android where possible. Note: We could technically continue to use the old behavior on Android 12 in cases where the containing application still has a targetSdkVersion corresponding to Android 11 or earlier. However, in practice, there seems to be little value in doing this. PiperOrigin-RevId: 398720114 --- RELEASENOTES.md | 12 + .../exoplayer2/offline/DownloadService.java | 205 ++++++++++++------ 2 files changed, 147 insertions(+), 70 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index eb04bdb5e4..40a14057db 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -14,6 +14,10 @@ * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. * Android 12 compatibility: + * Keep `DownloadService` started and in the foreground whilst waiting for + requirements to be met on Android 12. This is necessary due to new + [foreground service launch restrictions](https://developer.android.com/about/versions/12/foreground-services). + `DownloadService.getScheduler` will not be called on Android 12 devices. * Disable platform transcoding when playing content URIs on Android 12. * Add `ExoPlayer.setVideoChangeFrameRateStrategy` to allow disabling of calls from the player to `Surface.setFrameRate`. This is useful for @@ -23,6 +27,14 @@ * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with `Player.addListener`. +* Downloads and caching: + * Modify `DownloadService` behavior when `DownloadService.getScheduler` + returns `null`, or returns a `Scheduler` that does not support the + requirements for downloads to continue. In both cases, `DownloadService` + will now remain started and in the foreground whilst waiting for + requirements to be met. + * Modify `DownlaodService` behavior when running on Android 12 and above. + See the "Android 12 compatibility" section above. * RTSP: * Support RFC4566 SDP attribute field grammar ([#9430](https://github.com/google/ExoPlayer/issues/9430)). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java index f0f22af1ac..ea9e6f8569 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java @@ -28,6 +28,7 @@ import android.os.Looper; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.google.android.exoplayer2.scheduler.Requirements; +import com.google.android.exoplayer2.scheduler.Requirements.RequirementFlags; import com.google.android.exoplayer2.scheduler.Scheduler; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -36,6 +37,7 @@ import com.google.android.exoplayer2.util.Util; import java.util.HashMap; import java.util.List; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** A {@link Service} for downloading media. */ public abstract class DownloadService extends Service { @@ -179,8 +181,7 @@ public abstract class DownloadService extends Service { @StringRes private final int channelNameResourceId; @StringRes private final int channelDescriptionResourceId; - private @MonotonicNonNull Scheduler scheduler; - private @MonotonicNonNull DownloadManager downloadManager; + private @MonotonicNonNull DownloadManagerHelper downloadManagerHelper; private int lastStartId; private boolean startedInForeground; private boolean taskRemoved; @@ -191,8 +192,7 @@ public abstract class DownloadService extends Service { * Creates a DownloadService. * *

      If {@code foregroundNotificationId} is {@link #FOREGROUND_NOTIFICATION_ID_NONE} then the - * service will only ever run in the background. No foreground notification will be displayed and - * {@link #getScheduler()} will not be called. + * service will only ever run in the background, and no foreground notification will be displayed. * *

      If {@code foregroundNotificationId} is not {@link #FOREGROUND_NOTIFICATION_ID_NONE} then the * service will run in the foreground. The foreground notification will be updated at least as @@ -583,22 +583,19 @@ public abstract class DownloadService extends Service { @Nullable DownloadManagerHelper downloadManagerHelper = downloadManagerHelpers.get(clazz); if (downloadManagerHelper == null) { boolean foregroundAllowed = foregroundNotificationUpdater != null; - @Nullable Scheduler scheduler = foregroundAllowed ? getScheduler() : null; - if (scheduler != null) { - this.scheduler = scheduler; - } - downloadManager = getDownloadManager(); + // See https://developer.android.com/about/versions/12/foreground-services. + boolean canStartForegroundServiceFromBackground = Util.SDK_INT < 31; + @Nullable + Scheduler scheduler = + foregroundAllowed && canStartForegroundServiceFromBackground ? getScheduler() : null; + DownloadManager downloadManager = getDownloadManager(); downloadManager.resumeDownloads(); downloadManagerHelper = new DownloadManagerHelper( getApplicationContext(), downloadManager, foregroundAllowed, scheduler, clazz); downloadManagerHelpers.put(clazz, downloadManagerHelper); - } else { - if (downloadManagerHelper.scheduler != null) { - scheduler = downloadManagerHelper.scheduler; - } - downloadManager = downloadManagerHelper.downloadManager; } + this.downloadManagerHelper = downloadManagerHelper; downloadManagerHelper.attachService(this); } @@ -618,7 +615,8 @@ public abstract class DownloadService extends Service { if (intentAction == null) { intentAction = ACTION_INIT; } - DownloadManager downloadManager = Assertions.checkNotNull(this.downloadManager); + DownloadManager downloadManager = + Assertions.checkNotNull(downloadManagerHelper).downloadManager; switch (intentAction) { case ACTION_INIT: case ACTION_RESTART: @@ -666,21 +664,6 @@ public abstract class DownloadService extends Service { if (requirements == null) { Log.e(TAG, "Ignored SET_REQUIREMENTS: Missing " + KEY_REQUIREMENTS + " extra"); } else { - if (scheduler != null) { - Requirements supportedRequirements = scheduler.getSupportedRequirements(requirements); - if (!supportedRequirements.equals(requirements)) { - Log.w( - TAG, - "Ignoring requirements not supported by the Scheduler: " - + (requirements.getRequirements() ^ supportedRequirements.getRequirements())); - // We need to make sure DownloadManager only uses requirements supported by the - // Scheduler. If we don't do this, DownloadManager can report itself as idle due to an - // unmet requirement that the Scheduler doesn't support. This can then lead to the - // service being destroyed, even though the Scheduler won't be able to restart it when - // the requirement is subsequently met. - requirements = supportedRequirements; - } - } downloadManager.setRequirements(requirements); } break; @@ -696,7 +679,7 @@ public abstract class DownloadService extends Service { isStopped = false; if (downloadManager.isIdle()) { - stop(); + onIdle(); } return START_STICKY; } @@ -709,9 +692,7 @@ public abstract class DownloadService extends Service { @Override public void onDestroy() { isDestroyed = true; - DownloadManagerHelper downloadManagerHelper = - Assertions.checkNotNull(downloadManagerHelpers.get(getClass())); - downloadManagerHelper.detachService(this); + Assertions.checkNotNull(downloadManagerHelper).detachService(this); if (foregroundNotificationUpdater != null) { foregroundNotificationUpdater.stopPeriodicUpdates(); } @@ -733,14 +714,35 @@ public abstract class DownloadService extends Service { protected abstract DownloadManager getDownloadManager(); /** - * Returns a {@link Scheduler} to restart the service when requirements allowing downloads to take - * place are met. If {@code null}, the service will only be restarted if the process is still in - * memory when the requirements are met. + * Returns a {@link Scheduler} to restart the service when requirements for downloads to continue + * are met. * - *

      This method is not called for services whose {@code foregroundNotificationId} is set to - * {@link #FOREGROUND_NOTIFICATION_ID_NONE}. Such services will only be restarted if the process - * is still in memory and considered non-idle, meaning that it's either in the foreground or was - * backgrounded within the last few minutes. + *

      This method is not called on all devices or for all service configurations. When it is + * called, it's called only once in the life cycle of the process. If a service has unfinished + * downloads that cannot make progress due to unmet requirements, it will behave according to the + * first matching case below: + * + *

        + *
      • If the service has {@code foregroundNotificationId} set to {@link + * #FOREGROUND_NOTIFICATION_ID_NONE}, then this method will not be called. The service will + * remain in the background until the downloads are able to continue to completion or the + * service is killed by the platform. + *
      • If the device API level is less than 31, a {@link Scheduler} is returned from this + * method, and the returned {@link Scheduler} {@link Scheduler#getSupportedRequirements + * supports} all of the requirements that have been specified for downloads to continue, + * then the service will stop itself and the {@link Scheduler} will be used to restart it in + * the foreground when the requirements are met. + *
      • If the device API level is less than 31 and either {@code null} or a {@link Scheduler} + * that does not {@link Scheduler#getSupportedRequirements support} all of the requirements + * is returned from this method, then the service will remain in the foreground until the + * downloads are able to continue to completion. + *
      • If the device API level is 31 or above, then this method will not be called and the + * service will remain in the foreground until the downloads are able to continue to + * completion. A {@link Scheduler} cannot be used for this case due to Android 12 + * foreground service launch restrictions. + *
      • + *
      */ @Nullable protected abstract Scheduler getScheduler(); @@ -758,7 +760,7 @@ public abstract class DownloadService extends Service { * @return The foreground notification to display. */ protected abstract Notification getForegroundNotification( - List downloads, @Requirements.RequirementFlags int notMetRequirements); + List downloads, @RequirementFlags int notMetRequirements); /** * Invalidates the current foreground notification and causes {@link @@ -813,10 +815,21 @@ public abstract class DownloadService extends Service { return isStopped; } - private void stop() { + private void onIdle() { if (foregroundNotificationUpdater != null) { + // Whether the service remains started or not, we don't need periodic notification updates + // when the DownloadManager is idle. foregroundNotificationUpdater.stopPeriodicUpdates(); } + + if (!Assertions.checkNotNull(downloadManagerHelper).updateScheduler()) { + // We failed to schedule the service to restart when requirements that the DownloadManager is + // waiting for are met, so remain started. + return; + } + + // Stop the service, either because the DownloadManager is not waiting for requirements to be + // met, or because we've scheduled the service to be restarted when they are. if (Util.SDK_INT < 28 && taskRemoved) { // See [Internal: b/74248644]. stopSelf(); isStopped = true; @@ -887,9 +900,10 @@ public abstract class DownloadService extends Service { } private void update() { - List downloads = Assertions.checkNotNull(downloadManager).getCurrentDownloads(); - @Requirements.RequirementFlags - int notMetRequirements = downloadManager.getNotMetRequirements(); + DownloadManager downloadManager = + Assertions.checkNotNull(downloadManagerHelper).downloadManager; + List downloads = downloadManager.getCurrentDownloads(); + @RequirementFlags int notMetRequirements = downloadManager.getNotMetRequirements(); Notification notification = getForegroundNotification(downloads, notMetRequirements); if (!notificationDisplayed) { startForeground(notificationId, notification); @@ -914,7 +928,9 @@ public abstract class DownloadService extends Service { private final boolean foregroundAllowed; @Nullable private final Scheduler scheduler; private final Class serviceClass; + @Nullable private DownloadService downloadService; + private @MonotonicNonNull Requirements scheduledRequirements; private DownloadManagerHelper( Context context, @@ -949,8 +965,46 @@ public abstract class DownloadService extends Service { public void detachService(DownloadService downloadService) { Assertions.checkState(this.downloadService == downloadService); this.downloadService = null; - if (scheduler != null && !downloadManager.isWaitingForRequirements()) { - scheduler.cancel(); + } + + /** + * Schedules or cancels restarting the service, as needed for the current state. + * + * @return True if the DownloadManager is not waiting for requirements, or if it is waiting for + * requirements and the service has been successfully scheduled to be restarted when they + * are met. False if the DownloadManager is waiting for requirements and the service has not + * been scheduled for restart. + */ + public boolean updateScheduler() { + boolean waitingForRequirements = downloadManager.isWaitingForRequirements(); + if (scheduler == null) { + return !waitingForRequirements; + } + + if (!waitingForRequirements) { + cancelScheduler(); + return true; + } + + Requirements requirements = downloadManager.getRequirements(); + Requirements supportedRequirements = scheduler.getSupportedRequirements(requirements); + if (!supportedRequirements.equals(requirements)) { + cancelScheduler(); + return false; + } + + if (!schedulerNeedsUpdate(requirements)) { + return true; + } + + String servicePackage = context.getPackageName(); + if (scheduler.schedule(requirements, servicePackage, ACTION_RESTART)) { + scheduledRequirements = requirements; + return true; + } else { + Log.w(TAG, "Failed to schedule restart"); + cancelScheduler(); + return false; } } @@ -989,10 +1043,18 @@ public abstract class DownloadService extends Service { @Override public final void onIdle(DownloadManager downloadManager) { if (downloadService != null) { - downloadService.stop(); + downloadService.onIdle(); } } + @Override + public void onRequirementsStateChanged( + DownloadManager downloadManager, + Requirements requirements, + @RequirementFlags int notMetRequirements) { + updateScheduler(); + } + @Override public void onWaitingForRequirementsChanged( DownloadManager downloadManager, boolean waitingForRequirements) { @@ -1006,23 +1068,42 @@ public abstract class DownloadService extends Service { for (int i = 0; i < downloads.size(); i++) { if (downloads.get(i).state == Download.STATE_QUEUED) { restartService(); - break; + return; } } } - updateScheduler(); } // Internal methods. + private boolean schedulerNeedsUpdate(Requirements requirements) { + return !Util.areEqual(scheduledRequirements, requirements); + } + + @RequiresNonNull("scheduler") + private void cancelScheduler() { + Requirements canceledRequirements = new Requirements(/* requirements= */ 0); + if (schedulerNeedsUpdate(canceledRequirements)) { + scheduler.cancel(); + scheduledRequirements = canceledRequirements; + } + } + private boolean serviceMayNeedRestart() { return downloadService == null || downloadService.isStopped(); } private void restartService() { if (foregroundAllowed) { - Intent intent = getIntent(context, serviceClass, DownloadService.ACTION_RESTART); - Util.startForegroundService(context, intent); + try { + Intent intent = getIntent(context, serviceClass, DownloadService.ACTION_RESTART); + Util.startForegroundService(context, intent); + } catch (IllegalStateException e) { + // The process is running in the background, and is not allowed to start a foreground + // service due to foreground service launch restrictions + // (https://developer.android.com/about/versions/12/foreground-services). + Log.w(TAG, "Failed to restart (foreground launch restriction)"); + } } else { // The service is background only. Use ACTION_INIT rather than ACTION_RESTART because // ACTION_RESTART is handled as though KEY_FOREGROUND is set to true. @@ -1032,25 +1113,9 @@ public abstract class DownloadService extends Service { } catch (IllegalStateException e) { // The process is classed as idle by the platform. Starting a background service is not // allowed in this state. - Log.w(TAG, "Failed to restart DownloadService (process is idle)."); + Log.w(TAG, "Failed to restart (process is idle)"); } } } - - private void updateScheduler() { - if (scheduler == null) { - return; - } - if (downloadManager.isWaitingForRequirements()) { - String servicePackage = context.getPackageName(); - Requirements requirements = downloadManager.getRequirements(); - boolean success = scheduler.schedule(requirements, servicePackage, ACTION_RESTART); - if (!success) { - Log.e(TAG, "Scheduling downloads failed."); - } - } else { - scheduler.cancel(); - } - } } } From 0cd1031dcd36fed61999486b897c1a1beace6ae9 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 24 Sep 2021 17:00:56 +0100 Subject: [PATCH 230/441] Rename MediaItem.PlaybackProperties to LocalConfiguration This aligns with other MediaItem.FooConfiguration class names and also more clearly represents that this class encapsulates information used for local playback that is lost when serializing MediaItem between processes. The old class and fields are kept (deprecated) for backwards compatibility. PiperOrigin-RevId: 398742708 --- .../google/android/exoplayer2/MediaItem.java | 96 ++++++++++----- .../android/exoplayer2/MediaItemTest.java | 111 +++++++++--------- 2 files changed, 121 insertions(+), 86 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 3621404e4c..98059d98db 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -99,19 +99,19 @@ public final class MediaItem implements Bundleable { mediaId = mediaItem.mediaId; mediaMetadata = mediaItem.mediaMetadata; liveConfiguration = mediaItem.liveConfiguration.buildUpon(); - @Nullable PlaybackProperties playbackProperties = mediaItem.playbackProperties; - if (playbackProperties != null) { - customCacheKey = playbackProperties.customCacheKey; - mimeType = playbackProperties.mimeType; - uri = playbackProperties.uri; - streamKeys = playbackProperties.streamKeys; - subtitles = playbackProperties.subtitles; - tag = playbackProperties.tag; + @Nullable LocalConfiguration localConfiguration = mediaItem.localConfiguration; + if (localConfiguration != null) { + customCacheKey = localConfiguration.customCacheKey; + mimeType = localConfiguration.mimeType; + uri = localConfiguration.uri; + streamKeys = localConfiguration.streamKeys; + subtitles = localConfiguration.subtitles; + tag = localConfiguration.tag; drmConfiguration = - playbackProperties.drmConfiguration != null - ? playbackProperties.drmConfiguration.buildUpon() + localConfiguration.drmConfiguration != null + ? localConfiguration.drmConfiguration.buildUpon() : new DrmConfiguration.Builder(); - adsConfiguration = playbackProperties.adsConfiguration; + adsConfiguration = localConfiguration.adsConfiguration; } } @@ -128,9 +128,9 @@ public final class MediaItem implements Bundleable { /** * Sets the optional URI. * - *

      If {@code uri} is null or unset then no {@link PlaybackProperties} object is created + *

      If {@code uri} is null or unset then no {@link LocalConfiguration} object is created * during {@link #build()} and no other {@code Builder} methods that would populate {@link - * MediaItem#playbackProperties} should be called. + * MediaItem#localConfiguration} should be called. */ public Builder setUri(@Nullable String uri) { return setUri(uri == null ? null : Uri.parse(uri)); @@ -139,9 +139,9 @@ public final class MediaItem implements Bundleable { /** * Sets the optional URI. * - *

      If {@code uri} is null or unset then no {@link PlaybackProperties} object is created + *

      If {@code uri} is null or unset then no {@link LocalConfiguration} object is created * during {@link #build()} and no other {@code Builder} methods that would populate {@link - * MediaItem#playbackProperties} should be called. + * MediaItem#localConfiguration} should be called. */ public Builder setUri(@Nullable Uri uri) { this.uri = uri; @@ -334,7 +334,7 @@ public final class MediaItem implements Bundleable { *

      {@code null} or an empty {@link List} can be used for a reset. * *

      If {@link #setUri} is passed a non-null {@code uri}, the stream keys are used to create a - * {@link PlaybackProperties} object. Otherwise they will be ignored. + * {@link LocalConfiguration} object. Otherwise they will be ignored. */ public Builder setStreamKeys(@Nullable List streamKeys) { this.streamKeys = @@ -485,13 +485,14 @@ public final class MediaItem implements Bundleable { } /** Returns a new {@link MediaItem} instance with the current builder values. */ + @SuppressWarnings("deprecation") // Using PlaybackProperties while it exists. public MediaItem build() { // TODO: remove this check once all the deprecated individual DRM setters are removed. checkState(drmConfiguration.licenseUri == null || drmConfiguration.scheme != null); - @Nullable PlaybackProperties playbackProperties = null; + @Nullable PlaybackProperties localConfiguration = null; @Nullable Uri uri = this.uri; if (uri != null) { - playbackProperties = + localConfiguration = new PlaybackProperties( uri, mimeType, @@ -505,7 +506,7 @@ public final class MediaItem implements Bundleable { return new MediaItem( mediaId != null ? mediaId : DEFAULT_MEDIA_ID, clippingProperties.build(), - playbackProperties, + localConfiguration, liveConfiguration.build(), mediaMetadata != null ? mediaMetadata : MediaMetadata.EMPTY); } @@ -861,7 +862,8 @@ public final class MediaItem implements Bundleable { } /** Properties for local playback. */ - public static final class PlaybackProperties { + // TODO: Mark this final when PlaybackProperties is deleted. + public static class LocalConfiguration { /** The {@link Uri}. */ public final Uri uri; @@ -896,7 +898,7 @@ public final class MediaItem implements Bundleable { */ @Nullable public final Object tag; - private PlaybackProperties( + private LocalConfiguration( Uri uri, @Nullable String mimeType, @Nullable DrmConfiguration drmConfiguration, @@ -920,10 +922,10 @@ public final class MediaItem implements Bundleable { if (this == obj) { return true; } - if (!(obj instanceof PlaybackProperties)) { + if (!(obj instanceof LocalConfiguration)) { return false; } - PlaybackProperties other = (PlaybackProperties) obj; + LocalConfiguration other = (LocalConfiguration) obj; return uri.equals(other.uri) && Util.areEqual(mimeType, other.mimeType) @@ -949,6 +951,31 @@ public final class MediaItem implements Bundleable { } } + /** @deprecated Use {@link LocalConfiguration}. */ + @Deprecated + public static final class PlaybackProperties extends LocalConfiguration { + + private PlaybackProperties( + Uri uri, + @Nullable String mimeType, + @Nullable DrmConfiguration drmConfiguration, + @Nullable AdsConfiguration adsConfiguration, + List streamKeys, + @Nullable String customCacheKey, + List subtitles, + @Nullable Object tag) { + super( + uri, + mimeType, + drmConfiguration, + adsConfiguration, + streamKeys, + customCacheKey, + subtitles, + tag); + } + } + /** Live playback configuration. */ public static final class LiveConfiguration implements Bundleable { @@ -1555,8 +1582,13 @@ public final class MediaItem implements Bundleable { /** Identifies the media item. */ public final String mediaId; - /** Optional playback properties. May be {@code null} if shared over process boundaries. */ - @Nullable public final PlaybackProperties playbackProperties; + /** + * Optional configuration for local playback. May be {@code null} if shared over process + * boundaries. + */ + @Nullable public final LocalConfiguration localConfiguration; + /** @deprecated Use {@link #localConfiguration} instead. */ + @Deprecated @Nullable public final PlaybackProperties playbackProperties; /** The live playback configuration. */ public final LiveConfiguration liveConfiguration; @@ -1567,14 +1599,16 @@ public final class MediaItem implements Bundleable { /** The clipping properties. */ public final ClippingProperties clippingProperties; + @SuppressWarnings("deprecation") // Using PlaybackProperties until it's deleted. private MediaItem( String mediaId, ClippingProperties clippingProperties, - @Nullable PlaybackProperties playbackProperties, + @Nullable PlaybackProperties localConfiguration, LiveConfiguration liveConfiguration, MediaMetadata mediaMetadata) { this.mediaId = mediaId; - this.playbackProperties = playbackProperties; + this.localConfiguration = localConfiguration; + this.playbackProperties = localConfiguration; this.liveConfiguration = liveConfiguration; this.mediaMetadata = mediaMetadata; this.clippingProperties = clippingProperties; @@ -1598,7 +1632,7 @@ public final class MediaItem implements Bundleable { return Util.areEqual(mediaId, other.mediaId) && clippingProperties.equals(other.clippingProperties) - && Util.areEqual(playbackProperties, other.playbackProperties) + && Util.areEqual(localConfiguration, other.localConfiguration) && Util.areEqual(liveConfiguration, other.liveConfiguration) && Util.areEqual(mediaMetadata, other.mediaMetadata); } @@ -1606,7 +1640,7 @@ public final class MediaItem implements Bundleable { @Override public int hashCode() { int result = mediaId.hashCode(); - result = 31 * result + (playbackProperties != null ? playbackProperties.hashCode() : 0); + result = 31 * result + (localConfiguration != null ? localConfiguration.hashCode() : 0); result = 31 * result + liveConfiguration.hashCode(); result = 31 * result + clippingProperties.hashCode(); result = 31 * result + mediaMetadata.hashCode(); @@ -1633,7 +1667,7 @@ public final class MediaItem implements Bundleable { /** * {@inheritDoc} * - *

      It omits the {@link #playbackProperties} field. The {@link #playbackProperties} of an + *

      It omits the {@link #localConfiguration} field. The {@link #localConfiguration} of an * instance restored by {@link #CREATOR} will always be {@code null}. */ @Override @@ -1649,7 +1683,7 @@ public final class MediaItem implements Bundleable { /** * Object that can restore {@link MediaItem} from a {@link Bundle}. * - *

      The {@link #playbackProperties} of a restored instance will always be {@code null}. + *

      The {@link #localConfiguration} of a restored instance will always be {@code null}. */ public static final Creator CREATOR = MediaItem::fromBundle; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index b7760bf56a..45b54f3047 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -45,7 +45,7 @@ public class MediaItemTest { MediaItem mediaItem = MediaItem.fromUri(uri); - assertThat(mediaItem.playbackProperties.uri).isEqualTo(uri); + assertThat(mediaItem.localConfiguration.uri).isEqualTo(uri); assertThat(mediaItem.mediaMetadata).isNotNull(); } @@ -53,7 +53,7 @@ public class MediaItemTest { public void builderWithUriAsString_setsUri() { MediaItem mediaItem = MediaItem.fromUri(URI_STRING); - assertThat(mediaItem.playbackProperties.uri.toString()).isEqualTo(URI_STRING); + assertThat(mediaItem.localConfiguration.uri.toString()).isEqualTo(URI_STRING); } @Test @@ -67,7 +67,7 @@ public class MediaItemTest { public void builderSetMimeType_isNullByDefault() { MediaItem mediaItem = MediaItem.fromUri(URI_STRING); - assertThat(mediaItem.playbackProperties.mimeType).isNull(); + assertThat(mediaItem.localConfiguration.mimeType).isNull(); } @Test @@ -75,14 +75,14 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setMimeType(MimeTypes.APPLICATION_MPD).build(); - assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD); + assertThat(mediaItem.localConfiguration.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD); } @Test public void builder_drmConfigIsNullByDefault() { // Null value by default. MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); - assertThat(mediaItem.playbackProperties.drmConfiguration).isNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration).isNull(); } @Test @@ -105,20 +105,20 @@ public class MediaItemTest { .setDrmUuid(C.WIDEVINE_UUID) .build(); - assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); - assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); - assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) + assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isEqualTo(licenseUri); + assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders) .isEqualTo(requestHeaders); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders) + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders) .isEqualTo(requestHeaders); - assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes) + assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO); - assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId); + assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId); } @Test @@ -142,17 +142,17 @@ public class MediaItemTest { .setDrmConfiguration(new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID).build()) .build(); - assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); - assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.CLEARKEY_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isNull(); - assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders).isEmpty(); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders).isEmpty(); - assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isFalse(); - assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isFalse(); - assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isFalse(); - assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes).isEmpty(); - assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.CLEARKEY_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.CLEARKEY_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders).isEmpty(); + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders).isEmpty(); + assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isFalse(); + assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isFalse(); + assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isFalse(); + assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes).isEmpty(); + assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isNull(); } @Test @@ -177,20 +177,20 @@ public class MediaItemTest { .build()) .build(); - assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull(); - assertThat(mediaItem.playbackProperties.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri); - assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders) + assertThat(mediaItem.localConfiguration.drmConfiguration).isNotNull(); + assertThat(mediaItem.localConfiguration.drmConfiguration.scheme).isEqualTo(C.WIDEVINE_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID); + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseUri).isEqualTo(licenseUri); + assertThat(mediaItem.localConfiguration.drmConfiguration.requestHeaders) .isEqualTo(requestHeaders); - assertThat(mediaItem.playbackProperties.drmConfiguration.licenseRequestHeaders) + assertThat(mediaItem.localConfiguration.drmConfiguration.licenseRequestHeaders) .isEqualTo(requestHeaders); - assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.forceDefaultLicenseUri).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue(); - assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes) + assertThat(mediaItem.localConfiguration.drmConfiguration.multiSession).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue(); + assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO); - assertThat(mediaItem.playbackProperties.drmConfiguration.getKeySetId()).isEqualTo(keySetId); + assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId); } @Test @@ -206,7 +206,7 @@ public class MediaItemTest { .setDrmSessionForClearPeriods(true) .build(); - assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes) + assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); } @@ -242,7 +242,7 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setCustomCacheKey("key").build(); - assertThat(mediaItem.playbackProperties.customCacheKey).isEqualTo("key"); + assertThat(mediaItem.localConfiguration.customCacheKey).isEqualTo("key"); } @Test @@ -254,7 +254,7 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setStreamKeys(streamKeys).build(); - assertThat(mediaItem.playbackProperties.streamKeys).isEqualTo(streamKeys); + assertThat(mediaItem.localConfiguration.streamKeys).isEqualTo(streamKeys); } @Test @@ -287,14 +287,14 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setSubtitles(subtitles).build(); - assertThat(mediaItem.playbackProperties.subtitles).isEqualTo(subtitles); + assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitles); } @Test public void builderSetTag_isNullByDefault() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); - assertThat(mediaItem.playbackProperties.tag).isNull(); + assertThat(mediaItem.localConfiguration.tag).isNull(); } @Test @@ -303,7 +303,7 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setTag(tag).build(); - assertThat(mediaItem.playbackProperties.tag).isEqualTo(tag); + assertThat(mediaItem.localConfiguration.tag).isEqualTo(tag); } @Test @@ -430,8 +430,8 @@ public class MediaItemTest { .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build(); - assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); - assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isNull(); + assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isNull(); } @Test @@ -445,8 +445,8 @@ public class MediaItemTest { .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adsId).build()) .build(); - assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); - assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isEqualTo(adsId); + assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isEqualTo(adsId); } @Test @@ -456,8 +456,8 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setAdTagUri(adTagUri).build(); - assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); - assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isNull(); + assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isNull(); } @Test @@ -469,8 +469,8 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setAdTagUri(adTagUri, adsId).build(); - assertThat(mediaItem.playbackProperties.adsConfiguration.adTagUri).isEqualTo(adTagUri); - assertThat(mediaItem.playbackProperties.adsConfiguration.adsId).isEqualTo(adsId); + assertThat(mediaItem.localConfiguration.adsConfiguration.adTagUri).isEqualTo(adTagUri); + assertThat(mediaItem.localConfiguration.adsConfiguration.adsId).isEqualTo(adsId); } @Test @@ -596,6 +596,7 @@ public class MediaItemTest { MediaItem copy = mediaItem.buildUpon().build(); assertThat(copy).isEqualTo(mediaItem); + assertThat(copy.localConfiguration).isEqualTo(mediaItem.playbackProperties); } @Test @@ -674,7 +675,7 @@ public class MediaItemTest { .setClipStartsAtKeyFrame(true) .build(); - assertThat(mediaItem.playbackProperties).isNull(); + assertThat(mediaItem.localConfiguration).isNull(); assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle())).isEqualTo(mediaItem); } @@ -682,7 +683,7 @@ public class MediaItemTest { public void roundTripViaBundle_withPlaybackProperties_dropsPlaybackProperties() { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).build(); - assertThat(mediaItem.playbackProperties).isNotNull(); - assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle()).playbackProperties).isNull(); + assertThat(mediaItem.localConfiguration).isNotNull(); + assertThat(MediaItem.CREATOR.fromBundle(mediaItem.toBundle()).localConfiguration).isNull(); } } From a9867880f0dfd16bb77db6a696ba6ebfd22ab103 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 24 Sep 2021 17:21:59 +0100 Subject: [PATCH 231/441] IMA sdk request input serialization/deserialization temporary pulled out from the main cl to keep code small for review PiperOrigin-RevId: 398746806 --- .../exoplayer2/ext/ima/DaiStreamRequest.java | 367 ++++++++++++++++++ .../ext/ima/DaiStreamRequestTest.java | 103 +++++ 2 files changed, 470 insertions(+) create mode 100644 extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java create mode 100644 extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java new file mode 100644 index 0000000000..f6aa5145f5 --- /dev/null +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java @@ -0,0 +1,367 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.ext.ima; + +import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + +import android.net.Uri; +import android.text.TextUtils; +import androidx.annotation.Nullable; +import com.google.ads.interactivemedia.v3.api.ImaSdkFactory; +import com.google.ads.interactivemedia.v3.api.StreamRequest; +import com.google.ads.interactivemedia.v3.api.StreamRequest.StreamFormat; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.C.ContentType; +import java.util.HashMap; +import java.util.Map; + +// TODO(gdambrauskas): move this back under IMA DAI class. +/** Defines all of IMA DAI stream request inputs. */ +/* package */ final class DaiStreamRequest { + + private static final String SCHEME = "imadai"; + private static final String ASSET_KEY = "assetKey"; + private static final String API_KEY = "apiKey"; + private static final String CONTENT_SOURCE_ID = "contentSourceId"; + private static final String VIDEO_ID = "videoId"; + private static final String AD_TAG_PARAMETERS = "adTagParameters"; + private static final String MANIFEST_SUFFIX = "manifestSuffix"; + private static final String CONTENT_URL = "contentUrl"; + private static final String AUTH_TOKEN = "authToken"; + private static final String STREAM_ACTIVITY_MONITOR_ID = "streamActivityMonitorId"; + private static final String FORMAT = "format"; + + @Nullable private final String assetKey; + @Nullable private final String apiKey; + @Nullable private final String contentSourceId; + @Nullable private final String videoId; + @Nullable private final Map adTagParameters; + @Nullable private final String manifestSuffix; + @Nullable private final String contentUrl; + @Nullable private final String authToken; + @Nullable private final String streamActivityMonitorId; + @Nullable private StreamRequest request; + @ContentType public int format = C.TYPE_HLS; + + private DaiStreamRequest( + @Nullable String assetKey, + @Nullable String apiKey, + @Nullable String contentSourceId, + @Nullable String videoId, + @Nullable Map adTagParameters, + @Nullable String manifestSuffix, + @Nullable String contentUrl, + @Nullable String authToken, + @Nullable String streamActivityMonitorId, + @ContentType int format) { + this.assetKey = assetKey; + this.apiKey = apiKey; + this.contentSourceId = contentSourceId; + this.videoId = videoId; + this.adTagParameters = adTagParameters; + this.manifestSuffix = manifestSuffix; + this.contentUrl = contentUrl; + this.authToken = authToken; + this.streamActivityMonitorId = streamActivityMonitorId; + this.format = format; + } + + @SuppressWarnings("nullness") + public StreamRequest getStreamRequest() { + if (request != null) { + return request; + } + // We don't care if multiple threads execute the code below, but we do care that the request + // object is fully constructed before using it. + StreamRequest streamRequest = null; + if (!TextUtils.isEmpty(assetKey)) { + streamRequest = ImaSdkFactory.getInstance().createLiveStreamRequest(assetKey, apiKey); + } else if (!TextUtils.isEmpty(contentSourceId) && !TextUtils.isEmpty(videoId)) { + streamRequest = + ImaSdkFactory.getInstance().createVodStreamRequest(contentSourceId, videoId, apiKey); + } + checkNotNull(streamRequest); + if (format == C.TYPE_DASH) { + streamRequest.setFormat(StreamFormat.DASH); + } else if (format == C.TYPE_HLS) { + streamRequest.setFormat(StreamFormat.HLS); + } + // Optional params. + if (adTagParameters != null) { + streamRequest.setAdTagParameters(adTagParameters); + } + if (manifestSuffix != null) { + streamRequest.setManifestSuffix(manifestSuffix); + } + if (contentUrl != null) { + streamRequest.setContentUrl(contentUrl); + } + if (authToken != null) { + streamRequest.setAuthToken(authToken); + } + if (streamActivityMonitorId != null) { + streamRequest.setStreamActivityMonitorId(streamActivityMonitorId); + } + request = streamRequest; + return request; + } + + /** + * Creates a {@link DaiStreamRequest} for the given URI. + * + * @param uri The URI. + * @return An {@link DaiStreamRequest} for the given URI. + * @throws IllegalStateException If uri has missing or invalid inputs. + */ + public static DaiStreamRequest fromUri(Uri uri) { + DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); + if (!SCHEME.equals(uri.getScheme())) { + throw new IllegalArgumentException("Invalid scheme."); + } + request.setAssetKey(uri.getQueryParameter(ASSET_KEY)); + request.setApiKey(uri.getQueryParameter(API_KEY)); + request.setContentSourceId(uri.getQueryParameter(CONTENT_SOURCE_ID)); + request.setVideoId(uri.getQueryParameter(VIDEO_ID)); + request.setManifestSuffix(uri.getQueryParameter(MANIFEST_SUFFIX)); + request.setContentUrl(uri.getQueryParameter(CONTENT_URL)); + request.setAuthToken(uri.getQueryParameter(AUTH_TOKEN)); + request.setStreamActivityMonitorId(uri.getQueryParameter(STREAM_ACTIVITY_MONITOR_ID)); + String formatValue = uri.getQueryParameter(FORMAT); + if (!TextUtils.isEmpty(formatValue)) { + request.setFormat(Integer.parseInt(formatValue)); + } + Map adTagParameters; + String adTagParametersValue; + String singleAdTagParameterValue; + if (uri.getQueryParameter(AD_TAG_PARAMETERS) != null) { + adTagParameters = new HashMap<>(); + adTagParametersValue = uri.getQueryParameter(AD_TAG_PARAMETERS); + if (!TextUtils.isEmpty(adTagParametersValue)) { + Uri adTagParametersUri = Uri.parse(adTagParametersValue); + for (String paramName : adTagParametersUri.getQueryParameterNames()) { + singleAdTagParameterValue = adTagParametersUri.getQueryParameter(paramName); + if (!TextUtils.isEmpty(singleAdTagParameterValue)) { + adTagParameters.put(paramName, singleAdTagParameterValue); + } + } + } + request.setAdTagParameters(adTagParameters); + } + return request.build(); + } + + public Uri toUri() { + Uri.Builder dataUriBuilder = new Uri.Builder(); + dataUriBuilder.scheme(SCHEME); + if (assetKey != null) { + dataUriBuilder.appendQueryParameter(ASSET_KEY, assetKey); + } + if (apiKey != null) { + dataUriBuilder.appendQueryParameter(API_KEY, apiKey); + } + if (contentSourceId != null) { + dataUriBuilder.appendQueryParameter(CONTENT_SOURCE_ID, contentSourceId); + } + if (videoId != null) { + dataUriBuilder.appendQueryParameter(VIDEO_ID, videoId); + } + if (manifestSuffix != null) { + dataUriBuilder.appendQueryParameter(MANIFEST_SUFFIX, manifestSuffix); + } + if (contentUrl != null) { + dataUriBuilder.appendQueryParameter(CONTENT_URL, contentUrl); + } + if (authToken != null) { + dataUriBuilder.appendQueryParameter(AUTH_TOKEN, authToken); + } + if (streamActivityMonitorId != null) { + dataUriBuilder.appendQueryParameter(STREAM_ACTIVITY_MONITOR_ID, streamActivityMonitorId); + } + if (adTagParameters != null && !adTagParameters.isEmpty()) { + Uri.Builder adTagParametersUriBuilder = new Uri.Builder(); + for (Map.Entry entry : adTagParameters.entrySet()) { + adTagParametersUriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); + } + dataUriBuilder.appendQueryParameter( + AD_TAG_PARAMETERS, adTagParametersUriBuilder.build().toString()); + } + dataUriBuilder.appendQueryParameter(FORMAT, String.valueOf(format)); + return dataUriBuilder.build(); + } + + public static final class Builder { + @Nullable private String assetKey; + @Nullable private String apiKey; + @Nullable private String contentSourceId; + @Nullable private String videoId; + @Nullable private Map adTagParameters; + @Nullable private String manifestSuffix; + @Nullable private String contentUrl; + @Nullable private String authToken; + @Nullable private String streamActivityMonitorId; + @ContentType public int format = C.TYPE_HLS; + /* + *

      /** The stream request asset key used for live streams. + * + * @param assetKey Live stream asset key. + * @return This instance, for convenience. + */ + public Builder setAssetKey(@Nullable String assetKey) { + this.assetKey = assetKey; + return this; + } + + /** + * Sets the stream request authorization token. Used in place of the API key for stricter + * content authorization. The publisher can control individual content streams authorizations + * based on this token. + * + * @param authToken Live stream authorization token. + * @return This instance, for convenience. + */ + public Builder setAuthToken(@Nullable String authToken) { + this.authToken = authToken; + return this; + } + + /** + * The stream request content source ID used for on-demand streams. + * + * @param contentSourceId VOD stream content source id. + * @return This instance, for convenience. + */ + public Builder setContentSourceId(@Nullable String contentSourceId) { + this.contentSourceId = contentSourceId; + return this; + } + + /** + * The stream request video ID used for on-demand streams. + * + * @param videoId VOD stream video id. + * @return This instance, for convenience. + */ + public Builder setVideoId(@Nullable String videoId) { + this.videoId = videoId; + return this; + } + + /** + * Sets the format of the stream request. + * + * @param format VOD or live stream type. + * @return This instance, for convenience. + */ + public Builder setFormat(@ContentType int format) { + checkArgument(format == C.TYPE_DASH || format == C.TYPE_HLS); + this.format = format; + return this; + } + + /** + * The stream request API key. This is used for content authentication. The API key is provided + * to the publisher to unlock their content. It's a security measure used to verify the + * applications that are attempting to access the content. + * + * @param apiKey Stream api key. + * @return This instance, for convenience. + */ + public Builder setApiKey(@Nullable String apiKey) { + this.apiKey = apiKey; + return this; + } + + /** + * Sets the ID to be used to debug the stream with the stream activity monitor. This is used to + * provide a convenient way to allow publishers to find a stream log in the stream activity + * monitor tool. + * + * @param streamActivityMonitorId ID for debugging the stream withstream activity monitor. + * @return This instance, for convenience. + */ + public Builder setStreamActivityMonitorId(@Nullable String streamActivityMonitorId) { + this.streamActivityMonitorId = streamActivityMonitorId; + return this; + } + + /** + * Sets the overridable ad tag parameters on the stream request. Supply targeting parameters to your + * stream provides more information. + * + *

      You can use the dai-ot and dai-ov parameters for stream variant preference. See Override Stream Variant Parameters + * for more information. + * + * @param adTagParameters A map of extra parameters to pass to the ad server. + * @return This instance, for convenience. + */ + public Builder setAdTagParameters(@Nullable Map adTagParameters) { + this.adTagParameters = adTagParameters; + return this; + } + + /** + * Sets the optional stream manifest's suffix, which will be appended to the stream manifest's + * URL. The provided string must be URL-encoded and must not include a leading question mark. + * + * @param manifestSuffix Stream manifest's suffix. + * @return This instance, for convenience. + */ + public Builder setManifestSuffix(@Nullable String manifestSuffix) { + this.manifestSuffix = manifestSuffix; + return this; + } + + /** + * Specifies the deep link to the content's screen. If provided, this parameter is passed to the + * OM SDK. See Android + * documentation for more information. + * + * @param contentUrl Deep link to the content's screen. + * @return This instance, for convenience. + */ + public Builder setContentUrl(@Nullable String contentUrl) { + this.contentUrl = contentUrl; + return this; + } + + /** + * Builds a {@link DaiStreamRequest} with the builder's current values. + * + * @return The build {@link DaiStreamRequest}. + * @throws IllegalStateException If request has missing or invalid inputs. + */ + public DaiStreamRequest build() { + if (TextUtils.isEmpty(assetKey) + && (TextUtils.isEmpty(contentSourceId) || TextUtils.isEmpty(videoId))) { + throw new IllegalStateException("Missing DAI stream request parameters."); + } + return new DaiStreamRequest( + assetKey, + apiKey, + contentSourceId, + videoId, + adTagParameters, + manifestSuffix, + contentUrl, + authToken, + streamActivityMonitorId, + format); + } + } +} diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java new file mode 100644 index 0000000000..4fbf9c1b9c --- /dev/null +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.ext.ima; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.ads.interactivemedia.v3.api.StreamRequest.StreamFormat; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit tests for {@link DaiStreamRequest}. */ +@RunWith(AndroidJUnit4.class) +public final class DaiStreamRequestTest { + + private static final String ASSET_KEY = "testAssetKey"; + private static final String API_KEY = "testApiKey"; + private static final String CONTENT_SOURCE_ID = "testContentSourceId"; + private static final String VIDEO_ID = "testVideoId"; + private static final String MANIFEST_SUFFIX = "testManifestSuffix"; + private static final String CONTENT_URL = + "http://google.com/contentUrl?queryParamName=queryParamValue"; + private static final String AUTH_TOKEN = "testAuthToken"; + private static final String STREAM_ACTIVITY_MONITOR_ID = "testStreamActivityMonitorId"; + private static final int FORMAT_DASH = 0; + private static final int FORMAT_HLS = 2; + private static final Map adTagParameters = new HashMap<>(); + + static { + adTagParameters.put("param1", "value1"); + adTagParameters.put("param2", "value2"); + } + + @Test + public void liveRequestSerializationAndDeserialization() { + DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); + request.setAssetKey(ASSET_KEY); + request.setApiKey(API_KEY); + request.setManifestSuffix(MANIFEST_SUFFIX); + request.setContentUrl(CONTENT_URL); + request.setAuthToken(AUTH_TOKEN); + request.setStreamActivityMonitorId(STREAM_ACTIVITY_MONITOR_ID); + request.setFormat(FORMAT_HLS); + request.setAdTagParameters(adTagParameters); + + DaiStreamRequest requestAfterConversions = DaiStreamRequest.fromUri(request.build().toUri()); + assertThat(requestAfterConversions.getStreamRequest().getAssetKey()).isEqualTo(ASSET_KEY); + assertThat(requestAfterConversions.getStreamRequest().getApiKey()).isEqualTo(API_KEY); + assertThat(requestAfterConversions.getStreamRequest().getManifestSuffix()) + .isEqualTo(MANIFEST_SUFFIX); + assertThat(requestAfterConversions.getStreamRequest().getContentUrl()).isEqualTo(CONTENT_URL); + assertThat(requestAfterConversions.getStreamRequest().getAuthToken()).isEqualTo(AUTH_TOKEN); + assertThat(requestAfterConversions.getStreamRequest().getStreamActivityMonitorId()) + .isEqualTo(STREAM_ACTIVITY_MONITOR_ID); + assertThat(requestAfterConversions.getStreamRequest().getFormat()).isEqualTo(StreamFormat.HLS); + assertThat(requestAfterConversions.getStreamRequest().getAdTagParameters()) + .isEqualTo(adTagParameters); + } + + @Test + public void vodRequestSerializationAndDeserialization() { + DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); + request.setApiKey(API_KEY); + request.setContentSourceId(CONTENT_SOURCE_ID); + request.setVideoId(VIDEO_ID); + request.setManifestSuffix(MANIFEST_SUFFIX); + request.setContentUrl(CONTENT_URL); + request.setAuthToken(AUTH_TOKEN); + request.setStreamActivityMonitorId(STREAM_ACTIVITY_MONITOR_ID); + request.setFormat(FORMAT_DASH); + request.setAdTagParameters(adTagParameters); + + DaiStreamRequest requestAfterConversions = DaiStreamRequest.fromUri(request.build().toUri()); + assertThat(requestAfterConversions.getStreamRequest().getApiKey()).isEqualTo(API_KEY); + assertThat(requestAfterConversions.getStreamRequest().getContentSourceId()) + .isEqualTo(CONTENT_SOURCE_ID); + assertThat(requestAfterConversions.getStreamRequest().getVideoId()).isEqualTo(VIDEO_ID); + assertThat(requestAfterConversions.getStreamRequest().getManifestSuffix()) + .isEqualTo(MANIFEST_SUFFIX); + assertThat(requestAfterConversions.getStreamRequest().getContentUrl()).isEqualTo(CONTENT_URL); + assertThat(requestAfterConversions.getStreamRequest().getAuthToken()).isEqualTo(AUTH_TOKEN); + assertThat(requestAfterConversions.getStreamRequest().getStreamActivityMonitorId()) + .isEqualTo(STREAM_ACTIVITY_MONITOR_ID); + assertThat(requestAfterConversions.getStreamRequest().getFormat()).isEqualTo(StreamFormat.DASH); + assertThat(requestAfterConversions.getStreamRequest().getAdTagParameters()) + .isEqualTo(adTagParameters); + } +} From 732fc3ef3ac4a141ae742b020079eb5209f16f41 Mon Sep 17 00:00:00 2001 From: Dean Wheatley Date: Fri, 24 Sep 2021 13:49:23 +1000 Subject: [PATCH 232/441] Check direct playback capabilities for automotive devices For Automotive devices, surround encodings can be supported via the passthrough path. Therefore, include automotive in the allowed device types in the isDirectPlaybackSupported checks. The automotive system feature is checked, rather then UI_MODE_TYPE_CAR, because the UI_MODE_TYPE_CAR can be force enabled via android.app.UiModeManager.enableCarMode(), whereas FEATURE_AUTOMOTIVE cannot be forced. --- .../java/com/google/android/exoplayer2/util/Util.java | 10 ++++++++++ .../android/exoplayer2/audio/AudioCapabilities.java | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) 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 ec913e52e1..1f6822151d 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 @@ -2305,6 +2305,16 @@ public final class Util { && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION; } + /** + * Returns whether the app is running on an Automotive device. + * + * @param context Any context. + * @return Whether the app is running on an Automotive device. + */ + public static boolean isAutomotive(Context context) { + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); + } + /** * Gets the size of the current mode of the default display, in pixels. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java index 1510aa6e22..39fa2860a6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java @@ -90,8 +90,9 @@ public final class AudioCapabilities { } // AudioTrack.isDirectPlaybackSupported returns true for encodings that are supported for audio // offload, as well as for encodings we want to list for passthrough mode. Therefore we only use - // it on TV devices, which generally shouldn't support audio offload for surround encodings. - if (Util.SDK_INT >= 29 && Util.isTv(context)) { + // it on TV and Automotive devices, which generally shouldn't support audio offload for surround + // encodings. + if (Util.SDK_INT >= 29 && (Util.isTv(context) || Util.isAutomotive(context))) { return new AudioCapabilities( Api29.getDirectPlaybackSupportedEncodings(), DEFAULT_MAX_CHANNEL_COUNT); } From 1e6a3aa6fb1fc8fe2b6d8a0c8fa46a19e998f63f Mon Sep 17 00:00:00 2001 From: gyumin Date: Mon, 27 Sep 2021 06:29:30 +0100 Subject: [PATCH 233/441] Update androidx.media version to 1.4.2 PiperOrigin-RevId: 399108998 --- constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index a891e3ad87..9fa1488a53 100644 --- a/constants.gradle +++ b/constants.gradle @@ -40,7 +40,7 @@ project.ext { androidxCollectionVersion = '1.1.0' androidxCoreVersion = '1.3.2' androidxFuturesVersion = '1.1.0' - androidxMediaVersion = '1.4.1' + androidxMediaVersion = '1.4.2' androidxMedia2Version = '1.1.3' androidxMultidexVersion = '2.0.1' androidxRecyclerViewVersion = '1.2.1' From a82690a533fa5caf8f60ce4be3e7533c8ebbb0f9 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 27 Sep 2021 10:27:41 +0100 Subject: [PATCH 234/441] Use SurfaceTexture.getTimestamp PiperOrigin-RevId: 399139842 --- .../transformer/TransformerTranscodingVideoRenderer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 3e1da57bdf..7ed1afef1b 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -71,7 +71,6 @@ import java.nio.ByteBuffer; @Nullable private GlUtil.Uniform decoderTextureTransformUniform; @Nullable private MediaCodecAdapterWrapper encoder; - private long nextEncoderTimeUs; /** Whether encoder's actual output format is obtained. */ private boolean hasEncoderActualOutputFormat; @@ -304,7 +303,6 @@ import java.nio.ByteBuffer; if (!isDecoderSurfacePopulated) { if (!waitingForPopulatedDecoderSurface) { if (decoder.getOutputBuffer() != null) { - nextEncoderTimeUs = checkNotNull(decoder.getOutputBufferInfo()).presentationTimeUs; decoder.releaseOutputBuffer(/* render= */ true); waitingForPopulatedDecoderSurface = true; } @@ -326,7 +324,8 @@ import java.nio.ByteBuffer; GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); EGLDisplay eglDisplay = checkNotNull(this.eglDisplay); EGLSurface eglSurface = checkNotNull(this.eglSurface); - EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, nextEncoderTimeUs * 1000L); + long decoderSurfaceTextureTimestampNs = decoderSurfaceTexture.getTimestamp(); + EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, decoderSurfaceTextureTimestampNs); EGL14.eglSwapBuffers(eglDisplay, eglSurface); isDecoderSurfacePopulated = false; return true; From e373e0cbaf069b55c3b49417c082663fc1e6284b Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 27 Sep 2021 14:57:36 +0100 Subject: [PATCH 235/441] Inline SimpleSubtitleOutputBuffer PiperOrigin-RevId: 399179751 --- .../text/SimpleSubtitleDecoder.java | 7 +++- .../text/SimpleSubtitleOutputBuffer.java | 33 ------------------- .../exoplayer2/text/ExoplayerCuesDecoder.java | 8 ++++- 3 files changed, 13 insertions(+), 35 deletions(-) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java index 3325bdc723..e4b50c8b59 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java @@ -53,7 +53,12 @@ public abstract class SimpleSubtitleDecoder @Override protected final SubtitleOutputBuffer createOutputBuffer() { - return new SimpleSubtitleOutputBuffer(this::releaseOutputBuffer); + return new SubtitleOutputBuffer() { + @Override + public void release() { + SimpleSubtitleDecoder.this.releaseOutputBuffer(this); + } + }; } @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java b/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java deleted file mode 100644 index ab2736e680..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleOutputBuffer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.text; - -/** A {@link SubtitleOutputBuffer} for decoders that extend {@link SimpleSubtitleDecoder}. */ -/* package */ final class SimpleSubtitleOutputBuffer extends SubtitleOutputBuffer { - - private final Owner owner; - - /** @param owner The decoder that owns this buffer. */ - public SimpleSubtitleOutputBuffer(Owner owner) { - super(); - this.owner = owner; - } - - @Override - public final void release() { - owner.releaseOutputBuffer(this); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java index 33703778d2..07b72ba185 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.java @@ -57,7 +57,13 @@ public final class ExoplayerCuesDecoder implements SubtitleDecoder { inputBuffer = new SubtitleInputBuffer(); availableOutputBuffers = new ArrayDeque<>(); for (int i = 0; i < OUTPUT_BUFFERS_COUNT; i++) { - availableOutputBuffers.addFirst(new SimpleSubtitleOutputBuffer(this::releaseOutputBuffer)); + availableOutputBuffers.addFirst( + new SubtitleOutputBuffer() { + @Override + public void release() { + ExoplayerCuesDecoder.this.releaseOutputBuffer(this); + } + }); } inputBufferState = INPUT_BUFFER_AVAILABLE; } From a04f1d1726f3ea5df5d49bcb0b32667b301f4c98 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 27 Sep 2021 17:14:24 +0100 Subject: [PATCH 236/441] Migrate usages of MediaItem.PlaybackProperties to LocalConfiguration PiperOrigin-RevId: 399206106 --- .../exoplayer2/demo/DownloadTracker.java | 6 +-- .../android/exoplayer2/demo/IntentUtil.java | 32 +++++------ .../exoplayer2/demo/PlayerActivity.java | 10 ++-- .../demo/SampleChooserActivity.java | 8 +-- docs/analytics.md | 2 +- docs/playlists.md | 4 +- .../ext/cast/DefaultMediaItemConverter.java | 24 ++++----- .../exoplayer2/ext/cast/CastPlayerTest.java | 36 ++++++------- .../ext/media2/DefaultMediaItemConverter.java | 6 +-- .../google/android/exoplayer2/Timeline.java | 4 +- .../google/android/exoplayer2/util/Util.java | 16 +++--- .../android/exoplayer2/TimelineTest.java | 2 +- .../drm/DefaultDrmSessionManagerProvider.java | 4 +- .../exoplayer2/offline/DownloadHelper.java | 24 ++++----- .../offline/ProgressiveDownloader.java | 6 +-- .../exoplayer2/offline/SegmentDownloader.java | 6 +-- .../source/DefaultMediaSourceFactory.java | 38 ++++++------- .../exoplayer2/source/MediaSourceFactory.java | 2 +- .../source/ProgressiveMediaSource.java | 16 +++--- .../exoplayer2/source/SilenceMediaSource.java | 3 +- .../source/SingleSampleMediaSource.java | 3 +- .../exoplayer2/source/ads/AdsMediaSource.java | 8 +-- .../android/exoplayer2/ExoPlayerTest.java | 54 +++++++++---------- .../offline/DownloadHelperTest.java | 6 +-- .../source/SilenceMediaSourceTest.java | 12 ++--- .../source/SinglePeriodTimelineTest.java | 4 +- .../source/dash/DashMediaSource.java | 26 ++++----- .../source/dash/DashMediaSourceTest.java | 24 ++++----- .../dash/DefaultMediaSourceFactoryTest.java | 2 +- .../exoplayer2/source/hls/HlsMediaSource.java | 19 +++---- .../hls/DefaultMediaSourceFactoryTest.java | 2 +- .../source/hls/HlsMediaSourceTest.java | 24 ++++----- .../source/rtsp/RtspMediaSource.java | 6 +-- .../source/smoothstreaming/SsMediaSource.java | 32 +++++------ .../smoothstreaming/offline/SsDownloader.java | 2 +- .../DefaultMediaSourceFactoryTest.java | 2 +- .../smoothstreaming/SsMediaSourceTest.java | 32 +++++------ .../exoplayer2/testutil/FakeMediaSource.java | 2 +- .../exoplayer2/testutil/TimelineAsserts.java | 6 +-- 39 files changed, 257 insertions(+), 258 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index caffeb8a6a..2bbf99b03c 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -98,7 +98,7 @@ public class DownloadTracker { } public boolean isDownloaded(MediaItem mediaItem) { - @Nullable Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri); + @Nullable Download download = downloads.get(checkNotNull(mediaItem.localConfiguration).uri); return download != null && download.state != Download.STATE_FAILED; } @@ -110,7 +110,7 @@ public class DownloadTracker { public void toggleDownload( FragmentManager fragmentManager, MediaItem mediaItem, RenderersFactory renderersFactory) { - @Nullable Download download = downloads.get(checkNotNull(mediaItem.playbackProperties).uri); + @Nullable Download download = downloads.get(checkNotNull(mediaItem.localConfiguration).uri); if (download != null && download.state != Download.STATE_FAILED) { DownloadService.sendRemoveDownload( context, DemoDownloadService.class, download.request.id, /* foreground= */ false); @@ -223,7 +223,7 @@ public class DownloadTracker { widevineOfflineLicenseFetchTask = new WidevineOfflineLicenseFetchTask( format, - mediaItem.playbackProperties.drmConfiguration, + mediaItem.localConfiguration.drmConfiguration, httpDataSourceFactory, /* dialogHelper= */ this, helper); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 8b7ea65989..153870f15a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -88,22 +88,22 @@ public class IntentUtil { Assertions.checkArgument(!mediaItems.isEmpty()); if (mediaItems.size() == 1) { MediaItem mediaItem = mediaItems.get(0); - MediaItem.PlaybackProperties playbackProperties = checkNotNull(mediaItem.playbackProperties); - intent.setAction(ACTION_VIEW).setData(mediaItem.playbackProperties.uri); + MediaItem.LocalConfiguration localConfiguration = checkNotNull(mediaItem.localConfiguration); + intent.setAction(ACTION_VIEW).setData(mediaItem.localConfiguration.uri); if (mediaItem.mediaMetadata.title != null) { intent.putExtra(TITLE_EXTRA, mediaItem.mediaMetadata.title); } - addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ ""); + addPlaybackPropertiesToIntent(localConfiguration, intent, /* extrasKeySuffix= */ ""); addClippingPropertiesToIntent( mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ ""); } else { intent.setAction(ACTION_VIEW_LIST); for (int i = 0; i < mediaItems.size(); i++) { MediaItem mediaItem = mediaItems.get(i); - MediaItem.PlaybackProperties playbackProperties = - checkNotNull(mediaItem.playbackProperties); - intent.putExtra(URI_EXTRA + ("_" + i), playbackProperties.uri.toString()); - addPlaybackPropertiesToIntent(playbackProperties, intent, /* extrasKeySuffix= */ "_" + i); + MediaItem.LocalConfiguration localConfiguration = + checkNotNull(mediaItem.localConfiguration); + intent.putExtra(URI_EXTRA + ("_" + i), localConfiguration.uri.toString()); + addPlaybackPropertiesToIntent(localConfiguration, intent, /* extrasKeySuffix= */ "_" + i); addClippingPropertiesToIntent( mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ "_" + i); if (mediaItem.mediaMetadata.title != null) { @@ -185,20 +185,20 @@ public class IntentUtil { } private static void addPlaybackPropertiesToIntent( - MediaItem.PlaybackProperties playbackProperties, Intent intent, String extrasKeySuffix) { + MediaItem.LocalConfiguration localConfiguration, Intent intent, String extrasKeySuffix) { intent - .putExtra(MIME_TYPE_EXTRA + extrasKeySuffix, playbackProperties.mimeType) + .putExtra(MIME_TYPE_EXTRA + extrasKeySuffix, localConfiguration.mimeType) .putExtra( AD_TAG_URI_EXTRA + extrasKeySuffix, - playbackProperties.adsConfiguration != null - ? playbackProperties.adsConfiguration.adTagUri.toString() + localConfiguration.adsConfiguration != null + ? localConfiguration.adsConfiguration.adTagUri.toString() : null); - if (playbackProperties.drmConfiguration != null) { - addDrmConfigurationToIntent(playbackProperties.drmConfiguration, intent, extrasKeySuffix); + if (localConfiguration.drmConfiguration != null) { + addDrmConfigurationToIntent(localConfiguration.drmConfiguration, intent, extrasKeySuffix); } - if (!playbackProperties.subtitles.isEmpty()) { - checkState(playbackProperties.subtitles.size() == 1); - MediaItem.Subtitle subtitle = playbackProperties.subtitles.get(0); + if (!localConfiguration.subtitles.isEmpty()) { + checkState(localConfiguration.subtitles.size() == 1); + MediaItem.Subtitle subtitle = localConfiguration.subtitles.get(0); intent.putExtra(SUBTITLE_URI_EXTRA + extrasKeySuffix, subtitle.uri.toString()); intent.putExtra(SUBTITLE_MIME_TYPE_EXTRA + extrasKeySuffix, subtitle.mimeType); intent.putExtra(SUBTITLE_LANGUAGE_EXTRA + extrasKeySuffix, subtitle.language); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 2efd02b0e2..5f5acea8ea 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -323,7 +323,7 @@ public class PlayerActivity extends AppCompatActivity } MediaItem.DrmConfiguration drmConfiguration = - checkNotNull(mediaItem.playbackProperties).drmConfiguration; + checkNotNull(mediaItem.localConfiguration).drmConfiguration; if (drmConfiguration != null) { if (Util.SDK_INT < 18) { showToast(R.string.error_drm_unsupported_before_api_18); @@ -335,7 +335,7 @@ public class PlayerActivity extends AppCompatActivity return Collections.emptyList(); } } - hasAds |= mediaItem.playbackProperties.adsConfiguration != null; + hasAds |= mediaItem.localConfiguration.adsConfiguration != null; } if (!hasAds) { releaseAdsLoader(); @@ -496,7 +496,7 @@ public class PlayerActivity extends AppCompatActivity for (MediaItem item : IntentUtil.createMediaItemsFromIntent(intent)) { @Nullable DownloadRequest downloadRequest = - downloadTracker.getDownloadRequest(checkNotNull(item.playbackProperties).uri); + downloadTracker.getDownloadRequest(checkNotNull(item.localConfiguration).uri); if (downloadRequest != null) { MediaItem.Builder builder = item.buildUpon(); builder @@ -506,7 +506,7 @@ public class PlayerActivity extends AppCompatActivity .setMimeType(downloadRequest.mimeType) .setStreamKeys(downloadRequest.streamKeys); @Nullable - MediaItem.DrmConfiguration drmConfiguration = item.playbackProperties.drmConfiguration; + MediaItem.DrmConfiguration drmConfiguration = item.localConfiguration.drmConfiguration; if (drmConfiguration != null) { builder.setDrmConfiguration( drmConfiguration @@ -526,7 +526,7 @@ public class PlayerActivity extends AppCompatActivity @Nullable private static Map getDrmRequestHeaders(MediaItem item) { - MediaItem.DrmConfiguration drmConfiguration = item.playbackProperties.drmConfiguration; + MediaItem.DrmConfiguration drmConfiguration = item.localConfiguration.drmConfiguration; return drmConfiguration != null ? drmConfiguration.licenseRequestHeaders : null; } } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index f85aaa97c5..585c6cdf1b 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -249,12 +249,12 @@ public class SampleChooserActivity extends AppCompatActivity if (playlistHolder.mediaItems.size() > 1) { return R.string.download_playlist_unsupported; } - MediaItem.PlaybackProperties playbackProperties = - checkNotNull(playlistHolder.mediaItems.get(0).playbackProperties); - if (playbackProperties.adsConfiguration != null) { + MediaItem.LocalConfiguration localConfiguration = + checkNotNull(playlistHolder.mediaItems.get(0).localConfiguration); + if (localConfiguration.adsConfiguration != null) { return R.string.download_ads_unsupported; } - String scheme = playbackProperties.uri.getScheme(); + String scheme = localConfiguration.uri.getScheme(); if (!("http".equals(scheme) || "https".equals(scheme))) { return R.string.download_scheme_unsupported; } diff --git a/docs/analytics.md b/docs/analytics.md index 2a819fe2e3..149fc52022 100644 --- a/docs/analytics.md +++ b/docs/analytics.md @@ -215,7 +215,7 @@ new PlaybackStatsListener( /* keepHistory= */ false, (eventTime, playbackStats) -> { Object mediaTag = eventTime.timeline.getWindow(eventTime.windowIndex, new Window()) - .mediaItem.playbackProperties.tag; + .mediaItem.localConfiguration.tag; // Report playbackStats with mediaTag metadata. }); ~~~ diff --git a/docs/playlists.md b/docs/playlists.md index bc06164d39..85770396f0 100644 --- a/docs/playlists.md +++ b/docs/playlists.md @@ -124,8 +124,8 @@ custom tags, then an implementation might look like: public void onMediaItemTransition( @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) { @Nullable CustomMetadata metadata = null; - if (mediaItem != null && mediaItem.playbackProperties != null) { - metadata = (CustomMetadata) mediaItem.playbackProperties.tag; + if (mediaItem != null && mediaItem.localConfiguration != null) { + metadata = (CustomMetadata) mediaItem.localConfiguration.tag; } updateUiForPlayingMediaItem(metadata); } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index 88b0a47abd..8612316452 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -52,8 +52,8 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { @Override public MediaQueueItem toMediaQueueItem(MediaItem mediaItem) { - Assertions.checkNotNull(mediaItem.playbackProperties); - if (mediaItem.playbackProperties.mimeType == null) { + Assertions.checkNotNull(mediaItem.localConfiguration); + if (mediaItem.localConfiguration.mimeType == null) { throw new IllegalArgumentException("The item must specify its mimeType"); } MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE); @@ -61,9 +61,9 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { metadata.putString(MediaMetadata.KEY_TITLE, mediaItem.mediaMetadata.title.toString()); } MediaInfo mediaInfo = - new MediaInfo.Builder(mediaItem.playbackProperties.uri.toString()) + new MediaInfo.Builder(mediaItem.localConfiguration.uri.toString()) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) - .setContentType(mediaItem.playbackProperties.mimeType) + .setContentType(mediaItem.localConfiguration.mimeType) .setMetadata(metadata) .setCustomData(getCustomData(mediaItem)) .build(); @@ -128,15 +128,15 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { } private static JSONObject getMediaItemJson(MediaItem mediaItem) throws JSONException { - Assertions.checkNotNull(mediaItem.playbackProperties); + Assertions.checkNotNull(mediaItem.localConfiguration); JSONObject json = new JSONObject(); json.put(KEY_TITLE, mediaItem.mediaMetadata.title); - json.put(KEY_URI, mediaItem.playbackProperties.uri.toString()); - json.put(KEY_MIME_TYPE, mediaItem.playbackProperties.mimeType); - if (mediaItem.playbackProperties.drmConfiguration != null) { + json.put(KEY_URI, mediaItem.localConfiguration.uri.toString()); + json.put(KEY_MIME_TYPE, mediaItem.localConfiguration.mimeType); + if (mediaItem.localConfiguration.drmConfiguration != null) { json.put( KEY_DRM_CONFIGURATION, - getDrmConfigurationJson(mediaItem.playbackProperties.drmConfiguration)); + getDrmConfigurationJson(mediaItem.localConfiguration.drmConfiguration)); } return json; } @@ -152,11 +152,11 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { @Nullable private static JSONObject getPlayerConfigJson(MediaItem mediaItem) throws JSONException { - if (mediaItem.playbackProperties == null - || mediaItem.playbackProperties.drmConfiguration == null) { + if (mediaItem.localConfiguration == null + || mediaItem.localConfiguration.drmConfiguration == null) { return null; } - MediaItem.DrmConfiguration drmConfiguration = mediaItem.playbackProperties.drmConfiguration; + MediaItem.DrmConfiguration drmConfiguration = mediaItem.localConfiguration.drmConfiguration; String drmScheme; if (C.WIDEVINE_UUID.equals(drmConfiguration.scheme)) { diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index f07e975b1d..3195218b4e 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -423,7 +423,7 @@ public class CastPlayerTest { .onMediaItemTransition( mediaItemCaptor.capture(), eq(MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)); inOrder.verify(mockListener, never()).onMediaItemTransition(any(), anyInt()); - assertThat(mediaItemCaptor.getAllValues().get(1).playbackProperties.tag).isEqualTo(3); + assertThat(mediaItemCaptor.getAllValues().get(1).localConfiguration.tag).isEqualTo(3); } @SuppressWarnings("deprecation") // Verifies deprecated callback being called correctly. @@ -533,7 +533,7 @@ public class CastPlayerTest { verify(mockRemoteMediaClient) .queueInsertItems( queueItemsArgumentCaptor.capture(), - eq((int) mediaItems.get(index).playbackProperties.tag), + eq((int) mediaItems.get(index).localConfiguration.tag), any()); MediaQueueItem[] mediaQueueItems = queueItemsArgumentCaptor.getValue(); @@ -677,7 +677,7 @@ public class CastPlayerTest { Timeline currentTimeline = castPlayer.getCurrentTimeline(); for (int i = 0; i < mediaItems.size(); i++) { assertThat(currentTimeline.getWindow(/* windowIndex= */ i, window).uid) - .isEqualTo(mediaItems.get(i).playbackProperties.tag); + .isEqualTo(mediaItems.get(i).localConfiguration.tag); } } @@ -696,8 +696,8 @@ public class CastPlayerTest { .onMediaItemTransition( mediaItemCaptor.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)); inOrder.verify(mockListener, never()).onMediaItemTransition(any(), anyInt()); - assertThat(mediaItemCaptor.getValue().playbackProperties.tag) - .isEqualTo(mediaItem.playbackProperties.tag); + assertThat(mediaItemCaptor.getValue().localConfiguration.tag) + .isEqualTo(mediaItem.localConfiguration.tag); } @Test @@ -801,10 +801,10 @@ public class CastPlayerTest { .onMediaItemTransition( mediaItemCaptor.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)); inOrder.verify(mockListener, never()).onMediaItemTransition(any(), anyInt()); - assertThat(mediaItemCaptor.getAllValues().get(0).playbackProperties.tag) - .isEqualTo(mediaItem1.playbackProperties.tag); - assertThat(mediaItemCaptor.getAllValues().get(1).playbackProperties.tag) - .isEqualTo(mediaItem2.playbackProperties.tag); + assertThat(mediaItemCaptor.getAllValues().get(0).localConfiguration.tag) + .isEqualTo(mediaItem1.localConfiguration.tag); + assertThat(mediaItemCaptor.getAllValues().get(1).localConfiguration.tag) + .isEqualTo(mediaItem2.localConfiguration.tag); } @Test @@ -886,10 +886,10 @@ public class CastPlayerTest { mediaItemCaptor.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED)); inOrder.verify(mockListener, never()).onMediaItemTransition(any(), anyInt()); List capturedMediaItems = mediaItemCaptor.getAllValues(); - assertThat(capturedMediaItems.get(0).playbackProperties.tag) - .isEqualTo(mediaItem1.playbackProperties.tag); - assertThat(capturedMediaItems.get(1).playbackProperties.tag) - .isEqualTo(mediaItem2.playbackProperties.tag); + assertThat(capturedMediaItems.get(0).localConfiguration.tag) + .isEqualTo(mediaItem1.localConfiguration.tag); + assertThat(capturedMediaItems.get(1).localConfiguration.tag) + .isEqualTo(mediaItem2.localConfiguration.tag); } @Test @@ -1012,8 +1012,8 @@ public class CastPlayerTest { .onMediaItemTransition( mediaItemCaptor.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_SEEK)); inOrder.verify(mockListener, never()).onPositionDiscontinuity(any(), any(), anyInt()); - assertThat(mediaItemCaptor.getValue().playbackProperties.tag) - .isEqualTo(mediaItem2.playbackProperties.tag); + assertThat(mediaItemCaptor.getValue().localConfiguration.tag) + .isEqualTo(mediaItem2.localConfiguration.tag); } @Test @@ -1144,7 +1144,7 @@ public class CastPlayerTest { .onMediaItemTransition( mediaItemCaptor.capture(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); inOrder.verify(mockListener, never()).onMediaItemTransition(any(), anyInt()); - assertThat(mediaItemCaptor.getValue().playbackProperties.tag).isEqualTo(2); + assertThat(mediaItemCaptor.getValue().localConfiguration.tag).isEqualTo(2); } @Test @@ -1788,9 +1788,9 @@ public class CastPlayerTest { int streamType = streamTypes[i]; long durationMs = durationsMs[i]; MediaInfo.Builder mediaInfoBuilder = - new MediaInfo.Builder(mediaItem.playbackProperties.uri.toString()) + new MediaInfo.Builder(mediaItem.localConfiguration.uri.toString()) .setStreamType(streamType) - .setContentType(mediaItem.playbackProperties.mimeType); + .setContentType(mediaItem.localConfiguration.mimeType); if (durationMs != C.TIME_UNSET) { mediaInfoBuilder.setStreamDuration(durationMs); } diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java index 9ff1f3dd24..73e94f1b2e 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java @@ -96,10 +96,10 @@ public class DefaultMediaItemConverter implements MediaItemConverter { @Override public androidx.media2.common.MediaItem convertToMedia2MediaItem(MediaItem exoPlayerMediaItem) { Assertions.checkNotNull(exoPlayerMediaItem); - MediaItem.PlaybackProperties playbackProperties = - Assertions.checkNotNull(exoPlayerMediaItem.playbackProperties); + MediaItem.LocalConfiguration localConfiguration = + Assertions.checkNotNull(exoPlayerMediaItem.localConfiguration); - @Nullable Object tag = playbackProperties.tag; + @Nullable Object tag = localConfiguration.tag; if (tag instanceof androidx.media2.common.MediaItem) { return (androidx.media2.common.MediaItem) tag; } 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 c3d1500ba5..656ea38556 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 @@ -272,8 +272,8 @@ public abstract class Timeline implements Bundleable { this.uid = uid; this.mediaItem = mediaItem != null ? mediaItem : EMPTY_MEDIA_ITEM; this.tag = - mediaItem != null && mediaItem.playbackProperties != null - ? mediaItem.playbackProperties.tag + mediaItem != null && mediaItem.localConfiguration != null + ? mediaItem.localConfiguration.tag : null; this.manifest = manifest; this.presentationStartTimeMs = presentationStartTimeMs; 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 ec913e52e1..81c85419d6 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 @@ -227,14 +227,14 @@ public final class Util { return false; } for (MediaItem mediaItem : mediaItems) { - if (mediaItem.playbackProperties == null) { + if (mediaItem.localConfiguration == null) { continue; } - if (isLocalFileUri(mediaItem.playbackProperties.uri)) { + if (isLocalFileUri(mediaItem.localConfiguration.uri)) { return requestExternalStoragePermission(activity); } - for (int i = 0; i < mediaItem.playbackProperties.subtitles.size(); i++) { - if (isLocalFileUri(mediaItem.playbackProperties.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { + if (isLocalFileUri(mediaItem.localConfiguration.subtitles.get(i).uri)) { return requestExternalStoragePermission(activity); } } @@ -255,14 +255,14 @@ public final class Util { return true; } for (MediaItem mediaItem : mediaItems) { - if (mediaItem.playbackProperties == null) { + if (mediaItem.localConfiguration == null) { continue; } - if (isTrafficRestricted(mediaItem.playbackProperties.uri)) { + if (isTrafficRestricted(mediaItem.localConfiguration.uri)) { return false; } - for (int i = 0; i < mediaItem.playbackProperties.subtitles.size(); i++) { - if (isTrafficRestricted(mediaItem.playbackProperties.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { + if (isTrafficRestricted(mediaItem.localConfiguration.subtitles.get(i).uri)) { return false; } } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/TimelineTest.java b/library/common/src/test/java/com/google/android/exoplayer2/TimelineTest.java index 689716bb25..4bf3f94bad 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/TimelineTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/TimelineTest.java @@ -122,7 +122,7 @@ public class TimelineTest { otherWindow.positionInFirstPeriodUs = C.TIME_UNSET; assertThat(window).isNotEqualTo(otherWindow); - window = populateWindow(mediaItem, mediaItem.playbackProperties.tag); + window = populateWindow(mediaItem, mediaItem.localConfiguration.tag); otherWindow = otherWindow.set( window.uid, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java index 65140c050c..6976934337 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java @@ -74,9 +74,9 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager @Override public DrmSessionManager get(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); + checkNotNull(mediaItem.localConfiguration); @Nullable - MediaItem.DrmConfiguration drmConfiguration = mediaItem.playbackProperties.drmConfiguration; + MediaItem.DrmConfiguration drmConfiguration = mediaItem.localConfiguration.drmConfiguration; if (drmConfiguration == null || Util.SDK_INT < 18) { return DrmSessionManager.DRM_UNSUPPORTED; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index c8c832736b..7fea1c5a43 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -321,7 +321,7 @@ public final class DownloadHelper { * @throws IllegalStateException If the media item is of type DASH, HLS or SmoothStreaming. */ public static DownloadHelper forMediaItem(Context context, MediaItem mediaItem) { - Assertions.checkArgument(isProgressive(checkNotNull(mediaItem.playbackProperties))); + Assertions.checkArgument(isProgressive(checkNotNull(mediaItem.localConfiguration))); return forMediaItem( mediaItem, getDefaultTrackSelectorParameters(context), @@ -411,7 +411,7 @@ public final class DownloadHelper { @Nullable RenderersFactory renderersFactory, @Nullable DataSource.Factory dataSourceFactory, @Nullable DrmSessionManager drmSessionManager) { - boolean isProgressive = isProgressive(checkNotNull(mediaItem.playbackProperties)); + boolean isProgressive = isProgressive(checkNotNull(mediaItem.localConfiguration)); Assertions.checkArgument(isProgressive || dataSourceFactory != null); return new DownloadHelper( mediaItem, @@ -452,7 +452,7 @@ public final class DownloadHelper { downloadRequest.toMediaItem(), dataSourceFactory, drmSessionManager); } - private final MediaItem.PlaybackProperties playbackProperties; + private final MediaItem.LocalConfiguration localConfiguration; @Nullable private final MediaSource mediaSource; private final DefaultTrackSelector trackSelector; private final RendererCapabilities[] rendererCapabilities; @@ -485,7 +485,7 @@ public final class DownloadHelper { @Nullable MediaSource mediaSource, DefaultTrackSelector.Parameters trackSelectorParameters, RendererCapabilities[] rendererCapabilities) { - this.playbackProperties = checkNotNull(mediaItem.playbackProperties); + this.localConfiguration = checkNotNull(mediaItem.localConfiguration); this.mediaSource = mediaSource; this.trackSelector = new DefaultTrackSelector(trackSelectorParameters, new DownloadTrackSelection.Factory()); @@ -726,7 +726,7 @@ public final class DownloadHelper { * @return The built {@link DownloadRequest}. */ public DownloadRequest getDownloadRequest(@Nullable byte[] data) { - return getDownloadRequest(playbackProperties.uri.toString(), data); + return getDownloadRequest(localConfiguration.uri.toString(), data); } /** @@ -739,13 +739,13 @@ public final class DownloadHelper { */ public DownloadRequest getDownloadRequest(String id, @Nullable byte[] data) { DownloadRequest.Builder requestBuilder = - new DownloadRequest.Builder(id, playbackProperties.uri) - .setMimeType(playbackProperties.mimeType) + new DownloadRequest.Builder(id, localConfiguration.uri) + .setMimeType(localConfiguration.mimeType) .setKeySetId( - playbackProperties.drmConfiguration != null - ? playbackProperties.drmConfiguration.getKeySetId() + localConfiguration.drmConfiguration != null + ? localConfiguration.drmConfiguration.getKeySetId() : null) - .setCustomCacheKey(playbackProperties.customCacheKey) + .setCustomCacheKey(localConfiguration.customCacheKey) .setData(data); if (mediaSource == null) { return requestBuilder.build(); @@ -896,9 +896,9 @@ public final class DownloadHelper { .createMediaSource(mediaItem); } - private static boolean isProgressive(MediaItem.PlaybackProperties playbackProperties) { + private static boolean isProgressive(MediaItem.LocalConfiguration localConfiguration) { return Util.inferContentTypeForUriAndMimeType( - playbackProperties.uri, playbackProperties.mimeType) + localConfiguration.uri, localConfiguration.mimeType) == C.TYPE_OTHER; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/ProgressiveDownloader.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/ProgressiveDownloader.java index 5be5ea785d..7af11dbbb4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/ProgressiveDownloader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/ProgressiveDownloader.java @@ -69,11 +69,11 @@ public final class ProgressiveDownloader implements Downloader { public ProgressiveDownloader( MediaItem mediaItem, CacheDataSource.Factory cacheDataSourceFactory, Executor executor) { this.executor = Assertions.checkNotNull(executor); - Assertions.checkNotNull(mediaItem.playbackProperties); + Assertions.checkNotNull(mediaItem.localConfiguration); dataSpec = new DataSpec.Builder() - .setUri(mediaItem.playbackProperties.uri) - .setKey(mediaItem.playbackProperties.customCacheKey) + .setUri(mediaItem.localConfiguration.uri) + .setKey(mediaItem.localConfiguration.customCacheKey) .setFlags(DataSpec.FLAG_ALLOW_CACHE_FRAGMENTATION) .build(); dataSource = cacheDataSourceFactory.createDataSourceForDownloading(); 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 7156f50a22..764d2c63f5 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 @@ -110,10 +110,10 @@ public abstract class SegmentDownloader> impleme Parser manifestParser, CacheDataSource.Factory cacheDataSourceFactory, Executor executor) { - checkNotNull(mediaItem.playbackProperties); - this.manifestDataSpec = getCompressibleDataSpec(mediaItem.playbackProperties.uri); + checkNotNull(mediaItem.localConfiguration); + this.manifestDataSpec = getCompressibleDataSpec(mediaItem.localConfiguration.uri); this.manifestParser = manifestParser; - this.streamKeys = new ArrayList<>(mediaItem.playbackProperties.streamKeys); + this.streamKeys = new ArrayList<>(mediaItem.localConfiguration.streamKeys); this.cacheDataSourceFactory = cacheDataSourceFactory; this.executor = executor; cache = Assertions.checkNotNull(cacheDataSourceFactory.getCache()); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index a5ffff4998..da82e72de4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -54,23 +54,23 @@ import java.util.List; * factories: * *

        - *
      • {@code DashMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri} - * ends in '.mpd' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType field} is + *
      • {@code DashMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri} + * ends in '.mpd' or if its {@link MediaItem.LocalConfiguration#mimeType mimeType field} is * explicitly set to {@link MimeTypes#APPLICATION_MPD} (Requires the exoplayer-dash module * to be added to the app). - *
      • {@code HlsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri} - * ends in '.m3u8' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType field} is + *
      • {@code HlsMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri} + * ends in '.m3u8' or if its {@link MediaItem.LocalConfiguration#mimeType mimeType field} is * explicitly set to {@link MimeTypes#APPLICATION_M3U8} (Requires the exoplayer-hls module to * be added to the app). - *
      • {@code SsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#uri uri} - * ends in '.ism', '.ism/Manifest' or if its {@link MediaItem.PlaybackProperties#mimeType + *
      • {@code SsMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri} + * ends in '.ism', '.ism/Manifest' or if its {@link MediaItem.LocalConfiguration#mimeType * mimeType field} is explicitly set to {@link MimeTypes#APPLICATION_SS} (Requires the * exoplayer-smoothstreaming module to be added to the app). *
      • {@link ProgressiveMediaSource.Factory} serves as a fallback if the item's {@link - * MediaItem.PlaybackProperties#uri uri} doesn't match one of the above. It tries to infer the + * MediaItem.LocalConfiguration#uri uri} doesn't match one of the above. It tries to infer the * required extractor by using the {@link DefaultExtractorsFactory} or the {@link * ExtractorsFactory} provided in the constructor. An {@link UnrecognizedInputFormatException} * is thrown if none of the available extractors can read the stream. @@ -78,7 +78,7 @@ import java.util.List; * *

        Ad support for media items with ad tag URIs

        * - *

        To support media items with {@link MediaItem.PlaybackProperties#adsConfiguration ads + *

        To support media items with {@link MediaItem.LocalConfiguration#adsConfiguration ads * configuration}, {@link #setAdsLoaderProvider} and {@link #setAdViewProvider} need to be called to * configure the factory with the required providers. */ @@ -86,17 +86,17 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Provides {@link AdsLoader} instances for media items that have {@link - * MediaItem.PlaybackProperties#adsConfiguration ad tag URIs}. + * MediaItem.LocalConfiguration#adsConfiguration ad tag URIs}. */ public interface AdsLoaderProvider { /** * Returns an {@link AdsLoader} for the given {@link - * MediaItem.PlaybackProperties#adsConfiguration ads configuration}, or {@code null} if no ads + * MediaItem.LocalConfiguration#adsConfiguration ads configuration}, or {@code null} if no ads * loader is available for the given ads configuration. * *

        This method is called each time a {@link MediaSource} is created from a {@link MediaItem} - * that defines an {@link MediaItem.PlaybackProperties#adsConfiguration ads configuration}. + * that defines an {@link MediaItem.LocalConfiguration#adsConfiguration ads configuration}. */ @Nullable AdsLoader getAdsLoader(MediaItem.AdsConfiguration adsConfiguration); @@ -173,7 +173,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Sets whether a {@link ProgressiveMediaSource} or {@link SingleSampleMediaSource} is constructed - * to handle {@link MediaItem.PlaybackProperties#subtitles}. Defaults to false (i.e. {@link + * to handle {@link MediaItem.LocalConfiguration#subtitles}. Defaults to false (i.e. {@link * SingleSampleMediaSource}. * *

        This method is experimental, and will be renamed or removed in a future release. @@ -190,7 +190,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Sets the {@link AdsLoaderProvider} that provides {@link AdsLoader} instances for media items - * that have {@link MediaItem.PlaybackProperties#adsConfiguration ads configurations}. + * that have {@link MediaItem.LocalConfiguration#adsConfiguration ads configurations}. * * @param adsLoaderProvider A provider for {@link AdsLoader} instances. * @return This factory, for convenience. @@ -341,11 +341,11 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @Override public MediaSource createMediaSource(MediaItem mediaItem) { - Assertions.checkNotNull(mediaItem.playbackProperties); + Assertions.checkNotNull(mediaItem.localConfiguration); @C.ContentType int type = Util.inferContentTypeForUriAndMimeType( - mediaItem.playbackProperties.uri, mediaItem.playbackProperties.mimeType); + mediaItem.localConfiguration.uri, mediaItem.localConfiguration.mimeType); @Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(type); Assertions.checkNotNull( mediaSourceFactory, "No suitable media source factory found for content type: " + type); @@ -375,7 +375,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { MediaSource mediaSource = mediaSourceFactory.createMediaSource(mediaItem); - List subtitles = castNonNull(mediaItem.playbackProperties).subtitles; + List subtitles = castNonNull(mediaItem.localConfiguration).subtitles; if (!subtitles.isEmpty()) { MediaSource[] mediaSources = new MediaSource[subtitles.size() + 1]; mediaSources[0] = mediaSource; @@ -434,9 +434,9 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } private MediaSource maybeWrapWithAdsMediaSource(MediaItem mediaItem, MediaSource mediaSource) { - Assertions.checkNotNull(mediaItem.playbackProperties); + Assertions.checkNotNull(mediaItem.localConfiguration); @Nullable - MediaItem.AdsConfiguration adsConfiguration = mediaItem.playbackProperties.adsConfiguration; + MediaItem.AdsConfiguration adsConfiguration = mediaItem.localConfiguration.adsConfiguration; if (adsConfiguration == null) { return mediaSource; } @@ -460,7 +460,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /* adsId= */ adsConfiguration.adsId != null ? adsConfiguration.adsId : ImmutableList.of( - mediaItem.mediaId, mediaItem.playbackProperties.uri, adsConfiguration.adTagUri), + mediaItem.mediaId, mediaItem.localConfiguration.uri, adsConfiguration.adTagUri), /* adMediaSourceFactory= */ this, adsLoader, adViewProvider); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index 755096bbe9..d4a5d6ca62 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -34,7 +34,7 @@ import java.util.List; /** Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. */ public interface MediaSourceFactory { - /** @deprecated Use {@link MediaItem.PlaybackProperties#streamKeys} instead. */ + /** @deprecated Use {@link MediaItem.LocalConfiguration#streamKeys} instead. */ @Deprecated default MediaSourceFactory setStreamKeys(@Nullable List streamKeys) { return this; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java index 9243ed5975..67d019ccee 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java @@ -215,14 +215,14 @@ public final class ProgressiveMediaSource extends BaseMediaSource * * @param mediaItem The {@link MediaItem}. * @return The new {@link ProgressiveMediaSource}. - * @throws NullPointerException if {@link MediaItem#playbackProperties} is {@code null}. + * @throws NullPointerException if {@link MediaItem#localConfiguration} is {@code null}. */ @Override public ProgressiveMediaSource createMediaSource(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); - boolean needsTag = mediaItem.playbackProperties.tag == null && tag != null; + checkNotNull(mediaItem.localConfiguration); + boolean needsTag = mediaItem.localConfiguration.tag == null && tag != null; boolean needsCustomCacheKey = - mediaItem.playbackProperties.customCacheKey == null && customCacheKey != null; + mediaItem.localConfiguration.customCacheKey == null && customCacheKey != null; if (needsTag && needsCustomCacheKey) { mediaItem = mediaItem.buildUpon().setTag(tag).setCustomCacheKey(customCacheKey).build(); } else if (needsTag) { @@ -252,7 +252,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource public static final int DEFAULT_LOADING_CHECK_INTERVAL_BYTES = 1024 * 1024; private final MediaItem mediaItem; - private final MediaItem.PlaybackProperties playbackProperties; + private final MediaItem.LocalConfiguration localConfiguration; private final DataSource.Factory dataSourceFactory; private final ProgressiveMediaExtractor.Factory progressiveMediaExtractorFactory; private final DrmSessionManager drmSessionManager; @@ -272,7 +272,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource DrmSessionManager drmSessionManager, LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy, int continueLoadingCheckIntervalBytes) { - this.playbackProperties = checkNotNull(mediaItem.playbackProperties); + this.localConfiguration = checkNotNull(mediaItem.localConfiguration); this.mediaItem = mediaItem; this.dataSourceFactory = dataSourceFactory; this.progressiveMediaExtractorFactory = progressiveMediaExtractorFactory; @@ -307,7 +307,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource dataSource.addTransferListener(transferListener); } return new ProgressiveMediaPeriod( - playbackProperties.uri, + localConfiguration.uri, dataSource, progressiveMediaExtractorFactory.createProgressiveMediaExtractor(), drmSessionManager, @@ -316,7 +316,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource createEventDispatcher(id), this, allocator, - playbackProperties.customCacheKey, + localConfiguration.customCacheKey, continueLoadingCheckIntervalBytes); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java index 93f3d7ac1a..dbd3349ccc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java @@ -58,8 +58,7 @@ public final class SilenceMediaSource extends BaseMediaSource { /** * Sets a tag for the media source which will be published in the {@link * com.google.android.exoplayer2.Timeline} of the source as {@link - * com.google.android.exoplayer2.MediaItem.PlaybackProperties#tag - * Window#mediaItem.playbackProperties.tag}. + * MediaItem.LocalConfiguration#tag Window#mediaItem.localConfiguration.tag}. * * @param tag A tag for the media source. * @return This factory, for convenience. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 887ce26463..607f4208d1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -61,8 +61,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { /** * Sets a tag for the media source which will be published in the {@link Timeline} of the source - * as {@link com.google.android.exoplayer2.MediaItem.PlaybackProperties#tag - * Window#mediaItem.playbackProperties.tag}. + * as {@link MediaItem.LocalConfiguration#tag Window#mediaItem.localConfiguration.tag}. * * @param tag A tag for the media source. * @return This factory, for convenience. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 23bdc14dc4..09208060a1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -314,10 +314,10 @@ public final class AdsMediaSource extends CompositeMediaSource { MediaItem.Builder adMediaItem = new MediaItem.Builder().setUri(adUri); // Propagate the content's DRM config into the ad media source. @Nullable - MediaItem.PlaybackProperties contentPlaybackProperties = - contentMediaSource.getMediaItem().playbackProperties; - if (contentPlaybackProperties != null) { - adMediaItem.setDrmConfiguration(contentPlaybackProperties.drmConfiguration); + MediaItem.LocalConfiguration contentLocalConfiguration = + contentMediaSource.getMediaItem().localConfiguration; + if (contentLocalConfiguration != null) { + adMediaItem.setDrmConfiguration(contentLocalConfiguration.drmConfiguration); } MediaSource adMediaSource = adMediaSourceFactory.createMediaSource(adMediaItem.build()); adMediaSourceHolder.initializeWithMediaSource(adMediaSource, adUri); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 2fda88cf20..105a90471b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -7953,11 +7953,11 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(currentMediaItems.get(0).playbackProperties.uri.toString()) + assertThat(currentMediaItems.get(0).localConfiguration.uri.toString()) .isEqualTo("http://foo.bar/fake1"); - assertThat(currentMediaItems.get(1).playbackProperties.uri.toString()) + assertThat(currentMediaItems.get(1).localConfiguration.uri.toString()) .isEqualTo("http://foo.bar/fake2"); - assertThat(currentMediaItems.get(2).playbackProperties.uri.toString()) + assertThat(currentMediaItems.get(2).localConfiguration.uri.toString()) .isEqualTo("http://foo.bar/fake3"); assertThat(mediaItemsInTimeline).containsExactlyElementsIn(currentMediaItems); } @@ -9767,7 +9767,7 @@ public final class ExoPlayerTest { assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); - assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(1); + assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000); @@ -9789,7 +9789,7 @@ public final class ExoPlayerTest { assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); - assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(1); + assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(10_000); @@ -9809,7 +9809,7 @@ public final class ExoPlayerTest { oldPositionInfo = oldPosition.getValue(); newPositionInfo = newPosition.getValue(); assertThat(oldPositionInfo.windowIndex).isEqualTo(1); - assertThat(oldPositionInfo.mediaItem.playbackProperties.tag).isEqualTo(2); + assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(2); assertThat(oldPositionInfo.windowUid).isNotEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(20_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(20_000); @@ -10131,7 +10131,7 @@ public final class ExoPlayerTest { assertThat(oldPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(0, window).uid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(0); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-0"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPosition.getValue().positionMs).isEqualTo(10_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(10_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10139,7 +10139,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); assertThat(newPosition.getValue().windowIndex).isEqualTo(1); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-1"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10159,13 +10159,13 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(2, window).uid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(1); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-1"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(oldPosition.getValue().positionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10179,14 +10179,14 @@ public final class ExoPlayerTest { newPosition.capture(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); @@ -10201,14 +10201,14 @@ public final class ExoPlayerTest { eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(2); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(19_999); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(19_999); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10226,14 +10226,14 @@ public final class ExoPlayerTest { .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-2"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowUid).isNotEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(3); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); @@ -10248,14 +10248,14 @@ public final class ExoPlayerTest { eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().windowIndex).isEqualTo(3); - assertThat(oldPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); + assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); assertThat(newPosition.getValue().windowIndex).isEqualTo(3); - assertThat(newPosition.getValue().mediaItem.playbackProperties.tag).isEqualTo("id-3"); + assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); @@ -10379,14 +10379,14 @@ public final class ExoPlayerTest { any(), newPositionArgumentCaptor.capture(), eq(Player.DISCONTINUITY_REASON_REMOVE)); // The state at auto-transition event time. assertThat(mediaItemCount[0]).isEqualTo(2); - assertThat(currentMediaItems[0].playbackProperties.tag).isEqualTo("id-1"); + assertThat(currentMediaItems[0].localConfiguration.tag).isEqualTo("id-1"); // The masked state after id-1 has been removed. assertThat(mediaItemCount[1]).isEqualTo(1); - assertThat(currentMediaItems[1].playbackProperties.tag).isEqualTo("id-0"); + assertThat(currentMediaItems[1].localConfiguration.tag).isEqualTo("id-0"); // PositionInfo reports the media item at event time. - assertThat(newPositionArgumentCaptor.getAllValues().get(0).mediaItem.playbackProperties.tag) + assertThat(newPositionArgumentCaptor.getAllValues().get(0).mediaItem.localConfiguration.tag) .isEqualTo("id-1"); - assertThat(newPositionArgumentCaptor.getAllValues().get(1).mediaItem.playbackProperties.tag) + assertThat(newPositionArgumentCaptor.getAllValues().get(1).mediaItem.localConfiguration.tag) .isEqualTo("id-0"); player.release(); } @@ -10717,20 +10717,20 @@ public final class ExoPlayerTest { List newPositions = newPosition.getAllValues(); assertThat(oldPositions.get(0).windowUid).isEqualTo(newPositions.get(0).windowUid); assertThat(newPositions.get(0).windowIndex).isEqualTo(0); - assertThat(newPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo("id-0"); + assertThat(newPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); - assertThat(oldPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo("id-0"); + assertThat(oldPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(newPositions.get(0).positionMs).isEqualTo(7_000); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).windowUid).isNotEqualTo(newPositions.get(1).windowUid); assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); - assertThat(oldPositions.get(1).mediaItem.playbackProperties.tag).isEqualTo("id-0"); + assertThat(oldPositions.get(1).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPositions.get(1).positionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(7_000); assertThat(newPositions.get(1).windowIndex).isEqualTo(1); - assertThat(newPositions.get(1).mediaItem.playbackProperties.tag).isEqualTo("id-1"); + assertThat(newPositions.get(1).mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(newPositions.get(1).positionMs).isEqualTo(1_000); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1_000); player.release(); @@ -11032,7 +11032,7 @@ public final class ExoPlayerTest { List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); - assertThat(oldPositions.get(0).mediaItem.playbackProperties.tag).isEqualTo(123); + assertThat(oldPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo(123); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); assertThat(newPositions.get(0).windowUid).isNull(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java index 5a042310a1..64eeec7f87 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java @@ -400,10 +400,10 @@ public class DownloadHelperTest { DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(data); - assertThat(downloadRequest.uri).isEqualTo(testMediaItem.playbackProperties.uri); - assertThat(downloadRequest.mimeType).isEqualTo(testMediaItem.playbackProperties.mimeType); + assertThat(downloadRequest.uri).isEqualTo(testMediaItem.localConfiguration.uri); + assertThat(downloadRequest.mimeType).isEqualTo(testMediaItem.localConfiguration.mimeType); assertThat(downloadRequest.customCacheKey) - .isEqualTo(testMediaItem.playbackProperties.customCacheKey); + .isEqualTo(testMediaItem.localConfiguration.customCacheKey); assertThat(downloadRequest.data).isEqualTo(data); assertThat(downloadRequest.streamKeys) .containsExactly( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/SilenceMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/SilenceMediaSourceTest.java index d8a7727953..cfe188b895 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/SilenceMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/SilenceMediaSourceTest.java @@ -38,8 +38,8 @@ public class SilenceMediaSourceTest { assertThat(mediaItem).isNotNull(); assertThat(mediaItem.mediaId).isEqualTo(SilenceMediaSource.MEDIA_ID); - assertThat(mediaItem.playbackProperties.uri).isEqualTo(Uri.EMPTY); - assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.AUDIO_RAW); + assertThat(mediaItem.localConfiguration.uri).isEqualTo(Uri.EMPTY); + assertThat(mediaItem.localConfiguration.mimeType).isEqualTo(MimeTypes.AUDIO_RAW); } @Test @@ -49,7 +49,7 @@ public class SilenceMediaSourceTest { SilenceMediaSource mediaSource = new SilenceMediaSource.Factory().setTag(tag).setDurationUs(1_000_000).createMediaSource(); - assertThat(mediaSource.getMediaItem().playbackProperties.tag).isEqualTo(tag); + assertThat(mediaSource.getMediaItem().localConfiguration.tag).isEqualTo(tag); } @Test @@ -59,7 +59,7 @@ public class SilenceMediaSourceTest { SilenceMediaSource mediaSource = new SilenceMediaSource.Factory().setTag(tag).setDurationUs(1_000_000).createMediaSource(); - assertThat(mediaSource.getMediaItem().playbackProperties.tag).isEqualTo(tag); + assertThat(mediaSource.getMediaItem().localConfiguration.tag).isEqualTo(tag); } @Test @@ -82,7 +82,7 @@ public class SilenceMediaSourceTest { assertThat(mediaItem).isNotNull(); assertThat(mediaItem.mediaId).isEqualTo(SilenceMediaSource.MEDIA_ID); - assertThat(mediaSource.getMediaItem().playbackProperties.uri).isEqualTo(Uri.EMPTY); - assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.AUDIO_RAW); + assertThat(mediaSource.getMediaItem().localConfiguration.uri).isEqualTo(Uri.EMPTY); + assertThat(mediaItem.localConfiguration.mimeType).isEqualTo(MimeTypes.AUDIO_RAW); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java index 5f5b28262d..aec51e3cab 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/SinglePeriodTimelineTest.java @@ -101,7 +101,7 @@ public final class SinglePeriodTimelineTest { new MediaItem.Builder().setUri(Uri.EMPTY).setTag(null).build()); assertThat(timeline.getWindow(/* windowIndex= */ 0, window).tag).isNull(); - assertThat(timeline.getWindow(/* windowIndex= */ 0, window).mediaItem.playbackProperties.tag) + assertThat(timeline.getWindow(/* windowIndex= */ 0, window).mediaItem.localConfiguration.tag) .isNull(); assertThat(timeline.getPeriod(/* periodIndex= */ 0, period, /* setIds= */ false).id).isNull(); assertThat(timeline.getPeriod(/* periodIndex= */ 0, period, /* setIds= */ true).id).isNull(); @@ -143,7 +143,7 @@ public final class SinglePeriodTimelineTest { Window window = timeline.getWindow(/* windowIndex= */ 0, this.window); assertThat(window.mediaItem).isEqualTo(mediaItem); - assertThat(window.tag).isEqualTo(mediaItem.playbackProperties.tag); + assertThat(window.tag).isEqualTo(mediaItem.localConfiguration.tag); } @Test diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index f99e6017b1..af0ee0ef22 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -315,10 +315,10 @@ public final class DashMediaSource extends BaseMediaSource { Assertions.checkArgument(!manifest.dynamic); MediaItem.Builder mediaItemBuilder = mediaItem.buildUpon().setMimeType(MimeTypes.APPLICATION_MPD); - if (mediaItem.playbackProperties == null) { + if (mediaItem.localConfiguration == null) { mediaItemBuilder.setUri(Uri.EMPTY); } - if (mediaItem.playbackProperties == null || mediaItem.playbackProperties.tag == null) { + if (mediaItem.localConfiguration == null || mediaItem.localConfiguration.tag == null) { mediaItemBuilder.setTag(tag); } if (mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET) { @@ -329,12 +329,12 @@ public final class DashMediaSource extends BaseMediaSource { .setTargetOffsetMs(targetLiveOffsetOverrideMs) .build()); } - if (mediaItem.playbackProperties == null - || mediaItem.playbackProperties.streamKeys.isEmpty()) { + if (mediaItem.localConfiguration == null + || mediaItem.localConfiguration.streamKeys.isEmpty()) { mediaItemBuilder.setStreamKeys(streamKeys); } mediaItem = mediaItemBuilder.build(); - if (!checkNotNull(mediaItem.playbackProperties).streamKeys.isEmpty()) { + if (!checkNotNull(mediaItem.localConfiguration).streamKeys.isEmpty()) { manifest = manifest.copy(streamKeys); } return new DashMediaSource( @@ -367,26 +367,26 @@ public final class DashMediaSource extends BaseMediaSource { * * @param mediaItem The media item of the dash stream. * @return The new {@link DashMediaSource}. - * @throws NullPointerException if {@link MediaItem#playbackProperties} is {@code null}. + * @throws NullPointerException if {@link MediaItem#localConfiguration} is {@code null}. */ @Override public DashMediaSource createMediaSource(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); + checkNotNull(mediaItem.localConfiguration); @Nullable ParsingLoadable.Parser manifestParser = this.manifestParser; if (manifestParser == null) { manifestParser = new DashManifestParser(); } List streamKeys = - mediaItem.playbackProperties.streamKeys.isEmpty() + mediaItem.localConfiguration.streamKeys.isEmpty() ? this.streamKeys - : mediaItem.playbackProperties.streamKeys; + : mediaItem.localConfiguration.streamKeys; if (!streamKeys.isEmpty()) { manifestParser = new FilteringManifestParser<>(manifestParser, streamKeys); } - boolean needsTag = mediaItem.playbackProperties.tag == null && tag != null; + boolean needsTag = mediaItem.localConfiguration.tag == null && tag != null; boolean needsStreamKeys = - mediaItem.playbackProperties.streamKeys.isEmpty() && !streamKeys.isEmpty(); + mediaItem.localConfiguration.streamKeys.isEmpty() && !streamKeys.isEmpty(); boolean needsTargetLiveOffset = mediaItem.liveConfiguration.targetOffsetMs == C.TIME_UNSET && targetLiveOffsetOverrideMs != C.TIME_UNSET; @@ -501,8 +501,8 @@ public final class DashMediaSource extends BaseMediaSource { long fallbackTargetLiveOffsetMs) { this.mediaItem = mediaItem; this.liveConfiguration = mediaItem.liveConfiguration; - this.manifestUri = checkNotNull(mediaItem.playbackProperties).uri; - this.initialManifestUri = mediaItem.playbackProperties.uri; + this.manifestUri = checkNotNull(mediaItem.localConfiguration).uri; + this.initialManifestUri = mediaItem.localConfiguration.uri; this.manifest = manifest; this.manifestDataSourceFactory = manifestDataSourceFactory; this.manifestParser = manifestParser; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java index cc9947b4d3..004b7e22c7 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DashMediaSourceTest.java @@ -111,9 +111,9 @@ public final class DashMediaSourceTest { MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(dashMediaItem.playbackProperties).isNotNull(); - assertThat(dashMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(dashMediaItem.playbackProperties.tag).isEqualTo(tag); + assertThat(dashMediaItem.localConfiguration).isNotNull(); + assertThat(dashMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(dashMediaItem.localConfiguration.tag).isEqualTo(tag); } // Tests backwards compatibility @@ -129,9 +129,9 @@ public final class DashMediaSourceTest { MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(dashMediaItem.playbackProperties).isNotNull(); - assertThat(dashMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(dashMediaItem.playbackProperties.tag).isEqualTo(mediaItemTag); + assertThat(dashMediaItem.localConfiguration).isNotNull(); + assertThat(dashMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(dashMediaItem.localConfiguration.tag).isEqualTo(mediaItemTag); } // Tests backwards compatibility @@ -146,9 +146,9 @@ public final class DashMediaSourceTest { MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(dashMediaItem.playbackProperties).isNotNull(); - assertThat(dashMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(dashMediaItem.playbackProperties.streamKeys).containsExactly(streamKey); + assertThat(dashMediaItem.localConfiguration).isNotNull(); + assertThat(dashMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(dashMediaItem.localConfiguration.streamKeys).containsExactly(streamKey); } // Tests backwards compatibility @@ -168,9 +168,9 @@ public final class DashMediaSourceTest { MediaItem dashMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(dashMediaItem.playbackProperties).isNotNull(); - assertThat(dashMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(dashMediaItem.playbackProperties.streamKeys).containsExactly(mediaItemStreamKey); + assertThat(dashMediaItem.localConfiguration).isNotNull(); + assertThat(dashMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(dashMediaItem.localConfiguration.streamKeys).containsExactly(mediaItemStreamKey); } @Test diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java index ab7f456c55..8a607d9110 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultMediaSourceFactoryTest.java @@ -60,7 +60,7 @@ public class DefaultMediaSourceFactoryTest { MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); - assertThat(mediaSource.getMediaItem().playbackProperties.tag).isEqualTo(tag); + assertThat(mediaSource.getMediaItem().localConfiguration.tag).isEqualTo(tag); } @Test diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 6fafd35a46..45c16bb8c9 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -365,24 +365,24 @@ public final class HlsMediaSource extends BaseMediaSource * * @param mediaItem The {@link MediaItem}. * @return The new {@link HlsMediaSource}. - * @throws NullPointerException if {@link MediaItem#playbackProperties} is {@code null}. + * @throws NullPointerException if {@link MediaItem#localConfiguration} is {@code null}. */ @Override public HlsMediaSource createMediaSource(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); + checkNotNull(mediaItem.localConfiguration); HlsPlaylistParserFactory playlistParserFactory = this.playlistParserFactory; List streamKeys = - mediaItem.playbackProperties.streamKeys.isEmpty() + mediaItem.localConfiguration.streamKeys.isEmpty() ? this.streamKeys - : mediaItem.playbackProperties.streamKeys; + : mediaItem.localConfiguration.streamKeys; if (!streamKeys.isEmpty()) { playlistParserFactory = new FilteringHlsPlaylistParserFactory(playlistParserFactory, streamKeys); } - boolean needsTag = mediaItem.playbackProperties.tag == null && tag != null; + boolean needsTag = mediaItem.localConfiguration.tag == null && tag != null; boolean needsStreamKeys = - mediaItem.playbackProperties.streamKeys.isEmpty() && !streamKeys.isEmpty(); + mediaItem.localConfiguration.streamKeys.isEmpty() && !streamKeys.isEmpty(); if (needsTag && needsStreamKeys) { mediaItem = mediaItem.buildUpon().setTag(tag).setStreamKeys(streamKeys).build(); } else if (needsTag) { @@ -412,7 +412,7 @@ public final class HlsMediaSource extends BaseMediaSource } private final HlsExtractorFactory extractorFactory; - private final MediaItem.PlaybackProperties playbackProperties; + private final MediaItem.LocalConfiguration localConfiguration; private final HlsDataSourceFactory dataSourceFactory; private final CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; private final DrmSessionManager drmSessionManager; @@ -439,7 +439,7 @@ public final class HlsMediaSource extends BaseMediaSource boolean allowChunklessPreparation, @MetadataType int metadataType, boolean useSessionKeys) { - this.playbackProperties = checkNotNull(mediaItem.playbackProperties); + this.localConfiguration = checkNotNull(mediaItem.localConfiguration); this.mediaItem = mediaItem; this.liveConfiguration = mediaItem.liveConfiguration; this.dataSourceFactory = dataSourceFactory; @@ -465,7 +465,8 @@ public final class HlsMediaSource extends BaseMediaSource drmSessionManager.prepare(); MediaSourceEventListener.EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); - playlistTracker.start(playbackProperties.uri, eventDispatcher, /* listener= */ this); + playlistTracker.start( + localConfiguration.uri, eventDispatcher, /* primaryPlaylistListener= */ this); } @Override diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java index 54383ffe33..d67c1fb3ea 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/DefaultMediaSourceFactoryTest.java @@ -60,7 +60,7 @@ public class DefaultMediaSourceFactoryTest { MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); - assertThat(mediaSource.getMediaItem().playbackProperties.tag).isEqualTo(tag); + assertThat(mediaSource.getMediaItem().localConfiguration.tag).isEqualTo(tag); } @Test diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java index aeda359e0a..a21cd456c3 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaSourceTest.java @@ -59,9 +59,9 @@ public class HlsMediaSourceTest { MediaItem hlsMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(hlsMediaItem.playbackProperties).isNotNull(); - assertThat(hlsMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(hlsMediaItem.playbackProperties.tag).isEqualTo(tag); + assertThat(hlsMediaItem.localConfiguration).isNotNull(); + assertThat(hlsMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(hlsMediaItem.localConfiguration.tag).isEqualTo(tag); } // Tests backwards compatibility @@ -77,9 +77,9 @@ public class HlsMediaSourceTest { MediaItem hlsMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(hlsMediaItem.playbackProperties).isNotNull(); - assertThat(hlsMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(hlsMediaItem.playbackProperties.tag).isEqualTo(mediaItemTag); + assertThat(hlsMediaItem.localConfiguration).isNotNull(); + assertThat(hlsMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(hlsMediaItem.localConfiguration.tag).isEqualTo(mediaItemTag); } // Tests backwards compatibility @@ -94,9 +94,9 @@ public class HlsMediaSourceTest { MediaItem hlsMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(hlsMediaItem.playbackProperties).isNotNull(); - assertThat(hlsMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(hlsMediaItem.playbackProperties.streamKeys).containsExactly(streamKey); + assertThat(hlsMediaItem.localConfiguration).isNotNull(); + assertThat(hlsMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(hlsMediaItem.localConfiguration.streamKeys).containsExactly(streamKey); } // Tests backwards compatibility @@ -116,9 +116,9 @@ public class HlsMediaSourceTest { MediaItem hlsMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(hlsMediaItem.playbackProperties).isNotNull(); - assertThat(hlsMediaItem.playbackProperties.uri).isEqualTo(mediaItem.playbackProperties.uri); - assertThat(hlsMediaItem.playbackProperties.streamKeys).containsExactly(mediaItemStreamKey); + assertThat(hlsMediaItem.localConfiguration).isNotNull(); + assertThat(hlsMediaItem.localConfiguration.uri).isEqualTo(mediaItem.localConfiguration.uri); + assertThat(hlsMediaItem.localConfiguration.streamKeys).containsExactly(mediaItemStreamKey); } @Test diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java index 688c2f40b3..63bbeed35c 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java @@ -191,11 +191,11 @@ public final class RtspMediaSource extends BaseMediaSource { * * @param mediaItem The {@link MediaItem}. * @return The new {@link RtspMediaSource}. - * @throws NullPointerException if {@link MediaItem#playbackProperties} is {@code null}. + * @throws NullPointerException if {@link MediaItem#localConfiguration} is {@code null}. */ @Override public RtspMediaSource createMediaSource(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); + checkNotNull(mediaItem.localConfiguration); return new RtspMediaSource( mediaItem, forceUseRtpTcp @@ -241,7 +241,7 @@ public final class RtspMediaSource extends BaseMediaSource { this.mediaItem = mediaItem; this.rtpDataChannelFactory = rtpDataChannelFactory; this.userAgent = userAgent; - this.uri = checkNotNull(this.mediaItem.playbackProperties).uri; + this.uri = checkNotNull(this.mediaItem.localConfiguration).uri; this.debugLoggingEnabled = debugLoggingEnabled; this.timelineDurationUs = C.TIME_UNSET; this.timelineIsPlaceholder = true; diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index cab77cb072..aabe71ce73 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -277,20 +277,20 @@ public final class SsMediaSource extends BaseMediaSource public SsMediaSource createMediaSource(SsManifest manifest, MediaItem mediaItem) { Assertions.checkArgument(!manifest.isLive); List streamKeys = - mediaItem.playbackProperties != null && !mediaItem.playbackProperties.streamKeys.isEmpty() - ? mediaItem.playbackProperties.streamKeys + mediaItem.localConfiguration != null && !mediaItem.localConfiguration.streamKeys.isEmpty() + ? mediaItem.localConfiguration.streamKeys : this.streamKeys; if (!streamKeys.isEmpty()) { manifest = manifest.copy(streamKeys); } - boolean hasUri = mediaItem.playbackProperties != null; - boolean hasTag = hasUri && mediaItem.playbackProperties.tag != null; + boolean hasUri = mediaItem.localConfiguration != null; + boolean hasTag = hasUri && mediaItem.localConfiguration.tag != null; mediaItem = mediaItem .buildUpon() .setMimeType(MimeTypes.APPLICATION_SS) - .setUri(hasUri ? mediaItem.playbackProperties.uri : Uri.EMPTY) - .setTag(hasTag ? mediaItem.playbackProperties.tag : tag) + .setUri(hasUri ? mediaItem.localConfiguration.uri : Uri.EMPTY) + .setTag(hasTag ? mediaItem.localConfiguration.tag : tag) .setStreamKeys(streamKeys) .build(); return new SsMediaSource( @@ -310,26 +310,26 @@ public final class SsMediaSource extends BaseMediaSource * * @param mediaItem The {@link MediaItem}. * @return The new {@link SsMediaSource}. - * @throws NullPointerException if {@link MediaItem#playbackProperties} is {@code null}. + * @throws NullPointerException if {@link MediaItem#localConfiguration} is {@code null}. */ @Override public SsMediaSource createMediaSource(MediaItem mediaItem) { - checkNotNull(mediaItem.playbackProperties); + checkNotNull(mediaItem.localConfiguration); @Nullable ParsingLoadable.Parser manifestParser = this.manifestParser; if (manifestParser == null) { manifestParser = new SsManifestParser(); } List streamKeys = - !mediaItem.playbackProperties.streamKeys.isEmpty() - ? mediaItem.playbackProperties.streamKeys + !mediaItem.localConfiguration.streamKeys.isEmpty() + ? mediaItem.localConfiguration.streamKeys : this.streamKeys; if (!streamKeys.isEmpty()) { manifestParser = new FilteringManifestParser<>(manifestParser, streamKeys); } - boolean needsTag = mediaItem.playbackProperties.tag == null && tag != null; + boolean needsTag = mediaItem.localConfiguration.tag == null && tag != null; boolean needsStreamKeys = - mediaItem.playbackProperties.streamKeys.isEmpty() && !streamKeys.isEmpty(); + mediaItem.localConfiguration.streamKeys.isEmpty() && !streamKeys.isEmpty(); if (needsTag && needsStreamKeys) { mediaItem = mediaItem.buildUpon().setTag(tag).setStreamKeys(streamKeys).build(); } else if (needsTag) { @@ -370,7 +370,7 @@ public final class SsMediaSource extends BaseMediaSource private final boolean sideloadedManifest; private final Uri manifestUri; - private final MediaItem.PlaybackProperties playbackProperties; + private final MediaItem.LocalConfiguration localConfiguration; private final MediaItem mediaItem; private final DataSource.Factory manifestDataSourceFactory; private final SsChunkSource.Factory chunkSourceFactory; @@ -404,12 +404,12 @@ public final class SsMediaSource extends BaseMediaSource long livePresentationDelayMs) { Assertions.checkState(manifest == null || !manifest.isLive); this.mediaItem = mediaItem; - playbackProperties = checkNotNull(mediaItem.playbackProperties); + localConfiguration = checkNotNull(mediaItem.localConfiguration); this.manifest = manifest; this.manifestUri = - playbackProperties.uri.equals(Uri.EMPTY) + localConfiguration.uri.equals(Uri.EMPTY) ? null - : Util.fixSmoothStreamingIsmManifestUri(playbackProperties.uri); + : Util.fixSmoothStreamingIsmManifestUri(localConfiguration.uri); this.manifestDataSourceFactory = manifestDataSourceFactory; this.manifestParser = manifestParser; this.chunkSourceFactory = chunkSourceFactory; diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java index e5def39cd1..dcb99b5074 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java @@ -87,7 +87,7 @@ public final class SsDownloader extends SegmentDownloader { .buildUpon() .setUri( Util.fixSmoothStreamingIsmManifestUri( - checkNotNull(mediaItem.playbackProperties).uri)) + checkNotNull(mediaItem.localConfiguration).uri)) .build(), new SsManifestParser(), cacheDataSourceFactory, diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java index 43c62071d3..01face26c6 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultMediaSourceFactoryTest.java @@ -60,7 +60,7 @@ public class DefaultMediaSourceFactoryTest { MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); - assertThat(mediaSource.getMediaItem().playbackProperties.tag).isEqualTo(tag); + assertThat(mediaSource.getMediaItem().localConfiguration.tag).isEqualTo(tag); } @Test diff --git a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSourceTest.java b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSourceTest.java index 7e6f659ce7..a0719c0608 100644 --- a/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSourceTest.java +++ b/library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSourceTest.java @@ -41,10 +41,10 @@ public class SsMediaSourceTest { MediaItem ssMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(ssMediaItem.playbackProperties).isNotNull(); - assertThat(ssMediaItem.playbackProperties.uri) - .isEqualTo(castNonNull(mediaItem.playbackProperties).uri); - assertThat(ssMediaItem.playbackProperties.tag).isEqualTo(tag); + assertThat(ssMediaItem.localConfiguration).isNotNull(); + assertThat(ssMediaItem.localConfiguration.uri) + .isEqualTo(castNonNull(mediaItem.localConfiguration).uri); + assertThat(ssMediaItem.localConfiguration.tag).isEqualTo(tag); } // Tests backwards compatibility @@ -60,10 +60,10 @@ public class SsMediaSourceTest { MediaItem ssMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(ssMediaItem.playbackProperties).isNotNull(); - assertThat(ssMediaItem.playbackProperties.uri) - .isEqualTo(castNonNull(mediaItem.playbackProperties).uri); - assertThat(ssMediaItem.playbackProperties.tag).isEqualTo(mediaItemTag); + assertThat(ssMediaItem.localConfiguration).isNotNull(); + assertThat(ssMediaItem.localConfiguration.uri) + .isEqualTo(castNonNull(mediaItem.localConfiguration).uri); + assertThat(ssMediaItem.localConfiguration.tag).isEqualTo(mediaItemTag); } // Tests backwards compatibility @@ -78,10 +78,10 @@ public class SsMediaSourceTest { MediaItem ssMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(ssMediaItem.playbackProperties).isNotNull(); - assertThat(ssMediaItem.playbackProperties.uri) - .isEqualTo(castNonNull(mediaItem.playbackProperties).uri); - assertThat(ssMediaItem.playbackProperties.streamKeys).containsExactly(streamKey); + assertThat(ssMediaItem.localConfiguration).isNotNull(); + assertThat(ssMediaItem.localConfiguration.uri) + .isEqualTo(castNonNull(mediaItem.localConfiguration).uri); + assertThat(ssMediaItem.localConfiguration.streamKeys).containsExactly(streamKey); } // Tests backwards compatibility @@ -101,9 +101,9 @@ public class SsMediaSourceTest { MediaItem ssMediaItem = factory.createMediaSource(mediaItem).getMediaItem(); - assertThat(ssMediaItem.playbackProperties).isNotNull(); - assertThat(ssMediaItem.playbackProperties.uri) - .isEqualTo(castNonNull(mediaItem.playbackProperties).uri); - assertThat(ssMediaItem.playbackProperties.streamKeys).containsExactly(mediaItemStreamKey); + assertThat(ssMediaItem.localConfiguration).isNotNull(); + assertThat(ssMediaItem.localConfiguration.uri) + .isEqualTo(castNonNull(mediaItem.localConfiguration).uri); + assertThat(ssMediaItem.localConfiguration.streamKeys).containsExactly(mediaItemStreamKey); } } 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 330450173b..7e098bfe78 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 @@ -85,7 +85,7 @@ public class FakeMediaSource extends BaseMediaSource { new MediaItem.Builder().setMediaId("FakeMediaSource").setUri("http://manifest.uri").build(); private static final DataSpec FAKE_DATA_SPEC = - new DataSpec(castNonNull(FAKE_MEDIA_ITEM.playbackProperties).uri); + new DataSpec(castNonNull(FAKE_MEDIA_ITEM.localConfiguration).uri); private static final int MANIFEST_LOAD_BYTES = 100; private final TrackGroupArray trackGroupArray; 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 c5154dbadc..1627f3a6cf 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 @@ -58,9 +58,9 @@ public final class TimelineAsserts { for (int i = 0; i < timeline.getWindowCount(); i++) { timeline.getWindow(i, window); if (expectedWindowTags[i] != null) { - MediaItem.PlaybackProperties playbackProperties = window.mediaItem.playbackProperties; - assertThat(playbackProperties).isNotNull(); - assertThat(Util.castNonNull(playbackProperties).tag).isEqualTo(expectedWindowTags[i]); + MediaItem.LocalConfiguration localConfiguration = window.mediaItem.localConfiguration; + assertThat(localConfiguration).isNotNull(); + assertThat(Util.castNonNull(localConfiguration).tag).isEqualTo(expectedWindowTags[i]); } } } From ed23b2905bcf74b3cbe915fdb87ff3f6c50e28b9 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 28 Sep 2021 09:36:18 +0100 Subject: [PATCH 237/441] Migrate callers of ExoPlayer.Builder#build() to buildExoPlayer() An upcoming change will update build() to return Player. PiperOrigin-RevId: 399382297 --- .../android/exoplayer2/gldemo/MainActivity.java | 2 +- .../exoplayer2/surfacedemo/MainActivity.java | 2 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 2 +- .../exoplayer2/ext/media2/PlayerTestRule.java | 2 +- .../ext/media2/SessionPlayerConnectorTest.java | 6 ++++-- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 2 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 2 +- .../android/exoplayer2/ClippedPlaybackTest.java | 4 ++-- .../android/exoplayer2/drm/DrmPlaybackTest.java | 2 +- .../android/exoplayer2/SimpleExoPlayerTest.java | 14 ++++++++------ .../analytics/AnalyticsCollectorTest.java | 2 +- .../exoplayer2/e2etest/EndToEndGaplessTest.java | 2 +- .../exoplayer2/e2etest/FlacPlaybackTest.java | 2 +- .../exoplayer2/e2etest/FlvPlaybackTest.java | 2 +- .../exoplayer2/e2etest/MkaPlaybackTest.java | 2 +- .../exoplayer2/e2etest/MkvPlaybackTest.java | 2 +- .../exoplayer2/e2etest/Mp3PlaybackTest.java | 2 +- .../exoplayer2/e2etest/Mp4PlaybackTest.java | 2 +- .../exoplayer2/e2etest/OggPlaybackTest.java | 2 +- .../exoplayer2/e2etest/PlaylistPlaybackTest.java | 4 ++-- .../exoplayer2/e2etest/SilencePlaybackTest.java | 4 ++-- .../android/exoplayer2/e2etest/TsPlaybackTest.java | 2 +- .../exoplayer2/e2etest/Vp9PlaybackTest.java | 2 +- .../exoplayer2/e2etest/WavPlaybackTest.java | 2 +- .../ads/ServerSideInsertedAdMediaSourceTest.java | 10 ++++++---- .../source/dash/e2etest/DashPlaybackTest.java | 4 ++-- .../exoplayer2/source/rtsp/RtspPlaybackTest.java | 2 +- .../exoplayer2/transformer/Transformer.java | 2 +- .../playbacktests/gts/DashTestRunner.java | 2 +- .../android/exoplayer2/testutil/ExoHostedTest.java | 4 +++- .../exoplayer2/testutil/TestExoPlayerBuilder.java | 2 +- 31 files changed, 52 insertions(+), 44 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index 7488d94f98..aff3dbbf48 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -173,7 +173,7 @@ public final class MainActivity extends Activity { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).buildExoPlayer(); player.setRepeatMode(Player.REPEAT_MODE_ALL); player.setMediaSource(mediaSource); player.prepare(); diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index 44dd9d423b..a5fbd98431 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -217,7 +217,7 @@ public final class MainActivity extends Activity { } else { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).buildExoPlayer(); player.setMediaSource(mediaSource); player.prepare(); player.play(); diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index f5886505a9..f0f667ae4b 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -117,7 +117,7 @@ public class FlacPlaybackTest { new Renderer[] { new LibflacAudioRenderer(eventHandler, audioRendererEventListener, audioSink) }; - player = new ExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index 0dc6b89238..fcbd97e965 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -73,7 +73,7 @@ import org.junit.rules.ExternalResource; new ExoPlayer.Builder(context) .setLooper(Looper.myLooper()) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) - .build(); + .buildExoPlayer(); sessionPlayerConnector = new SessionPlayerConnector(exoPlayer); }); } diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java index 5e78ba99a2..8a1712e3fe 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java @@ -170,7 +170,8 @@ public class SessionPlayerConnectorTest { SimpleExoPlayer simpleExoPlayer = null; SessionPlayerConnector playerConnector = null; try { - simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + simpleExoPlayer = + new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).buildExoPlayer(); playerConnector = new SessionPlayerConnector(simpleExoPlayer, new DefaultMediaItemConverter()); playerConnector.setControlDispatcher(controlDispatcher); @@ -195,7 +196,8 @@ public class SessionPlayerConnectorTest { Player forwardingPlayer = null; SessionPlayerConnector playerConnector = null; try { - Player simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + Player simpleExoPlayer = + new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).buildExoPlayer(); forwardingPlayer = new ForwardingPlayer(simpleExoPlayer) { @Override diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index a398399068..629a6b55ad 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -97,7 +97,7 @@ public class OpusPlaybackTest { textRendererOutput, metadataRendererOutput) -> new Renderer[] {new LibopusAudioRenderer(eventHandler, audioRendererEventListener)}; - player = new ExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 544418bd51..a571f72c51 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -131,7 +131,7 @@ public class VpxPlaybackTest { videoRendererEventListener, /* maxDroppedFramesToNotify= */ -1) }; - player = new ExoPlayer.Builder(context, renderersFactory).build(); + player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index 001c3d69c9..7accfce7da 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -59,7 +59,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); player.get().addListener(textCapturer); player.get().setMediaItem(mediaItem); player.get().prepare(); @@ -101,7 +101,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); player.get().addListener(textCapturer); player.get().setMediaItems(mediaItems); player.get().prepare(); diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java index c342e9a1a7..57357974db 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java @@ -70,7 +70,7 @@ public final class DrmPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); player .get() .addListener( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java index 15bd503925..a758250fb4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java @@ -52,7 +52,9 @@ public class SimpleExoPlayerTest { public void builder_inBackgroundThread_doesNotThrow() throws Exception { Thread builderThread = new Thread( - () -> new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); + () -> + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) + .buildExoPlayer()); AtomicReference builderThrow = new AtomicReference<>(); builderThread.setUncaughtExceptionHandler((thread, throwable) -> builderThrow.set(throwable)); @@ -65,7 +67,7 @@ public class SimpleExoPlayerTest { @Test public void onPlaylistMetadataChanged_calledWhenPlaylistMetadataSet() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); Player.Listener playerListener = mock(Player.Listener.class); player.addListener(playerListener); AnalyticsListener analyticsListener = mock(AnalyticsListener.class); @@ -86,7 +88,7 @@ public class SimpleExoPlayerTest { (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); AnalyticsListener listener = mock(AnalyticsListener.class); player.addAnalyticsListener(listener); // Do something that requires clean-up callbacks like decoder disabling. @@ -112,7 +114,7 @@ public class SimpleExoPlayerTest { (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); player.setMediaSource( @@ -133,7 +135,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingVolumeEventInListener() throws Exception { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); @@ -147,7 +149,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingDeviceVolumeEventsInListener() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 2c8373d64a..905d60e08c 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -1951,7 +1951,7 @@ public final class AnalyticsCollectorTest { public void recursiveListenerInvocation_arrivesInCorrectOrder() { AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); analyticsCollector.setPlayer( - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(), Looper.myLooper()); AnalyticsListener listener1 = mock(AnalyticsListener.class); AnalyticsListener listener2 = diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java index 3e2422f064..254a658981 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java @@ -90,7 +90,7 @@ public class EndToEndGaplessTest { SimpleExoPlayer player = new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setMediaItems( ImmutableList.of( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java index 779199c7a7..83d9e0db00 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java @@ -67,7 +67,7 @@ public class FlacPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/flac/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java index 51e9051b60..c00b1f4f01 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java @@ -58,7 +58,7 @@ public final class FlvPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java index a3e2c1c32e..fedef9f8b6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java @@ -60,7 +60,7 @@ public final class MkaPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/mka/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index 398d6c05d4..d8158efe9c 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -64,7 +64,7 @@ public final class MkvPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java index 53a2d62de7..e4ec831b70 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java @@ -63,7 +63,7 @@ public final class Mp3PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/mp3/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java index ccb6ca9961..9076c3c2b6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java @@ -80,7 +80,7 @@ public class Mp4PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java index 3966dd59ca..79b17c6952 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java @@ -61,7 +61,7 @@ public final class OggPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/ogg/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java index a5ecc58580..37b2b1ed3f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java @@ -48,7 +48,7 @@ public final class PlaylistPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.addMediaItem(MediaItem.fromUri("asset:///media/wav/sample.wav")); @@ -70,7 +70,7 @@ public final class PlaylistPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.addMediaItem(MediaItem.fromUri("asset:///media/mka/bear-opus.mka")); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java index 7acd02fc66..94438c922a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java @@ -48,7 +48,7 @@ public final class SilencePlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaSource(new SilenceMediaSource(/* durationUs= */ 500_000)); @@ -69,7 +69,7 @@ public final class SilencePlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaSource(new SilenceMediaSource(/* durationUs= */ 0)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java index fc741e0710..3afe1c28ea 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java @@ -84,7 +84,7 @@ public class TsPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java index 01f12d272d..69ad00f769 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java @@ -62,7 +62,7 @@ public final class Vp9PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java index 451a9d9f8b..f51dd92a71 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java @@ -55,7 +55,7 @@ public final class WavPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/wav/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java index d93f802190..0bf3080830 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java @@ -146,7 +146,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -205,7 +205,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -265,7 +265,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -320,7 +320,9 @@ public final class ServerSideInsertedAdMediaSourceTest { public void playbackWithSeek_isHandledCorrectly() throws Exception { Context context = ApplicationProvider.getApplicationContext(); SimpleExoPlayer player = - new ExoPlayer.Builder(context).setClock(new FakeClock(/* isAutoAdvancing= */ true)).build(); + new ExoPlayer.Builder(context) + .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); ServerSideInsertedAdsMediaSource mediaSource = diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index 053fd707e4..52c6d0fa99 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -54,7 +54,7 @@ public final class DashPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -81,7 +81,7 @@ public final class DashPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .build(); + .buildExoPlayer(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java index 4fd7361444..87b9064229 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java @@ -153,7 +153,7 @@ public final class RtspPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(clock) - .build(); + .buildExoPlayer(); player.setMediaSource( new RtspMediaSource( MediaItem.fromUri(RtspTestUtils.getTestUri(serverRtspPortNumber)), diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index d79aae40af..7e7ead9440 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -486,7 +486,7 @@ public final class Transformer { .setLoadControl(loadControl) .setLooper(looper) .setClock(clock) - .build(); + .buildExoPlayer(); player.setMediaItem(mediaItem); player.addAnalyticsListener(new TransformerAnalyticsListener(mediaItem, muxerWrapper)); player.prepare(); diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index e0ae2074e2..87419dc67d 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -317,7 +317,7 @@ import java.util.List; SimpleExoPlayer player = new ExoPlayer.Builder(host, new DebugRenderersFactory(host)) .setTrackSelector(trackSelector) - .build(); + .buildExoPlayer(); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index 97004ddacb..d4aa6b259f 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -248,7 +248,9 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); renderersFactory.setAllowedVideoJoiningTimeMs(/* allowedVideoJoiningTimeMs= */ 0); SimpleExoPlayer player = - new ExoPlayer.Builder(host, renderersFactory).setTrackSelector(trackSelector).build(); + new ExoPlayer.Builder(host, renderersFactory) + .setTrackSelector(trackSelector) + .buildExoPlayer(); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index c7089dcc9d..ea524256c9 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -313,6 +313,6 @@ public class TestExoPlayerBuilder { if (mediaSourceFactory != null) { builder.setMediaSourceFactory(mediaSourceFactory); } - return builder.build(); + return builder.buildExoPlayer(); } } From 3e7b2d06c1c36526f6c3175b9e79e82610342998 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 28 Sep 2021 11:35:41 +0100 Subject: [PATCH 238/441] Move SubtitleExtractor to text package PiperOrigin-RevId: 399400909 --- .../android/exoplayer2/source/DefaultMediaSourceFactory.java | 2 +- .../extractor/{subtitle => text}/SubtitleExtractor.java | 2 +- .../exoplayer2/extractor/{subtitle => text}/package-info.java | 2 +- .../extractor/{subtitle => text}/SubtitleExtractorTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename library/extractor/src/main/java/com/google/android/exoplayer2/extractor/{subtitle => text}/SubtitleExtractor.java (99%) rename library/extractor/src/main/java/com/google/android/exoplayer2/extractor/{subtitle => text}/package-info.java (92%) rename library/extractor/src/test/java/com/google/android/exoplayer2/extractor/{subtitle => text}/SubtitleExtractorTest.java (99%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index da82e72de4..c52646c5da 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -28,7 +28,7 @@ import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.extractor.subtitle.SubtitleExtractor; +import com.google.android.exoplayer2.extractor.text.SubtitleExtractor; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsMediaSource; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java similarity index 99% rename from library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java index a9890e20ba..1552dd1c4a 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.extractor.subtitle; +package com.google.android.exoplayer2.extractor.text; import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java similarity index 92% rename from library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java index ba60a48a62..dc920e8302 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/subtitle/package-info.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java @@ -14,6 +14,6 @@ * limitations under the License. */ @NonNullApi -package com.google.android.exoplayer2.extractor.subtitle; +package com.google.android.exoplayer2.extractor.text; import com.google.android.exoplayer2.util.NonNullApi; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java similarity index 99% rename from library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java index 52c013deab..2427790dce 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/subtitle/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.extractor.subtitle; +package com.google.android.exoplayer2.extractor.text; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; From 679e3751d500b2875bc34138964147661c9c15d3 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 28 Sep 2021 13:54:34 +0100 Subject: [PATCH 239/441] Fix bug in MCVR where dummySurface is released but surface isn't nulled The fix for Issue: #8776 was to release and null-out dummySurface if it doesn't match the security level of the decoder. But it's possible that this.surface is already set to this.dummySurface, in which case we must also null out this.surface otherwise we will later try and re-use the old, released DummySurface instance. This logic already exists in MCVR#onReset, so I pulled it into a releaseDummySurface() helper function. Issue: #9476 #minor-release PiperOrigin-RevId: 399420476 --- RELEASENOTES.md | 4 ++++ .../video/MediaCodecVideoRenderer.java | 17 ++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 503244134c..a896409151 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -13,6 +13,10 @@ `GlUtil.glAssertionsEnabled` instead. * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. +* Video: + * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a + released `Surface` when playing without an app-provided `Surface` + ([#9476](https://github.com/google/ExoPlayer/issues/9476)). * Android 12 compatibility: * Keep `DownloadService` started and in the foreground whilst waiting for requirements to be met on Android 12. This is necessary due to new diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 3bb6acee03..fefa2067cf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -495,11 +495,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { super.onReset(); } finally { if (dummySurface != null) { - if (surface == dummySurface) { - surface = null; - } - dummySurface.release(); - dummySurface = null; + releaseDummySurface(); } } } @@ -618,8 +614,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { float codecOperatingRate) { if (dummySurface != null && dummySurface.secure != codecInfo.secure) { // We can't re-use the current DummySurface instance with the new decoder. - dummySurface.release(); - dummySurface = null; + releaseDummySurface(); } String codecMimeType = codecInfo.codecMimeType; codecMaxValues = getCodecMaxValues(codecInfo, format, getStreamFormats()); @@ -1178,6 +1173,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { && (!codecInfo.secure || DummySurface.isSecureSupported(context)); } + private void releaseDummySurface() { + if (surface == dummySurface) { + surface = null; + } + dummySurface.release(); + dummySurface = null; + } + private void setJoiningDeadlineMs() { joiningDeadlineMs = allowedJoiningTimeMs > 0 From 5ae29821225f49a86ccf6aeb5d49004447e84a12 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 28 Sep 2021 15:42:49 +0100 Subject: [PATCH 240/441] Change how AnalyticsCollector forwards onPlayerReleased Before releasing r2.15.0, we had a regression that crashed PlaybackStatsListener. A change in the AnalyticsCollector made it to send an additional AnalyticsListener.onEvents() callback after calling Player.release() and AnalyticsListener.onEvents() appeared to arrive with event times that were not monotonically increasing. The AnalyticsListener.onEvents() callback that contained AnalyticsListener.EVENT_PLAYER_RELEASED was called with a timestamp that was smaller than event times of previously AnalyticsListener.onEvents() calls. A first fix changed the order of events being forwarded to AnalyticsListener. Upon calling Player.release(), the AnalyticsCollector would call AnalyticsListener.onPlayerReleased() and its associated AnalyticsListener.onEvents() on the same stack call. This fix maintained that event times are monotonically increasing, but made AnalyticsListener.onPlayerReleased() be called earlier. This change: - Further changes AnalyticsCollector to ensure that AnalyticsListener.onPlayerReleased() and its related AnalyticsListener.onEvents() are the last callbacks to be called, and the associated timestamp is bigger than previously reported event times. - Adds an instrumentation test to guard against the regression. PiperOrigin-RevId: 399437724 --- ...AnalyticsCollectorInstrumentationTest.java | 189 ++++++++++++++++++ .../analytics/AnalyticsCollector.java | 28 +-- .../analytics/AnalyticsCollectorTest.java | 42 +++- 3 files changed, 244 insertions(+), 15 deletions(-) create mode 100644 library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java new file mode 100644 index 0000000000..94f7c26725 --- /dev/null +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java @@ -0,0 +1,189 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.analytics; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.same; +import static org.mockito.Mockito.spy; + +import android.app.Instrumentation; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.ConditionVariable; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; + +/** Instrumentation tests for the {@link AnalyticsCollector} */ +@RunWith(AndroidJUnit4.class) +public class AnalyticsCollectorInstrumentationTest { + + /** + * This is a regression test against [internal ref: b/195396384]. The root cause of the regression + * was an introduction of an additional {@link AnalyticsListener#onEvents} callback inside {@link + * AnalyticsCollector} for callbacks that are queued during {@link Player#release}. The additional + * callback was called before {@link AnalyticsListener#onPlayerReleased} but its associated event + * real-time timestamps were greater than the real-time timestamp of {@link + * AnalyticsListener#onPlayerReleased}. As a result, the {@link AnalyticsListener#onEvents} that + * contained {@link AnalyticsListener#EVENT_PLAYER_RELEASED} had a real-time timestamp that was + * smaller than the timestamps of the previously forwarded events. That broke the {@link + * PlaybackStatsListener} which assumed that real-time event timestamps are always increasing. + * + *

        The regression was easily reproduced in the demo app with a {@link PlaybackStatsListener} + * attached to the player and pressing back while the app was playing a video. That would make the + * app call {@link Player#release} while the player was playing, and it would throw an exception + * from the {@link PlaybackStatsListener}. + * + *

        This test starts playback of an item and calls {@link Player#release} while the player is + * playing. The test uses a custom {@link Renderer} that queues a callback to be handled after + * {@link Player#release} completes. The test asserts that {@link + * AnalyticsListener#onPlayerReleased} is called after any callbacks queued during {@link + * Player#release} and its real-time timestamp is greater that the timestamps of the other + * callbacks. + */ + @Test + public void releasePlayer_whilePlaying_onPlayerReleasedIsForwardedLast() throws Exception { + AtomicLong playerReleaseTimeMs = new AtomicLong(C.TIME_UNSET); + AtomicReference playerError = new AtomicReference<>(); + AtomicReference player = new AtomicReference<>(); + ConditionVariable playerReleasedEventArrived = new ConditionVariable(); + AnalyticsListener analyticsListener = + spy(new TestAnalyticsListener(playerReleasedEventArrived)); + Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + instrumentation.runOnMainSync( + () -> { + player.set(new ExoPlayer.Builder(instrumentation.getContext()).build()); + player + .get() + .addListener( + new Player.Listener() { + @Override + public void onPlayerError(PlaybackException error) { + playerError.set(error); + player.get().release(); + } + }); + player.get().addAnalyticsListener(analyticsListener); + player.get().setMediaItem(MediaItem.fromUri("asset:///media/mp4/preroll-5s.mp4")); + player.get().prepare(); + player.get().play(); + }); + waitUntilPosition(player.get(), /* positionMs= */ 1000); + instrumentation.runOnMainSync( + () -> { + player.get().release(); + playerReleaseTimeMs.set(Clock.DEFAULT.elapsedRealtime()); + }); + playerReleasedEventArrived.block(); + + assertThat(playerError.get()).isNull(); + assertThat(playerReleaseTimeMs).isNotEqualTo(C.TIME_UNSET); + InOrder inOrder = inOrder(analyticsListener); + ArgumentCaptor onVideoDecoderReleasedArgumentCaptor = + ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); + inOrder + .verify(analyticsListener) + .onVideoDecoderReleased(onVideoDecoderReleasedArgumentCaptor.capture(), any()); + assertThat(onVideoDecoderReleasedArgumentCaptor.getValue().realtimeMs) + .isGreaterThan(playerReleaseTimeMs.get()); + inOrder + .verify(analyticsListener) + .onEvents( + same(player.get()), + argThat(events -> events.contains(AnalyticsListener.EVENT_VIDEO_DECODER_RELEASED))); + ArgumentCaptor onPlayerReleasedArgumentCaptor = + ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); + inOrder.verify(analyticsListener).onPlayerReleased(onPlayerReleasedArgumentCaptor.capture()); + assertThat(onPlayerReleasedArgumentCaptor.getAllValues()).hasSize(1); + assertThat(onPlayerReleasedArgumentCaptor.getValue().realtimeMs) + .isGreaterThan(onVideoDecoderReleasedArgumentCaptor.getValue().realtimeMs); + inOrder + .verify(analyticsListener) + .onEvents( + same(player.get()), + argThat(events -> events.contains(AnalyticsListener.EVENT_PLAYER_RELEASED))); + } + + private static void waitUntilPosition(SimpleExoPlayer simpleExoPlayer, long positionMs) + throws Exception { + ConditionVariable conditionVariable = new ConditionVariable(); + InstrumentationRegistry.getInstrumentation() + .runOnMainSync( + () -> { + simpleExoPlayer.addListener( + new Player.Listener() { + @Override + public void onPlayerError(PlaybackException error) { + conditionVariable.open(); + } + }); + simpleExoPlayer + .createMessage((messageType, payload) -> conditionVariable.open()) + .setPosition(positionMs) + .send(); + }); + conditionVariable.block(); + } + + /** + * An {@link AnalyticsListener} that blocks the thread on {@link + * AnalyticsListener#onVideoDecoderReleased} for at least {@code 1ms} and unblocks a {@link + * ConditionVariable} when an {@link AnalyticsListener#EVENT_PLAYER_RELEASED} arrives. The class + * is public and non-final so we can use it with {@link org.mockito.Mockito#spy}. + */ + public static class TestAnalyticsListener implements AnalyticsListener { + private final ConditionVariable playerReleasedEventArrived; + + public TestAnalyticsListener(ConditionVariable playerReleasedEventArrived) { + this.playerReleasedEventArrived = playerReleasedEventArrived; + } + + @Override + public void onVideoDecoderReleased(EventTime eventTime, String decoderName) { + // Sleep for 1 ms so that the elapsedRealtime when the subsequent events + // are greater by at least 1 ms. + long startTimeMs = Clock.DEFAULT.elapsedRealtime(); + try { + while (startTimeMs + 1 > Clock.DEFAULT.elapsedRealtime()) { + Thread.sleep(1); + } + } catch (InterruptedException e) { + throw new IllegalStateException(e); + } + } + + @Override + public void onEvents(Player player, Events events) { + if (events.contains(AnalyticsListener.EVENT_PLAYER_RELEASED)) { + playerReleasedEventArrived.open(); + } + } + } +} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 6aaf008262..1e908e41e4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.analytics; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import android.os.Looper; @@ -49,7 +50,6 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.HandlerWrapper; import com.google.android.exoplayer2.util.ListenerSet; @@ -108,7 +108,7 @@ public class AnalyticsCollector */ @CallSuper public void addListener(AnalyticsListener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); listeners.add(listener); } @@ -131,8 +131,7 @@ public class AnalyticsCollector */ @CallSuper public void setPlayer(Player player, Looper looper) { - Assertions.checkState( - this.player == null || mediaPeriodQueueTracker.mediaPeriodQueue.isEmpty()); + checkState(this.player == null || mediaPeriodQueueTracker.mediaPeriodQueue.isEmpty()); this.player = checkNotNull(player); handler = clock.createHandler(looper, null); listeners = @@ -148,15 +147,9 @@ public class AnalyticsCollector */ @CallSuper public void release() { - EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); - eventTimes.put(AnalyticsListener.EVENT_PLAYER_RELEASED, eventTime); - sendEvent( - eventTime, - AnalyticsListener.EVENT_PLAYER_RELEASED, - listener -> listener.onPlayerReleased(eventTime)); - // Release listeners lazily so that all events that got triggered as part of player.release() - // are still delivered to all listeners. - checkStateNotNull(handler).post(() -> listeners.release()); + // Release lazily so that all events that got triggered as part of player.release() + // are still delivered to all listeners and onPlayerReleased() is delivered last. + checkStateNotNull(handler).post(this::releaseInternal); } /** @@ -941,6 +934,15 @@ public class AnalyticsCollector player.getTotalBufferedDuration()); } + private void releaseInternal() { + EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); + sendEvent( + eventTime, + AnalyticsListener.EVENT_PLAYER_RELEASED, + listener -> listener.onPlayerReleased(eventTime)); + listeners.release(); + } + private EventTime generateEventTime(@Nullable MediaPeriodId mediaPeriodId) { checkNotNull(player); @Nullable diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 905d60e08c..654e010eae 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -35,6 +35,7 @@ import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_ME import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_PLAYBACK_PARAMETERS_CHANGED; import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_PLAYBACK_STATE_CHANGED; import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_PLAYER_ERROR; +import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_PLAYER_RELEASED; import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_PLAY_WHEN_READY_CHANGED; import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_POSITION_DISCONTINUITY; import static com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_RENDERED_FIRST_FRAME; @@ -55,8 +56,11 @@ import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.same; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -102,6 +106,7 @@ import com.google.android.exoplayer2.testutil.ActionSchedule; import com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable; import com.google.android.exoplayer2.testutil.ExoPlayerTestRunner; import com.google.android.exoplayer2.testutil.FakeAudioRenderer; +import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.testutil.FakeExoMediaDrm; import com.google.android.exoplayer2.testutil.FakeMediaSource; import com.google.android.exoplayer2.testutil.FakeRenderer; @@ -128,7 +133,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; -import org.mockito.Mockito; import org.robolectric.shadows.ShadowLooper; /** Integration test for {@link AnalyticsCollector}. */ @@ -1971,7 +1975,7 @@ public final class AnalyticsCollectorTest { ExoPlaybackException.createForSource( new IOException(), PlaybackException.ERROR_CODE_IO_UNSPECIFIED)); - InOrder inOrder = Mockito.inOrder(listener1, listener2, listener3); + InOrder inOrder = inOrder(listener1, listener2, listener3); inOrder.verify(listener1).onPlayerError(any(), any()); inOrder.verify(listener2).onPlayerError(any(), any()); inOrder.verify(listener3).onPlayerError(any(), any()); @@ -1980,6 +1984,40 @@ public final class AnalyticsCollectorTest { inOrder.verify(listener3).onSurfaceSizeChanged(any(), eq(0), eq(0)); } + @Test + public void release_withCallbacksArrivingAfterRelease_onPlayerReleasedForwardedLast() { + FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 0, /* isAutoAdvancing= */ false); + AnalyticsCollector analyticsCollector = new AnalyticsCollector(fakeClock); + SimpleExoPlayer simpleExoPlayer = + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); + analyticsCollector.setPlayer(simpleExoPlayer, Looper.myLooper()); + AnalyticsListener analyticsListener = mock(AnalyticsListener.class); + analyticsCollector.addListener(analyticsListener); + + // Simulate Player.release(): events arrive to the analytics collector after it's been released. + analyticsCollector.release(); + fakeClock.advanceTime(/* timeDiffMs= */ 1); + analyticsCollector.onDroppedFrames(/* count= */ 1, /* elapsedMs= */ 1); + fakeClock.advanceTime(/* timeDiffMs= */ 1); + ShadowLooper.idleMainLooper(); + + InOrder inOrder = inOrder(analyticsListener); + inOrder + .verify(analyticsListener) + .onDroppedVideoFrames(argThat(eventTime -> eventTime.realtimeMs == 1), eq(1), eq(1L)); + inOrder + .verify(analyticsListener) + .onEvents( + same(simpleExoPlayer), argThat(events -> events.contains(EVENT_DROPPED_VIDEO_FRAMES))); + inOrder + .verify(analyticsListener) + .onPlayerReleased(argThat(eventTime -> eventTime.realtimeMs == 2)); + inOrder + .verify(analyticsListener) + .onEvents(same(simpleExoPlayer), argThat(events -> events.contains(EVENT_PLAYER_RELEASED))); + inOrder.verifyNoMoreInteractions(); + } + private static TestAnalyticsListener runAnalyticsTest(MediaSource mediaSource) throws Exception { return runAnalyticsTest(mediaSource, /* actionSchedule= */ null); } From d9cfebd89518ff9d8fbafba958ecff7858ea6132 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 28 Sep 2021 16:23:47 +0100 Subject: [PATCH 241/441] Update initial network bandwidth estimates. PiperOrigin-RevId: 399444511 --- .../upstream/DefaultBandwidthMeter.java | 388 +++++++++--------- 1 file changed, 195 insertions(+), 193 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java index c046ca8d45..07b3185b43 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java @@ -51,27 +51,27 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList /** Default initial Wifi bitrate estimate in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI = - ImmutableList.of(6_200_000L, 3_900_000L, 2_300_000L, 1_300_000L, 620_000L); + ImmutableList.of(5_400_000L, 3_300_000L, 2_000_000L, 1_300_000L, 760_000L); /** Default initial 2G bitrate estimates in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_2G = - ImmutableList.of(248_000L, 160_000L, 142_000L, 127_000L, 113_000L); + ImmutableList.of(1_700_000L, 820_000L, 450_000L, 180_000L, 130_000L); /** Default initial 3G bitrate estimates in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_3G = - ImmutableList.of(2_200_000L, 1_300_000L, 950_000L, 760_000L, 520_000L); + ImmutableList.of(2_300_000L, 1_300_000L, 1_000_000L, 820_000L, 570_000L); /** Default initial 4G bitrate estimates in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_4G = - ImmutableList.of(4_400_000L, 2_300_000L, 1_500_000L, 1_100_000L, 640_000L); + ImmutableList.of(3_400_000L, 2_000_000L, 1_400_000L, 1_000_000L, 620_000L); /** Default initial 5G-NSA bitrate estimates in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA = - ImmutableList.of(10_000_000L, 7_200_000L, 5_000_000L, 2_700_000L, 1_600_000L); + ImmutableList.of(7_500_000L, 5_200_000L, 3_700_000L, 1_800_000L, 1_100_000L); /** Default initial 5G-SA bitrate estimates in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA = - ImmutableList.of(2_600_000L, 2_200_000L, 2_000_000L, 1_500_000L, 470_000L); + ImmutableList.of(3_300_000L, 1_900_000L, 1_700_000L, 1_500_000L, 1_200_000L); /** * Default initial bitrate estimate used when the device is offline or the network type cannot be @@ -465,243 +465,245 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList createInitialBitrateCountryGroupAssignment() { return ImmutableListMultimap.builder() .putAll("AD", 1, 2, 0, 0, 2, 2) - .putAll("AE", 1, 4, 4, 4, 2, 2) - .putAll("AF", 4, 4, 3, 4, 2, 2) - .putAll("AG", 4, 2, 1, 4, 2, 2) + .putAll("AE", 1, 4, 4, 4, 3, 2) + .putAll("AF", 4, 4, 4, 4, 2, 2) + .putAll("AG", 2, 3, 1, 2, 2, 2) .putAll("AI", 1, 2, 2, 2, 2, 2) - .putAll("AL", 1, 1, 1, 1, 2, 2) - .putAll("AM", 2, 2, 1, 3, 2, 2) - .putAll("AO", 3, 4, 3, 1, 2, 2) - .putAll("AR", 2, 4, 2, 1, 2, 2) - .putAll("AS", 2, 2, 3, 3, 2, 2) - .putAll("AT", 0, 1, 0, 0, 0, 2) - .putAll("AU", 0, 2, 0, 1, 1, 2) - .putAll("AW", 1, 2, 0, 4, 2, 2) + .putAll("AL", 1, 2, 0, 1, 2, 2) + .putAll("AM", 2, 3, 2, 4, 2, 2) + .putAll("AO", 3, 4, 3, 2, 2, 2) + .putAll("AQ", 4, 2, 2, 2, 2, 2) + .putAll("AR", 2, 4, 1, 1, 2, 2) + .putAll("AS", 2, 2, 2, 3, 2, 2) + .putAll("AT", 0, 0, 0, 0, 0, 2) + .putAll("AU", 0, 1, 0, 1, 2, 2) + .putAll("AW", 1, 2, 4, 4, 2, 2) .putAll("AX", 0, 2, 2, 2, 2, 2) - .putAll("AZ", 3, 3, 3, 4, 4, 2) - .putAll("BA", 1, 1, 0, 1, 2, 2) + .putAll("AZ", 3, 2, 4, 4, 2, 2) + .putAll("BA", 1, 2, 0, 1, 2, 2) .putAll("BB", 0, 2, 0, 0, 2, 2) - .putAll("BD", 2, 0, 3, 3, 2, 2) - .putAll("BE", 0, 0, 2, 3, 2, 2) - .putAll("BF", 4, 4, 4, 2, 2, 2) - .putAll("BG", 0, 1, 0, 0, 2, 2) - .putAll("BH", 1, 0, 2, 4, 2, 2) - .putAll("BI", 4, 4, 4, 4, 2, 2) - .putAll("BJ", 4, 4, 4, 4, 2, 2) + .putAll("BD", 2, 1, 3, 3, 2, 2) + .putAll("BE", 0, 0, 3, 3, 2, 2) + .putAll("BF", 4, 3, 4, 3, 2, 2) + .putAll("BG", 0, 0, 0, 0, 1, 2) + .putAll("BH", 1, 2, 2, 4, 4, 2) + .putAll("BI", 4, 3, 4, 4, 2, 2) + .putAll("BJ", 4, 4, 3, 4, 2, 2) .putAll("BL", 1, 2, 2, 2, 2, 2) - .putAll("BM", 0, 2, 0, 0, 2, 2) - .putAll("BN", 3, 2, 1, 0, 2, 2) - .putAll("BO", 1, 2, 4, 2, 2, 2) - .putAll("BQ", 1, 2, 1, 2, 2, 2) - .putAll("BR", 2, 4, 3, 2, 2, 2) - .putAll("BS", 2, 2, 1, 3, 2, 2) - .putAll("BT", 3, 0, 3, 2, 2, 2) - .putAll("BW", 3, 4, 1, 1, 2, 2) - .putAll("BY", 1, 1, 1, 2, 2, 2) - .putAll("BZ", 2, 2, 2, 2, 2, 2) - .putAll("CA", 0, 3, 1, 2, 4, 2) - .putAll("CD", 4, 2, 2, 1, 2, 2) + .putAll("BM", 1, 2, 0, 0, 2, 2) + .putAll("BN", 3, 2, 1, 1, 2, 2) + .putAll("BO", 1, 3, 3, 2, 2, 2) + .putAll("BQ", 1, 2, 2, 0, 2, 2) + .putAll("BR", 2, 3, 2, 2, 2, 2) + .putAll("BS", 4, 2, 2, 3, 2, 2) + .putAll("BT", 3, 1, 3, 2, 2, 2) + .putAll("BW", 3, 4, 1, 0, 2, 2) + .putAll("BY", 0, 1, 1, 3, 2, 2) + .putAll("BZ", 2, 4, 2, 2, 2, 2) + .putAll("CA", 0, 2, 1, 2, 4, 1) + .putAll("CD", 4, 2, 3, 1, 2, 2) .putAll("CF", 4, 2, 3, 2, 2, 2) - .putAll("CG", 3, 4, 2, 2, 2, 2) - .putAll("CH", 0, 0, 0, 0, 1, 2) - .putAll("CI", 3, 3, 3, 3, 2, 2) - .putAll("CK", 2, 2, 3, 0, 2, 2) - .putAll("CL", 1, 1, 2, 2, 2, 2) + .putAll("CG", 2, 4, 3, 4, 2, 2) + .putAll("CH", 0, 0, 0, 0, 0, 2) + .putAll("CI", 3, 3, 3, 4, 2, 2) + .putAll("CK", 2, 2, 2, 1, 2, 2) + .putAll("CL", 1, 1, 2, 2, 3, 2) .putAll("CM", 3, 4, 3, 2, 2, 2) - .putAll("CN", 2, 2, 2, 1, 3, 2) - .putAll("CO", 2, 3, 4, 2, 2, 2) - .putAll("CR", 2, 3, 4, 4, 2, 2) - .putAll("CU", 4, 4, 2, 2, 2, 2) + .putAll("CN", 2, 0, 2, 2, 3, 1) + .putAll("CO", 2, 2, 4, 2, 2, 2) + .putAll("CR", 2, 2, 4, 4, 2, 2) + .putAll("CU", 4, 4, 3, 2, 2, 2) .putAll("CV", 2, 3, 1, 0, 2, 2) - .putAll("CW", 1, 2, 0, 0, 2, 2) - .putAll("CY", 1, 1, 0, 0, 2, 2) - .putAll("CZ", 0, 1, 0, 0, 1, 2) - .putAll("DE", 0, 0, 1, 1, 0, 2) - .putAll("DJ", 4, 0, 4, 4, 2, 2) + .putAll("CW", 2, 2, 0, 0, 2, 2) + .putAll("CX", 1, 2, 2, 2, 2, 2) + .putAll("CY", 1, 0, 0, 0, 1, 2) + .putAll("CZ", 0, 0, 0, 0, 1, 2) + .putAll("DE", 0, 0, 2, 2, 1, 2) + .putAll("DJ", 4, 1, 4, 4, 2, 2) .putAll("DK", 0, 0, 1, 0, 0, 2) .putAll("DM", 1, 2, 2, 2, 2, 2) .putAll("DO", 3, 4, 4, 4, 2, 2) - .putAll("DZ", 3, 3, 4, 4, 2, 4) - .putAll("EC", 2, 4, 3, 1, 2, 2) - .putAll("EE", 0, 1, 0, 0, 2, 2) - .putAll("EG", 3, 4, 3, 3, 2, 2) + .putAll("DZ", 4, 3, 4, 4, 2, 2) + .putAll("EC", 2, 4, 2, 1, 2, 2) + .putAll("EE", 0, 0, 0, 0, 2, 2) + .putAll("EG", 3, 4, 2, 3, 2, 2) .putAll("EH", 2, 2, 2, 2, 2, 2) .putAll("ER", 4, 2, 2, 2, 2, 2) .putAll("ES", 0, 1, 1, 1, 2, 2) - .putAll("ET", 4, 4, 4, 1, 2, 2) - .putAll("FI", 0, 0, 0, 0, 0, 2) - .putAll("FJ", 3, 0, 2, 3, 2, 2) - .putAll("FK", 4, 2, 2, 2, 2, 2) - .putAll("FM", 3, 2, 4, 4, 2, 2) - .putAll("FO", 1, 2, 0, 1, 2, 2) - .putAll("FR", 1, 1, 2, 0, 1, 2) - .putAll("GA", 3, 4, 1, 1, 2, 2) - .putAll("GB", 0, 0, 1, 1, 1, 2) + .putAll("ET", 4, 4, 3, 1, 2, 2) + .putAll("FI", 0, 0, 0, 1, 0, 2) + .putAll("FJ", 3, 1, 3, 3, 2, 2) + .putAll("FK", 3, 2, 2, 2, 2, 2) + .putAll("FM", 3, 2, 4, 2, 2, 2) + .putAll("FO", 0, 2, 0, 0, 2, 2) + .putAll("FR", 1, 1, 2, 1, 1, 1) + .putAll("GA", 2, 3, 1, 1, 2, 2) + .putAll("GB", 0, 0, 1, 1, 2, 3) .putAll("GD", 1, 2, 2, 2, 2, 2) - .putAll("GE", 1, 1, 1, 2, 2, 2) - .putAll("GF", 2, 2, 2, 3, 2, 2) - .putAll("GG", 1, 2, 0, 0, 2, 2) - .putAll("GH", 3, 1, 3, 2, 2, 2) - .putAll("GI", 0, 2, 0, 0, 2, 2) + .putAll("GE", 1, 1, 1, 3, 2, 2) + .putAll("GF", 2, 1, 2, 3, 2, 2) + .putAll("GG", 0, 2, 0, 0, 2, 2) + .putAll("GH", 3, 2, 3, 2, 2, 2) + .putAll("GI", 0, 2, 2, 2, 2, 2) .putAll("GL", 1, 2, 0, 0, 2, 2) - .putAll("GM", 4, 3, 2, 4, 2, 2) + .putAll("GM", 4, 2, 2, 4, 2, 2) .putAll("GN", 4, 3, 4, 2, 2, 2) .putAll("GP", 2, 1, 2, 3, 2, 2) - .putAll("GQ", 4, 2, 2, 4, 2, 2) - .putAll("GR", 1, 2, 0, 0, 2, 2) - .putAll("GT", 3, 2, 3, 1, 2, 2) - .putAll("GU", 1, 2, 3, 4, 2, 2) - .putAll("GW", 4, 4, 4, 4, 2, 2) - .putAll("GY", 3, 3, 3, 4, 2, 2) + .putAll("GQ", 4, 2, 3, 4, 2, 2) + .putAll("GR", 1, 0, 0, 0, 2, 2) + .putAll("GT", 2, 3, 2, 1, 2, 2) + .putAll("GU", 1, 2, 4, 4, 2, 2) + .putAll("GW", 3, 4, 3, 3, 2, 2) + .putAll("GY", 3, 4, 1, 0, 2, 2) .putAll("HK", 0, 1, 2, 3, 2, 0) - .putAll("HN", 3, 1, 3, 3, 2, 2) - .putAll("HR", 1, 1, 0, 0, 3, 2) + .putAll("HN", 3, 2, 3, 3, 2, 2) + .putAll("HR", 1, 0, 0, 0, 2, 2) .putAll("HT", 4, 4, 4, 4, 2, 2) - .putAll("HU", 0, 0, 0, 0, 0, 2) - .putAll("ID", 3, 2, 3, 3, 2, 2) - .putAll("IE", 0, 0, 1, 1, 3, 2) - .putAll("IL", 1, 0, 2, 3, 4, 2) + .putAll("HU", 0, 0, 0, 1, 3, 2) + .putAll("ID", 3, 2, 3, 3, 3, 2) + .putAll("IE", 0, 1, 1, 1, 2, 2) + .putAll("IL", 1, 1, 2, 3, 4, 2) .putAll("IM", 0, 2, 0, 1, 2, 2) - .putAll("IN", 2, 1, 3, 3, 2, 2) - .putAll("IO", 4, 2, 2, 4, 2, 2) - .putAll("IQ", 3, 3, 4, 4, 2, 2) - .putAll("IR", 3, 2, 3, 2, 2, 2) - .putAll("IS", 0, 2, 0, 0, 2, 2) - .putAll("IT", 0, 4, 0, 1, 2, 2) - .putAll("JE", 2, 2, 1, 2, 2, 2) - .putAll("JM", 3, 3, 4, 4, 2, 2) - .putAll("JO", 2, 2, 1, 1, 2, 2) - .putAll("JP", 0, 0, 0, 0, 2, 1) - .putAll("KE", 3, 4, 2, 2, 2, 2) - .putAll("KG", 2, 0, 1, 1, 2, 2) - .putAll("KH", 1, 0, 4, 3, 2, 2) + .putAll("IN", 1, 1, 3, 2, 4, 3) + .putAll("IO", 4, 2, 2, 2, 2, 2) + .putAll("IQ", 3, 3, 3, 3, 2, 2) + .putAll("IR", 3, 0, 1, 1, 3, 0) + .putAll("IS", 0, 0, 0, 0, 0, 2) + .putAll("IT", 0, 1, 0, 1, 1, 2) + .putAll("JE", 3, 2, 1, 2, 2, 2) + .putAll("JM", 3, 4, 4, 4, 2, 2) + .putAll("JO", 1, 0, 0, 1, 2, 2) + .putAll("JP", 0, 1, 0, 1, 1, 1) + .putAll("KE", 3, 3, 2, 2, 2, 2) + .putAll("KG", 2, 1, 1, 1, 2, 2) + .putAll("KH", 1, 1, 4, 2, 2, 2) .putAll("KI", 4, 2, 4, 3, 2, 2) - .putAll("KM", 4, 3, 2, 3, 2, 2) - .putAll("KN", 1, 2, 2, 2, 2, 2) - .putAll("KP", 4, 2, 2, 2, 2, 2) - .putAll("KR", 0, 0, 1, 3, 1, 2) - .putAll("KW", 1, 3, 1, 1, 1, 2) - .putAll("KY", 1, 2, 0, 2, 2, 2) - .putAll("KZ", 2, 2, 2, 3, 2, 2) - .putAll("LA", 1, 2, 1, 1, 2, 2) - .putAll("LB", 3, 2, 0, 0, 2, 2) + .putAll("KM", 4, 2, 4, 3, 2, 2) + .putAll("KN", 2, 2, 2, 2, 2, 2) + .putAll("KP", 3, 2, 2, 2, 2, 2) + .putAll("KR", 0, 0, 1, 3, 4, 4) + .putAll("KW", 1, 1, 0, 0, 0, 2) + .putAll("KY", 1, 2, 0, 1, 2, 2) + .putAll("KZ", 1, 1, 2, 2, 2, 2) + .putAll("LA", 2, 2, 1, 2, 2, 2) + .putAll("LB", 3, 2, 1, 4, 2, 2) .putAll("LC", 1, 2, 0, 0, 2, 2) .putAll("LI", 0, 2, 2, 2, 2, 2) - .putAll("LK", 2, 0, 2, 3, 2, 2) + .putAll("LK", 3, 1, 3, 4, 4, 2) .putAll("LR", 3, 4, 4, 3, 2, 2) - .putAll("LS", 3, 3, 2, 3, 2, 2) + .putAll("LS", 3, 3, 4, 3, 2, 2) .putAll("LT", 0, 0, 0, 0, 2, 2) - .putAll("LU", 1, 0, 1, 1, 2, 2) + .putAll("LU", 1, 0, 2, 2, 2, 2) .putAll("LV", 0, 0, 0, 0, 2, 2) .putAll("LY", 4, 2, 4, 3, 2, 2) - .putAll("MA", 3, 2, 2, 1, 2, 2) - .putAll("MC", 0, 2, 0, 0, 2, 2) - .putAll("MD", 1, 2, 0, 0, 2, 2) - .putAll("ME", 1, 2, 0, 1, 2, 2) - .putAll("MF", 2, 2, 1, 1, 2, 2) + .putAll("MA", 3, 2, 2, 2, 2, 2) + .putAll("MC", 0, 2, 2, 0, 2, 2) + .putAll("MD", 1, 0, 0, 0, 2, 2) + .putAll("ME", 1, 0, 0, 1, 2, 2) + .putAll("MF", 1, 2, 1, 0, 2, 2) .putAll("MG", 3, 4, 2, 2, 2, 2) - .putAll("MH", 4, 2, 2, 4, 2, 2) - .putAll("MK", 1, 1, 0, 0, 2, 2) - .putAll("ML", 4, 4, 2, 2, 2, 2) - .putAll("MM", 2, 3, 3, 3, 2, 2) - .putAll("MN", 2, 4, 2, 2, 2, 2) + .putAll("MH", 3, 2, 2, 4, 2, 2) + .putAll("MK", 1, 0, 0, 0, 2, 2) + .putAll("ML", 4, 3, 3, 1, 2, 2) + .putAll("MM", 2, 4, 3, 3, 2, 2) + .putAll("MN", 2, 0, 1, 2, 2, 2) .putAll("MO", 0, 2, 4, 4, 2, 2) .putAll("MP", 0, 2, 2, 2, 2, 2) - .putAll("MQ", 2, 2, 2, 3, 2, 2) - .putAll("MR", 3, 0, 4, 3, 2, 2) + .putAll("MQ", 2, 1, 2, 3, 2, 2) + .putAll("MR", 4, 1, 3, 4, 2, 2) .putAll("MS", 1, 2, 2, 2, 2, 2) - .putAll("MT", 0, 2, 0, 0, 2, 2) - .putAll("MU", 2, 1, 1, 2, 2, 2) - .putAll("MV", 4, 3, 2, 4, 2, 2) + .putAll("MT", 0, 0, 0, 0, 2, 2) + .putAll("MU", 3, 1, 1, 2, 2, 2) + .putAll("MV", 3, 4, 1, 4, 2, 2) .putAll("MW", 4, 2, 1, 0, 2, 2) - .putAll("MX", 2, 4, 4, 4, 4, 2) - .putAll("MY", 1, 0, 3, 2, 2, 2) - .putAll("MZ", 3, 3, 2, 1, 2, 2) - .putAll("NA", 4, 3, 3, 2, 2, 2) - .putAll("NC", 3, 0, 4, 4, 2, 2) + .putAll("MX", 2, 4, 3, 4, 2, 2) + .putAll("MY", 2, 1, 3, 3, 2, 2) + .putAll("MZ", 3, 2, 2, 2, 2, 2) + .putAll("NA", 4, 3, 2, 2, 2, 2) + .putAll("NC", 3, 2, 4, 4, 2, 2) .putAll("NE", 4, 4, 4, 4, 2, 2) .putAll("NF", 2, 2, 2, 2, 2, 2) - .putAll("NG", 3, 3, 2, 3, 2, 2) - .putAll("NI", 2, 1, 4, 4, 2, 2) - .putAll("NL", 0, 2, 3, 2, 0, 2) - .putAll("NO", 0, 1, 2, 0, 0, 2) - .putAll("NP", 2, 0, 4, 2, 2, 2) - .putAll("NR", 3, 2, 3, 1, 2, 2) + .putAll("NG", 3, 4, 1, 1, 2, 2) + .putAll("NI", 2, 3, 4, 3, 2, 2) + .putAll("NL", 0, 0, 3, 2, 0, 4) + .putAll("NO", 0, 0, 2, 0, 0, 2) + .putAll("NP", 2, 1, 4, 3, 2, 2) + .putAll("NR", 3, 2, 2, 0, 2, 2) .putAll("NU", 4, 2, 2, 2, 2, 2) - .putAll("NZ", 0, 2, 1, 2, 4, 2) - .putAll("OM", 2, 2, 1, 3, 3, 2) + .putAll("NZ", 1, 0, 1, 2, 4, 2) + .putAll("OM", 2, 3, 1, 3, 4, 2) .putAll("PA", 1, 3, 3, 3, 2, 2) - .putAll("PE", 2, 3, 4, 4, 2, 2) - .putAll("PF", 2, 2, 2, 1, 2, 2) + .putAll("PE", 2, 3, 4, 4, 4, 2) + .putAll("PF", 2, 3, 3, 1, 2, 2) .putAll("PG", 4, 4, 3, 2, 2, 2) - .putAll("PH", 2, 1, 3, 3, 3, 2) + .putAll("PH", 2, 2, 3, 3, 3, 2) .putAll("PK", 3, 2, 3, 3, 2, 2) - .putAll("PL", 1, 0, 1, 2, 3, 2) + .putAll("PL", 1, 1, 2, 2, 3, 2) .putAll("PM", 0, 2, 2, 2, 2, 2) - .putAll("PR", 2, 1, 2, 2, 4, 3) - .putAll("PS", 3, 3, 2, 2, 2, 2) - .putAll("PT", 0, 1, 1, 0, 2, 2) - .putAll("PW", 1, 2, 4, 1, 2, 2) - .putAll("PY", 2, 0, 3, 2, 2, 2) - .putAll("QA", 2, 3, 1, 2, 3, 2) - .putAll("RE", 1, 0, 2, 2, 2, 2) - .putAll("RO", 0, 1, 0, 1, 0, 2) - .putAll("RS", 1, 2, 0, 0, 2, 2) - .putAll("RU", 0, 1, 0, 1, 4, 2) - .putAll("RW", 3, 3, 3, 1, 2, 2) - .putAll("SA", 2, 2, 2, 1, 1, 2) - .putAll("SB", 4, 2, 3, 2, 2, 2) - .putAll("SC", 4, 2, 1, 3, 2, 2) + .putAll("PR", 2, 3, 2, 2, 3, 3) + .putAll("PS", 3, 4, 1, 2, 2, 2) + .putAll("PT", 0, 1, 0, 0, 2, 2) + .putAll("PW", 2, 2, 4, 1, 2, 2) + .putAll("PY", 2, 2, 3, 2, 2, 2) + .putAll("QA", 2, 4, 2, 4, 4, 2) + .putAll("RE", 1, 1, 1, 2, 2, 2) + .putAll("RO", 0, 0, 1, 1, 1, 2) + .putAll("RS", 1, 0, 0, 0, 2, 2) + .putAll("RU", 0, 0, 0, 1, 2, 2) + .putAll("RW", 3, 4, 3, 0, 2, 2) + .putAll("SA", 2, 2, 1, 1, 2, 2) + .putAll("SB", 4, 2, 4, 3, 2, 2) + .putAll("SC", 4, 3, 0, 2, 2, 2) .putAll("SD", 4, 4, 4, 4, 2, 2) .putAll("SE", 0, 0, 0, 0, 0, 2) - .putAll("SG", 1, 0, 1, 2, 3, 2) + .putAll("SG", 1, 1, 2, 3, 1, 4) .putAll("SH", 4, 2, 2, 2, 2, 2) - .putAll("SI", 0, 0, 0, 0, 2, 2) - .putAll("SJ", 2, 2, 2, 2, 2, 2) - .putAll("SK", 0, 1, 0, 0, 2, 2) - .putAll("SL", 4, 3, 4, 0, 2, 2) + .putAll("SI", 0, 0, 0, 0, 1, 2) + .putAll("SJ", 0, 2, 2, 2, 2, 2) + .putAll("SK", 0, 0, 0, 0, 0, 2) + .putAll("SL", 4, 3, 4, 1, 2, 2) .putAll("SM", 0, 2, 2, 2, 2, 2) .putAll("SN", 4, 4, 4, 4, 2, 2) - .putAll("SO", 3, 3, 3, 4, 2, 2) - .putAll("SR", 3, 2, 2, 2, 2, 2) - .putAll("SS", 4, 4, 3, 3, 2, 2) - .putAll("ST", 2, 2, 1, 2, 2, 2) - .putAll("SV", 2, 1, 4, 3, 2, 2) + .putAll("SO", 3, 2, 3, 3, 2, 2) + .putAll("SR", 2, 3, 2, 2, 2, 2) + .putAll("SS", 4, 2, 2, 2, 2, 2) + .putAll("ST", 3, 2, 2, 2, 2, 2) + .putAll("SV", 2, 2, 3, 3, 2, 2) .putAll("SX", 2, 2, 1, 0, 2, 2) - .putAll("SY", 4, 3, 3, 2, 2, 2) - .putAll("SZ", 3, 3, 2, 4, 2, 2) - .putAll("TC", 2, 2, 2, 0, 2, 2) - .putAll("TD", 4, 3, 4, 4, 2, 2) - .putAll("TG", 3, 2, 2, 4, 2, 2) - .putAll("TH", 0, 3, 2, 3, 2, 2) - .putAll("TJ", 4, 4, 4, 4, 2, 2) - .putAll("TL", 4, 0, 4, 4, 2, 2) - .putAll("TM", 4, 2, 4, 3, 2, 2) - .putAll("TN", 2, 1, 1, 2, 2, 2) - .putAll("TO", 3, 3, 4, 3, 2, 2) - .putAll("TR", 1, 2, 1, 1, 2, 2) - .putAll("TT", 1, 4, 0, 1, 2, 2) - .putAll("TV", 3, 2, 2, 4, 2, 2) - .putAll("TW", 0, 0, 0, 0, 1, 0) - .putAll("TZ", 3, 3, 3, 2, 2, 2) + .putAll("SY", 4, 3, 4, 4, 2, 2) + .putAll("SZ", 4, 3, 2, 4, 2, 2) + .putAll("TC", 2, 2, 1, 0, 2, 2) + .putAll("TD", 4, 4, 4, 4, 2, 2) + .putAll("TG", 3, 3, 2, 0, 2, 2) + .putAll("TH", 0, 3, 2, 3, 3, 0) + .putAll("TJ", 4, 2, 4, 4, 2, 2) + .putAll("TL", 4, 3, 4, 4, 2, 2) + .putAll("TM", 4, 2, 4, 2, 2, 2) + .putAll("TN", 2, 2, 1, 1, 2, 2) + .putAll("TO", 4, 2, 3, 3, 2, 2) + .putAll("TR", 1, 1, 0, 1, 2, 2) + .putAll("TT", 1, 4, 1, 1, 2, 2) + .putAll("TV", 4, 2, 2, 2, 2, 2) + .putAll("TW", 0, 0, 0, 0, 0, 0) + .putAll("TZ", 3, 4, 3, 3, 2, 2) .putAll("UA", 0, 3, 1, 1, 2, 2) - .putAll("UG", 3, 2, 3, 3, 2, 2) - .putAll("US", 1, 1, 2, 2, 4, 2) - .putAll("UY", 2, 2, 1, 1, 2, 2) - .putAll("UZ", 2, 1, 3, 4, 2, 2) + .putAll("UG", 3, 3, 3, 3, 2, 2) + .putAll("US", 1, 1, 2, 2, 3, 2) + .putAll("UY", 2, 2, 1, 2, 2, 2) + .putAll("UZ", 2, 2, 3, 4, 2, 2) .putAll("VC", 1, 2, 2, 2, 2, 2) .putAll("VE", 4, 4, 4, 4, 2, 2) .putAll("VG", 2, 2, 1, 1, 2, 2) - .putAll("VI", 1, 2, 1, 2, 2, 2) - .putAll("VN", 0, 1, 3, 4, 2, 2) - .putAll("VU", 4, 0, 3, 1, 2, 2) + .putAll("VI", 1, 2, 1, 3, 2, 2) + .putAll("VN", 0, 3, 3, 4, 2, 2) + .putAll("VU", 4, 2, 2, 1, 2, 2) .putAll("WF", 4, 2, 2, 4, 2, 2) - .putAll("WS", 3, 1, 3, 1, 2, 2) - .putAll("XK", 0, 1, 1, 0, 2, 2) - .putAll("YE", 4, 4, 4, 3, 2, 2) - .putAll("YT", 4, 2, 2, 3, 2, 2) - .putAll("ZA", 3, 3, 2, 1, 2, 2) - .putAll("ZM", 3, 2, 3, 3, 2, 2) + .putAll("WS", 3, 1, 2, 1, 2, 2) + .putAll("XK", 1, 1, 1, 1, 2, 2) + .putAll("YE", 4, 4, 4, 4, 2, 2) + .putAll("YT", 4, 1, 1, 1, 2, 2) + .putAll("ZA", 3, 3, 1, 1, 1, 2) + .putAll("ZM", 3, 3, 4, 2, 2, 2) .putAll("ZW", 3, 2, 4, 3, 2, 2) .build(); } From b6b39cf7cf880156902222ae24d7c245db65b41c Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 28 Sep 2021 17:01:19 +0100 Subject: [PATCH 242/441] Use JUnit's Assume to skip Widevine GTS tests on non-GMS devices DashTestRunner.setWidevineInfo instantiates a Widevine MediaDrm to check for L1 support, which fails on GMS devices that don't support Widevine. The Widevine tests should be skipped on these devices, but the setWidevineInfo call happens in @Before before the skipping logic inside the test. This change moves the skipping logic to the beginning of @Before, and uses Assume to ensure the test isn't run. This will also report the test as 'skipped due to unmet assumption' which is more precise than 'passed'. PiperOrigin-RevId: 399452734 --- .../gts/CommonEncryptionDrmTest.java | 17 +-- .../playbacktests/gts/DashStreamingTest.java | 129 ++++++++---------- .../gts/DashWidevineOfflineTest.java | 48 +++---- .../playbacktests/gts/GtsTestUtil.java | 5 + 4 files changed, 88 insertions(+), 111 deletions(-) diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/CommonEncryptionDrmTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/CommonEncryptionDrmTest.java index 8f2d9c6f21..65638d8173 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/CommonEncryptionDrmTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/CommonEncryptionDrmTest.java @@ -16,6 +16,8 @@ package com.google.android.exoplayer2.playbacktests.gts; import static com.google.android.exoplayer2.playbacktests.gts.GtsTestUtil.shouldSkipWidevineTest; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; @@ -59,6 +61,8 @@ public final class CommonEncryptionDrmTest { @Before public void setUp() { + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner = new DashTestRunner(TAG, testRule.getActivity()) .setWidevineInfo(MimeTypes.VIDEO_H264, false) @@ -74,10 +78,6 @@ public final class CommonEncryptionDrmTest { @Test public void cencSchemeTypeV18() { - if (Util.SDK_INT < 18 || shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } testRunner .setStreamName("test_widevine_h264_scheme_cenc") .setManifestUrl(DashTestData.WIDEVINE_SCHEME_CENC) @@ -86,12 +86,9 @@ public final class CommonEncryptionDrmTest { @Test public void cbcsSchemeTypeV25() { - if (Util.SDK_INT < 25 || shouldSkipWidevineTest(testRule.getActivity())) { - // cbcs support was added in API 24, but it is stable from API 25 onwards. - // See [internal: b/65634809]. - // Pass. - return; - } + // cbcs support was added in API 24, but it is stable from API 25 onwards. + // See [internal: b/65634809]. + assumeTrue(Util.SDK_INT >= 25); testRunner .setStreamName("test_widevine_h264_scheme_cbcs") .setManifestUrl(DashTestData.WIDEVINE_SCHEME_CBCS) diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java index 495372ab48..0972c02da4 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashStreamingTest.java @@ -17,6 +17,8 @@ package com.google.android.exoplayer2.playbacktests.gts; import static com.google.android.exoplayer2.playbacktests.gts.GtsTestUtil.shouldSkipWidevineTest; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import android.content.pm.PackageManager; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -387,10 +389,8 @@ public final class DashStreamingTest { @Test public void widevineH264FixedV18() throws Exception { - if (Util.SDK_INT < 18 || shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_h264_fixed") .setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST) @@ -404,12 +404,9 @@ public final class DashStreamingTest { @Test public void widevineH264AdaptiveV18() throws Exception { - if (Util.SDK_INT < 18 - || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264) - || shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeFalse(shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_h264_adaptive") .setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST) @@ -424,12 +421,9 @@ public final class DashStreamingTest { @Test public void widevineH264AdaptiveWithSeekingV18() throws Exception { - if (Util.SDK_INT < 18 - || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264) - || shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeFalse(shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_h264_adaptive_with_seeking") .setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST) @@ -445,12 +439,9 @@ public final class DashStreamingTest { @Test public void widevineH264AdaptiveWithRendererDisablingV18() throws Exception { - if (Util.SDK_INT < 18 - || shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264) - || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeFalse(shouldSkipAdaptiveTest(MimeTypes.VIDEO_H264)); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_h264_adaptive_with_renderer_disabling") .setManifestUrl(DashTestData.WIDEVINE_H264_MANIFEST) @@ -468,10 +459,10 @@ public final class DashStreamingTest { @Test public void widevineH265FixedV23() throws Exception { - if (Util.SDK_INT < 23 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity()) || isPc()) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 23); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + assumeFalse(isPc()); + testRunner .setStreamName("test_widevine_h265_fixed") .setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST) @@ -485,10 +476,10 @@ public final class DashStreamingTest { @Test public void widevineH265AdaptiveV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity()) || isPc()) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + assumeFalse(isPc()); + testRunner .setStreamName("test_widevine_h265_adaptive") .setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST) @@ -503,10 +494,10 @@ public final class DashStreamingTest { @Test public void widevineH265AdaptiveWithSeekingV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity()) || isPc()) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + assumeFalse(isPc()); + testRunner .setStreamName("test_widevine_h265_adaptive_with_seeking") .setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST) @@ -522,10 +513,10 @@ public final class DashStreamingTest { @Test public void widevineH265AdaptiveWithRendererDisablingV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity()) || isPc()) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + assumeFalse(isPc()); + testRunner .setStreamName("test_widevine_h265_adaptive_with_renderer_disabling") .setManifestUrl(DashTestData.WIDEVINE_H265_MANIFEST) @@ -543,10 +534,9 @@ public final class DashStreamingTest { @Test public void widevineVp9Fixed360pV23() throws Exception { - if (Util.SDK_INT < 23 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 23); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_vp9_fixed_360p") .setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST) @@ -561,10 +551,9 @@ public final class DashStreamingTest { @Test public void widevineVp9AdaptiveV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_vp9_adaptive") .setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST) @@ -579,10 +568,9 @@ public final class DashStreamingTest { @Test public void widevineVp9AdaptiveWithSeekingV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_vp9_adaptive_with_seeking") .setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST) @@ -598,10 +586,9 @@ public final class DashStreamingTest { @Test public void widevineVp9AdaptiveWithRendererDisablingV24() throws Exception { - if (Util.SDK_INT < 24 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_vp9_adaptive_with_renderer_disabling") .setManifestUrl(DashTestData.WIDEVINE_VP9_MANIFEST) @@ -620,10 +607,9 @@ public final class DashStreamingTest { // 23.976 fps. @Test public void widevine23FpsH264FixedV23() throws Exception { - if (Util.SDK_INT < 23 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 23); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_23fps_h264_fixed") .setManifestUrl(DashTestData.WIDEVINE_H264_23_MANIFEST) @@ -639,10 +625,9 @@ public final class DashStreamingTest { // 24 fps. @Test public void widevine24FpsH264FixedV23() throws Exception { - if (Util.SDK_INT < 23 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 23); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_24fps_h264_fixed") .setManifestUrl(DashTestData.WIDEVINE_H264_24_MANIFEST) @@ -658,10 +643,9 @@ public final class DashStreamingTest { // 29.97 fps. @Test public void widevine29FpsH264FixedV23() throws Exception { - if (Util.SDK_INT < 23 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 23); + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner .setStreamName("test_widevine_29fps_h264_fixed") .setManifestUrl(DashTestData.WIDEVINE_H264_29_MANIFEST) @@ -687,10 +671,9 @@ public final class DashStreamingTest { @Test public void decoderInfoH265V24() throws Exception { - if (Util.SDK_INT < 24 || isPc()) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assumeFalse(isPc()); + assertThat( MediaCodecUtil.getDecoderInfo( MimeTypes.VIDEO_H265, /* secure= */ false, /* tunneling= */ false) @@ -700,10 +683,8 @@ public final class DashStreamingTest { @Test public void decoderInfoVP9V24() throws Exception { - if (Util.SDK_INT < 24) { - // Pass. - return; - } + assumeTrue(Util.SDK_INT >= 24); + assertThat( MediaCodecUtil.getDecoderInfo( MimeTypes.VIDEO_VP9, /* secure= */ false, /* tunneling= */ false) diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java index dd8f225075..8f9fb71a77 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashWidevineOfflineTest.java @@ -15,9 +15,12 @@ */ package com.google.android.exoplayer2.playbacktests.gts; +import static com.google.android.exoplayer2.playbacktests.gts.GtsTestUtil.shouldSkipWidevineTest; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import android.media.MediaDrm.MediaDrmStateException; import android.net.Uri; @@ -61,6 +64,8 @@ public final class DashWidevineOfflineTest { @Before public void setUp() throws Exception { + assumeFalse(shouldSkipWidevineTest(testRule.getActivity())); + testRunner = new DashTestRunner(TAG, testRule.getActivity()) .setStreamName("test_widevine_h264_fixed_offline") @@ -75,13 +80,11 @@ public final class DashWidevineOfflineTest { boolean useL1Widevine = DashTestRunner.isL1WidevineAvailable(MimeTypes.VIDEO_H264); String widevineLicenseUrl = DashTestData.getWidevineLicenseUrl(true, useL1Widevine); httpDataSourceFactory = new DefaultHttpDataSource.Factory(); - if (Util.SDK_INT >= 18) { - offlineLicenseHelper = - OfflineLicenseHelper.newWidevineInstance( - widevineLicenseUrl, - httpDataSourceFactory, - new DrmSessionEventListener.EventDispatcher()); - } + offlineLicenseHelper = + OfflineLicenseHelper.newWidevineInstance( + widevineLicenseUrl, + httpDataSourceFactory, + new DrmSessionEventListener.EventDispatcher()); } @After @@ -90,9 +93,7 @@ public final class DashWidevineOfflineTest { if (offlineLicenseKeySetId != null) { releaseLicense(); } - if (offlineLicenseHelper != null) { - offlineLicenseHelper.release(); - } + offlineLicenseHelper.release(); offlineLicenseHelper = null; httpDataSourceFactory = null; } @@ -104,9 +105,8 @@ public final class DashWidevineOfflineTest { "Needs to be reconfigured/rewritten with an offline-compatible licence [internal" + " b/176960595].") public void widevineOfflineLicenseV22() throws Exception { - if (Util.SDK_INT < 22 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - return; // Pass. - } + assumeTrue(Util.SDK_INT >= 22); + downloadLicense(); testRunner.run(); @@ -120,11 +120,8 @@ public final class DashWidevineOfflineTest { "Needs to be reconfigured/rewritten with an offline-compatible licence [internal" + " b/176960595].") public void widevineOfflineReleasedLicenseV22() throws Throwable { - if (Util.SDK_INT < 22 - || Util.SDK_INT > 28 - || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - return; // Pass. - } + assumeTrue(Util.SDK_INT >= 22 && Util.SDK_INT <= 28); + downloadLicense(); releaseLicense(); // keySetId no longer valid. @@ -148,9 +145,8 @@ public final class DashWidevineOfflineTest { "Needs to be reconfigured/rewritten with an offline-compatible licence [internal" + " b/176960595].") public void widevineOfflineReleasedLicenseV29() throws Throwable { - if (Util.SDK_INT < 29 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - return; // Pass. - } + assumeTrue(Util.SDK_INT >= 29); + downloadLicense(); releaseLicense(); // keySetId no longer valid. @@ -174,9 +170,8 @@ public final class DashWidevineOfflineTest { "Needs to be reconfigured/rewritten with an offline-compatible licence [internal" + " b/176960595].") public void widevineOfflineExpiredLicenseV22() throws Exception { - if (Util.SDK_INT < 22 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - return; // Pass. - } + assumeTrue(Util.SDK_INT >= 22); + downloadLicense(); // Wait until the license expires @@ -207,9 +202,8 @@ public final class DashWidevineOfflineTest { "Needs to be reconfigured/rewritten with an offline-compatible licence [internal" + " b/176960595].") public void widevineOfflineLicenseExpiresOnPauseV22() throws Exception { - if (Util.SDK_INT < 22 || GtsTestUtil.shouldSkipWidevineTest(testRule.getActivity())) { - return; // Pass. - } + assumeTrue(Util.SDK_INT >= 22); + downloadLicense(); // During playback pause until the license expires then continue playback diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/GtsTestUtil.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/GtsTestUtil.java index 6223539056..8855e96b30 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/GtsTestUtil.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/GtsTestUtil.java @@ -21,6 +21,7 @@ import static com.google.android.exoplayer2.C.WIDEVINE_UUID; import android.content.Context; import android.content.pm.PackageManager; import android.media.MediaDrm; +import com.google.android.exoplayer2.util.Util; /** Utility methods for GTS tests. */ public final class GtsTestUtil { @@ -29,6 +30,10 @@ public final class GtsTestUtil { /** Returns true if the device doesn't support Widevine and this is permitted. */ public static boolean shouldSkipWidevineTest(Context context) { + if (Util.SDK_INT < 18) { + // MediaDrm isn't present until API 18 + return true; + } if (isGmsInstalled(context)) { // GMS devices are required to support Widevine. return false; From 8db6ea464972fbf5a2d3000d98f4b00b54f8050b Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 28 Sep 2021 18:25:49 +0100 Subject: [PATCH 243/441] Rename MediaItem.ClippingProperties to ClippingConfiguration This is more consistent with the other MediaItem inner classes which are all Configurations. The old class and fields are left deprecated for backwards compatibility. MediaItem.Builder#setClippingProperties is directly renamed (without deprecation) because it only exists on the dev-v2 branch and hasn't been included in a numbered ExoPlayer release. PiperOrigin-RevId: 399471414 --- .../google/android/exoplayer2/MediaItem.java | 132 +++++++++++------- .../android/exoplayer2/MediaItemTest.java | 68 ++++----- 2 files changed, 113 insertions(+), 87 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 98059d98db..5e1bfecf4d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -69,7 +69,7 @@ public final class MediaItem implements Bundleable { @Nullable private String mimeType; // TODO: Change this to ClippingProperties once all the deprecated individual setters are // removed. - private ClippingProperties.Builder clippingProperties; + private ClippingConfiguration.Builder clippingConfiguration; // TODO: Change this to @Nullable DrmConfiguration once all the deprecated individual setters // are removed. private DrmConfiguration.Builder drmConfiguration; @@ -86,7 +86,7 @@ public final class MediaItem implements Bundleable { /** Creates a builder. */ @SuppressWarnings("deprecation") // Temporarily uses DrmConfiguration.Builder() constructor. public Builder() { - clippingProperties = new ClippingProperties.Builder(); + clippingConfiguration = new ClippingConfiguration.Builder(); drmConfiguration = new DrmConfiguration.Builder(); streamKeys = Collections.emptyList(); subtitles = Collections.emptyList(); @@ -95,7 +95,7 @@ public final class MediaItem implements Bundleable { private Builder(MediaItem mediaItem) { this(); - clippingProperties = mediaItem.clippingProperties.buildUpon(); + clippingConfiguration = mediaItem.clippingConfiguration.buildUpon(); mediaId = mediaItem.mediaId; mediaMetadata = mediaItem.mediaMetadata; liveConfiguration = mediaItem.liveConfiguration.buildUpon(); @@ -162,59 +162,59 @@ public final class MediaItem implements Bundleable { return this; } - /** Sets the {@link ClippingProperties}, defaults to {@link ClippingProperties#UNSET}. */ - public Builder setClippingProperties(ClippingProperties clippingProperties) { - this.clippingProperties = clippingProperties.buildUpon(); + /** Sets the {@link ClippingConfiguration}, defaults to {@link ClippingConfiguration#UNSET}. */ + public Builder setClippingConfiguration(ClippingConfiguration clippingConfiguration) { + this.clippingConfiguration = clippingConfiguration.buildUpon(); return this; } /** - * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link - * ClippingProperties.Builder#setStartPositionMs(long)} instead. + * @deprecated Use {@link #setClippingConfiguration(ClippingConfiguration)} and {@link + * ClippingConfiguration.Builder#setStartPositionMs(long)} instead. */ @Deprecated public Builder setClipStartPositionMs(@IntRange(from = 0) long startPositionMs) { - clippingProperties.setStartPositionMs(startPositionMs); + clippingConfiguration.setStartPositionMs(startPositionMs); return this; } /** - * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link - * ClippingProperties.Builder#setEndPositionMs(long)} instead. + * @deprecated Use {@link #setClippingConfiguration(ClippingConfiguration)} and {@link + * ClippingConfiguration.Builder#setEndPositionMs(long)} instead. */ @Deprecated public Builder setClipEndPositionMs(long endPositionMs) { - clippingProperties.setEndPositionMs(endPositionMs); + clippingConfiguration.setEndPositionMs(endPositionMs); return this; } /** - * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link - * ClippingProperties.Builder#setRelativeToLiveWindow(boolean)} instead. + * @deprecated Use {@link #setClippingConfiguration(ClippingConfiguration)} and {@link + * ClippingConfiguration.Builder#setRelativeToLiveWindow(boolean)} instead. */ @Deprecated public Builder setClipRelativeToLiveWindow(boolean relativeToLiveWindow) { - clippingProperties.setRelativeToLiveWindow(relativeToLiveWindow); + clippingConfiguration.setRelativeToLiveWindow(relativeToLiveWindow); return this; } /** - * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link - * ClippingProperties.Builder#setRelativeToDefaultPosition(boolean)} instead. + * @deprecated Use {@link #setClippingConfiguration(ClippingConfiguration)} and {@link + * ClippingConfiguration.Builder#setRelativeToDefaultPosition(boolean)} instead. */ @Deprecated public Builder setClipRelativeToDefaultPosition(boolean relativeToDefaultPosition) { - clippingProperties.setRelativeToDefaultPosition(relativeToDefaultPosition); + clippingConfiguration.setRelativeToDefaultPosition(relativeToDefaultPosition); return this; } /** - * @deprecated Use {@link #setClippingProperties(ClippingProperties)} and {@link - * ClippingProperties.Builder#setStartsAtKeyFrame(boolean)} instead. + * @deprecated Use {@link #setClippingConfiguration(ClippingConfiguration)} and {@link + * ClippingConfiguration.Builder#setStartsAtKeyFrame(boolean)} instead. */ @Deprecated public Builder setClipStartsAtKeyFrame(boolean startsAtKeyFrame) { - clippingProperties.setStartsAtKeyFrame(startsAtKeyFrame); + clippingConfiguration.setStartsAtKeyFrame(startsAtKeyFrame); return this; } @@ -505,7 +505,7 @@ public final class MediaItem implements Bundleable { } return new MediaItem( mediaId != null ? mediaId : DEFAULT_MEDIA_ID, - clippingProperties.build(), + clippingConfiguration.buildClippingProperties(), localConfiguration, liveConfiguration.build(), mediaMetadata != null ? mediaMetadata : MediaMetadata.EMPTY); @@ -1368,12 +1368,13 @@ public final class MediaItem implements Bundleable { } /** Optionally clips the media item to a custom start and end position. */ - public static final class ClippingProperties implements Bundleable { + // TODO: Mark this final when ClippingProperties is deleted. + public static class ClippingConfiguration implements Bundleable { - /** A clipping properties configuration with default values. */ - public static final ClippingProperties UNSET = new ClippingProperties.Builder().build(); + /** A clipping configuration with default values. */ + public static final ClippingConfiguration UNSET = new ClippingConfiguration.Builder().build(); - /** Builder for {@link ClippingProperties} instances. */ + /** Builder for {@link ClippingConfiguration} instances. */ public static final class Builder { private long startPositionMs; private long endPositionMs; @@ -1386,12 +1387,12 @@ public final class MediaItem implements Bundleable { endPositionMs = C.TIME_END_OF_SOURCE; } - private Builder(ClippingProperties clippingProperties) { - startPositionMs = clippingProperties.startPositionMs; - endPositionMs = clippingProperties.endPositionMs; - relativeToLiveWindow = clippingProperties.relativeToLiveWindow; - relativeToDefaultPosition = clippingProperties.relativeToDefaultPosition; - startsAtKeyFrame = clippingProperties.startsAtKeyFrame; + private Builder(ClippingConfiguration clippingConfiguration) { + startPositionMs = clippingConfiguration.startPositionMs; + endPositionMs = clippingConfiguration.endPositionMs; + relativeToLiveWindow = clippingConfiguration.relativeToLiveWindow; + relativeToDefaultPosition = clippingConfiguration.relativeToDefaultPosition; + startsAtKeyFrame = clippingConfiguration.startsAtKeyFrame; } /** @@ -1444,9 +1445,16 @@ public final class MediaItem implements Bundleable { } /** - * Returns a {@link ClippingProperties} instance initialized with the values of this builder. + * Returns a {@link ClippingConfiguration} instance initialized with the values of this + * builder. */ - public ClippingProperties build() { + public ClippingConfiguration build() { + return buildClippingProperties(); + } + + /** @deprecated Use {@link #build()} instead. */ + @Deprecated + public ClippingProperties buildClippingProperties() { return new ClippingProperties(this); } } @@ -1476,7 +1484,7 @@ public final class MediaItem implements Bundleable { /** Sets whether the start point is guaranteed to be a key frame. */ public final boolean startsAtKeyFrame; - private ClippingProperties(Builder builder) { + private ClippingConfiguration(Builder builder) { this.startPositionMs = builder.startPositionMs; this.endPositionMs = builder.endPositionMs; this.relativeToLiveWindow = builder.relativeToLiveWindow; @@ -1494,11 +1502,11 @@ public final class MediaItem implements Bundleable { if (this == obj) { return true; } - if (!(obj instanceof ClippingProperties)) { + if (!(obj instanceof ClippingConfiguration)) { return false; } - ClippingProperties other = (ClippingProperties) obj; + ClippingConfiguration other = (ClippingConfiguration) obj; return startPositionMs == other.startPositionMs && endPositionMs == other.endPositionMs @@ -1547,10 +1555,10 @@ public final class MediaItem implements Bundleable { return bundle; } - /** Object that can restore {@link ClippingProperties} from a {@link Bundle}. */ + /** Object that can restore {@link ClippingConfiguration} from a {@link Bundle}. */ public static final Creator CREATOR = bundle -> - new ClippingProperties.Builder() + new ClippingConfiguration.Builder() .setStartPositionMs( bundle.getLong(keyForField(FIELD_START_POSITION_MS), /* defaultValue= */ 0)) .setEndPositionMs( @@ -1563,13 +1571,24 @@ public final class MediaItem implements Bundleable { bundle.getBoolean(keyForField(FIELD_RELATIVE_TO_DEFAULT_POSITION), false)) .setStartsAtKeyFrame( bundle.getBoolean(keyForField(FIELD_STARTS_AT_KEY_FRAME), false)) - .build(); + .buildClippingProperties(); - private static String keyForField(@ClippingProperties.FieldNumber int field) { + private static String keyForField(@ClippingConfiguration.FieldNumber int field) { return Integer.toString(field, Character.MAX_RADIX); } } + /** @deprecated Use {@link ClippingConfiguration} instead. */ + @Deprecated + public static final class ClippingProperties extends ClippingConfiguration { + public static final ClippingProperties UNSET = + new ClippingConfiguration.Builder().buildClippingProperties(); + + private ClippingProperties(Builder builder) { + super(builder); + } + } + /** * The default media ID that is used if the media ID is not explicitly set by {@link * Builder#setMediaId(String)}. @@ -1597,12 +1616,15 @@ public final class MediaItem implements Bundleable { public final MediaMetadata mediaMetadata; /** The clipping properties. */ - public final ClippingProperties clippingProperties; + public final ClippingConfiguration clippingConfiguration; + /** @deprecated Use {@link #clippingConfiguration} instead. */ + @Deprecated public final ClippingProperties clippingProperties; - @SuppressWarnings("deprecation") // Using PlaybackProperties until it's deleted. + // Using PlaybackProperties and ClippingProperties until they're deleted. + @SuppressWarnings("deprecation") private MediaItem( String mediaId, - ClippingProperties clippingProperties, + ClippingProperties clippingConfiguration, @Nullable PlaybackProperties localConfiguration, LiveConfiguration liveConfiguration, MediaMetadata mediaMetadata) { @@ -1611,7 +1633,8 @@ public final class MediaItem implements Bundleable { this.playbackProperties = localConfiguration; this.liveConfiguration = liveConfiguration; this.mediaMetadata = mediaMetadata; - this.clippingProperties = clippingProperties; + this.clippingConfiguration = clippingConfiguration; + this.clippingProperties = clippingConfiguration; } /** Returns a {@link Builder} initialized with the values of this instance. */ @@ -1631,7 +1654,7 @@ public final class MediaItem implements Bundleable { MediaItem other = (MediaItem) obj; return Util.areEqual(mediaId, other.mediaId) - && clippingProperties.equals(other.clippingProperties) + && clippingConfiguration.equals(other.clippingConfiguration) && Util.areEqual(localConfiguration, other.localConfiguration) && Util.areEqual(liveConfiguration, other.liveConfiguration) && Util.areEqual(mediaMetadata, other.mediaMetadata); @@ -1642,7 +1665,7 @@ public final class MediaItem implements Bundleable { int result = mediaId.hashCode(); result = 31 * result + (localConfiguration != null ? localConfiguration.hashCode() : 0); result = 31 * result + liveConfiguration.hashCode(); - result = 31 * result + clippingProperties.hashCode(); + result = 31 * result + clippingConfiguration.hashCode(); result = 31 * result + mediaMetadata.hashCode(); return result; } @@ -1676,7 +1699,7 @@ public final class MediaItem implements Bundleable { bundle.putString(keyForField(FIELD_MEDIA_ID), mediaId); bundle.putBundle(keyForField(FIELD_LIVE_CONFIGURATION), liveConfiguration.toBundle()); bundle.putBundle(keyForField(FIELD_MEDIA_METADATA), mediaMetadata.toBundle()); - bundle.putBundle(keyForField(FIELD_CLIPPING_PROPERTIES), clippingProperties.toBundle()); + bundle.putBundle(keyForField(FIELD_CLIPPING_PROPERTIES), clippingConfiguration.toBundle()); return bundle; } @@ -1687,6 +1710,7 @@ public final class MediaItem implements Bundleable { */ public static final Creator CREATOR = MediaItem::fromBundle; + @SuppressWarnings("deprecation") // Unbundling to ClippingProperties while it still exists. private static MediaItem fromBundle(Bundle bundle) { String mediaId = checkNotNull(bundle.getString(keyForField(FIELD_MEDIA_ID), DEFAULT_MEDIA_ID)); @Nullable @@ -1705,16 +1729,16 @@ public final class MediaItem implements Bundleable { mediaMetadata = MediaMetadata.CREATOR.fromBundle(mediaMetadataBundle); } @Nullable - Bundle clippingPropertiesBundle = bundle.getBundle(keyForField(FIELD_CLIPPING_PROPERTIES)); - ClippingProperties clippingProperties; - if (clippingPropertiesBundle == null) { - clippingProperties = ClippingProperties.UNSET; + Bundle clippingConfigurationBundle = bundle.getBundle(keyForField(FIELD_CLIPPING_PROPERTIES)); + ClippingProperties clippingConfiguration; + if (clippingConfigurationBundle == null) { + clippingConfiguration = ClippingProperties.UNSET; } else { - clippingProperties = ClippingProperties.CREATOR.fromBundle(clippingPropertiesBundle); + clippingConfiguration = ClippingConfiguration.CREATOR.fromBundle(clippingConfigurationBundle); } return new MediaItem( mediaId, - clippingProperties, + clippingConfiguration, /* playbackProperties= */ null, liveConfiguration, mediaMetadata); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 45b54f3047..6273e014de 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -307,12 +307,13 @@ public class MediaItemTest { } @Test - public void builderSetClippingProperties() { + @SuppressWarnings("deprecation") // Testing deprecated field + public void builderSetClippingConfiguration() { MediaItem mediaItem = new MediaItem.Builder() .setUri(URI_STRING) - .setClippingProperties( - new MediaItem.ClippingProperties.Builder() + .setClippingConfiguration( + new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(1000L) .setEndPositionMs(2000L) .setRelativeToLiveWindow(true) @@ -321,40 +322,41 @@ public class MediaItemTest { .build()) .build(); - assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(1000L); - assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(2000L); - assertThat(mediaItem.clippingProperties.relativeToLiveWindow).isTrue(); - assertThat(mediaItem.clippingProperties.relativeToDefaultPosition).isTrue(); - assertThat(mediaItem.clippingProperties.startsAtKeyFrame).isTrue(); + assertThat(mediaItem.clippingConfiguration.startPositionMs).isEqualTo(1000L); + assertThat(mediaItem.clippingConfiguration.endPositionMs).isEqualTo(2000L); + assertThat(mediaItem.clippingConfiguration.relativeToLiveWindow).isTrue(); + assertThat(mediaItem.clippingConfiguration.relativeToDefaultPosition).isTrue(); + assertThat(mediaItem.clippingConfiguration.startsAtKeyFrame).isTrue(); + assertThat(mediaItem.clippingConfiguration).isEqualTo(mediaItem.clippingProperties); } @Test - public void clippingPropertiesDefaults() { - MediaItem.ClippingProperties clippingProperties = - new MediaItem.ClippingProperties.Builder().build(); + public void clippingConfigurationDefaults() { + MediaItem.ClippingConfiguration clippingConfiguration = + new MediaItem.ClippingConfiguration.Builder().build(); - assertThat(clippingProperties.startPositionMs).isEqualTo(0L); - assertThat(clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); - assertThat(clippingProperties.relativeToLiveWindow).isFalse(); - assertThat(clippingProperties.relativeToDefaultPosition).isFalse(); - assertThat(clippingProperties.startsAtKeyFrame).isFalse(); - assertThat(clippingProperties).isEqualTo(MediaItem.ClippingProperties.UNSET); + assertThat(clippingConfiguration.startPositionMs).isEqualTo(0L); + assertThat(clippingConfiguration.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); + assertThat(clippingConfiguration.relativeToLiveWindow).isFalse(); + assertThat(clippingConfiguration.relativeToDefaultPosition).isFalse(); + assertThat(clippingConfiguration.startsAtKeyFrame).isFalse(); + assertThat(clippingConfiguration).isEqualTo(MediaItem.ClippingConfiguration.UNSET); } @Test - public void clippingPropertiesBuilder_throwsOnInvalidValues() { - MediaItem.ClippingProperties.Builder clippingPropertiesBuilder = - new MediaItem.ClippingProperties.Builder(); + public void clippingConfigurationBuilder_throwsOnInvalidValues() { + MediaItem.ClippingConfiguration.Builder clippingConfigurationBuilder = + new MediaItem.ClippingConfiguration.Builder(); assertThrows( - IllegalArgumentException.class, () -> clippingPropertiesBuilder.setStartPositionMs(-1)); + IllegalArgumentException.class, () -> clippingConfigurationBuilder.setStartPositionMs(-1)); assertThrows( - IllegalArgumentException.class, () -> clippingPropertiesBuilder.setEndPositionMs(-1)); + IllegalArgumentException.class, () -> clippingConfigurationBuilder.setEndPositionMs(-1)); - MediaItem.ClippingProperties clippingProperties = clippingPropertiesBuilder.build(); + MediaItem.ClippingConfiguration clippingConfiguration = clippingConfigurationBuilder.build(); // Check neither of the setters succeeded in mutating the builder. - assertThat(clippingProperties.startPositionMs).isEqualTo(0L); - assertThat(clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); + assertThat(clippingConfiguration.startPositionMs).isEqualTo(0L); + assertThat(clippingConfiguration.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); } @Test @@ -363,7 +365,7 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setClipStartPositionMs(1000L).build(); - assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(1000L); + assertThat(mediaItem.clippingConfiguration.startPositionMs).isEqualTo(1000L); } @Test @@ -380,7 +382,7 @@ public class MediaItemTest { MediaItem mediaItem = new MediaItem.Builder().setUri(URI_STRING).setClipEndPositionMs(1000L).build(); - assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(1000L); + assertThat(mediaItem.clippingConfiguration.endPositionMs).isEqualTo(1000L); } @Test @@ -393,7 +395,7 @@ public class MediaItemTest { .setClipEndPositionMs(C.TIME_END_OF_SOURCE) .build(); - assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); + assertThat(mediaItem.clippingConfiguration.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE); } @Test @@ -415,9 +417,9 @@ public class MediaItemTest { .setClipStartsAtKeyFrame(true) .build(); - assertThat(mediaItem.clippingProperties.relativeToDefaultPosition).isTrue(); - assertThat(mediaItem.clippingProperties.relativeToLiveWindow).isTrue(); - assertThat(mediaItem.clippingProperties.startsAtKeyFrame).isTrue(); + assertThat(mediaItem.clippingConfiguration.relativeToDefaultPosition).isTrue(); + assertThat(mediaItem.clippingConfiguration.relativeToLiveWindow).isTrue(); + assertThat(mediaItem.clippingConfiguration.startsAtKeyFrame).isTrue(); } @Test @@ -605,8 +607,8 @@ public class MediaItemTest { new MediaItem.Builder() .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(Uri.parse(URI_STRING)).build()) - .setClippingProperties( - new MediaItem.ClippingProperties.Builder() + .setClippingConfiguration( + new MediaItem.ClippingConfiguration.Builder() .setEndPositionMs(1000) .setRelativeToDefaultPosition(true) .setRelativeToLiveWindow(true) From f39dba0c5bf3164aa6ba6376fbee8ba16c60a5c2 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 28 Sep 2021 18:26:25 +0100 Subject: [PATCH 244/441] Migrate usages of MediaItem.ClippingProperties to ClippingConfiguration PiperOrigin-RevId: 399471555 --- .../android/exoplayer2/demo/IntentUtil.java | 22 ++++++++++--------- .../ext/media2/DefaultMediaItemConverter.java | 4 ++-- .../exoplayer2/ClippedPlaybackTest.java | 4 ++-- .../source/DefaultMediaSourceFactory.java | 16 +++++++------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 153870f15a..15c365bdad 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -94,8 +94,8 @@ public class IntentUtil { intent.putExtra(TITLE_EXTRA, mediaItem.mediaMetadata.title); } addPlaybackPropertiesToIntent(localConfiguration, intent, /* extrasKeySuffix= */ ""); - addClippingPropertiesToIntent( - mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ ""); + addClippingConfigurationToIntent( + mediaItem.clippingConfiguration, intent, /* extrasKeySuffix= */ ""); } else { intent.setAction(ACTION_VIEW_LIST); for (int i = 0; i < mediaItems.size(); i++) { @@ -104,8 +104,8 @@ public class IntentUtil { checkNotNull(mediaItem.localConfiguration); intent.putExtra(URI_EXTRA + ("_" + i), localConfiguration.uri.toString()); addPlaybackPropertiesToIntent(localConfiguration, intent, /* extrasKeySuffix= */ "_" + i); - addClippingPropertiesToIntent( - mediaItem.clippingProperties, intent, /* extrasKeySuffix= */ "_" + i); + addClippingConfigurationToIntent( + mediaItem.clippingConfiguration, intent, /* extrasKeySuffix= */ "_" + i); if (mediaItem.mediaMetadata.title != null) { intent.putExtra(TITLE_EXTRA + ("_" + i), mediaItem.mediaMetadata.title); } @@ -236,15 +236,17 @@ public class IntentUtil { } } - private static void addClippingPropertiesToIntent( - MediaItem.ClippingProperties clippingProperties, Intent intent, String extrasKeySuffix) { - if (clippingProperties.startPositionMs != 0) { + private static void addClippingConfigurationToIntent( + MediaItem.ClippingConfiguration clippingConfiguration, + Intent intent, + String extrasKeySuffix) { + if (clippingConfiguration.startPositionMs != 0) { intent.putExtra( - CLIP_START_POSITION_MS_EXTRA + extrasKeySuffix, clippingProperties.startPositionMs); + CLIP_START_POSITION_MS_EXTRA + extrasKeySuffix, clippingConfiguration.startPositionMs); } - if (clippingProperties.endPositionMs != C.TIME_END_OF_SOURCE) { + if (clippingConfiguration.endPositionMs != C.TIME_END_OF_SOURCE) { intent.putExtra( - CLIP_END_POSITION_MS_EXTRA + extrasKeySuffix, clippingProperties.endPositionMs); + CLIP_END_POSITION_MS_EXTRA + extrasKeySuffix, clippingConfiguration.endPositionMs); } } } diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java index 73e94f1b2e..a7baef2241 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java @@ -105,8 +105,8 @@ public class DefaultMediaItemConverter implements MediaItemConverter { } androidx.media2.common.MediaMetadata metadata = getMetadata(exoPlayerMediaItem); - long startPositionMs = exoPlayerMediaItem.clippingProperties.startPositionMs; - long endPositionMs = exoPlayerMediaItem.clippingProperties.endPositionMs; + long startPositionMs = exoPlayerMediaItem.clippingConfiguration.startPositionMs; + long endPositionMs = exoPlayerMediaItem.clippingConfiguration.endPositionMs; if (endPositionMs == C.TIME_END_OF_SOURCE) { endPositionMs = androidx.media2.common.MediaItem.POSITION_UNKNOWN; } diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index 7accfce7da..1ab81138aa 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -33,8 +33,8 @@ import org.junit.Test; import org.junit.runner.RunWith; /** - * Instrumentation tests for playback of clipped items using {@link MediaItem#clippingProperties} or - * {@link ClippingMediaSource} directly. + * Instrumentation tests for playback of clipped items using {@link MediaItem#clippingConfiguration} + * or {@link ClippingMediaSource} directly. */ @RunWith(AndroidJUnit4.class) public final class ClippedPlaybackTest { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index c52646c5da..b301a3d2d1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -419,18 +419,18 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { // internal methods private static MediaSource maybeClipMediaSource(MediaItem mediaItem, MediaSource mediaSource) { - if (mediaItem.clippingProperties.startPositionMs == 0 - && mediaItem.clippingProperties.endPositionMs == C.TIME_END_OF_SOURCE - && !mediaItem.clippingProperties.relativeToDefaultPosition) { + if (mediaItem.clippingConfiguration.startPositionMs == 0 + && mediaItem.clippingConfiguration.endPositionMs == C.TIME_END_OF_SOURCE + && !mediaItem.clippingConfiguration.relativeToDefaultPosition) { return mediaSource; } return new ClippingMediaSource( mediaSource, - C.msToUs(mediaItem.clippingProperties.startPositionMs), - C.msToUs(mediaItem.clippingProperties.endPositionMs), - /* enableInitialDiscontinuity= */ !mediaItem.clippingProperties.startsAtKeyFrame, - /* allowDynamicClippingUpdates= */ mediaItem.clippingProperties.relativeToLiveWindow, - mediaItem.clippingProperties.relativeToDefaultPosition); + C.msToUs(mediaItem.clippingConfiguration.startPositionMs), + C.msToUs(mediaItem.clippingConfiguration.endPositionMs), + /* enableInitialDiscontinuity= */ !mediaItem.clippingConfiguration.startsAtKeyFrame, + /* allowDynamicClippingUpdates= */ mediaItem.clippingConfiguration.relativeToLiveWindow, + mediaItem.clippingConfiguration.relativeToDefaultPosition); } private MediaSource maybeWrapWithAdsMediaSource(MediaItem mediaItem, MediaSource mediaSource) { From 71f07e7a2bd53bd295d15d0daed7ff25bf79b666 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 29 Sep 2021 12:12:17 +0100 Subject: [PATCH 245/441] Update ExoPlayer.Builder javadoc to mention buildExoPlayer() PiperOrigin-RevId: 399651641 --- .../google/android/exoplayer2/ExoPlayer.java | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index fe733dd4d1..ddb41d352e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -501,7 +501,8 @@ public interface ExoPlayer extends Player { * * @param trackSelector A {@link TrackSelector}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setTrackSelector(TrackSelector trackSelector) { wrappedBuilder.setTrackSelector(trackSelector); @@ -513,7 +514,8 @@ public interface ExoPlayer extends Player { * * @param mediaSourceFactory A {@link MediaSourceFactory}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { wrappedBuilder.setMediaSourceFactory(mediaSourceFactory); @@ -525,7 +527,8 @@ public interface ExoPlayer extends Player { * * @param loadControl A {@link LoadControl}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setLoadControl(LoadControl loadControl) { wrappedBuilder.setLoadControl(loadControl); @@ -537,7 +540,8 @@ public interface ExoPlayer extends Player { * * @param bandwidthMeter A {@link BandwidthMeter}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { wrappedBuilder.setBandwidthMeter(bandwidthMeter); @@ -550,7 +554,8 @@ public interface ExoPlayer extends Player { * * @param looper A {@link Looper}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setLooper(Looper looper) { wrappedBuilder.setLooper(looper); @@ -562,7 +567,8 @@ public interface ExoPlayer extends Player { * * @param analyticsCollector An {@link AnalyticsCollector}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { wrappedBuilder.setAnalyticsCollector(analyticsCollector); @@ -576,7 +582,8 @@ public interface ExoPlayer extends Player { * * @param priorityTaskManager A {@link PriorityTaskManager}, or null to not use one. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { wrappedBuilder.setPriorityTaskManager(priorityTaskManager); @@ -594,7 +601,8 @@ public interface ExoPlayer extends Player { * @param audioAttributes {@link AudioAttributes}. * @param handleAudioFocus Whether the player should handle audio focus. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { wrappedBuilder.setAudioAttributes(audioAttributes, handleAudioFocus); @@ -616,7 +624,8 @@ public interface ExoPlayer extends Player { * * @param wakeMode A {@link C.WakeMode}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setWakeMode(@C.WakeMode int wakeMode) { wrappedBuilder.setWakeMode(wakeMode); @@ -632,7 +641,8 @@ public interface ExoPlayer extends Player { * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is * rerouted from a headset to device speakers. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { wrappedBuilder.setHandleAudioBecomingNoisy(handleAudioBecomingNoisy); @@ -644,7 +654,8 @@ public interface ExoPlayer extends Player { * * @param skipSilenceEnabled Whether skipping silences is enabled. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { wrappedBuilder.setSkipSilenceEnabled(skipSilenceEnabled); @@ -659,7 +670,8 @@ public interface ExoPlayer extends Player { * * @param videoScalingMode A {@link C.VideoScalingMode}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { wrappedBuilder.setVideoScalingMode(videoScalingMode); @@ -678,7 +690,8 @@ public interface ExoPlayer extends Player { * * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { @@ -695,7 +708,8 @@ public interface ExoPlayer extends Player { * * @param useLazyPreparation Whether to use lazy preparation. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setUseLazyPreparation(boolean useLazyPreparation) { wrappedBuilder.setUseLazyPreparation(useLazyPreparation); @@ -707,7 +721,8 @@ public interface ExoPlayer extends Player { * * @param seekParameters The {@link SeekParameters}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setSeekParameters(SeekParameters seekParameters) { wrappedBuilder.setSeekParameters(seekParameters); @@ -720,7 +735,8 @@ public interface ExoPlayer extends Player { * @param seekBackIncrementMs The seek back increment, in milliseconds. * @return This builder. * @throws IllegalArgumentException If {@code seekBackIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { wrappedBuilder.setSeekBackIncrementMs(seekBackIncrementMs); @@ -733,7 +749,8 @@ public interface ExoPlayer extends Player { * @param seekForwardIncrementMs The seek forward increment, in milliseconds. * @return This builder. * @throws IllegalArgumentException If {@code seekForwardIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { wrappedBuilder.setSeekForwardIncrementMs(seekForwardIncrementMs); @@ -749,7 +766,8 @@ public interface ExoPlayer extends Player { * * @param releaseTimeoutMs The release timeout, in milliseconds. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { wrappedBuilder.setReleaseTimeoutMs(releaseTimeoutMs); @@ -765,7 +783,8 @@ public interface ExoPlayer extends Player { * * @param detachSurfaceTimeoutMs The timeout for detaching a surface, in milliseconds. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { wrappedBuilder.setDetachSurfaceTimeoutMs(detachSurfaceTimeoutMs); @@ -782,7 +801,8 @@ public interface ExoPlayer extends Player { * * @param pauseAtEndOfMediaItems Whether to pause playback at the end of each media item. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { wrappedBuilder.setPauseAtEndOfMediaItems(pauseAtEndOfMediaItems); @@ -795,7 +815,8 @@ public interface ExoPlayer extends Player { * * @param livePlaybackSpeedControl The {@link LivePlaybackSpeedControl}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { wrappedBuilder.setLivePlaybackSpeedControl(livePlaybackSpeedControl); @@ -808,7 +829,8 @@ public interface ExoPlayer extends Player { * * @param clock A {@link Clock}. * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. + * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already + * been called. */ @VisibleForTesting public Builder setClock(Clock clock) { @@ -819,7 +841,8 @@ public interface ExoPlayer extends Player { /** * Builds a {@link SimpleExoPlayer} instance. * - * @throws IllegalStateException If this method has already been called. + * @throws IllegalStateException If this method or {@link #buildExoPlayer()} has already been + * called. */ @InlineMe(replacement = "this.buildExoPlayer()") public SimpleExoPlayer build() { @@ -829,7 +852,7 @@ public interface ExoPlayer extends Player { /** * Builds a {@link SimpleExoPlayer} instance. * - * @throws IllegalStateException If this method has already been called. + * @throws IllegalStateException If this method or {@link #build()} has already been called. */ public SimpleExoPlayer buildExoPlayer() { return wrappedBuilder.build(); From 6d014cbfd220504c80fb531f84182c458fa8266b Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 29 Sep 2021 13:23:43 +0100 Subject: [PATCH 246/441] Move SubtitleExtractor to text package PiperOrigin-RevId: 399661676 --- .../source/DefaultMediaSourceFactory.java | 2 +- .../extractor/text/package-info.java | 19 ------------------- .../text/SubtitleExtractor.java | 8 +------- .../text/SubtitleExtractorTest.java | 4 +--- 4 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java rename library/extractor/src/main/java/com/google/android/exoplayer2/{extractor => }/text/SubtitleExtractor.java (95%) rename library/extractor/src/test/java/com/google/android/exoplayer2/{extractor => }/text/SubtitleExtractorTest.java (98%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index b301a3d2d1..bdba5330c1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -28,10 +28,10 @@ import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.extractor.text.SubtitleExtractor; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsMediaSource; +import com.google.android.exoplayer2.text.SubtitleExtractor; import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; import com.google.android.exoplayer2.ui.AdViewProvider; import com.google.android.exoplayer2.upstream.DataSource; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java deleted file mode 100644 index dc920e8302..0000000000 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@NonNullApi -package com.google.android.exoplayer2.extractor.text; - -import com.google.android.exoplayer2.util.NonNullApi; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java similarity index 95% rename from library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java index 1552dd1c4a..3642ff177e 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.extractor.text; +package com.google.android.exoplayer2.text; import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; @@ -29,12 +29,6 @@ import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.IndexSeekMap; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.TrackOutput; -import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.CueEncoder; -import com.google.android.exoplayer2.text.SubtitleDecoder; -import com.google.android.exoplayer2.text.SubtitleDecoderException; -import com.google.android.exoplayer2.text.SubtitleInputBuffer; -import com.google.android.exoplayer2.text.SubtitleOutputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java similarity index 98% rename from library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java index 2427790dce..8e09ef0662 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/text/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.extractor.text; +package com.google.android.exoplayer2.text; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; @@ -24,8 +24,6 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.testutil.FakeExtractorInput; import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; -import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.text.CueDecoder; import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; From 82172c7d3b2fc49e5ff98e7793d2dece471555f3 Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 29 Sep 2021 14:20:50 +0100 Subject: [PATCH 247/441] Strip DaiStreamRequest and test from public release for now. PiperOrigin-RevId: 399669963 --- .../exoplayer2/ext/ima/DaiStreamRequest.java | 367 ------------------ .../ext/ima/DaiStreamRequestTest.java | 103 ----- 2 files changed, 470 deletions(-) delete mode 100644 extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java delete mode 100644 extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java deleted file mode 100644 index f6aa5145f5..0000000000 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequest.java +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.ext.ima; - -import static com.google.android.exoplayer2.util.Assertions.checkArgument; -import static com.google.android.exoplayer2.util.Assertions.checkNotNull; - -import android.net.Uri; -import android.text.TextUtils; -import androidx.annotation.Nullable; -import com.google.ads.interactivemedia.v3.api.ImaSdkFactory; -import com.google.ads.interactivemedia.v3.api.StreamRequest; -import com.google.ads.interactivemedia.v3.api.StreamRequest.StreamFormat; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.C.ContentType; -import java.util.HashMap; -import java.util.Map; - -// TODO(gdambrauskas): move this back under IMA DAI class. -/** Defines all of IMA DAI stream request inputs. */ -/* package */ final class DaiStreamRequest { - - private static final String SCHEME = "imadai"; - private static final String ASSET_KEY = "assetKey"; - private static final String API_KEY = "apiKey"; - private static final String CONTENT_SOURCE_ID = "contentSourceId"; - private static final String VIDEO_ID = "videoId"; - private static final String AD_TAG_PARAMETERS = "adTagParameters"; - private static final String MANIFEST_SUFFIX = "manifestSuffix"; - private static final String CONTENT_URL = "contentUrl"; - private static final String AUTH_TOKEN = "authToken"; - private static final String STREAM_ACTIVITY_MONITOR_ID = "streamActivityMonitorId"; - private static final String FORMAT = "format"; - - @Nullable private final String assetKey; - @Nullable private final String apiKey; - @Nullable private final String contentSourceId; - @Nullable private final String videoId; - @Nullable private final Map adTagParameters; - @Nullable private final String manifestSuffix; - @Nullable private final String contentUrl; - @Nullable private final String authToken; - @Nullable private final String streamActivityMonitorId; - @Nullable private StreamRequest request; - @ContentType public int format = C.TYPE_HLS; - - private DaiStreamRequest( - @Nullable String assetKey, - @Nullable String apiKey, - @Nullable String contentSourceId, - @Nullable String videoId, - @Nullable Map adTagParameters, - @Nullable String manifestSuffix, - @Nullable String contentUrl, - @Nullable String authToken, - @Nullable String streamActivityMonitorId, - @ContentType int format) { - this.assetKey = assetKey; - this.apiKey = apiKey; - this.contentSourceId = contentSourceId; - this.videoId = videoId; - this.adTagParameters = adTagParameters; - this.manifestSuffix = manifestSuffix; - this.contentUrl = contentUrl; - this.authToken = authToken; - this.streamActivityMonitorId = streamActivityMonitorId; - this.format = format; - } - - @SuppressWarnings("nullness") - public StreamRequest getStreamRequest() { - if (request != null) { - return request; - } - // We don't care if multiple threads execute the code below, but we do care that the request - // object is fully constructed before using it. - StreamRequest streamRequest = null; - if (!TextUtils.isEmpty(assetKey)) { - streamRequest = ImaSdkFactory.getInstance().createLiveStreamRequest(assetKey, apiKey); - } else if (!TextUtils.isEmpty(contentSourceId) && !TextUtils.isEmpty(videoId)) { - streamRequest = - ImaSdkFactory.getInstance().createVodStreamRequest(contentSourceId, videoId, apiKey); - } - checkNotNull(streamRequest); - if (format == C.TYPE_DASH) { - streamRequest.setFormat(StreamFormat.DASH); - } else if (format == C.TYPE_HLS) { - streamRequest.setFormat(StreamFormat.HLS); - } - // Optional params. - if (adTagParameters != null) { - streamRequest.setAdTagParameters(adTagParameters); - } - if (manifestSuffix != null) { - streamRequest.setManifestSuffix(manifestSuffix); - } - if (contentUrl != null) { - streamRequest.setContentUrl(contentUrl); - } - if (authToken != null) { - streamRequest.setAuthToken(authToken); - } - if (streamActivityMonitorId != null) { - streamRequest.setStreamActivityMonitorId(streamActivityMonitorId); - } - request = streamRequest; - return request; - } - - /** - * Creates a {@link DaiStreamRequest} for the given URI. - * - * @param uri The URI. - * @return An {@link DaiStreamRequest} for the given URI. - * @throws IllegalStateException If uri has missing or invalid inputs. - */ - public static DaiStreamRequest fromUri(Uri uri) { - DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); - if (!SCHEME.equals(uri.getScheme())) { - throw new IllegalArgumentException("Invalid scheme."); - } - request.setAssetKey(uri.getQueryParameter(ASSET_KEY)); - request.setApiKey(uri.getQueryParameter(API_KEY)); - request.setContentSourceId(uri.getQueryParameter(CONTENT_SOURCE_ID)); - request.setVideoId(uri.getQueryParameter(VIDEO_ID)); - request.setManifestSuffix(uri.getQueryParameter(MANIFEST_SUFFIX)); - request.setContentUrl(uri.getQueryParameter(CONTENT_URL)); - request.setAuthToken(uri.getQueryParameter(AUTH_TOKEN)); - request.setStreamActivityMonitorId(uri.getQueryParameter(STREAM_ACTIVITY_MONITOR_ID)); - String formatValue = uri.getQueryParameter(FORMAT); - if (!TextUtils.isEmpty(formatValue)) { - request.setFormat(Integer.parseInt(formatValue)); - } - Map adTagParameters; - String adTagParametersValue; - String singleAdTagParameterValue; - if (uri.getQueryParameter(AD_TAG_PARAMETERS) != null) { - adTagParameters = new HashMap<>(); - adTagParametersValue = uri.getQueryParameter(AD_TAG_PARAMETERS); - if (!TextUtils.isEmpty(adTagParametersValue)) { - Uri adTagParametersUri = Uri.parse(adTagParametersValue); - for (String paramName : adTagParametersUri.getQueryParameterNames()) { - singleAdTagParameterValue = adTagParametersUri.getQueryParameter(paramName); - if (!TextUtils.isEmpty(singleAdTagParameterValue)) { - adTagParameters.put(paramName, singleAdTagParameterValue); - } - } - } - request.setAdTagParameters(adTagParameters); - } - return request.build(); - } - - public Uri toUri() { - Uri.Builder dataUriBuilder = new Uri.Builder(); - dataUriBuilder.scheme(SCHEME); - if (assetKey != null) { - dataUriBuilder.appendQueryParameter(ASSET_KEY, assetKey); - } - if (apiKey != null) { - dataUriBuilder.appendQueryParameter(API_KEY, apiKey); - } - if (contentSourceId != null) { - dataUriBuilder.appendQueryParameter(CONTENT_SOURCE_ID, contentSourceId); - } - if (videoId != null) { - dataUriBuilder.appendQueryParameter(VIDEO_ID, videoId); - } - if (manifestSuffix != null) { - dataUriBuilder.appendQueryParameter(MANIFEST_SUFFIX, manifestSuffix); - } - if (contentUrl != null) { - dataUriBuilder.appendQueryParameter(CONTENT_URL, contentUrl); - } - if (authToken != null) { - dataUriBuilder.appendQueryParameter(AUTH_TOKEN, authToken); - } - if (streamActivityMonitorId != null) { - dataUriBuilder.appendQueryParameter(STREAM_ACTIVITY_MONITOR_ID, streamActivityMonitorId); - } - if (adTagParameters != null && !adTagParameters.isEmpty()) { - Uri.Builder adTagParametersUriBuilder = new Uri.Builder(); - for (Map.Entry entry : adTagParameters.entrySet()) { - adTagParametersUriBuilder.appendQueryParameter(entry.getKey(), entry.getValue()); - } - dataUriBuilder.appendQueryParameter( - AD_TAG_PARAMETERS, adTagParametersUriBuilder.build().toString()); - } - dataUriBuilder.appendQueryParameter(FORMAT, String.valueOf(format)); - return dataUriBuilder.build(); - } - - public static final class Builder { - @Nullable private String assetKey; - @Nullable private String apiKey; - @Nullable private String contentSourceId; - @Nullable private String videoId; - @Nullable private Map adTagParameters; - @Nullable private String manifestSuffix; - @Nullable private String contentUrl; - @Nullable private String authToken; - @Nullable private String streamActivityMonitorId; - @ContentType public int format = C.TYPE_HLS; - /* - *

        /** The stream request asset key used for live streams. - * - * @param assetKey Live stream asset key. - * @return This instance, for convenience. - */ - public Builder setAssetKey(@Nullable String assetKey) { - this.assetKey = assetKey; - return this; - } - - /** - * Sets the stream request authorization token. Used in place of the API key for stricter - * content authorization. The publisher can control individual content streams authorizations - * based on this token. - * - * @param authToken Live stream authorization token. - * @return This instance, for convenience. - */ - public Builder setAuthToken(@Nullable String authToken) { - this.authToken = authToken; - return this; - } - - /** - * The stream request content source ID used for on-demand streams. - * - * @param contentSourceId VOD stream content source id. - * @return This instance, for convenience. - */ - public Builder setContentSourceId(@Nullable String contentSourceId) { - this.contentSourceId = contentSourceId; - return this; - } - - /** - * The stream request video ID used for on-demand streams. - * - * @param videoId VOD stream video id. - * @return This instance, for convenience. - */ - public Builder setVideoId(@Nullable String videoId) { - this.videoId = videoId; - return this; - } - - /** - * Sets the format of the stream request. - * - * @param format VOD or live stream type. - * @return This instance, for convenience. - */ - public Builder setFormat(@ContentType int format) { - checkArgument(format == C.TYPE_DASH || format == C.TYPE_HLS); - this.format = format; - return this; - } - - /** - * The stream request API key. This is used for content authentication. The API key is provided - * to the publisher to unlock their content. It's a security measure used to verify the - * applications that are attempting to access the content. - * - * @param apiKey Stream api key. - * @return This instance, for convenience. - */ - public Builder setApiKey(@Nullable String apiKey) { - this.apiKey = apiKey; - return this; - } - - /** - * Sets the ID to be used to debug the stream with the stream activity monitor. This is used to - * provide a convenient way to allow publishers to find a stream log in the stream activity - * monitor tool. - * - * @param streamActivityMonitorId ID for debugging the stream withstream activity monitor. - * @return This instance, for convenience. - */ - public Builder setStreamActivityMonitorId(@Nullable String streamActivityMonitorId) { - this.streamActivityMonitorId = streamActivityMonitorId; - return this; - } - - /** - * Sets the overridable ad tag parameters on the stream request. Supply targeting parameters to your - * stream provides more information. - * - *

        You can use the dai-ot and dai-ov parameters for stream variant preference. See Override Stream Variant Parameters - * for more information. - * - * @param adTagParameters A map of extra parameters to pass to the ad server. - * @return This instance, for convenience. - */ - public Builder setAdTagParameters(@Nullable Map adTagParameters) { - this.adTagParameters = adTagParameters; - return this; - } - - /** - * Sets the optional stream manifest's suffix, which will be appended to the stream manifest's - * URL. The provided string must be URL-encoded and must not include a leading question mark. - * - * @param manifestSuffix Stream manifest's suffix. - * @return This instance, for convenience. - */ - public Builder setManifestSuffix(@Nullable String manifestSuffix) { - this.manifestSuffix = manifestSuffix; - return this; - } - - /** - * Specifies the deep link to the content's screen. If provided, this parameter is passed to the - * OM SDK. See Android - * documentation for more information. - * - * @param contentUrl Deep link to the content's screen. - * @return This instance, for convenience. - */ - public Builder setContentUrl(@Nullable String contentUrl) { - this.contentUrl = contentUrl; - return this; - } - - /** - * Builds a {@link DaiStreamRequest} with the builder's current values. - * - * @return The build {@link DaiStreamRequest}. - * @throws IllegalStateException If request has missing or invalid inputs. - */ - public DaiStreamRequest build() { - if (TextUtils.isEmpty(assetKey) - && (TextUtils.isEmpty(contentSourceId) || TextUtils.isEmpty(videoId))) { - throw new IllegalStateException("Missing DAI stream request parameters."); - } - return new DaiStreamRequest( - assetKey, - apiKey, - contentSourceId, - videoId, - adTagParameters, - manifestSuffix, - contentUrl, - authToken, - streamActivityMonitorId, - format); - } - } -} diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java deleted file mode 100644 index 4fbf9c1b9c..0000000000 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/DaiStreamRequestTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.ext.ima; - -import static com.google.common.truth.Truth.assertThat; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.ads.interactivemedia.v3.api.StreamRequest.StreamFormat; -import java.util.HashMap; -import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Unit tests for {@link DaiStreamRequest}. */ -@RunWith(AndroidJUnit4.class) -public final class DaiStreamRequestTest { - - private static final String ASSET_KEY = "testAssetKey"; - private static final String API_KEY = "testApiKey"; - private static final String CONTENT_SOURCE_ID = "testContentSourceId"; - private static final String VIDEO_ID = "testVideoId"; - private static final String MANIFEST_SUFFIX = "testManifestSuffix"; - private static final String CONTENT_URL = - "http://google.com/contentUrl?queryParamName=queryParamValue"; - private static final String AUTH_TOKEN = "testAuthToken"; - private static final String STREAM_ACTIVITY_MONITOR_ID = "testStreamActivityMonitorId"; - private static final int FORMAT_DASH = 0; - private static final int FORMAT_HLS = 2; - private static final Map adTagParameters = new HashMap<>(); - - static { - adTagParameters.put("param1", "value1"); - adTagParameters.put("param2", "value2"); - } - - @Test - public void liveRequestSerializationAndDeserialization() { - DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); - request.setAssetKey(ASSET_KEY); - request.setApiKey(API_KEY); - request.setManifestSuffix(MANIFEST_SUFFIX); - request.setContentUrl(CONTENT_URL); - request.setAuthToken(AUTH_TOKEN); - request.setStreamActivityMonitorId(STREAM_ACTIVITY_MONITOR_ID); - request.setFormat(FORMAT_HLS); - request.setAdTagParameters(adTagParameters); - - DaiStreamRequest requestAfterConversions = DaiStreamRequest.fromUri(request.build().toUri()); - assertThat(requestAfterConversions.getStreamRequest().getAssetKey()).isEqualTo(ASSET_KEY); - assertThat(requestAfterConversions.getStreamRequest().getApiKey()).isEqualTo(API_KEY); - assertThat(requestAfterConversions.getStreamRequest().getManifestSuffix()) - .isEqualTo(MANIFEST_SUFFIX); - assertThat(requestAfterConversions.getStreamRequest().getContentUrl()).isEqualTo(CONTENT_URL); - assertThat(requestAfterConversions.getStreamRequest().getAuthToken()).isEqualTo(AUTH_TOKEN); - assertThat(requestAfterConversions.getStreamRequest().getStreamActivityMonitorId()) - .isEqualTo(STREAM_ACTIVITY_MONITOR_ID); - assertThat(requestAfterConversions.getStreamRequest().getFormat()).isEqualTo(StreamFormat.HLS); - assertThat(requestAfterConversions.getStreamRequest().getAdTagParameters()) - .isEqualTo(adTagParameters); - } - - @Test - public void vodRequestSerializationAndDeserialization() { - DaiStreamRequest.Builder request = new DaiStreamRequest.Builder(); - request.setApiKey(API_KEY); - request.setContentSourceId(CONTENT_SOURCE_ID); - request.setVideoId(VIDEO_ID); - request.setManifestSuffix(MANIFEST_SUFFIX); - request.setContentUrl(CONTENT_URL); - request.setAuthToken(AUTH_TOKEN); - request.setStreamActivityMonitorId(STREAM_ACTIVITY_MONITOR_ID); - request.setFormat(FORMAT_DASH); - request.setAdTagParameters(adTagParameters); - - DaiStreamRequest requestAfterConversions = DaiStreamRequest.fromUri(request.build().toUri()); - assertThat(requestAfterConversions.getStreamRequest().getApiKey()).isEqualTo(API_KEY); - assertThat(requestAfterConversions.getStreamRequest().getContentSourceId()) - .isEqualTo(CONTENT_SOURCE_ID); - assertThat(requestAfterConversions.getStreamRequest().getVideoId()).isEqualTo(VIDEO_ID); - assertThat(requestAfterConversions.getStreamRequest().getManifestSuffix()) - .isEqualTo(MANIFEST_SUFFIX); - assertThat(requestAfterConversions.getStreamRequest().getContentUrl()).isEqualTo(CONTENT_URL); - assertThat(requestAfterConversions.getStreamRequest().getAuthToken()).isEqualTo(AUTH_TOKEN); - assertThat(requestAfterConversions.getStreamRequest().getStreamActivityMonitorId()) - .isEqualTo(STREAM_ACTIVITY_MONITOR_ID); - assertThat(requestAfterConversions.getStreamRequest().getFormat()).isEqualTo(StreamFormat.DASH); - assertThat(requestAfterConversions.getStreamRequest().getAdTagParameters()) - .isEqualTo(adTagParameters); - } -} From 00412967c7925af755e761cabc6875407dd7c481 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 29 Sep 2021 16:43:59 +0100 Subject: [PATCH 248/441] Simplify tests for correct order of release events. There are two very similar tests checking for release events, one running with Robolectric and one instrumentation test. The instrumentation test only adds the interaction with the player to release it while the renderers are active. This same interaction can be added to the Robolectric test as well. This arguably improves the realism of the Robolectric test too as we listen for real player events instead of simulating the same events. PiperOrigin-RevId: 399694869 --- ...AnalyticsCollectorInstrumentationTest.java | 189 ------------------ .../analytics/AnalyticsCollectorTest.java | 64 ++++-- 2 files changed, 43 insertions(+), 210 deletions(-) delete mode 100644 library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java deleted file mode 100644 index 94f7c26725..0000000000 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorInstrumentationTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.analytics; - -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.argThat; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.same; -import static org.mockito.Mockito.spy; - -import android.app.Instrumentation; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.PlaybackException; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.Renderer; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.util.Clock; -import com.google.android.exoplayer2.util.ConditionVariable; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InOrder; - -/** Instrumentation tests for the {@link AnalyticsCollector} */ -@RunWith(AndroidJUnit4.class) -public class AnalyticsCollectorInstrumentationTest { - - /** - * This is a regression test against [internal ref: b/195396384]. The root cause of the regression - * was an introduction of an additional {@link AnalyticsListener#onEvents} callback inside {@link - * AnalyticsCollector} for callbacks that are queued during {@link Player#release}. The additional - * callback was called before {@link AnalyticsListener#onPlayerReleased} but its associated event - * real-time timestamps were greater than the real-time timestamp of {@link - * AnalyticsListener#onPlayerReleased}. As a result, the {@link AnalyticsListener#onEvents} that - * contained {@link AnalyticsListener#EVENT_PLAYER_RELEASED} had a real-time timestamp that was - * smaller than the timestamps of the previously forwarded events. That broke the {@link - * PlaybackStatsListener} which assumed that real-time event timestamps are always increasing. - * - *

        The regression was easily reproduced in the demo app with a {@link PlaybackStatsListener} - * attached to the player and pressing back while the app was playing a video. That would make the - * app call {@link Player#release} while the player was playing, and it would throw an exception - * from the {@link PlaybackStatsListener}. - * - *

        This test starts playback of an item and calls {@link Player#release} while the player is - * playing. The test uses a custom {@link Renderer} that queues a callback to be handled after - * {@link Player#release} completes. The test asserts that {@link - * AnalyticsListener#onPlayerReleased} is called after any callbacks queued during {@link - * Player#release} and its real-time timestamp is greater that the timestamps of the other - * callbacks. - */ - @Test - public void releasePlayer_whilePlaying_onPlayerReleasedIsForwardedLast() throws Exception { - AtomicLong playerReleaseTimeMs = new AtomicLong(C.TIME_UNSET); - AtomicReference playerError = new AtomicReference<>(); - AtomicReference player = new AtomicReference<>(); - ConditionVariable playerReleasedEventArrived = new ConditionVariable(); - AnalyticsListener analyticsListener = - spy(new TestAnalyticsListener(playerReleasedEventArrived)); - Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); - instrumentation.runOnMainSync( - () -> { - player.set(new ExoPlayer.Builder(instrumentation.getContext()).build()); - player - .get() - .addListener( - new Player.Listener() { - @Override - public void onPlayerError(PlaybackException error) { - playerError.set(error); - player.get().release(); - } - }); - player.get().addAnalyticsListener(analyticsListener); - player.get().setMediaItem(MediaItem.fromUri("asset:///media/mp4/preroll-5s.mp4")); - player.get().prepare(); - player.get().play(); - }); - waitUntilPosition(player.get(), /* positionMs= */ 1000); - instrumentation.runOnMainSync( - () -> { - player.get().release(); - playerReleaseTimeMs.set(Clock.DEFAULT.elapsedRealtime()); - }); - playerReleasedEventArrived.block(); - - assertThat(playerError.get()).isNull(); - assertThat(playerReleaseTimeMs).isNotEqualTo(C.TIME_UNSET); - InOrder inOrder = inOrder(analyticsListener); - ArgumentCaptor onVideoDecoderReleasedArgumentCaptor = - ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); - inOrder - .verify(analyticsListener) - .onVideoDecoderReleased(onVideoDecoderReleasedArgumentCaptor.capture(), any()); - assertThat(onVideoDecoderReleasedArgumentCaptor.getValue().realtimeMs) - .isGreaterThan(playerReleaseTimeMs.get()); - inOrder - .verify(analyticsListener) - .onEvents( - same(player.get()), - argThat(events -> events.contains(AnalyticsListener.EVENT_VIDEO_DECODER_RELEASED))); - ArgumentCaptor onPlayerReleasedArgumentCaptor = - ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); - inOrder.verify(analyticsListener).onPlayerReleased(onPlayerReleasedArgumentCaptor.capture()); - assertThat(onPlayerReleasedArgumentCaptor.getAllValues()).hasSize(1); - assertThat(onPlayerReleasedArgumentCaptor.getValue().realtimeMs) - .isGreaterThan(onVideoDecoderReleasedArgumentCaptor.getValue().realtimeMs); - inOrder - .verify(analyticsListener) - .onEvents( - same(player.get()), - argThat(events -> events.contains(AnalyticsListener.EVENT_PLAYER_RELEASED))); - } - - private static void waitUntilPosition(SimpleExoPlayer simpleExoPlayer, long positionMs) - throws Exception { - ConditionVariable conditionVariable = new ConditionVariable(); - InstrumentationRegistry.getInstrumentation() - .runOnMainSync( - () -> { - simpleExoPlayer.addListener( - new Player.Listener() { - @Override - public void onPlayerError(PlaybackException error) { - conditionVariable.open(); - } - }); - simpleExoPlayer - .createMessage((messageType, payload) -> conditionVariable.open()) - .setPosition(positionMs) - .send(); - }); - conditionVariable.block(); - } - - /** - * An {@link AnalyticsListener} that blocks the thread on {@link - * AnalyticsListener#onVideoDecoderReleased} for at least {@code 1ms} and unblocks a {@link - * ConditionVariable} when an {@link AnalyticsListener#EVENT_PLAYER_RELEASED} arrives. The class - * is public and non-final so we can use it with {@link org.mockito.Mockito#spy}. - */ - public static class TestAnalyticsListener implements AnalyticsListener { - private final ConditionVariable playerReleasedEventArrived; - - public TestAnalyticsListener(ConditionVariable playerReleasedEventArrived) { - this.playerReleasedEventArrived = playerReleasedEventArrived; - } - - @Override - public void onVideoDecoderReleased(EventTime eventTime, String decoderName) { - // Sleep for 1 ms so that the elapsedRealtime when the subsequent events - // are greater by at least 1 ms. - long startTimeMs = Clock.DEFAULT.elapsedRealtime(); - try { - while (startTimeMs + 1 > Clock.DEFAULT.elapsedRealtime()) { - Thread.sleep(1); - } - } catch (InterruptedException e) { - throw new IllegalStateException(e); - } - } - - @Override - public void onEvents(Player player, Events events) { - if (events.contains(AnalyticsListener.EVENT_PLAYER_RELEASED)) { - playerReleasedEventArrived.open(); - } - } - } -} diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 654e010eae..0753464f04 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -1985,37 +1985,59 @@ public final class AnalyticsCollectorTest { } @Test - public void release_withCallbacksArrivingAfterRelease_onPlayerReleasedForwardedLast() { - FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 0, /* isAutoAdvancing= */ false); - AnalyticsCollector analyticsCollector = new AnalyticsCollector(fakeClock); + public void release_withCallbacksArrivingAfterRelease_onPlayerReleasedForwardedLast() + throws Exception { + FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 0, /* isAutoAdvancing= */ true); SimpleExoPlayer simpleExoPlayer = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); - analyticsCollector.setPlayer(simpleExoPlayer, Looper.myLooper()); - AnalyticsListener analyticsListener = mock(AnalyticsListener.class); - analyticsCollector.addListener(analyticsListener); + new TestExoPlayerBuilder(ApplicationProvider.getApplicationContext()) + .setClock(fakeClock) + .build(); + AnalyticsListener analyticsListener = + spy( + new AnalyticsListener() { + @Override + public void onVideoDisabled(EventTime eventTime, DecoderCounters decoderCounters) { + // Add delay in callback to test whether event timestamp and release timestamp are + // in the correct order. + fakeClock.advanceTime(1); + } + }); + simpleExoPlayer.addAnalyticsListener(analyticsListener); - // Simulate Player.release(): events arrive to the analytics collector after it's been released. - analyticsCollector.release(); - fakeClock.advanceTime(/* timeDiffMs= */ 1); - analyticsCollector.onDroppedFrames(/* count= */ 1, /* elapsedMs= */ 1); - fakeClock.advanceTime(/* timeDiffMs= */ 1); + // Prepare with media to ensure video renderer is enabled. + simpleExoPlayer.setMediaSource( + new FakeMediaSource(new FakeTimeline(), ExoPlayerTestRunner.VIDEO_FORMAT)); + simpleExoPlayer.prepare(); + TestPlayerRunHelper.runUntilPlaybackState(simpleExoPlayer, Player.STATE_READY); + + // Release and add delay on releasing thread to verify timestamps of events. + simpleExoPlayer.release(); + long releaseTimeMs = fakeClock.currentTimeMillis(); + fakeClock.advanceTime(1); ShadowLooper.idleMainLooper(); + // Verify video disable events and release events arrived in order. + ArgumentCaptor videoDisabledEventTime = + ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); + ArgumentCaptor releasedEventTime = + ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); InOrder inOrder = inOrder(analyticsListener); + inOrder.verify(analyticsListener).onVideoDisabled(videoDisabledEventTime.capture(), any()); inOrder .verify(analyticsListener) - .onDroppedVideoFrames(argThat(eventTime -> eventTime.realtimeMs == 1), eq(1), eq(1L)); - inOrder - .verify(analyticsListener) - .onEvents( - same(simpleExoPlayer), argThat(events -> events.contains(EVENT_DROPPED_VIDEO_FRAMES))); - inOrder - .verify(analyticsListener) - .onPlayerReleased(argThat(eventTime -> eventTime.realtimeMs == 2)); + .onEvents(same(simpleExoPlayer), argThat(events -> events.contains(EVENT_VIDEO_DISABLED))); + inOrder.verify(analyticsListener).onPlayerReleased(releasedEventTime.capture()); inOrder .verify(analyticsListener) .onEvents(same(simpleExoPlayer), argThat(events -> events.contains(EVENT_PLAYER_RELEASED))); - inOrder.verifyNoMoreInteractions(); + + // Verify order of timestamps of these events. + // This verification is needed as a regression test against [internal ref: b/195396384]. The + // root cause of the regression was an onPlayerReleased timestamp that was less than the + // previously reported timestamps for other events triggered as part of the release. + long videoDisableTimeMs = videoDisabledEventTime.getValue().realtimeMs; + assertThat(videoDisableTimeMs).isGreaterThan(releaseTimeMs); + assertThat(releasedEventTime.getValue().realtimeMs).isGreaterThan(videoDisableTimeMs); } private static TestAnalyticsListener runAnalyticsTest(MediaSource mediaSource) throws Exception { From b105412a410709ba689ea9930d3199d6e4ac1ed8 Mon Sep 17 00:00:00 2001 From: gyumin Date: Thu, 30 Sep 2021 03:31:13 +0100 Subject: [PATCH 249/441] Rename BundleableUtils to BundleableUtil for consistency All utility classes in the common module has the same naming convention. PiperOrigin-RevId: 399831748 --- .../java/com/google/android/exoplayer2/Format.java | 8 ++++---- .../java/com/google/android/exoplayer2/Player.java | 6 +++--- .../google/android/exoplayer2/source/TrackGroup.java | 6 +++--- .../android/exoplayer2/source/TrackGroupArray.java | 6 +++--- .../google/android/exoplayer2/text/CueDecoder.java | 4 ++-- .../google/android/exoplayer2/text/CueEncoder.java | 4 ++-- .../{BundleableUtils.java => BundleableUtil.java} | 6 +++--- .../android/exoplayer2/ExoPlaybackException.java | 6 +++--- .../trackselection/DefaultTrackSelector.java | 11 +++++------ 9 files changed, 28 insertions(+), 29 deletions(-) rename library/common/src/main/java/com/google/android/exoplayer2/util/{BundleableUtils.java => BundleableUtil.java} (97%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index 150505ddcd..909c759c85 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -20,7 +20,7 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.ColorInfo; @@ -1429,7 +1429,7 @@ public final class Format implements Bundleable { bundle.putFloat(keyForField(FIELD_PIXEL_WIDTH_HEIGHT_RATIO), pixelWidthHeightRatio); bundle.putByteArray(keyForField(FIELD_PROJECTION_DATA), projectionData); bundle.putInt(keyForField(FIELD_STEREO_MODE), stereoMode); - bundle.putBundle(keyForField(FIELD_COLOR_INFO), BundleableUtils.toNullableBundle(colorInfo)); + bundle.putBundle(keyForField(FIELD_COLOR_INFO), BundleableUtil.toNullableBundle(colorInfo)); // Audio specific. bundle.putInt(keyForField(FIELD_CHANNEL_COUNT), channelCount); bundle.putInt(keyForField(FIELD_SAMPLE_RATE), sampleRate); @@ -1448,7 +1448,7 @@ public final class Format implements Bundleable { private static Format fromBundle(Bundle bundle) { Builder builder = new Builder(); - BundleableUtils.ensureClassLoader(bundle); + BundleableUtil.ensureClassLoader(bundle); builder .setId(defaultIfNull(bundle.getString(keyForField(FIELD_ID)), DEFAULT.id)) .setLabel(defaultIfNull(bundle.getString(keyForField(FIELD_LABEL)), DEFAULT.label)) @@ -1498,7 +1498,7 @@ public final class Format implements Bundleable { .setProjectionData(bundle.getByteArray(keyForField(FIELD_PROJECTION_DATA))) .setStereoMode(bundle.getInt(keyForField(FIELD_STEREO_MODE), DEFAULT.stereoMode)) .setColorInfo( - BundleableUtils.fromNullableBundle( + BundleableUtil.fromNullableBundle( ColorInfo.CREATOR, bundle.getBundle(keyForField(FIELD_COLOR_INFO)))) // Audio specific. .setChannelCount(bundle.getInt(keyForField(FIELD_CHANNEL_COUNT), DEFAULT.channelCount)) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 45f181d47e..367194350b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -32,7 +32,7 @@ import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.FlagSet; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -607,7 +607,7 @@ public interface Player { public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putInt(keyForField(FIELD_WINDOW_INDEX), windowIndex); - bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), BundleableUtils.toNullableBundle(mediaItem)); + bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), BundleableUtil.toNullableBundle(mediaItem)); bundle.putInt(keyForField(FIELD_PERIOD_INDEX), periodIndex); bundle.putLong(keyForField(FIELD_POSITION_MS), positionMs); bundle.putLong(keyForField(FIELD_CONTENT_POSITION_MS), contentPositionMs); @@ -624,7 +624,7 @@ public interface Player { bundle.getInt(keyForField(FIELD_WINDOW_INDEX), /* defaultValue= */ C.INDEX_UNSET); @Nullable MediaItem mediaItem = - BundleableUtils.fromNullableBundle( + BundleableUtil.fromNullableBundle( MediaItem.CREATOR, bundle.getBundle(keyForField(FIELD_MEDIA_ITEM))); int periodIndex = bundle.getInt(keyForField(FIELD_PERIOD_INDEX), /* defaultValue= */ C.INDEX_UNSET); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java index 4f9f93fc33..5e5eae2837 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroup.java @@ -23,7 +23,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Log; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -123,7 +123,7 @@ public final class TrackGroup implements Bundleable { public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putParcelableArrayList( - keyForField(FIELD_FORMATS), BundleableUtils.toBundleArrayList(Lists.newArrayList(formats))); + keyForField(FIELD_FORMATS), BundleableUtil.toBundleArrayList(Lists.newArrayList(formats))); return bundle; } @@ -131,7 +131,7 @@ public final class TrackGroup implements Bundleable { public static final Creator CREATOR = bundle -> { List formats = - BundleableUtils.fromBundleNullableList( + BundleableUtil.fromBundleNullableList( Format.CREATOR, bundle.getParcelableArrayList(keyForField(FIELD_FORMATS)), ImmutableList.of()); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java index 0af14a5fdc..6ddff84e38 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/TrackGroupArray.java @@ -20,7 +20,7 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.lang.annotation.Documented; @@ -118,7 +118,7 @@ public final class TrackGroupArray implements Bundleable { Bundle bundle = new Bundle(); bundle.putParcelableArrayList( keyForField(FIELD_TRACK_GROUPS), - BundleableUtils.toBundleArrayList(Lists.newArrayList(trackGroups))); + BundleableUtil.toBundleArrayList(Lists.newArrayList(trackGroups))); return bundle; } @@ -126,7 +126,7 @@ public final class TrackGroupArray implements Bundleable { public static final Creator CREATOR = bundle -> { List trackGroups = - BundleableUtils.fromBundleNullableList( + BundleableUtil.fromBundleNullableList( TrackGroup.CREATOR, bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUPS)), /* defaultValue= */ ImmutableList.of()); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java index d986c32f6e..78e7107bb6 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java @@ -18,7 +18,7 @@ package com.google.android.exoplayer2.text; import android.os.Bundle; import android.os.Parcel; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.common.collect.ImmutableList; import java.util.ArrayList; @@ -43,6 +43,6 @@ public final class CueDecoder { ArrayList bundledCues = Assertions.checkNotNull(bundle.getParcelableArrayList(BUNDLED_CUES)); - return BundleableUtils.fromBundleList(Cue.CREATOR, bundledCues); + return BundleableUtil.fromBundleList(Cue.CREATOR, bundledCues); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java b/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java index 773ec5aecf..4f7d3c4a22 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java @@ -17,7 +17,7 @@ package com.google.android.exoplayer2.text; import android.os.Bundle; import android.os.Parcel; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import java.util.ArrayList; import java.util.List; @@ -31,7 +31,7 @@ public final class CueEncoder { * @return The serialized byte array. */ public byte[] encode(List cues) { - ArrayList bundledCues = BundleableUtils.toBundleArrayList(cues); + ArrayList bundledCues = BundleableUtil.toBundleArrayList(cues); Bundle allCuesBundle = new Bundle(); allCuesBundle.putParcelableArrayList(CueDecoder.BUNDLED_CUES, bundledCues); Parcel parcel = Parcel.obtain(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java similarity index 97% rename from library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java rename to library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java index 932a3e8f7b..978095354b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtils.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.List; /** Utilities for {@link Bundleable}. */ -public final class BundleableUtils { +public final class BundleableUtil { /** * Converts a {@link Bundleable} to a {@link Bundle}. It's a convenience wrapper of {@link @@ -142,9 +142,9 @@ public final class BundleableUtils { */ public static void ensureClassLoader(@Nullable Bundle bundle) { if (bundle != null) { - bundle.setClassLoader(castNonNull(BundleableUtils.class.getClassLoader())); + bundle.setClassLoader(castNonNull(BundleableUtil.class.getClassLoader())); } } - private BundleableUtils() {} + private BundleableUtil() {} } 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 778999d2cb..f78441bda1 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 @@ -25,7 +25,7 @@ import com.google.android.exoplayer2.C.FormatSupport; import com.google.android.exoplayer2.source.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Documented; @@ -236,7 +236,7 @@ public final class ExoPlaybackException extends PlaybackException { rendererIndex = bundle.getInt(keyForField(FIELD_RENDERER_INDEX), /* defaultValue= */ C.INDEX_UNSET); rendererFormat = - BundleableUtils.fromNullableBundle( + BundleableUtil.fromNullableBundle( Format.CREATOR, bundle.getBundle(keyForField(FIELD_RENDERER_FORMAT))); rendererFormatSupport = bundle.getInt( @@ -400,7 +400,7 @@ public final class ExoPlaybackException extends PlaybackException { bundle.putString(keyForField(FIELD_RENDERER_NAME), rendererName); bundle.putInt(keyForField(FIELD_RENDERER_INDEX), rendererIndex); bundle.putBundle( - keyForField(FIELD_RENDERER_FORMAT), BundleableUtils.toNullableBundle(rendererFormat)); + keyForField(FIELD_RENDERER_FORMAT), BundleableUtil.toNullableBundle(rendererFormat)); bundle.putInt(keyForField(FIELD_RENDERER_FORMAT_SUPPORT), rendererFormatSupport); bundle.putBoolean(keyForField(FIELD_IS_RECOVERABLE), isRecoverable); return bundle; 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 7f3389ffe7..b0112d34ae 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 @@ -40,7 +40,7 @@ import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.BundleableUtils; +import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableList; @@ -813,13 +813,13 @@ public class DefaultTrackSelector extends MappingTrackSelector { bundle.getIntArray( Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES)); List trackGroupArrays = - BundleableUtils.fromBundleNullableList( + BundleableUtil.fromBundleNullableList( TrackGroupArray.CREATOR, bundle.getParcelableArrayList( Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS)), /* defaultValue= */ ImmutableList.of()); SparseArray selectionOverrides = - BundleableUtils.fromBundleNullableSparseArray( + BundleableUtil.fromBundleNullableSparseArray( SelectionOverride.CREATOR, bundle.getSparseParcelableArray( Parameters.keyForField(Parameters.FIELD_SELECTION_OVERRIDES)), @@ -1197,10 +1197,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { keyForField(FIELD_SELECTION_OVERRIDES_RENDERER_INDEXES), Ints.toArray(rendererIndexes)); bundle.putParcelableArrayList( keyForField(FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS), - BundleableUtils.toBundleArrayList(trackGroupArrays)); + BundleableUtil.toBundleArrayList(trackGroupArrays)); bundle.putSparseParcelableArray( - keyForField(FIELD_SELECTION_OVERRIDES), - BundleableUtils.toBundleSparseArray(selections)); + keyForField(FIELD_SELECTION_OVERRIDES), BundleableUtil.toBundleSparseArray(selections)); } } From 410ddf458c4daebcf3f997084891c82f2dbd6805 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 30 Sep 2021 11:13:06 +0100 Subject: [PATCH 250/441] Add link to annual media developer survey. This will be removed after the survey has closed in ~1 month. PiperOrigin-RevId: 399890121 --- docs/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/index.md b/docs/index.md index b28743192f..4a512678e1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,10 @@ --- layout: article --- +The Android media team is interested in your experiences with the Android media +APIs and developer resources. Please provide your feedback by +[completing this short survey](https://goo.gle/media-survey-6). +{:.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 From 13f4c832da01fdb6e87056c1760627ab1b44bbe8 Mon Sep 17 00:00:00 2001 From: glass Date: Fri, 2 Apr 2021 07:38:52 +0200 Subject: [PATCH 251/441] Add MP4 extraction of Dolby TrueHD samples Extract 16 access units per readSample call to align with what's done in MKV extraction. Signed-off-by: glass --- .../android/exoplayer2/audio/MlpUtil.java | 104 ++++++++++++++++++ .../exoplayer2/extractor/mp4/Atom.java | 6 + .../exoplayer2/extractor/mp4/AtomParsers.java | 20 +++- .../extractor/mp4/Mp4Extractor.java | 52 +++++++-- 4 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/audio/MlpUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/MlpUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/MlpUtil.java new file mode 100644 index 0000000000..a8fa37e81f --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/MlpUtil.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.audio; + +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.drm.DrmInitData; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.ParsableByteArray; + +/** Utility methods for parsing MLP frames, which are access units in MLP bitstreams. */ +public final class MlpUtil { + + /** a MLP stream can carry simultaneously multiple representations of the same audio : + * stereo as well as multichannel and object based immersive audio, + * so just consider stereo by default */ + private static final int CHANNEL_COUNT_2 = 2; + + /** + * Returns the MLP format given {@code data} containing the MLPSpecificBox according to + * dolbytruehdbitstreamswithintheisobasemediafileformat.pdf + * The reading position of {@code data} will be modified. + * + * @param data The MLPSpecificBox to parse. + * @param trackId The track identifier to set on the format. + * @param sampleRate The sample rate to be included in the format. + * @param language The language to set on the format. + * @param drmInitData {@link DrmInitData} to be included in the format. + * @return The MLP format parsed from data in the header. + */ + public static Format parseMlpFormat( + ParsableByteArray data, String trackId, int sampleRate, + String language, @Nullable DrmInitData drmInitData) { + + return new Format.Builder() + .setId(trackId) + .setSampleMimeType(MimeTypes.AUDIO_TRUEHD) + .setChannelCount(CHANNEL_COUNT_2) + .setSampleRate(sampleRate) + .setDrmInitData(drmInitData) + .setLanguage(language) + .build(); + } + + private MlpUtil() {} + + /** + * The number of samples to store in each output chunk when rechunking TrueHD streams. The number + * of samples extracted from the container corresponding to one syncframe must be an integer + * multiple of this value. + */ + public static final int TRUEHD_RECHUNK_SAMPLE_COUNT = 16; + + /** + * Rechunks TrueHD sample data into groups of {@link #TRUEHD_RECHUNK_SAMPLE_COUNT} samples. + */ + public static class TrueHdSampleRechunker { + + private int sampleCount; + public long timeUs; + public @C.BufferFlags int flags; + public int sampleSize; + + public TrueHdSampleRechunker() { + reset(); + } + + public void reset() { + sampleCount = 0; + sampleSize = 0; + } + + /** Returns true when enough samples have been appended. */ + public boolean appendSampleMetadata(long timeUs, @C.BufferFlags int flags, int size) { + + if (sampleCount++ == 0) { + // This is the first sample in the chunk. + this.timeUs = timeUs; + this.flags = flags; + this.sampleSize = 0; + } + this.sampleSize += size; + if (sampleCount >= TRUEHD_RECHUNK_SAMPLE_COUNT) { + sampleCount = 0; + return true; + } + return false; + } + } +} diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java index a85d928f04..bc8633acc8 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java @@ -152,6 +152,12 @@ import java.util.List; @SuppressWarnings("ConstantCaseForConstants") public static final int TYPE_dac4 = 0x64616334; + @SuppressWarnings("ConstantCaseForConstants") + public static final int TYPE_mlpa = 0x6d6c7061; + + @SuppressWarnings("ConstantCaseForConstants") + public static final int TYPE_dmlp = 0x646d6c70; + @SuppressWarnings("ConstantCaseForConstants") public static final int TYPE_dtsc = 0x64747363; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index 067d53ebfe..e739694dca 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -28,6 +28,7 @@ import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.audio.AacUtil; import com.google.android.exoplayer2.audio.Ac3Util; import com.google.android.exoplayer2.audio.Ac4Util; +import com.google.android.exoplayer2.audio.MlpUtil; import com.google.android.exoplayer2.audio.OpusUtil; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.extractor.ExtractorUtil; @@ -962,6 +963,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; || childAtomType == Atom.TYPE_ac_3 || childAtomType == Atom.TYPE_ec_3 || childAtomType == Atom.TYPE_ac_4 + || childAtomType == Atom.TYPE_mlpa || childAtomType == Atom.TYPE_dtsc || childAtomType == Atom.TYPE_dtse || childAtomType == Atom.TYPE_dtsh @@ -1312,14 +1314,20 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; parent.skipBytes(8); } - int channelCount; - int sampleRate; + int channelCount; + int sampleRate; + int sampleRate32 = 0; @C.PcmEncoding int pcmEncoding = Format.NO_VALUE; @Nullable String codecs = null; if (quickTimeSoundDescriptionVersion == 0 || quickTimeSoundDescriptionVersion == 1) { channelCount = parent.readUnsignedShort(); - parent.skipBytes(6); // sampleSize, compressionId, packetSize. + parent.skipBytes(6); // sampleSize, compressionId, packetSize. + + int pos = parent.getPosition(); + sampleRate32 = (int) parent.readUnsignedInt(); + + parent.setPosition(pos); sampleRate = parent.readUnsignedFixedPoint1616(); if (quickTimeSoundDescriptionVersion == 1) { @@ -1401,6 +1409,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; mimeType = MimeTypes.AUDIO_OPUS; } else if (atomType == Atom.TYPE_fLaC) { mimeType = MimeTypes.AUDIO_FLAC; + } else if (atomType == Atom.TYPE_mlpa) { + mimeType = MimeTypes.AUDIO_TRUEHD; } @Nullable List initializationData = null; @@ -1442,6 +1452,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; initializationData = ImmutableList.of(initializationDataBytes); } } + } else if (childAtomType == Atom.TYPE_dmlp) { + parent.setPosition(Atom.HEADER_SIZE + childPosition); + out.format = MlpUtil.parseMlpFormat(parent, Integer.toString(trackId), + sampleRate32, language, drmInitData); } else if (childAtomType == Atom.TYPE_dac3) { parent.setPosition(Atom.HEADER_SIZE + childPosition); out.format = diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java index d542fa8545..11e11898e8 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java @@ -30,6 +30,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.audio.Ac4Util; +import com.google.android.exoplayer2.audio.MlpUtil; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; @@ -501,11 +502,17 @@ public final class Mp4Extractor implements Extractor, SeekMap { track.durationUs != C.TIME_UNSET ? track.durationUs : trackSampleTable.durationUs; durationUs = max(durationUs, trackDurationUs); Mp4Track mp4Track = - new Mp4Track(track, trackSampleTable, extractorOutput.track(i, track.type)); + new Mp4Track(track, trackSampleTable, extractorOutput.track(i, track.type), track.format.sampleMimeType); // Each sample has up to three bytes of overhead for the start code that replaces its length. // Allow ten source samples per output sample, like the platform extractor. int maxInputSize = trackSampleTable.maximumSize + 3 * 10; + + if ((track.format.sampleMimeType != null) && (track.format.sampleMimeType.equals(MimeTypes.AUDIO_TRUEHD))) { + // TrueHD collates 16 source samples per output + maxInputSize = trackSampleTable.maximumSize * MlpUtil.TRUEHD_RECHUNK_SAMPLE_COUNT; + } + Format.Builder formatBuilder = track.format.buildUpon(); formatBuilder.setMaxInputSize(maxInputSize); if (track.type == C.TRACK_TYPE_VIDEO @@ -540,7 +547,8 @@ public final class Mp4Extractor implements Extractor, SeekMap { } /** - * Attempts to extract the next sample in the current mdat atom for the specified track. + * Attempts to extract the next sample or the next 16 samples in case of Dolby TrueHD audio + * in the current mdat atom for the specified track. * *

        Returns {@link #RESULT_SEEK} if the source should be reloaded from the position in {@code * positionHolder}. @@ -632,12 +640,9 @@ public final class Mp4Extractor implements Extractor, SeekMap { sampleCurrentNalBytesRemaining -= writtenBytes; } } - trackOutput.sampleMetadata( - track.sampleTable.timestampsUs[sampleIndex], - track.sampleTable.flags[sampleIndex], - sampleSize, - 0, - null); + + track.sampleMetadata(sampleIndex, sampleSize, 0, null); + track.sampleIndex++; sampleTrackIndex = C.INDEX_UNSET; sampleBytesRead = 0; @@ -904,11 +909,40 @@ public final class Mp4Extractor implements Extractor, SeekMap { public final TrackOutput trackOutput; public int sampleIndex; + @Nullable public MlpUtil.TrueHdSampleRechunker trueHdSampleRechunker; - public Mp4Track(Track track, TrackSampleTable sampleTable, TrackOutput trackOutput) { + public Mp4Track(Track track, TrackSampleTable sampleTable, TrackOutput trackOutput, @Nullable String mimeType) { this.track = track; this.sampleTable = sampleTable; this.trackOutput = trackOutput; + this.trueHdSampleRechunker = null; + + if ((mimeType != null) && mimeType.equals(MimeTypes.AUDIO_TRUEHD)) { + this.trueHdSampleRechunker = new MlpUtil.TrueHdSampleRechunker(); + } + } + + public void sampleMetadata( int sampleIndex, int sampleSize, int offset, + @Nullable TrackOutput.CryptoData cryptoData) { + + long timeUs = sampleTable.timestampsUs[sampleIndex]; + @C.BufferFlags int flags = sampleTable.flags[sampleIndex]; + + if (trueHdSampleRechunker != null) { + boolean fullChunk = trueHdSampleRechunker.appendSampleMetadata(timeUs,flags,sampleSize); + + if (fullChunk || (sampleIndex+1 == sampleTable.sampleCount)) { + timeUs = trueHdSampleRechunker.timeUs; + flags = trueHdSampleRechunker.flags; + sampleSize = trueHdSampleRechunker.sampleSize; + + trackOutput.sampleMetadata( timeUs, flags, sampleSize, offset, cryptoData); + trueHdSampleRechunker.reset(); + } + } else { + trackOutput.sampleMetadata( timeUs, flags, sampleSize, offset, cryptoData); + } } } + } From d6bc49cc541a45347e74af12ba385d45727d6823 Mon Sep 17 00:00:00 2001 From: glass Date: Wed, 8 Sep 2021 20:33:22 +0200 Subject: [PATCH 252/441] Add Dolby TrueHD extraction test for MP4 files. Signed-off-by: glass --- .../extractor/mp4/Mp4ExtractorTest.java | 6 + .../extractordumps/mp4/sample_dthd.mp4.0.dump | 147 ++++++++++++++++++ .../extractordumps/mp4/sample_dthd.mp4.1.dump | 115 ++++++++++++++ .../extractordumps/mp4/sample_dthd.mp4.2.dump | 83 ++++++++++ .../extractordumps/mp4/sample_dthd.mp4.3.dump | 51 ++++++ .../mp4/sample_dthd.mp4.unknown_length.dump | 147 ++++++++++++++++++ .../src/test/assets/media/mp4/sample_dthd.mp4 | Bin 0 -> 98103 bytes 7 files changed, 549 insertions(+) create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.unknown_length.dump create mode 100644 testdata/src/test/assets/media/mp4/sample_dthd.mp4 diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java index 4408ffab83..9c41d361ad 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java @@ -102,4 +102,10 @@ public final class Mp4ExtractorTest { ExtractorAsserts.assertBehavior( Mp4Extractor::new, "media/mp4/sample_with_color_info.mp4", simulationConfig); } + + @Test + public void mp4SampleWithDolbyTrueHDTrack() throws Exception { + ExtractorAsserts.assertBehavior( + Mp4Extractor::new, "media/mp4/sample_dthd.mp4", simulationConfig); + } } diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.0.dump new file mode 100644 index 0000000000..d05b05b2cc --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.0.dump @@ -0,0 +1,147 @@ +seekMap: + isSeekable = true + duration = 418333 + getPosition(0) = [[timeUs=0, position=3447]] + getPosition(1) = [[timeUs=1, position=3447]] + getPosition(209166) = [[timeUs=209166, position=27035]] + getPosition(418333) = [[timeUs=418333, position=75365]] +numberOfTracks = 1 +track 0: + total output bytes = 94656 + sample count = 32 + format 0: + id = 1 + sampleMimeType = audio/true-hd + maxInputSize = 12480 + channelCount = 2 + sampleRate = 48000 + language = und + sample 0: + time = 0 + flags = 1 + data = length 3512, hash B77F1117 + sample 1: + time = 13333 + flags = 0 + data = length 2830, hash 4B19B7D5 + sample 2: + time = 26666 + flags = 0 + data = length 2868, hash BC04A38E + sample 3: + time = 40000 + flags = 0 + data = length 2834, hash D2AF8AF9 + sample 4: + time = 53333 + flags = 0 + data = length 2898, hash 5C9B3119 + sample 5: + time = 66666 + flags = 0 + data = length 2800, hash 31B9C93F + sample 6: + time = 80000 + flags = 0 + data = length 2866, hash 7FCABDBC + sample 7: + time = 93333 + flags = 0 + data = length 2980, hash FC2CCBDA + sample 8: + time = 106666 + flags = 1 + data = length 3432, hash 17F43166 + sample 9: + time = 120000 + flags = 0 + data = length 2974, hash 69EDFD38 + sample 10: + time = 133333 + flags = 0 + data = length 2898, hash 60E09542 + sample 11: + time = 146666 + flags = 0 + data = length 2896, hash 94A43D4A + sample 12: + time = 160000 + flags = 0 + data = length 3008, hash 82D706BB + sample 13: + time = 173333 + flags = 0 + data = length 2918, hash 22DE72A8 + sample 14: + time = 186666 + flags = 0 + data = length 2990, hash E478A008 + sample 15: + time = 200000 + flags = 0 + data = length 2860, hash B5C3DE40 + sample 16: + time = 213333 + flags = 1 + data = length 3638, hash 3FCD885B + sample 17: + time = 226666 + flags = 0 + data = length 2968, hash A3692382 + sample 18: + time = 240000 + flags = 0 + data = length 2940, hash 72A71C81 + sample 19: + time = 253333 + flags = 0 + data = length 3010, hash A826B2C3 + sample 20: + time = 266666 + flags = 0 + data = length 2952, hash BCEA8C02 + sample 21: + time = 280000 + flags = 0 + data = length 3018, hash C313A53F + sample 22: + time = 293333 + flags = 0 + data = length 2930, hash 4AAB358 + sample 23: + time = 306666 + flags = 0 + data = length 2898, hash C2C22662 + sample 24: + time = 320000 + flags = 1 + data = length 3680, hash 354DF989 + sample 25: + time = 333333 + flags = 0 + data = length 2970, hash 3191F764 + sample 26: + time = 346666 + flags = 0 + data = length 3044, hash 9E115802 + sample 27: + time = 360000 + flags = 0 + data = length 2946, hash B1341399 + sample 28: + time = 373333 + flags = 0 + data = length 2992, hash 4DA27845 + sample 29: + time = 386666 + flags = 0 + data = length 2930, hash 140DC44C + sample 30: + time = 400000 + flags = 0 + data = length 2960, hash 5287EBF8 + sample 31: + time = 413333 + flags = 0 + data = length 1216, hash B83FE151 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.1.dump b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.1.dump new file mode 100644 index 0000000000..47ac8e4b97 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.1.dump @@ -0,0 +1,115 @@ +seekMap: + isSeekable = true + duration = 418333 + getPosition(0) = [[timeUs=0, position=3447]] + getPosition(1) = [[timeUs=1, position=3447]] + getPosition(209166) = [[timeUs=209166, position=27035]] + getPosition(418333) = [[timeUs=418333, position=75365]] +numberOfTracks = 1 +track 0: + total output bytes = 71068 + sample count = 24 + format 0: + id = 1 + sampleMimeType = audio/true-hd + maxInputSize = 12480 + channelCount = 2 + sampleRate = 48000 + language = und + sample 0: + time = 106666 + flags = 1 + data = length 3432, hash 17F43166 + sample 1: + time = 120000 + flags = 0 + data = length 2974, hash 69EDFD38 + sample 2: + time = 133333 + flags = 0 + data = length 2898, hash 60E09542 + sample 3: + time = 146666 + flags = 0 + data = length 2896, hash 94A43D4A + sample 4: + time = 160000 + flags = 0 + data = length 3008, hash 82D706BB + sample 5: + time = 173333 + flags = 0 + data = length 2918, hash 22DE72A8 + sample 6: + time = 186666 + flags = 0 + data = length 2990, hash E478A008 + sample 7: + time = 200000 + flags = 0 + data = length 2860, hash B5C3DE40 + sample 8: + time = 213333 + flags = 1 + data = length 3638, hash 3FCD885B + sample 9: + time = 226666 + flags = 0 + data = length 2968, hash A3692382 + sample 10: + time = 240000 + flags = 0 + data = length 2940, hash 72A71C81 + sample 11: + time = 253333 + flags = 0 + data = length 3010, hash A826B2C3 + sample 12: + time = 266666 + flags = 0 + data = length 2952, hash BCEA8C02 + sample 13: + time = 280000 + flags = 0 + data = length 3018, hash C313A53F + sample 14: + time = 293333 + flags = 0 + data = length 2930, hash 4AAB358 + sample 15: + time = 306666 + flags = 0 + data = length 2898, hash C2C22662 + sample 16: + time = 320000 + flags = 1 + data = length 3680, hash 354DF989 + sample 17: + time = 333333 + flags = 0 + data = length 2970, hash 3191F764 + sample 18: + time = 346666 + flags = 0 + data = length 3044, hash 9E115802 + sample 19: + time = 360000 + flags = 0 + data = length 2946, hash B1341399 + sample 20: + time = 373333 + flags = 0 + data = length 2992, hash 4DA27845 + sample 21: + time = 386666 + flags = 0 + data = length 2930, hash 140DC44C + sample 22: + time = 400000 + flags = 0 + data = length 2960, hash 5287EBF8 + sample 23: + time = 413333 + flags = 0 + data = length 1216, hash B83FE151 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.2.dump b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.2.dump new file mode 100644 index 0000000000..c52bcbffed --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.2.dump @@ -0,0 +1,83 @@ +seekMap: + isSeekable = true + duration = 418333 + getPosition(0) = [[timeUs=0, position=3447]] + getPosition(1) = [[timeUs=1, position=3447]] + getPosition(209166) = [[timeUs=209166, position=27035]] + getPosition(418333) = [[timeUs=418333, position=75365]] +numberOfTracks = 1 +track 0: + total output bytes = 47092 + sample count = 16 + format 0: + id = 1 + sampleMimeType = audio/true-hd + maxInputSize = 12480 + channelCount = 2 + sampleRate = 48000 + language = und + sample 0: + time = 213333 + flags = 1 + data = length 3638, hash 3FCD885B + sample 1: + time = 226666 + flags = 0 + data = length 2968, hash A3692382 + sample 2: + time = 240000 + flags = 0 + data = length 2940, hash 72A71C81 + sample 3: + time = 253333 + flags = 0 + data = length 3010, hash A826B2C3 + sample 4: + time = 266666 + flags = 0 + data = length 2952, hash BCEA8C02 + sample 5: + time = 280000 + flags = 0 + data = length 3018, hash C313A53F + sample 6: + time = 293333 + flags = 0 + data = length 2930, hash 4AAB358 + sample 7: + time = 306666 + flags = 0 + data = length 2898, hash C2C22662 + sample 8: + time = 320000 + flags = 1 + data = length 3680, hash 354DF989 + sample 9: + time = 333333 + flags = 0 + data = length 2970, hash 3191F764 + sample 10: + time = 346666 + flags = 0 + data = length 3044, hash 9E115802 + sample 11: + time = 360000 + flags = 0 + data = length 2946, hash B1341399 + sample 12: + time = 373333 + flags = 0 + data = length 2992, hash 4DA27845 + sample 13: + time = 386666 + flags = 0 + data = length 2930, hash 140DC44C + sample 14: + time = 400000 + flags = 0 + data = length 2960, hash 5287EBF8 + sample 15: + time = 413333 + flags = 0 + data = length 1216, hash B83FE151 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.3.dump b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.3.dump new file mode 100644 index 0000000000..1d226c257a --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.3.dump @@ -0,0 +1,51 @@ +seekMap: + isSeekable = true + duration = 418333 + getPosition(0) = [[timeUs=0, position=3447]] + getPosition(1) = [[timeUs=1, position=3447]] + getPosition(209166) = [[timeUs=209166, position=27035]] + getPosition(418333) = [[timeUs=418333, position=75365]] +numberOfTracks = 1 +track 0: + total output bytes = 22738 + sample count = 8 + format 0: + id = 1 + sampleMimeType = audio/true-hd + maxInputSize = 12480 + channelCount = 2 + sampleRate = 48000 + language = und + sample 0: + time = 320000 + flags = 1 + data = length 3680, hash 354DF989 + sample 1: + time = 333333 + flags = 0 + data = length 2970, hash 3191F764 + sample 2: + time = 346666 + flags = 0 + data = length 3044, hash 9E115802 + sample 3: + time = 360000 + flags = 0 + data = length 2946, hash B1341399 + sample 4: + time = 373333 + flags = 0 + data = length 2992, hash 4DA27845 + sample 5: + time = 386666 + flags = 0 + data = length 2930, hash 140DC44C + sample 6: + time = 400000 + flags = 0 + data = length 2960, hash 5287EBF8 + sample 7: + time = 413333 + flags = 0 + data = length 1216, hash B83FE151 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.unknown_length.dump new file mode 100644 index 0000000000..d05b05b2cc --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_dthd.mp4.unknown_length.dump @@ -0,0 +1,147 @@ +seekMap: + isSeekable = true + duration = 418333 + getPosition(0) = [[timeUs=0, position=3447]] + getPosition(1) = [[timeUs=1, position=3447]] + getPosition(209166) = [[timeUs=209166, position=27035]] + getPosition(418333) = [[timeUs=418333, position=75365]] +numberOfTracks = 1 +track 0: + total output bytes = 94656 + sample count = 32 + format 0: + id = 1 + sampleMimeType = audio/true-hd + maxInputSize = 12480 + channelCount = 2 + sampleRate = 48000 + language = und + sample 0: + time = 0 + flags = 1 + data = length 3512, hash B77F1117 + sample 1: + time = 13333 + flags = 0 + data = length 2830, hash 4B19B7D5 + sample 2: + time = 26666 + flags = 0 + data = length 2868, hash BC04A38E + sample 3: + time = 40000 + flags = 0 + data = length 2834, hash D2AF8AF9 + sample 4: + time = 53333 + flags = 0 + data = length 2898, hash 5C9B3119 + sample 5: + time = 66666 + flags = 0 + data = length 2800, hash 31B9C93F + sample 6: + time = 80000 + flags = 0 + data = length 2866, hash 7FCABDBC + sample 7: + time = 93333 + flags = 0 + data = length 2980, hash FC2CCBDA + sample 8: + time = 106666 + flags = 1 + data = length 3432, hash 17F43166 + sample 9: + time = 120000 + flags = 0 + data = length 2974, hash 69EDFD38 + sample 10: + time = 133333 + flags = 0 + data = length 2898, hash 60E09542 + sample 11: + time = 146666 + flags = 0 + data = length 2896, hash 94A43D4A + sample 12: + time = 160000 + flags = 0 + data = length 3008, hash 82D706BB + sample 13: + time = 173333 + flags = 0 + data = length 2918, hash 22DE72A8 + sample 14: + time = 186666 + flags = 0 + data = length 2990, hash E478A008 + sample 15: + time = 200000 + flags = 0 + data = length 2860, hash B5C3DE40 + sample 16: + time = 213333 + flags = 1 + data = length 3638, hash 3FCD885B + sample 17: + time = 226666 + flags = 0 + data = length 2968, hash A3692382 + sample 18: + time = 240000 + flags = 0 + data = length 2940, hash 72A71C81 + sample 19: + time = 253333 + flags = 0 + data = length 3010, hash A826B2C3 + sample 20: + time = 266666 + flags = 0 + data = length 2952, hash BCEA8C02 + sample 21: + time = 280000 + flags = 0 + data = length 3018, hash C313A53F + sample 22: + time = 293333 + flags = 0 + data = length 2930, hash 4AAB358 + sample 23: + time = 306666 + flags = 0 + data = length 2898, hash C2C22662 + sample 24: + time = 320000 + flags = 1 + data = length 3680, hash 354DF989 + sample 25: + time = 333333 + flags = 0 + data = length 2970, hash 3191F764 + sample 26: + time = 346666 + flags = 0 + data = length 3044, hash 9E115802 + sample 27: + time = 360000 + flags = 0 + data = length 2946, hash B1341399 + sample 28: + time = 373333 + flags = 0 + data = length 2992, hash 4DA27845 + sample 29: + time = 386666 + flags = 0 + data = length 2930, hash 140DC44C + sample 30: + time = 400000 + flags = 0 + data = length 2960, hash 5287EBF8 + sample 31: + time = 413333 + flags = 0 + data = length 1216, hash B83FE151 +tracksEnded = true diff --git a/testdata/src/test/assets/media/mp4/sample_dthd.mp4 b/testdata/src/test/assets/media/mp4/sample_dthd.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c5d3eb2a390e03a57b939cec0408e64b46070da4 GIT binary patch literal 98103 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

        V9cis9ri*KvqwRZi!5a8LnQNBGgi00@A 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

        WI8t&O&WXiJ=j71ftE*K}tdZ_F2jX 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 R%s9sEuU7lXQt0dQ{{<@HIN$&P literal 0 HcmV?d00001 From e335022e0b5ff4f1370f7606107ae640c4a6b55d Mon Sep 17 00:00:00 2001 From: samrobinson Date: Thu, 30 Sep 2021 12:36:29 +0100 Subject: [PATCH 253/441] Fix mediaMetadata being reset when media is repeated. Issue: #9458 PiperOrigin-RevId: 399901865 --- RELEASENOTES.md | 2 ++ .../main/java/com/google/android/exoplayer2/ExoPlayerImpl.java | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a896409151..c7bb21f239 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -13,6 +13,8 @@ `GlUtil.glAssertionsEnabled` instead. * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. + * Fix `mediaMetadata` being reset when media is + repeated ([#9458](https://github.com/google/ExoPlayer/issues/9458)). * Video: * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index d2c4f1e716..2692475719 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -1219,7 +1219,8 @@ import java.util.concurrent.CopyOnWriteArraySet; } newMediaMetadata = mediaItem != null ? mediaItem.mediaMetadata : MediaMetadata.EMPTY; } - if (!previousPlaybackInfo.staticMetadata.equals(newPlaybackInfo.staticMetadata)) { + if (mediaItemTransitioned + || !previousPlaybackInfo.staticMetadata.equals(newPlaybackInfo.staticMetadata)) { newMediaMetadata = newMediaMetadata.buildUpon().populateFromMetadata(newPlaybackInfo.staticMetadata).build(); } From ece0cfc9f293adac1344f0ca6ab4bd586a16afca Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 30 Sep 2021 15:03:13 +0100 Subject: [PATCH 254/441] Move some tests to facilitate package renaming PiperOrigin-RevId: 399923140 --- .../google/android/exoplayer2/{device => }/DeviceInfoTest.java | 3 +-- .../google/android/exoplayer2/ExoPlaybackExceptionTest.java | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename library/common/src/test/java/com/google/android/exoplayer2/{device => }/DeviceInfoTest.java (92%) rename library/{common => core}/src/test/java/com/google/android/exoplayer2/ExoPlaybackExceptionTest.java (100%) diff --git a/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java b/library/common/src/test/java/com/google/android/exoplayer2/DeviceInfoTest.java similarity index 92% rename from library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/DeviceInfoTest.java index 03ff4f833f..156887aaeb 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/device/DeviceInfoTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/DeviceInfoTest.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.device; +package com.google.android.exoplayer2; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.DeviceInfo; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/ExoPlaybackExceptionTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlaybackExceptionTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/ExoPlaybackExceptionTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/ExoPlaybackExceptionTest.java From d5ef11aaf38ffe6c28631ddf5bc3bed933cd46d8 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 30 Sep 2021 16:03:54 +0100 Subject: [PATCH 255/441] Add track selection override to the player API This moves `SelectionOverride` from `DefaultTrackSelector` to `TrackSelectionParameters`. It is then use to allow track selection override per track selection array. Note that contrary to `DefaultTrackSelector.Parameters.selectionOverride`, the renderer concept is not exposed. This cl is a part of the bigger track selection change, splitted for ease of review. Find all cls with the tag: #player-track-selection PiperOrigin-RevId: 399933612 --- .../TrackSelectionParameters.java | 153 +++++++++++++++++- .../exoplayer2/util/BundleableUtil.java | 14 +- .../TrackSelectionParametersTest.java | 30 ++++ .../trackselection/DefaultTrackSelector.java | 24 ++- .../DefaultTrackSelectorTest.java | 48 +++++- 5 files changed, 251 insertions(+), 18 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index 68e5b3c54f..ad3b831dfb 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -16,6 +16,8 @@ package com.google.android.exoplayer2.trackselection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; +import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; import static com.google.common.base.MoreObjects.firstNonNull; import android.content.Context; @@ -23,23 +25,27 @@ import android.graphics.Point; import android.os.Bundle; import android.os.Looper; import android.view.accessibility.CaptioningManager; -import androidx.annotation.CallSuper; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Ints; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; /** * Constraint parameters for track selection. @@ -93,6 +99,7 @@ public class TrackSelectionParameters implements Bundleable { // General private boolean forceLowestBitrate; private boolean forceHighestSupportedBitrate; + private ImmutableMap trackSelectionOverrides; private ImmutableSet<@C.TrackType Integer> disabledTrackTypes; /** @@ -123,6 +130,7 @@ public class TrackSelectionParameters implements Bundleable { // General forceLowestBitrate = false; forceHighestSupportedBitrate = false; + trackSelectionOverrides = ImmutableMap.of(); disabledTrackTypes = ImmutableSet.of(); } @@ -224,7 +232,17 @@ public class TrackSelectionParameters implements Bundleable { bundle.getBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); - + List keys = + fromBundleNullableList( + TrackGroup.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDE_KEYS)), + ImmutableList.of()); + List values = + fromBundleNullableList( + TrackSelectionOverride.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDE_VALUES)), + ImmutableList.of()); + trackSelectionOverrides = zipToMap(keys, values); disabledTrackTypes = ImmutableSet.copyOf( Ints.asList( @@ -238,6 +256,7 @@ public class TrackSelectionParameters implements Bundleable { "preferredAudioLanguages", "preferredAudioMimeTypes", "preferredTextLanguages", + "trackSelectionOverrides", "disabledTrackTypes", }) private void init(@UnknownInitialization Builder this, TrackSelectionParameters parameters) { @@ -267,6 +286,7 @@ public class TrackSelectionParameters implements Bundleable { // General forceLowestBitrate = parameters.forceLowestBitrate; forceHighestSupportedBitrate = parameters.forceHighestSupportedBitrate; + trackSelectionOverrides = parameters.trackSelectionOverrides; disabledTrackTypes = parameters.disabledTrackTypes; } @@ -615,6 +635,18 @@ public class TrackSelectionParameters implements Bundleable { return this; } + /** + * Sets the selection overrides. + * + * @param trackSelectionOverrides The track selection overrides. + * @return This builder. + */ + public Builder setTrackSelectionOverrides( + Map trackSelectionOverrides) { + this.trackSelectionOverrides = ImmutableMap.copyOf(trackSelectionOverrides); + return this; + } + /** * Sets the disabled track types, preventing all tracks of those types from being selected for * playback. @@ -659,6 +691,83 @@ public class TrackSelectionParameters implements Bundleable { } return listBuilder.build(); } + + private static ImmutableMap<@NonNull K, @NonNull V> zipToMap( + List<@NonNull K> keys, List<@NonNull V> values) { + ImmutableMap.Builder<@NonNull K, @NonNull V> builder = new ImmutableMap.Builder<>(); + for (int i = 0; i < keys.size(); i++) { + builder.put(keys.get(i), values.get(i)); + } + return builder.build(); + } + } + + /** + * Forces the selection of {@link #tracks} for a {@link TrackGroup}. + * + * @see #trackSelectionOverrides + */ + public static final class TrackSelectionOverride implements Bundleable { + /** Force the selection of the associated {@link TrackGroup}, but no track will be played. */ + public static final TrackSelectionOverride DISABLE = + new TrackSelectionOverride(ImmutableSet.of()); + + /** The index of tracks in a {@link TrackGroup} to be selected. */ + public final ImmutableSet tracks; + + /** Constructs an instance to force {@code tracks} to be selected. */ + public TrackSelectionOverride(ImmutableSet tracks) { + this.tracks = tracks; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + TrackSelectionOverride that = (TrackSelectionOverride) obj; + return tracks.equals(that.tracks); + } + + @Override + public int hashCode() { + return tracks.hashCode(); + } + + // Bundleable implementation + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_TRACKS, + }) + private @interface FieldNumber {} + + private static final int FIELD_TRACKS = 0; + + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putIntArray(keyForField(FIELD_TRACKS), Ints.toArray(tracks)); + return bundle; + } + + /** Object that can restore {@code TrackSelectionOverride} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + @Nullable int[] tracks = bundle.getIntArray(keyForField(FIELD_TRACKS)); + if (tracks == null) { + return DISABLE; + } + return new TrackSelectionOverride(ImmutableSet.copyOf(Ints.asList(tracks))); + }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } } /** @@ -810,6 +919,30 @@ public class TrackSelectionParameters implements Bundleable { * other constraints. The default value is {@code false}. */ public final boolean forceHighestSupportedBitrate; + + /** + * For each {@link TrackGroup} in the map, forces the tracks associated with it to be selected for + * playback. + * + *

        For example if {@code trackSelectionOverrides.equals(ImmutableMap.of(trackGroup, + * ImmutableSet.of(1, 2, 3)))}, the tracks 1, 2 and 3 of {@code trackGroup} will be selected. + * + *

        If multiple of the current {@link TrackGroup}s of the same {@link C.TrackType} are + * overridden, it is undetermined which one(s) will be selected. For example if a {@link + * MediaItem} has 2 video track groups (for example 2 different angles), and both are overriden, + * it is undetermined which one will be selected. + * + *

        If multiple tracks of the {@link TrackGroup} are overriden, all supported (see {@link + * C.FormatSupport}) will be selected. + * + *

        If a {@link TrackGroup} is associated with an empty set of tracks, no tracks will be played. + * This is similar to {@link #disabledTrackTypes}, except it will only affect the playback of the + * associated {@link TrackGroup}. For example, if the {@link C#TRACK_TYPE_VIDEO} {@link + * TrackGroup} is associated with no tracks, no video will play until the next video starts. + * + *

        The default value is that no {@link TrackGroup} selections are overridden (empty map). + */ + public final ImmutableMap trackSelectionOverrides; /** * The track types that are disabled. No track of a disabled type will be selected, thus no track * type contained in the set will be played. The default value is that no track type is disabled @@ -844,6 +977,7 @@ public class TrackSelectionParameters implements Bundleable { // General this.forceLowestBitrate = builder.forceLowestBitrate; this.forceHighestSupportedBitrate = builder.forceHighestSupportedBitrate; + this.trackSelectionOverrides = builder.trackSelectionOverrides; this.disabledTrackTypes = builder.disabledTrackTypes; } @@ -887,6 +1021,7 @@ public class TrackSelectionParameters implements Bundleable { // General && forceLowestBitrate == other.forceLowestBitrate && forceHighestSupportedBitrate == other.forceHighestSupportedBitrate + && trackSelectionOverrides.equals(other.trackSelectionOverrides) && disabledTrackTypes.equals(other.disabledTrackTypes); } @@ -919,6 +1054,7 @@ public class TrackSelectionParameters implements Bundleable { // General result = 31 * result + (forceLowestBitrate ? 1 : 0); result = 31 * result + (forceHighestSupportedBitrate ? 1 : 0); + result = 31 * result + trackSelectionOverrides.hashCode(); result = 31 * result + disabledTrackTypes.hashCode(); return result; } @@ -950,6 +1086,8 @@ public class TrackSelectionParameters implements Bundleable { FIELD_PREFERRED_AUDIO_MIME_TYPES, FIELD_FORCE_LOWEST_BITRATE, FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, + FIELD_SELECTION_OVERRIDE_KEYS, + FIELD_SELECTION_OVERRIDE_VALUES, FIELD_DISABLED_TRACK_TYPE, }) private @interface FieldNumber {} @@ -976,10 +1114,11 @@ public class TrackSelectionParameters implements Bundleable { private static final int FIELD_PREFERRED_AUDIO_MIME_TYPES = 20; private static final int FIELD_FORCE_LOWEST_BITRATE = 21; private static final int FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE = 22; - private static final int FIELD_DISABLED_TRACK_TYPE = 23; + private static final int FIELD_SELECTION_OVERRIDE_KEYS = 23; + private static final int FIELD_SELECTION_OVERRIDE_VALUES = 24; + private static final int FIELD_DISABLED_TRACK_TYPE = 25; @Override - @CallSuper public Bundle toBundle() { Bundle bundle = new Bundle(); @@ -1019,6 +1158,12 @@ public class TrackSelectionParameters implements Bundleable { bundle.putBoolean(keyForField(FIELD_FORCE_LOWEST_BITRATE), forceLowestBitrate); bundle.putBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), forceHighestSupportedBitrate); + bundle.putParcelableArrayList( + keyForField(FIELD_SELECTION_OVERRIDE_KEYS), + toBundleArrayList(trackSelectionOverrides.keySet())); + bundle.putParcelableArrayList( + keyForField(FIELD_SELECTION_OVERRIDE_VALUES), + toBundleArrayList(trackSelectionOverrides.values())); bundle.putIntArray(keyForField(FIELD_DISABLED_TRACK_TYPE), Ints.toArray(disabledTrackTypes)); return bundle; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java index 978095354b..7b59db54e8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/BundleableUtil.java @@ -24,6 +24,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.common.collect.ImmutableList; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** Utilities for {@link Bundleable}. */ @@ -108,14 +109,15 @@ public final class BundleableUtil { } /** - * Converts a list of {@link Bundleable} to an {@link ArrayList} of {@link Bundle} so that the - * returned list can be put to {@link Bundle} using {@link Bundle#putParcelableArrayList} + * Converts a collection of {@link Bundleable} to an {@link ArrayList} of {@link Bundle} so that + * the returned list can be put to {@link Bundle} using {@link Bundle#putParcelableArrayList} * conveniently. */ - public static ArrayList toBundleArrayList(List bundleableList) { - ArrayList arrayList = new ArrayList<>(bundleableList.size()); - for (int i = 0; i < bundleableList.size(); i++) { - arrayList.add(bundleableList.get(i).toBundle()); + public static ArrayList toBundleArrayList( + Collection bundleables) { + ArrayList arrayList = new ArrayList<>(bundleables.size()); + for (T element : bundleables) { + arrayList.add(element.toBundle()); } return arrayList; } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java index 69743bb609..701d88d0e6 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java @@ -19,8 +19,14 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import org.junit.Test; import org.junit.runner.RunWith; @@ -58,10 +64,16 @@ public class TrackSelectionParametersTest { // General assertThat(parameters.forceLowestBitrate).isFalse(); assertThat(parameters.forceHighestSupportedBitrate).isFalse(); + assertThat(parameters.trackSelectionOverrides).isEmpty(); + assertThat(parameters.disabledTrackTypes).isEmpty(); } @Test public void parametersSet_fromDefault_isAsExpected() { + ImmutableMap trackSelectionOverrides = + ImmutableMap.of( + new TrackGroup(new Format.Builder().build()), + new TrackSelectionOverride(/* tracks= */ ImmutableSet.of(2, 3))); TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT .buildUpon() @@ -90,6 +102,8 @@ public class TrackSelectionParametersTest { // General .setForceLowestBitrate(false) .setForceHighestSupportedBitrate(true) + .setTrackSelectionOverrides(trackSelectionOverrides) + .setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_TEXT)) .build(); // Video @@ -122,6 +136,9 @@ public class TrackSelectionParametersTest { // General assertThat(parameters.forceLowestBitrate).isFalse(); assertThat(parameters.forceHighestSupportedBitrate).isTrue(); + assertThat(parameters.trackSelectionOverrides).isEqualTo(trackSelectionOverrides); + assertThat(parameters.disabledTrackTypes) + .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_TEXT); } @Test @@ -160,4 +177,17 @@ public class TrackSelectionParametersTest { assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportOrientationMayChange).isTrue(); } + + /** Tests {@link SelectionOverride}'s {@link Bundleable} implementation. */ + @Test + public void roundTripViaBundle_ofSelectionOverride_yieldsEqualInstance() { + SelectionOverride selectionOverrideToBundle = + new SelectionOverride(/* groupIndex= */ 1, /* tracks...= */ 2, 3); + + SelectionOverride selectionOverrideFromBundle = + DefaultTrackSelector.SelectionOverride.CREATOR.fromBundle( + selectionOverrideToBundle.toBundle()); + + assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle); + } } 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 b0112d34ae..b93a575626 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 @@ -39,6 +39,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; @@ -608,6 +609,13 @@ public class DefaultTrackSelector extends MappingTrackSelector { return this; } + @Override + public ParametersBuilder setTrackSelectionOverrides( + Map trackSelectionOverrides) { + super.setTrackSelectionOverrides(trackSelectionOverrides); + return this; + } + @Override public ParametersBuilder setDisabledTrackTypes(Set<@C.TrackType Integer> disabledTrackTypes) { super.setDisabledTrackTypes(disabledTrackTypes); @@ -1490,19 +1498,33 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Apply track disabling and overriding. for (int i = 0; i < rendererCount; i++) { + // Per renderer and per track type disabling @C.TrackType int rendererType = mappedTrackInfo.getRendererType(i); if (params.getRendererDisabled(i) || params.disabledTrackTypes.contains(rendererType)) { definitions[i] = null; continue; } + // Per TrackGroupArray override TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(i); if (params.hasSelectionOverride(i, rendererTrackGroups)) { - SelectionOverride override = params.getSelectionOverride(i, rendererTrackGroups); + @Nullable SelectionOverride override = params.getSelectionOverride(i, rendererTrackGroups); definitions[i] = override == null ? null : new ExoTrackSelection.Definition( rendererTrackGroups.get(override.groupIndex), override.tracks, override.type); + continue; + } + // Per TrackGroup override + for (int j = 0; j < rendererTrackGroups.length; j++) { + TrackGroup trackGroup = rendererTrackGroups.get(j); + @Nullable + TrackSelectionOverride overrideTracks = params.trackSelectionOverrides.get(trackGroup); + if (overrideTracks != null) { + definitions[i] = + new ExoTrackSelection.Definition(trackGroup, Ints.toArray(overrideTracks.tracks)); + break; + } } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 5630d5d832..146e670798 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -45,10 +45,12 @@ import com.google.android.exoplayer2.testutil.FakeTimeline; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.HashMap; import java.util.Map; @@ -152,16 +154,21 @@ public final class DefaultTrackSelectorTest { assertThat(parametersFromBundle).isEqualTo(parametersToBundle); } - /** Tests {@link SelectionOverride}'s {@link Bundleable} implementation. */ + /** Tests that an empty override clears a track selection. */ @Test - public void roundTripViaBundle_ofSelectionOverride_yieldsEqualInstance() { - SelectionOverride selectionOverrideToBundle = - new SelectionOverride(/* groupIndex= */ 1, /* tracks...= */ 2, 3); + public void selectTracks_withNullOverride_clearsTrackSelection() throws ExoPlaybackException { + trackSelector.setParameters( + trackSelector + .buildUponParameters() + .setTrackSelectionOverrides( + ImmutableMap.of(VIDEO_TRACK_GROUP, new TrackSelectionOverride(ImmutableSet.of())))); - SelectionOverride selectionOverrideFromBundle = - SelectionOverride.CREATOR.fromBundle(selectionOverrideToBundle.toBundle()); + TrackSelectorResult result = + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); - assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle); + assertSelections(result, new TrackSelection[] {null, TRACK_SELECTIONS[1]}); + assertThat(result.rendererConfigurations) + .isEqualTo(new RendererConfiguration[] {null, DEFAULT}); } /** Tests that a null override clears a track selection. */ @@ -193,6 +200,29 @@ public final class DefaultTrackSelectorTest { .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); } + /** Tests that an empty override is not applied for a different set of available track groups. */ + @Test + public void selectTracks_withEmptyTrackOverrideForDifferentTracks_hasNoEffect() + throws ExoPlaybackException { + trackSelector.setParameters( + trackSelector + .buildUponParameters() + .setTrackSelectionOverrides( + ImmutableMap.of( + new TrackGroup(VIDEO_FORMAT, VIDEO_FORMAT), TrackSelectionOverride.DISABLE))); + + TrackSelectorResult result = + trackSelector.selectTracks( + RENDERER_CAPABILITIES, + new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP), + periodId, + TIMELINE); + + assertThat(result.selections).asList().containsExactlyElementsIn(TRACK_SELECTIONS).inOrder(); + assertThat(result.rendererConfigurations) + .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); + } + /** Tests that an override is not applied for a different set of available track groups. */ @Test public void selectTracksWithNullOverrideForDifferentTracks() throws ExoPlaybackException { @@ -1815,6 +1845,10 @@ public final class DefaultTrackSelectorTest { .setRendererDisabled(1, true) .setRendererDisabled(3, true) .setRendererDisabled(5, false) + .setTrackSelectionOverrides( + ImmutableMap.of( + AUDIO_TRACK_GROUP, + new TrackSelectionOverride(/* tracks= */ ImmutableSet.of(3, 4, 5)))) .setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO)) .build(); } From ce0cf23a7f55bb721f7df9a5edb9fdf9e2000fd2 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 30 Sep 2021 19:30:45 +0100 Subject: [PATCH 256/441] Migrate callers of ExoPlayer.Builder#build() to buildExoPlayer() An upcoming change will update build() to return Player. PiperOrigin-RevId: 399981901 --- .../com/google/android/exoplayer2/castdemo/PlayerManager.java | 2 +- .../java/com/google/android/exoplayer2/demo/PlayerActivity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index e6a55b1ce5..f3611bcbdb 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -90,7 +90,7 @@ import java.util.ArrayList; currentItemIndex = C.INDEX_UNSET; trackSelector = new DefaultTrackSelector(context); - exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); + exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).buildExoPlayer(); exoPlayer.addListener(this); localPlayerView.setPlayer(exoPlayer); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 5f5acea8ea..e4b817db0b 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -278,7 +278,7 @@ public class PlayerActivity extends AppCompatActivity new ExoPlayer.Builder(/* context= */ this, renderersFactory) .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) - .build(); + .buildExoPlayer(); player.addListener(new PlayerEventListener()); player.addAnalyticsListener(new EventLogger(trackSelector)); player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true); From 4e9e38f3a73f068031a32e7f6ea90af66354627e Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 1 Oct 2021 10:09:48 +0100 Subject: [PATCH 257/441] Update ExoPlayer.Builder#build() to return Player If callers need an ExoPlayer instance they should use buildExoPlayer(). Also remove the @InlineMe annotation now these methods are no longer equivalent. PiperOrigin-RevId: 400143239 --- library/core/build.gradle | 1 - .../main/java/com/google/android/exoplayer2/ExoPlayer.java | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/library/core/build.gradle b/library/core/build.gradle index 98dd2929e7..bebd62beb9 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -39,7 +39,6 @@ dependencies { api project(modulePrefix + 'library-extractor') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version - compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index ddb41d352e..c9dd336be6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -54,7 +54,6 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; -import com.google.errorprone.annotations.InlineMe; import java.util.List; /** @@ -839,13 +838,12 @@ public interface ExoPlayer extends Player { } /** - * Builds a {@link SimpleExoPlayer} instance. + * Builds a {@link Player} instance. * * @throws IllegalStateException If this method or {@link #buildExoPlayer()} has already been * called. */ - @InlineMe(replacement = "this.buildExoPlayer()") - public SimpleExoPlayer build() { + public Player build() { return buildExoPlayer(); } From 7a3dedce0770b31137bbd48fdc973f783aa8d745 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 1 Oct 2021 10:18:44 +0100 Subject: [PATCH 258/441] Rename MediaItem.Subtitle to SubtitleConfiguration This is more consistent with the other MediaItem inner classes which are all Configurations. The old class and fields are left deprecated for backwards compatibility. The deprecated Subtitle constructors are not moved to SubtitleConfiguration. PiperOrigin-RevId: 400144640 --- .../google/android/exoplayer2/MediaItem.java | 191 +++++++++++------- .../android/exoplayer2/MediaItemTest.java | 23 ++- 2 files changed, 129 insertions(+), 85 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 5e1bfecf4d..8360f69c79 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -75,7 +75,7 @@ public final class MediaItem implements Bundleable { private DrmConfiguration.Builder drmConfiguration; private List streamKeys; @Nullable private String customCacheKey; - private List subtitles; + private ImmutableList subtitleConfigurations; @Nullable private AdsConfiguration adsConfiguration; @Nullable private Object tag; @Nullable private MediaMetadata mediaMetadata; @@ -89,7 +89,7 @@ public final class MediaItem implements Bundleable { clippingConfiguration = new ClippingConfiguration.Builder(); drmConfiguration = new DrmConfiguration.Builder(); streamKeys = Collections.emptyList(); - subtitles = Collections.emptyList(); + subtitleConfigurations = ImmutableList.of(); liveConfiguration = new LiveConfiguration.Builder(); } @@ -105,7 +105,7 @@ public final class MediaItem implements Bundleable { mimeType = localConfiguration.mimeType; uri = localConfiguration.uri; streamKeys = localConfiguration.streamKeys; - subtitles = localConfiguration.subtitles; + subtitleConfigurations = localConfiguration.subtitleConfigurations; tag = localConfiguration.tag; drmConfiguration = localConfiguration.drmConfiguration != null @@ -354,18 +354,25 @@ public final class MediaItem implements Bundleable { return this; } + /** + * @deprecated Use {@link #setSubtitleConfigurations(List)} instead. Note that {@link + * #setSubtitleConfigurations(List)} doesn't accept null, use an empty list to clear the + * contents. + */ + @Deprecated + public Builder setSubtitles(@Nullable List subtitles) { + this.subtitleConfigurations = + subtitles != null ? ImmutableList.copyOf(subtitles) : ImmutableList.of(); + return this; + } + /** * Sets the optional subtitles. * - *

        {@code null} or an empty {@link List} can be used for a reset. - * *

        This method should only be called if {@link #setUri} is passed a non-null value. */ - public Builder setSubtitles(@Nullable List subtitles) { - this.subtitles = - subtitles != null && !subtitles.isEmpty() - ? Collections.unmodifiableList(new ArrayList<>(subtitles)) - : Collections.emptyList(); + public Builder setSubtitleConfigurations(List subtitleConfigurations) { + this.subtitleConfigurations = ImmutableList.copyOf(subtitleConfigurations); return this; } @@ -500,7 +507,7 @@ public final class MediaItem implements Bundleable { adsConfiguration, streamKeys, customCacheKey, - subtitles, + subtitleConfigurations, tag); } return new MediaItem( @@ -889,7 +896,9 @@ public final class MediaItem implements Bundleable { @Nullable public final String customCacheKey; /** Optional subtitles to be sideloaded. */ - public final List subtitles; + public final ImmutableList subtitleConfigurations; + /** @deprecated Use {@link #subtitleConfigurations} instead. */ + @Deprecated public final List subtitles; /** * Optional tag for custom attributes. The tag for the media source which will be published in @@ -898,6 +907,7 @@ public final class MediaItem implements Bundleable { */ @Nullable public final Object tag; + @SuppressWarnings("deprecation") // Setting deprecated subtitles field. private LocalConfiguration( Uri uri, @Nullable String mimeType, @@ -905,7 +915,7 @@ public final class MediaItem implements Bundleable { @Nullable AdsConfiguration adsConfiguration, List streamKeys, @Nullable String customCacheKey, - List subtitles, + ImmutableList subtitleConfigurations, @Nullable Object tag) { this.uri = uri; this.mimeType = mimeType; @@ -913,7 +923,12 @@ public final class MediaItem implements Bundleable { this.adsConfiguration = adsConfiguration; this.streamKeys = streamKeys; this.customCacheKey = customCacheKey; - this.subtitles = subtitles; + this.subtitleConfigurations = subtitleConfigurations; + ImmutableList.Builder subtitles = ImmutableList.builder(); + for (int i = 0; i < subtitleConfigurations.size(); i++) { + subtitles.add(subtitleConfigurations.get(i).buildUpon().buildSubtitle()); + } + this.subtitles = subtitles.build(); this.tag = tag; } @@ -933,7 +948,7 @@ public final class MediaItem implements Bundleable { && Util.areEqual(adsConfiguration, other.adsConfiguration) && streamKeys.equals(other.streamKeys) && Util.areEqual(customCacheKey, other.customCacheKey) - && subtitles.equals(other.subtitles) + && subtitleConfigurations.equals(other.subtitleConfigurations) && Util.areEqual(tag, other.tag); } @@ -945,7 +960,7 @@ public final class MediaItem implements Bundleable { result = 31 * result + (adsConfiguration == null ? 0 : adsConfiguration.hashCode()); result = 31 * result + streamKeys.hashCode(); result = 31 * result + (customCacheKey == null ? 0 : customCacheKey.hashCode()); - result = 31 * result + subtitles.hashCode(); + result = 31 * result + subtitleConfigurations.hashCode(); result = 31 * result + (tag == null ? 0 : tag.hashCode()); return result; } @@ -962,7 +977,7 @@ public final class MediaItem implements Bundleable { @Nullable AdsConfiguration adsConfiguration, List streamKeys, @Nullable String customCacheKey, - List subtitles, + ImmutableList subtitleConfigurations, @Nullable Object tag) { super( uri, @@ -971,7 +986,7 @@ public final class MediaItem implements Bundleable { adsConfiguration, streamKeys, customCacheKey, - subtitles, + subtitleConfigurations, tag); } } @@ -1208,9 +1223,10 @@ public final class MediaItem implements Bundleable { } /** Properties for a text track. */ - public static final class Subtitle { + // TODO: Mark this final when Subtitle is deleted. + public static class SubtitleConfiguration { - /** Builder for {@link Subtitle} instances. */ + /** Builder for {@link SubtitleConfiguration} instances. */ public static final class Builder { private Uri uri; @Nullable private String mimeType; @@ -1228,13 +1244,13 @@ public final class MediaItem implements Bundleable { this.uri = uri; } - private Builder(Subtitle subtitle) { - this.uri = subtitle.uri; - this.mimeType = subtitle.mimeType; - this.language = subtitle.language; - this.selectionFlags = subtitle.selectionFlags; - this.roleFlags = subtitle.roleFlags; - this.label = subtitle.label; + private Builder(SubtitleConfiguration subtitleConfiguration) { + this.uri = subtitleConfiguration.uri; + this.mimeType = subtitleConfiguration.mimeType; + this.language = subtitleConfiguration.language; + this.selectionFlags = subtitleConfiguration.selectionFlags; + this.roleFlags = subtitleConfiguration.roleFlags; + this.label = subtitleConfiguration.label; } /** Sets the {@link Uri} to the subtitle file. */ @@ -1273,8 +1289,12 @@ public final class MediaItem implements Bundleable { return this; } - /** Creates a {@link Subtitle} from the values of this builder. */ - public Subtitle build() { + /** Creates a {@link SubtitleConfiguration} from the values of this builder. */ + public SubtitleConfiguration build() { + return new SubtitleConfiguration(this); + } + + private Subtitle buildSubtitle() { return new Subtitle(this); } } @@ -1292,6 +1312,70 @@ public final class MediaItem implements Bundleable { /** The label. */ @Nullable public final String label; + private SubtitleConfiguration( + Uri uri, + String mimeType, + @Nullable String language, + @C.SelectionFlags int selectionFlags, + @C.RoleFlags int roleFlags, + @Nullable String label) { + this.uri = uri; + this.mimeType = mimeType; + this.language = language; + this.selectionFlags = selectionFlags; + this.roleFlags = roleFlags; + this.label = label; + } + + private SubtitleConfiguration(Builder builder) { + this.uri = builder.uri; + this.mimeType = builder.mimeType; + this.language = builder.language; + this.selectionFlags = builder.selectionFlags; + this.roleFlags = builder.roleFlags; + this.label = builder.label; + } + + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(this); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof SubtitleConfiguration)) { + return false; + } + + SubtitleConfiguration other = (SubtitleConfiguration) obj; + + return uri.equals(other.uri) + && Util.areEqual(mimeType, other.mimeType) + && Util.areEqual(language, other.language) + && selectionFlags == other.selectionFlags + && roleFlags == other.roleFlags + && Util.areEqual(label, other.label); + } + + @Override + public int hashCode() { + int result = uri.hashCode(); + result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode()); + result = 31 * result + (language == null ? 0 : language.hashCode()); + result = 31 * result + selectionFlags; + result = 31 * result + roleFlags; + result = 31 * result + (label == null ? 0 : label.hashCode()); + return result; + } + } + + /** @deprecated Use {@link MediaItem.SubtitleConfiguration} instead */ + @Deprecated + public static final class Subtitle extends SubtitleConfiguration { + /** @deprecated Use {@link Builder} instead. */ @Deprecated public Subtitle(Uri uri, String mimeType, @Nullable String language) { @@ -1314,56 +1398,11 @@ public final class MediaItem implements Bundleable { @C.SelectionFlags int selectionFlags, @C.RoleFlags int roleFlags, @Nullable String label) { - this.uri = uri; - this.mimeType = mimeType; - this.language = language; - this.selectionFlags = selectionFlags; - this.roleFlags = roleFlags; - this.label = label; + super(uri, mimeType, language, selectionFlags, roleFlags, label); } private Subtitle(Builder builder) { - this.uri = builder.uri; - this.mimeType = builder.mimeType; - this.language = builder.language; - this.selectionFlags = builder.selectionFlags; - this.roleFlags = builder.roleFlags; - this.label = builder.label; - } - - /** Returns a {@link Builder} initialized with the values of this instance. */ - public Builder buildUpon() { - return new Builder(this); - } - - @Override - public boolean equals(@Nullable Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof Subtitle)) { - return false; - } - - Subtitle other = (Subtitle) obj; - - return uri.equals(other.uri) - && Util.areEqual(mimeType, other.mimeType) - && Util.areEqual(language, other.language) - && selectionFlags == other.selectionFlags - && roleFlags == other.roleFlags - && Util.areEqual(label, other.label); - } - - @Override - public int hashCode() { - int result = uri.hashCode(); - result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode()); - result = 31 * result + (language == null ? 0 : language.hashCode()); - result = 31 * result + selectionFlags; - result = 31 * result + roleFlags; - result = 31 * result + (label == null ? 0 : label.hashCode()); - return result; + super(builder); } } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index 6273e014de..f1b85057ea 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -258,11 +258,11 @@ public class MediaItemTest { } @Test - @SuppressWarnings("deprecation") // Using deprecated constructors + @SuppressWarnings("deprecation") // Using deprecated Subtitle type public void builderSetSubtitles_setsSubtitles() { - List subtitles = + List subtitleConfigurations = ImmutableList.of( - new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/es")) + new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/es")) .setMimeType(MimeTypes.TEXT_SSA) .setLanguage(/* language= */ "es") .setSelectionFlags(C.SELECTION_FLAG_FORCED) @@ -285,9 +285,14 @@ public class MediaItemTest { "label")); MediaItem mediaItem = - new MediaItem.Builder().setUri(URI_STRING).setSubtitles(subtitles).build(); + new MediaItem.Builder() + .setUri(URI_STRING) + .setSubtitleConfigurations(subtitleConfigurations) + .build(); - assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitles); + assertThat(mediaItem.localConfiguration.subtitleConfigurations) + .isEqualTo(subtitleConfigurations); + assertThat(mediaItem.localConfiguration.subtitles).isEqualTo(subtitleConfigurations); } @Test @@ -583,9 +588,9 @@ public class MediaItemTest { .setLiveMaxPlaybackSpeed(1.1f) .setLiveMinOffsetMs(2222) .setLiveMaxOffsetMs(4444) - .setSubtitles( + .setSubtitleConfigurations( ImmutableList.of( - new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en")) + new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/en")) .setMimeType(MimeTypes.APPLICATION_TTML) .setLanguage("en") .setSelectionFlags(C.SELECTION_FLAG_FORCED) @@ -639,9 +644,9 @@ public class MediaItemTest { .setMinOffsetMs(2222) .setMaxOffsetMs(4444) .build()) - .setSubtitles( + .setSubtitleConfigurations( ImmutableList.of( - new MediaItem.Subtitle.Builder(Uri.parse(URI_STRING + "/en")) + new MediaItem.SubtitleConfiguration.Builder(Uri.parse(URI_STRING + "/en")) .setMimeType(MimeTypes.APPLICATION_TTML) .setLanguage("en") .setSelectionFlags(C.SELECTION_FLAG_FORCED) From d4343ed858b613316e27542afcfb128a7fd779be Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 1 Oct 2021 10:52:53 +0100 Subject: [PATCH 259/441] Allow configuring encoder. PiperOrigin-RevId: 400151886 --- .../transformer/MediaCodecAdapterWrapper.java | 21 ++++++++++++++----- .../TransformerTranscodingVideoRenderer.java | 5 ++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 3177166e95..b750b00289 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; +import static java.lang.Math.ceil; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; @@ -38,6 +39,7 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Map; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -199,21 +201,30 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * MediaCodecAdapter} video encoder. * * @param format The {@link Format} (of the output data) used to determine the underlying {@link - * MediaCodec} and its configuration values. + * MediaCodec} and its configuration values. {@link Format#width}, {@link Format#height}, + * {@link Format#frameRate} and {@link Format#averageBitrate} must be set to those of the + * desired output video format. + * @param additionalEncoderConfig A map of {@link MediaFormat}'s integer settings, where the keys + * are from {@code MediaFormat.KEY_*} constants. Its values will override those in {@code + * format}. * @return A configured and started encoder wrapper. * @throws IOException If the underlying codec cannot be created. */ - public static MediaCodecAdapterWrapper createForVideoEncoding(Format format) throws IOException { + public static MediaCodecAdapterWrapper createForVideoEncoding( + Format format, Map additionalEncoderConfig) throws IOException { @Nullable MediaCodecAdapter adapter = null; try { MediaFormat mediaFormat = MediaFormat.createVideoFormat( checkNotNull(format.sampleMimeType), format.width, format.height); - // TODO(claincly): enable configuration. mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); - mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); + mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, (int) ceil(format.frameRate)); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); - mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 5_000_000); + mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, format.averageBitrate); + + for (Map.Entry encoderSetting : additionalEncoderConfig.entrySet()) { + mediaFormat.setInteger(encoderSetting.getKey(), encoderSetting.getValue()); + } adapter = new Factory() diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 7ed1afef1b..88e04a0b70 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -39,6 +39,7 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.GlUtil; +import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.nio.ByteBuffer; @@ -158,7 +159,9 @@ import java.nio.ByteBuffer; } try { - encoder = MediaCodecAdapterWrapper.createForVideoEncoding(encoderConfigurationOutputFormat); + encoder = + MediaCodecAdapterWrapper.createForVideoEncoding( + encoderConfigurationOutputFormat, ImmutableMap.of()); } catch (IOException e) { throw createRendererException( // TODO(claincly): should be "ENCODER_INIT_FAILED" From b192465bba5c0705ff8db195ad043e0846b6c9cf Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 1 Oct 2021 10:57:00 +0100 Subject: [PATCH 260/441] Migrate usages of MediaItem.Subtitle to SubtitleConfiguration Usages of the (already deprecated) Subtitle constructors were not migrated, as it would require migrating to the Builder which is a more involved change. PiperOrigin-RevId: 400153139 --- .../android/exoplayer2/demo/IntentUtil.java | 13 ++++---- .../google/android/exoplayer2/util/Util.java | 8 ++--- .../source/DefaultMediaSourceFactory.java | 29 +++++++++--------- .../source/SingleSampleMediaSource.java | 30 +++++++++++-------- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 15c365bdad..71ad113ff9 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -196,12 +196,13 @@ public class IntentUtil { if (localConfiguration.drmConfiguration != null) { addDrmConfigurationToIntent(localConfiguration.drmConfiguration, intent, extrasKeySuffix); } - if (!localConfiguration.subtitles.isEmpty()) { - checkState(localConfiguration.subtitles.size() == 1); - MediaItem.Subtitle subtitle = localConfiguration.subtitles.get(0); - intent.putExtra(SUBTITLE_URI_EXTRA + extrasKeySuffix, subtitle.uri.toString()); - intent.putExtra(SUBTITLE_MIME_TYPE_EXTRA + extrasKeySuffix, subtitle.mimeType); - intent.putExtra(SUBTITLE_LANGUAGE_EXTRA + extrasKeySuffix, subtitle.language); + if (!localConfiguration.subtitleConfigurations.isEmpty()) { + checkState(localConfiguration.subtitleConfigurations.size() == 1); + MediaItem.SubtitleConfiguration subtitleConfiguration = + localConfiguration.subtitleConfigurations.get(0); + intent.putExtra(SUBTITLE_URI_EXTRA + extrasKeySuffix, subtitleConfiguration.uri.toString()); + intent.putExtra(SUBTITLE_MIME_TYPE_EXTRA + extrasKeySuffix, subtitleConfiguration.mimeType); + intent.putExtra(SUBTITLE_LANGUAGE_EXTRA + extrasKeySuffix, subtitleConfiguration.language); } } 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 8520fff8c9..e5bd28aca2 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 @@ -233,8 +233,8 @@ public final class Util { if (isLocalFileUri(mediaItem.localConfiguration.uri)) { return requestExternalStoragePermission(activity); } - for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { - if (isLocalFileUri(mediaItem.localConfiguration.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { + if (isLocalFileUri(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { return requestExternalStoragePermission(activity); } } @@ -261,8 +261,8 @@ public final class Util { if (isTrafficRestricted(mediaItem.localConfiguration.uri)) { return false; } - for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { - if (isTrafficRestricted(mediaItem.localConfiguration.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { + if (isTrafficRestricted(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { return false; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index bdba5330c1..a216e3ad82 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -173,8 +173,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Sets whether a {@link ProgressiveMediaSource} or {@link SingleSampleMediaSource} is constructed - * to handle {@link MediaItem.LocalConfiguration#subtitles}. Defaults to false (i.e. {@link - * SingleSampleMediaSource}. + * to handle {@link MediaItem.LocalConfiguration#subtitleConfigurations}. Defaults to false (i.e. + * {@link SingleSampleMediaSource}. * *

        This method is experimental, and will be renamed or removed in a future release. * @@ -375,13 +375,14 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { MediaSource mediaSource = mediaSourceFactory.createMediaSource(mediaItem); - List subtitles = castNonNull(mediaItem.localConfiguration).subtitles; - if (!subtitles.isEmpty()) { - MediaSource[] mediaSources = new MediaSource[subtitles.size() + 1]; + List subtitleConfigurations = + castNonNull(mediaItem.localConfiguration).subtitleConfigurations; + if (!subtitleConfigurations.isEmpty()) { + MediaSource[] mediaSources = new MediaSource[subtitleConfigurations.size() + 1]; mediaSources[0] = mediaSource; - for (int i = 0; i < subtitles.size(); i++) { + for (int i = 0; i < subtitleConfigurations.size(); i++) { if (useProgressiveMediaSourceForSubtitles - && MimeTypes.TEXT_VTT.equals(subtitles.get(i).mimeType)) { + && MimeTypes.TEXT_VTT.equals(subtitleConfigurations.get(i).mimeType)) { int index = i; ProgressiveMediaSource.Factory progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory( @@ -391,23 +392,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { new SubtitleExtractor( new WebvttDecoder(), new Format.Builder() - .setSampleMimeType(subtitles.get(index).mimeType) - .setLanguage(subtitles.get(index).language) - .setSelectionFlags(subtitles.get(index).selectionFlags) - .setRoleFlags(subtitles.get(index).roleFlags) - .setLabel(subtitles.get(index).label) + .setSampleMimeType(subtitleConfigurations.get(index).mimeType) + .setLanguage(subtitleConfigurations.get(index).language) + .setSelectionFlags(subtitleConfigurations.get(index).selectionFlags) + .setRoleFlags(subtitleConfigurations.get(index).roleFlags) + .setLabel(subtitleConfigurations.get(index).label) .build()) }); mediaSources[i + 1] = progressiveMediaSourceFactory.createMediaSource( - MediaItem.fromUri(subtitles.get(i).uri.toString())); + MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); } else { SingleSampleMediaSource.Factory singleSampleSourceFactory = new SingleSampleMediaSource.Factory(dataSourceFactory) .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); mediaSources[i + 1] = singleSampleSourceFactory.createMediaSource( - subtitles.get(i), /* durationUs= */ C.TIME_UNSET); + subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 607f4208d1..e5cb2bb976 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -30,7 +30,7 @@ import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.MimeTypes; -import java.util.Collections; +import com.google.common.collect.ImmutableList; /** * Loads data at a given {@link Uri} as a single sample belonging to a single {@link MediaPeriod}. @@ -115,14 +115,15 @@ public final class SingleSampleMediaSource extends BaseMediaSource { /** * Returns a new {@link SingleSampleMediaSource} using the current parameters. * - * @param subtitle The {@link MediaItem.Subtitle}. + * @param subtitleConfiguration The {@link MediaItem.SubtitleConfiguration}. * @param durationUs The duration of the media stream in microseconds. * @return The new {@link SingleSampleMediaSource}. */ - public SingleSampleMediaSource createMediaSource(MediaItem.Subtitle subtitle, long durationUs) { + public SingleSampleMediaSource createMediaSource( + MediaItem.SubtitleConfiguration subtitleConfiguration, long durationUs) { return new SingleSampleMediaSource( trackId, - subtitle, + subtitleConfiguration, dataSourceFactory, durationUs, loadErrorHandlingPolicy, @@ -144,7 +145,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { private SingleSampleMediaSource( @Nullable String trackId, - MediaItem.Subtitle subtitle, + MediaItem.SubtitleConfiguration subtitleConfiguration, DataSource.Factory dataSourceFactory, long durationUs, LoadErrorHandlingPolicy loadErrorHandlingPolicy, @@ -157,21 +158,24 @@ public final class SingleSampleMediaSource extends BaseMediaSource { mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setMediaId(subtitle.uri.toString()) - .setSubtitles(Collections.singletonList(subtitle)) + .setMediaId(subtitleConfiguration.uri.toString()) + .setSubtitleConfigurations(ImmutableList.of(subtitleConfiguration)) .setTag(tag) .build(); format = new Format.Builder() .setId(trackId) - .setSampleMimeType(firstNonNull(subtitle.mimeType, MimeTypes.TEXT_UNKNOWN)) - .setLanguage(subtitle.language) - .setSelectionFlags(subtitle.selectionFlags) - .setRoleFlags(subtitle.roleFlags) - .setLabel(subtitle.label) + .setSampleMimeType(firstNonNull(subtitleConfiguration.mimeType, MimeTypes.TEXT_UNKNOWN)) + .setLanguage(subtitleConfiguration.language) + .setSelectionFlags(subtitleConfiguration.selectionFlags) + .setRoleFlags(subtitleConfiguration.roleFlags) + .setLabel(subtitleConfiguration.label) .build(); dataSpec = - new DataSpec.Builder().setUri(subtitle.uri).setFlags(DataSpec.FLAG_ALLOW_GZIP).build(); + new DataSpec.Builder() + .setUri(subtitleConfiguration.uri) + .setFlags(DataSpec.FLAG_ALLOW_GZIP) + .build(); timeline = new SinglePeriodTimeline( durationUs, From e883c04006694392aae3f8c23223158cd653306d Mon Sep 17 00:00:00 2001 From: Andrew Shu Date: Sun, 3 Oct 2021 15:58:05 -0700 Subject: [PATCH 261/441] Fix setting initial 0 position in PlayerControlView --- .../com/google/android/exoplayer2/ui/PlayerControlView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 7035372b32..24dbde6a72 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -343,8 +343,8 @@ public class PlayerControlView extends FrameLayout { private long[] extraAdGroupTimesMs; private boolean[] extraPlayedAdGroups; private long currentWindowOffset; - private long currentPosition; - private long currentBufferedPosition; + private long currentPosition = C.POSITION_UNSET; + private long currentBufferedPosition = C.POSITION_UNSET; public PlayerControlView(Context context) { this(context, /* attrs= */ null); From f94148c478c40bfca37161c819f83db6650623b1 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 1 Oct 2021 14:38:41 +0100 Subject: [PATCH 262/441] Add microseconds suffix to Timeline#getPeriodPosition The old methods are deprecated and left in place for backwards compatibility. PiperOrigin-RevId: 400188084 --- .../google/android/exoplayer2/Timeline.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 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 656ea38556..945f2c5107 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 @@ -32,6 +32,7 @@ import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.BundleUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; +import com.google.errorprone.annotations.InlineMe; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1148,11 +1149,35 @@ public abstract class Timeline implements Bundleable { == C.INDEX_UNSET; } + /** @deprecated Use {@link #getPeriodPositionUs(Window, Period, int, long)} instead. */ + @Deprecated + @InlineMe(replacement = "this.getPeriodPositionUs(window, period, windowIndex, windowPositionUs)") + public final Pair getPeriodPosition( + Window window, Period period, int windowIndex, long windowPositionUs) { + return getPeriodPositionUs(window, period, windowIndex, windowPositionUs); + } + /** @deprecated Use {@link #getPeriodPositionUs(Window, Period, int, long, long)} instead. */ + @Deprecated + @Nullable + @InlineMe( + replacement = + "this.getPeriodPositionUs(" + + "window, period, windowIndex, windowPositionUs, defaultPositionProjectionUs)") + public final Pair getPeriodPosition( + Window window, + Period period, + int windowIndex, + long windowPositionUs, + long defaultPositionProjectionUs) { + return getPeriodPositionUs( + window, period, windowIndex, windowPositionUs, defaultPositionProjectionUs); + } + /** * Calls {@link #getPeriodPosition(Window, Period, int, long, long)} with a zero default position * projection. */ - public final Pair getPeriodPosition( + public final Pair getPeriodPositionUs( Window window, Period period, int windowIndex, long windowPositionUs) { return Assertions.checkNotNull( getPeriodPosition( @@ -1176,7 +1201,7 @@ public abstract class Timeline implements Bundleable { * position could not be projected by {@code defaultPositionProjectionUs}. */ @Nullable - public final Pair getPeriodPosition( + public final Pair getPeriodPositionUs( Window window, Period period, int windowIndex, From c810309775ca2fd018f1b1963f477405bcef76ce Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 1 Oct 2021 16:12:16 +0100 Subject: [PATCH 263/441] Validate input format. The format should have the following fields set (as specified in the javadoc): - width - height - frame rate, and - averageBitrate. PiperOrigin-RevId: 400204510 --- .../exoplayer2/transformer/MediaCodecAdapterWrapper.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index b750b00289..4afa84dfd3 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.transformer; +import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; import static java.lang.Math.ceil; @@ -212,6 +213,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; */ public static MediaCodecAdapterWrapper createForVideoEncoding( Format format, Map additionalEncoderConfig) throws IOException { + checkArgument(format.width != Format.NO_VALUE); + checkArgument(format.height != Format.NO_VALUE); + checkArgument(format.frameRate != Format.NO_VALUE); + checkArgument(format.averageBitrate != Format.NO_VALUE); + @Nullable MediaCodecAdapter adapter = null; try { MediaFormat mediaFormat = From a26caae4cad448bcff9290ca546352303a5a8597 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Fri, 1 Oct 2021 16:57:46 +0100 Subject: [PATCH 264/441] Remove BasePlayer stop as a final method. It calls through to a deprecated method, which is unusual for a convenience method, and the deprecated method has various implementations. This allows for a smoother removal of stop(boolean) and removes an obstacle for the ExoPlayer-SimpleExoPlayer merge. Adds missing @Deprecated tags to some Players. PiperOrigin-RevId: 400213422 --- .../com/google/android/exoplayer2/ext/cast/CastPlayer.java | 6 ++++++ .../main/java/com/google/android/exoplayer2/BasePlayer.java | 5 ----- .../java/com/google/android/exoplayer2/ExoPlayerImpl.java | 6 ++++++ .../java/com/google/android/exoplayer2/SimpleExoPlayer.java | 5 +++++ .../google/android/exoplayer2/testutil/StubExoPlayer.java | 6 ++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 97b0567222..22dc83818e 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -493,6 +493,12 @@ public final class CastPlayer extends BasePlayer { return playbackParameters.value; } + @Override + public void stop() { + stop(/* reset= */ false); + } + + @Deprecated @Override public void stop(boolean reset) { playbackState = STATE_IDLE; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index 02aa2527ae..da2e31d1d5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -227,11 +227,6 @@ public abstract class BasePlayer implements Player { setPlaybackParameters(getPlaybackParameters().withSpeed(speed)); } - @Override - public final void stop() { - stop(/* reset= */ false); - } - @Override public final int getNextWindowIndex() { Timeline timeline = getCurrentTimeline(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 2692475719..c91d0b746a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -738,6 +738,12 @@ import java.util.concurrent.CopyOnWriteArraySet; } } + @Override + public void stop() { + stop(/* reset= */ false); + } + + @Deprecated @Override public void stop(boolean reset) { stop(reset, /* error= */ null); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 480ca348fc..00a5d66be0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1378,6 +1378,11 @@ public class SimpleExoPlayer extends BasePlayer player.setForegroundMode(foregroundMode); } + @Override + public void stop() { + stop(/* reset= */ false); + } + @Deprecated @Override public void stop(boolean reset) { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index f37bf72a78..72efc2b81b 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -416,6 +416,12 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public void stop() { + throw new UnsupportedOperationException(); + } + + @Deprecated @Override public void stop(boolean reset) { throw new UnsupportedOperationException(); From 014ee8f5d81c0d24d70e8a7ae7f5206b31626641 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 1 Oct 2021 17:43:49 +0100 Subject: [PATCH 265/441] Remove fully qualified class names in link tags PiperOrigin-RevId: 400224459 --- .../exoplayer2/source/ads/AdPlaybackState.java | 14 +++++++------- .../audio/ChannelMappingAudioProcessor.java | 4 +++- .../exoplayer2/audio/TrimmingAudioProcessor.java | 4 +++- .../android/exoplayer2/source/MediaSource.java | 10 +++++----- .../exoplayer2/source/SilenceMediaSource.java | 6 +++--- .../android/exoplayer2/source/dash/DashUtil.java | 8 ++++---- .../android/exoplayer2/text/cea/Cea608Decoder.java | 3 +-- .../google/android/exoplayer2/video/AvcConfig.java | 4 ++-- .../android/exoplayer2/video/HevcConfig.java | 4 ++-- .../android/exoplayer2/ui/PlayerControlView.java | 5 +++-- .../exoplayer2/testutil/ExoPlayerTestRunner.java | 8 ++++---- 11 files changed, 37 insertions(+), 33 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java index 3c1427a2ec..e296d013d5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java @@ -27,6 +27,7 @@ import androidx.annotation.IntRange; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -52,8 +53,8 @@ public final class AdPlaybackState implements Bundleable { public static final class AdGroup implements Bundleable { /** - * The time of the ad group in the {@link com.google.android.exoplayer2.Timeline.Period}, in - * microseconds, or {@link C#TIME_END_OF_SOURCE} to indicate a postroll ad. + * The time of the ad group in the {@link Timeline.Period}, in microseconds, or {@link + * C#TIME_END_OF_SOURCE} to indicate a postroll ad. */ public final long timeUs; /** The number of ads in the ad group, or {@link C#LENGTH_UNSET} if unknown. */ @@ -75,9 +76,8 @@ public final class AdPlaybackState implements Bundleable { /** * Creates a new ad group with an unspecified number of ads. * - * @param timeUs The time of the ad group in the {@link - * com.google.android.exoplayer2.Timeline.Period}, in microseconds, or {@link - * C#TIME_END_OF_SOURCE} to indicate a postroll ad. + * @param timeUs The time of the ad group in the {@link Timeline.Period}, in microseconds, or + * {@link C#TIME_END_OF_SOURCE} to indicate a postroll ad. */ public AdGroup(long timeUs) { this( @@ -452,8 +452,8 @@ public final class AdPlaybackState implements Bundleable { * * @param adsId The opaque identifier for ads with which this instance is associated. * @param adGroupTimesUs The times of ad groups in microseconds, relative to the start of the - * {@link com.google.android.exoplayer2.Timeline.Period} they belong to. A final element with - * the value {@link C#TIME_END_OF_SOURCE} indicates that there is a postroll ad. + * {@link Timeline.Period} they belong to. A final element with the value {@link + * C#TIME_END_OF_SOURCE} indicates that there is a postroll ad. */ public AdPlaybackState(Object adsId, long... adGroupTimesUs) { this( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/ChannelMappingAudioProcessor.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/ChannelMappingAudioProcessor.java index 74c78b1af3..29b6896e18 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/ChannelMappingAudioProcessor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/ChannelMappingAudioProcessor.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.audio; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.Assertions; import java.nio.ByteBuffer; @@ -33,9 +34,10 @@ import java.nio.ByteBuffer; * Resets the channel mapping. After calling this method, call {@link #configure(AudioFormat)} to * start using the new channel map. * + *

        See {@link AudioSink#configure(Format, int, int[])}. + * * @param outputChannels The mapping from input to output channel indices, or {@code null} to * leave the input unchanged. - * @see AudioSink#configure(com.google.android.exoplayer2.Format, int, int[]) */ public void setChannelMap(@Nullable int[] outputChannels) { pendingOutputChannels = outputChannels; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/TrimmingAudioProcessor.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/TrimmingAudioProcessor.java index bd3017bf53..019c541f6d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/TrimmingAudioProcessor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/TrimmingAudioProcessor.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.audio; import static java.lang.Math.min; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; @@ -45,9 +46,10 @@ import java.nio.ByteBuffer; * processor. After calling this method, call {@link #configure(AudioFormat)} to apply the new * trimming frame counts. * + *

        See {@link AudioSink#configure(Format, int, int[])}. + * * @param trimStartFrames The number of audio frames to trim from the start of audio. * @param trimEndFrames The number of audio frames to trim from the end of audio. - * @see AudioSink#configure(com.google.android.exoplayer2.Format, int, int[]) */ public void setTrimFrameCount(int trimStartFrames, int trimEndFrames) { this.trimStartFrames = trimStartFrames; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java index 2117883f4d..fe039f9d16 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source; import android.os.Handler; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.drm.DrmSessionEventListener; @@ -25,8 +26,8 @@ import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; /** - * Defines and provides media to be played by an {@link com.google.android.exoplayer2.ExoPlayer}. A - * MediaSource has two main responsibilities: + * Defines and provides media to be played by an {@link ExoPlayer}. A MediaSource has two main + * responsibilities: * *

          *
        • To provide the player with a {@link Timeline} defining the structure of its media, and to @@ -40,9 +41,8 @@ import java.io.IOException; *
        * * All methods are called on the player's internal playback thread, as described in the {@link - * com.google.android.exoplayer2.ExoPlayer} Javadoc. They should not be called directly from - * application code. Instances can be re-used, but only for one {@link - * com.google.android.exoplayer2.ExoPlayer} instance simultaneously. + * ExoPlayer} Javadoc. They should not be called directly from application code. Instances can be + * re-used, but only for one {@link ExoPlayer} instance simultaneously. */ public interface MediaSource { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java index dbd3349ccc..41df5c6891 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.SeekParameters; +import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.Allocator; @@ -56,9 +57,8 @@ public final class SilenceMediaSource extends BaseMediaSource { } /** - * Sets a tag for the media source which will be published in the {@link - * com.google.android.exoplayer2.Timeline} of the source as {@link - * MediaItem.LocalConfiguration#tag Window#mediaItem.localConfiguration.tag}. + * Sets a tag for the media source which will be published in the {@link Timeline} of the source + * as {@link MediaItem.LocalConfiguration#tag Window#mediaItem.localConfiguration.tag}. * * @param tag A tag for the media source. * @return This factory, for convenience. diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java index a12cbeb805..4f07aa3d9d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashUtil.java @@ -124,7 +124,7 @@ public final class DashUtil { * Loads initialization data for the {@code representation} and returns the sample {@link Format}. * * @param dataSource The source from which the data should be loaded. - * @param trackType The type of the representation. Typically one of the {@link + * @param trackType The type of the representation. Typically one of the {@link C * com.google.android.exoplayer2.C} {@code TRACK_TYPE_*} constants. * @param representation The representation which initialization chunk belongs to. * @param baseUrlIndex The index of the base URL to be picked from the {@link @@ -155,7 +155,7 @@ public final class DashUtil { *

        Uses the first base URL for loading the format. * * @param dataSource The source from which the data should be loaded. - * @param trackType The type of the representation. Typically one of the {@link + * @param trackType The type of the representation. Typically one of the {@link C * com.google.android.exoplayer2.C} {@code TRACK_TYPE_*} constants. * @param representation The representation which initialization chunk belongs to. * @return the sample {@link Format} of the given representation. @@ -172,7 +172,7 @@ public final class DashUtil { * ChunkIndex}. * * @param dataSource The source from which the data should be loaded. - * @param trackType The type of the representation. Typically one of the {@link + * @param trackType The type of the representation. Typically one of the {@link C * com.google.android.exoplayer2.C} {@code TRACK_TYPE_*} constants. * @param representation The representation which initialization chunk belongs to. * @param baseUrlIndex The index of the base URL with which to resolve the request URI. @@ -204,7 +204,7 @@ public final class DashUtil { *

        Uses the first base URL for loading the index. * * @param dataSource The source from which the data should be loaded. - * @param trackType The type of the representation. Typically one of the {@link + * @param trackType The type of the representation. Typically one of the {@link C * com.google.android.exoplayer2.C} {@code TRACK_TYPE_*} constants. * @param representation The representation which initialization chunk belongs to. * @return The {@link ChunkIndex} of the given representation, or null if no initialization or diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java index b0e3f3f15e..0d50c3f709 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java @@ -350,8 +350,7 @@ public final class Cea608Decoder extends CeaDecoder { * Constructs an instance. * * @param mimeType The MIME type of the CEA-608 data. - * @param accessibilityChannel The Accessibility channel, or {@link - * com.google.android.exoplayer2.Format#NO_VALUE} if unknown. + * @param accessibilityChannel The Accessibility channel, or {@link Format#NO_VALUE} if unknown. * @param validDataChannelTimeoutMs The timeout (in milliseconds) permitted by ANSI/CTA-608-E * R-2014 Annex C.9 to clear "stuck" captions where no removal control code is received. The * timeout should be at least {@link #MIN_DATA_CHANNEL_TIMEOUT_MS} or {@link C#TIME_UNSET} for diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java index 376e593ee6..31dce7119b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java @@ -85,7 +85,7 @@ public final class AvcConfig { /** * List of buffers containing the codec-specific data to be provided to the decoder. * - * @see com.google.android.exoplayer2.Format#initializationData + *

        See {@link Format#initializationData}. */ public final List initializationData; @@ -104,7 +104,7 @@ public final class AvcConfig { /** * An RFC 6381 codecs string representing the video format, or {@code null} if not known. * - * @see com.google.android.exoplayer2.Format#codecs + *

        See {@link Format#codecs}. */ @Nullable public final String codecs; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java index cb0b6c542c..7e688b2e42 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java @@ -111,7 +111,7 @@ public final class HevcConfig { /** * List of buffers containing the codec-specific data to be provided to the decoder. * - * @see com.google.android.exoplayer2.Format#initializationData + *

        See {@link Format#initializationData}. */ public final List initializationData; @@ -130,7 +130,7 @@ public final class HevcConfig { /** * An RFC 6381 codecs string representing the video format, or {@code null} if not known. * - * @see com.google.android.exoplayer2.Format#codecs + *

        See {@link Format#codecs}. */ @Nullable public final String codecs; diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 7035372b32..9ebefcdcda 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -51,6 +51,7 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; +import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.ForwardingPlayer; @@ -322,7 +323,7 @@ public class PlayerControlView extends FrameLayout { private final String shuffleOffContentDescription; @Nullable private Player player; - private com.google.android.exoplayer2.ControlDispatcher controlDispatcher; + private ControlDispatcher controlDispatcher; @Nullable private ProgressUpdateListener progressUpdateListener; private boolean isAttachedToWindow; @@ -419,7 +420,7 @@ public class PlayerControlView extends FrameLayout { extraAdGroupTimesMs = new long[0]; extraPlayedAdGroups = new boolean[0]; componentListener = new ComponentListener(); - controlDispatcher = new com.google.android.exoplayer2.DefaultControlDispatcher(); + controlDispatcher = new DefaultControlDispatcher(); updateProgressAction = this::updateProgress; hideAction = this::hide; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index 682de8d56c..d3cd7fccaf 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -26,6 +26,7 @@ import android.view.Surface; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.LoadControl; import com.google.android.exoplayer2.MediaItem; @@ -178,10 +179,9 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul } /** - * Skips calling {@link com.google.android.exoplayer2.ExoPlayer#setMediaSources(List)} before - * preparing. Calling this method is not allowed after calls to {@link - * #setMediaSources(MediaSource...)}, {@link #setTimeline(Timeline)} and/or {@link - * #setManifest(Object)}. + * Skips calling {@link ExoPlayer#setMediaSources(List)} before preparing. Calling this method + * is not allowed after calls to {@link #setMediaSources(MediaSource...)}, {@link + * #setTimeline(Timeline)} and/or {@link #setManifest(Object)}. * * @return This builder. */ From 68b17d3391e8a3b9431b27c05198304f94a87ce4 Mon Sep 17 00:00:00 2001 From: krocard Date: Mon, 4 Oct 2021 10:58:23 +0100 Subject: [PATCH 266/441] Extract TrackSelection override & disabling in a method This avoid break and continue after affecting the definition array. PiperOrigin-RevId: 400671927 --- .../trackselection/DefaultTrackSelector.java | 67 +++++++++++-------- 1 file changed, 39 insertions(+), 28 deletions(-) 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 b93a575626..40814ceffd 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 @@ -1498,34 +1498,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Apply track disabling and overriding. for (int i = 0; i < rendererCount; i++) { - // Per renderer and per track type disabling - @C.TrackType int rendererType = mappedTrackInfo.getRendererType(i); - if (params.getRendererDisabled(i) || params.disabledTrackTypes.contains(rendererType)) { - definitions[i] = null; - continue; - } - // Per TrackGroupArray override - TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(i); - if (params.hasSelectionOverride(i, rendererTrackGroups)) { - @Nullable SelectionOverride override = params.getSelectionOverride(i, rendererTrackGroups); - definitions[i] = - override == null - ? null - : new ExoTrackSelection.Definition( - rendererTrackGroups.get(override.groupIndex), override.tracks, override.type); - continue; - } - // Per TrackGroup override - for (int j = 0; j < rendererTrackGroups.length; j++) { - TrackGroup trackGroup = rendererTrackGroups.get(j); - @Nullable - TrackSelectionOverride overrideTracks = params.trackSelectionOverrides.get(trackGroup); - if (overrideTracks != null) { - definitions[i] = - new ExoTrackSelection.Definition(trackGroup, Ints.toArray(overrideTracks.tracks)); - break; - } - } + definitions[i] = maybeApplyOverride(mappedTrackInfo, params, i, definitions[i]); } @NullableType @@ -1557,6 +1530,44 @@ public class DefaultTrackSelector extends MappingTrackSelector { return Pair.create(rendererConfigurations, rendererTrackSelections); } + /** + * Returns the {@link ExoTrackSelection.Definition} of a renderer after applying selection + * overriding and renderer disabling. + */ + protected ExoTrackSelection.@NullableType Definition maybeApplyOverride( + MappedTrackInfo mappedTrackInfo, + Parameters params, + int rendererIndex, + ExoTrackSelection.@NullableType Definition currentDefinition) { + // Per renderer and per track type disabling + @C.TrackType int rendererType = mappedTrackInfo.getRendererType(rendererIndex); + if (params.getRendererDisabled(rendererIndex) + || params.disabledTrackTypes.contains(rendererType)) { + return null; + } + // Per TrackGroupArray override + TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(rendererIndex); + if (params.hasSelectionOverride(rendererIndex, rendererTrackGroups)) { + @Nullable + SelectionOverride override = params.getSelectionOverride(rendererIndex, rendererTrackGroups); + if (override == null) { + return null; + } + return new ExoTrackSelection.Definition( + rendererTrackGroups.get(override.groupIndex), override.tracks, override.type); + } + // Per TrackGroup override + for (int j = 0; j < rendererTrackGroups.length; j++) { + TrackGroup trackGroup = rendererTrackGroups.get(j); + @Nullable + TrackSelectionOverride overrideTracks = params.trackSelectionOverrides.get(trackGroup); + if (overrideTracks != null) { + return new ExoTrackSelection.Definition(trackGroup, Ints.toArray(overrideTracks.tracks)); + } + } + return currentDefinition; // No override + } + // Track selection prior to overrides and disabled flags being applied. /** From d4b9fe33b4a76688d64683c8cf577adcb9348bae Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 4 Oct 2021 11:47:44 +0100 Subject: [PATCH 267/441] Remove subtitle types allow-list from DefaultMediaSourceFactory Removes subtitle allow-list by using SubtitleDecoderFactory.DEFAULT. When the format is unsupported, the extractor registers one track and sends the format with the Format#sampleMimeType set to TEXT_UNKNOWN and Format#codecs field set to the actual subtitle MIME type. The TextRenderer will recognize this MIME Type as not supported which is gonna be visible in the event log. PiperOrigin-RevId: 400679058 --- .../source/DefaultMediaSourceFactory.java | 91 ++++++++++++++----- 1 file changed, 70 insertions(+), 21 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index a216e3ad82..8630628b2d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -27,12 +27,17 @@ import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManagerProvider; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.Extractor; +import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorsFactory; +import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.extractor.SeekMap; +import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.ads.AdsMediaSource; +import com.google.android.exoplayer2.text.SubtitleDecoderFactory; import com.google.android.exoplayer2.text.SubtitleExtractor; -import com.google.android.exoplayer2.text.webvtt.WebvttDecoder; import com.google.android.exoplayer2.ui.AdViewProvider; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; @@ -44,6 +49,7 @@ import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; +import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -381,27 +387,27 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { MediaSource[] mediaSources = new MediaSource[subtitleConfigurations.size() + 1]; mediaSources[0] = mediaSource; for (int i = 0; i < subtitleConfigurations.size(); i++) { - if (useProgressiveMediaSourceForSubtitles - && MimeTypes.TEXT_VTT.equals(subtitleConfigurations.get(i).mimeType)) { - int index = i; - ProgressiveMediaSource.Factory progressiveMediaSourceFactory = - new ProgressiveMediaSource.Factory( - dataSourceFactory, - () -> - new Extractor[] { - new SubtitleExtractor( - new WebvttDecoder(), - new Format.Builder() - .setSampleMimeType(subtitleConfigurations.get(index).mimeType) - .setLanguage(subtitleConfigurations.get(index).language) - .setSelectionFlags(subtitleConfigurations.get(index).selectionFlags) - .setRoleFlags(subtitleConfigurations.get(index).roleFlags) - .setLabel(subtitleConfigurations.get(index).label) - .build()) - }); + if (useProgressiveMediaSourceForSubtitles) { + Format format = + new Format.Builder() + .setSampleMimeType(subtitleConfigurations.get(i).mimeType) + .setLanguage(subtitleConfigurations.get(i).language) + .setSelectionFlags(subtitleConfigurations.get(i).selectionFlags) + .setRoleFlags(subtitleConfigurations.get(i).roleFlags) + .setLabel(subtitleConfigurations.get(i).label) + .build(); + ExtractorsFactory extractorsFactory = + () -> + new Extractor[] { + SubtitleDecoderFactory.DEFAULT.supportsFormat(format) + ? new SubtitleExtractor( + SubtitleDecoderFactory.DEFAULT.createDecoder(format), format) + : new UnknownSubtitlesExtractor(format) + }; mediaSources[i + 1] = - progressiveMediaSourceFactory.createMediaSource( - MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); + new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory) + .createMediaSource( + MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); } else { SingleSampleMediaSource.Factory singleSampleSourceFactory = new SingleSampleMediaSource.Factory(dataSourceFactory) @@ -513,4 +519,47 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { C.TYPE_OTHER, new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)); return factories; } + + private static final class UnknownSubtitlesExtractor implements Extractor { + private final Format format; + + public UnknownSubtitlesExtractor(Format format) { + this.format = format; + } + + @Override + public boolean sniff(ExtractorInput input) { + return true; + } + + @Override + public void init(ExtractorOutput output) { + TrackOutput trackOutput = output.track(/* id= */ 0, C.TRACK_TYPE_TEXT); + output.seekMap(new SeekMap.Unseekable(C.TIME_UNSET)); + output.endTracks(); + trackOutput.format( + format + .buildUpon() + .setSampleMimeType(MimeTypes.TEXT_UNKNOWN) + .setCodecs(format.sampleMimeType) + .build()); + } + + @Override + public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { + int skipResult = input.skip(Integer.MAX_VALUE); + if (skipResult == C.RESULT_END_OF_INPUT) { + return RESULT_END_OF_INPUT; + } + return RESULT_CONTINUE; + } + + @Override + public void seek(long position, long timeUs) { + return; + } + + @Override + public void release() {} + } } From 8ed6c9fcf5e22ad859023703e479e21b2f578f83 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 4 Oct 2021 12:01:49 +0100 Subject: [PATCH 268/441] Fix capitalization of language in track selector Issue: #9452 PiperOrigin-RevId: 400680794 --- RELEASENOTES.md | 2 ++ .../java/com/google/android/exoplayer2/util/Util.java | 5 +++++ .../exoplayer2/ui/DefaultTrackNameProvider.java | 10 ++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 98e8659397..455697bde9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -35,6 +35,8 @@ `Player.addListener`. * Fix initial timestamp display in `PlayerControlView` ([#9524](https://github.com/google/ExoPlayer/issues/9254)). + * Fix capitalization of languages in the track selector + ([#9452](https://github.com/google/ExoPlayer/issues/9452)). * Extractors: * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. 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 e5bd28aca2..27a0d93670 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 @@ -2243,6 +2243,11 @@ public final class Util { return systemLocales; } + /** Returns the default {@link Locale.Category#DISPLAY DISPLAY} {@link Locale}. */ + public static Locale getDefaultDisplayLocale() { + return Util.SDK_INT >= 24 ? Locale.getDefault(Locale.Category.DISPLAY) : Locale.getDefault(); + } + /** * Uncompresses the data in {@code input}. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java index a3d20eadb7..03b2cfb4fd 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java @@ -104,8 +104,14 @@ public class DefaultTrackNameProvider implements TrackNameProvider { if (TextUtils.isEmpty(language) || C.LANGUAGE_UNDETERMINED.equals(language)) { return ""; } - Locale locale = Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); - return locale.getDisplayName(); + Locale languageLocale = + Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); + Locale displayLocale = Util.getDefaultDisplayLocale(); + String languageName = languageLocale.getDisplayName(displayLocale); + // Capitalize the first letter. See: https://github.com/google/ExoPlayer/issues/9452. + int firstCodePointLength = languageName.offsetByCodePoints(0, 1); + return languageName.substring(0, firstCodePointLength).toUpperCase(displayLocale) + + languageName.substring(firstCodePointLength); } private String buildRoleString(Format format) { From 7383bf76969ba237d9b8325c179133f4ffff1199 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 4 Oct 2021 12:05:34 +0100 Subject: [PATCH 269/441] Fix dev-v2 build PiperOrigin-RevId: 400681582 --- .../common/src/main/java/com/google/android/exoplayer2/C.java | 2 +- .../exoplayer2/trackselection/TrackSelectionParameters.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index ac7c5d8e04..a779729bd9 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -461,7 +461,7 @@ public final class C { /** * Playback offload mode. One of {@link #PLAYBACK_OFFLOAD_NOT_SUPPORTED},{@link - * PLAYBACK_OFFLOAD_SUPPORTED} or {@link PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED}. + * #PLAYBACK_OFFLOAD_SUPPORTED} or {@link #PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED}. */ @IntDef({ PLAYBACK_OFFLOAD_NOT_SUPPORTED, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index ad3b831dfb..57cdc3a970 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -31,6 +31,7 @@ import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; From 9788750ddb23b2064dddf99d6e1ea491b2e45cea Mon Sep 17 00:00:00 2001 From: claincly Date: Mon, 4 Oct 2021 13:56:49 +0100 Subject: [PATCH 270/441] Simplify GL program handling. PiperOrigin-RevId: 400697945 --- .../gldemo/BitmapOverlayVideoProcessor.java | 45 ++- .../android/exoplayer2/util/GlUtil.java | 289 ++++++++++-------- .../video/VideoDecoderGLSurfaceView.java | 20 +- .../video/spherical/ProjectionRenderer.java | 23 +- .../TransformerTranscodingVideoRenderer.java | 20 +- 5 files changed, 229 insertions(+), 168 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java index 13e2a60684..cbc2bfe30c 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.gldemo; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -26,7 +28,6 @@ import android.opengl.GLES20; import android.opengl.GLUtils; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.GlUtil; import java.io.IOException; import java.util.Locale; @@ -49,7 +50,7 @@ import javax.microedition.khronos.opengles.GL10; private final Bitmap logoBitmap; private final Canvas overlayCanvas; - private int program; + @Nullable private GlUtil.Program program; @Nullable private GlUtil.Attribute[] attributes; @Nullable private GlUtil.Uniform[] uniforms; @@ -77,27 +78,40 @@ import javax.microedition.khronos.opengles.GL10; @Override public void initialize() { - String vertexShaderCode; - String fragmentShaderCode; try { - vertexShaderCode = GlUtil.loadAsset(context, "bitmap_overlay_video_processor_vertex.glsl"); - fragmentShaderCode = - GlUtil.loadAsset(context, "bitmap_overlay_video_processor_fragment.glsl"); + program = + new GlUtil.Program( + context, + /* vertexShaderFilePath= */ "bitmap_overlay_video_processor_vertex.glsl", + /* fragmentShaderFilePath= */ "bitmap_overlay_video_processor_fragment.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - program = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); - GlUtil.Attribute[] attributes = GlUtil.getAttributes(program); - GlUtil.Uniform[] uniforms = GlUtil.getUniforms(program); + program.use(); + GlUtil.Attribute[] attributes = program.getAttributes(); for (GlUtil.Attribute attribute : attributes) { if (attribute.name.equals("a_position")) { - attribute.setBuffer(new float[] {-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, 1, 1, 0, 1}, 4); + attribute.setBuffer( + new float[] { + -1, -1, 0, 1, + 1, -1, 0, 1, + -1, 1, 0, 1, + 1, 1, 0, 1 + }, + 4); } else if (attribute.name.equals("a_texcoord")) { - attribute.setBuffer(new float[] {0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1}, 4); + attribute.setBuffer( + new float[] { + 0, 0, 0, 1, + 1, 0, 0, 1, + 0, 1, 0, 1, + 1, 1, 0, 1 + }, + 4); } } this.attributes = attributes; - this.uniforms = uniforms; + this.uniforms = checkNotNull(program).getUniforms(); GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); GLES20.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); @@ -126,9 +140,8 @@ import javax.microedition.khronos.opengles.GL10; GlUtil.checkGlError(); // Run the shader program. - GlUtil.Uniform[] uniforms = Assertions.checkNotNull(this.uniforms); - GlUtil.Attribute[] attributes = Assertions.checkNotNull(this.attributes); - GLES20.glUseProgram(program); + GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms); + GlUtil.Attribute[] attributes = checkNotNull(this.attributes); for (GlUtil.Uniform uniform : uniforms) { switch (uniform.name) { case "tex_sampler_0": diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index a0643ad393..a46e6ca21c 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -54,6 +54,160 @@ public final class GlUtil { /** Thrown when the required EGL version is not supported by the device. */ public static final class UnsupportedEglVersionException extends Exception {} + /** GL program. */ + public static final class Program { + /** The identifier of a compiled and linked GLSL shader program. */ + private final int programId; + + /** + * Compiles a GL shader program from vertex and fragment shader code. + * + * @param vertexShaderCode GLES20 vertex shader program. + * @param fragmentShaderCode GLES20 fragment shader program. + */ + public Program(String vertexShaderCode, String fragmentShaderCode) { + programId = GLES20.glCreateProgram(); + checkGlError(); + + // Add the vertex and fragment shaders. + addShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); + addShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); + + // Link and check for errors. + GLES20.glLinkProgram(programId); + int[] linkStatus = new int[] {GLES20.GL_FALSE}; + GLES20.glGetProgramiv(programId, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + throwGlException( + "Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(programId)); + } + checkGlError(); + } + + /** + * Compiles a GL shader program from vertex and fragment shader code. + * + * @param context The {@link Context}. + * @param vertexShaderFilePath The path to a GLES20 vertex shader program. + * @param fragmentShaderFilePath The path to a fragment shader program. + * @throws IOException When failing to read the shader files. + */ + public Program(Context context, String vertexShaderFilePath, String fragmentShaderFilePath) + throws IOException { + this(loadAsset(context, vertexShaderFilePath), loadAsset(context, fragmentShaderFilePath)); + } + + /** + * Compiles a GL shader program from vertex and fragment shader code. + * + * @param vertexShaderCode GLES20 vertex shader program as arrays of strings. Strings are joined + * by adding a new line character in between each of them. + * @param fragmentShaderCode GLES20 fragment shader program as arrays of strings. Strings are + * joined by adding a new line character in between each of them. + */ + public Program(String[] vertexShaderCode, String[] fragmentShaderCode) { + this(TextUtils.join("\n", vertexShaderCode), TextUtils.join("\n", fragmentShaderCode)); + } + + /** Uses the program. */ + public void use() { + GLES20.glUseProgram(programId); + } + + /** Deletes the program. Deleted programs cannot be used again. */ + public void delete() { + GLES20.glDeleteProgram(programId); + } + + /** Returns the location of an {@link Attribute}. */ + public int glGetAttribLocation(String attributeName) { + return GLES20.glGetAttribLocation(programId, attributeName); + } + + /** Returns the location of a {@link Uniform}. */ + public int glGetUniformLocation(String uniformName) { + return GLES20.glGetUniformLocation(programId, uniformName); + } + + /** Returns the program's {@link Attribute}s. */ + public Attribute[] getAttributes() { + int[] attributeCount = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); + if (attributeCount[0] != 2) { + throw new IllegalStateException("Expected two attributes."); + } + + Attribute[] attributes = new Attribute[attributeCount[0]]; + for (int i = 0; i < attributeCount[0]; i++) { + attributes[i] = createAttribute(i); + } + return attributes; + } + + /** Returns the program's {@link Uniform}s. */ + public Uniform[] getUniforms() { + int[] uniformCount = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); + + Uniform[] uniforms = new Uniform[uniformCount[0]]; + for (int i = 0; i < uniformCount[0]; i++) { + uniforms[i] = createUniform(i); + } + + return uniforms; + } + + private Uniform createUniform(int index) { + int[] length = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, length, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] name = new byte[length[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveUniform(programId, index, length[0], ignore, 0, size, 0, type, 0, name, 0); + String nameString = new String(name, 0, strlen(name)); + int location = glGetAttribLocation(nameString); + int typeInt = type[0]; + + return new Uniform(nameString, location, typeInt); + } + + private Attribute createAttribute(int index) { + int[] length = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, length, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] nameBytes = new byte[length[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveAttrib( + programId, index, length[0], ignore, 0, size, 0, type, 0, nameBytes, 0); + String name = new String(nameBytes, 0, strlen(nameBytes)); + int location = glGetAttribLocation(name); + + return new Attribute(name, index, location); + } + + private void addShader(int type, String shaderCode) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, shaderCode); + GLES20.glCompileShader(shader); + + int[] result = new int[] {GLES20.GL_FALSE}; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); + if (result[0] != GLES20.GL_TRUE) { + throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + shaderCode); + } + + GLES20.glAttachShader(programId, shader); + GLES20.glDeleteShader(shader); + checkGlError(); + } + } + /** * GL attribute, which can be attached to a buffer with {@link Attribute#setBuffer(float[], int)}. */ @@ -68,26 +222,11 @@ public final class GlUtil { @Nullable private Buffer buffer; private int size; - /** - * Creates a new GL attribute. - * - * @param program The identifier of a compiled and linked GLSL shader program. - * @param index The index of the attribute. After this instance has been constructed, the name - * of the attribute is available via the {@link #name} field. - */ - public Attribute(int program, int index) { - int[] len = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, len, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] nameBytes = new byte[len[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveAttrib(program, index, len[0], ignore, 0, size, 0, type, 0, nameBytes, 0); - name = new String(nameBytes, 0, strlen(nameBytes)); - location = GLES20.glGetAttribLocation(program, name); + /** Creates a new GL attribute. */ + public Attribute(String name, int index, int location) { + this.name = name; this.index = index; + this.location = location; } /** @@ -137,28 +276,12 @@ public final class GlUtil { private int texId; private int unit; - /** - * Creates a new GL uniform. - * - * @param program The identifier of a compiled and linked GLSL shader program. - * @param index The index of the uniform. After this instance has been constructed, the name of - * the uniform is available via the {@link #name} field. - */ - public Uniform(int program, int index) { - int[] len = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, len, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] name = new byte[len[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveUniform(program, index, len[0], ignore, 0, size, 0, type, 0, name, 0); - this.name = new String(name, 0, strlen(name)); - location = GLES20.glGetUniformLocation(program, this.name); - this.type = type[0]; - - value = new float[16]; + /** Creates a new GL uniform. */ + public Uniform(String name, int location, int type) { + this.name = name; + this.location = location; + this.type = type; + this.value = new float[16]; } /** @@ -332,74 +455,6 @@ public final class GlUtil { Api17.focusSurface(eglDisplay, eglContext, surface, width, height); } - /** - * Builds a GL shader program from vertex and fragment shader code. - * - * @param vertexCode GLES20 vertex shader program as arrays of strings. Strings are joined by - * adding a new line character in between each of them. - * @param fragmentCode GLES20 fragment shader program as arrays of strings. Strings are joined by - * adding a new line character in between each of them. - * @return GLES20 program id. - */ - public static int compileProgram(String[] vertexCode, String[] fragmentCode) { - return compileProgram(TextUtils.join("\n", vertexCode), TextUtils.join("\n", fragmentCode)); - } - - /** - * Builds a GL shader program from vertex and fragment shader code. - * - * @param vertexCode GLES20 vertex shader program. - * @param fragmentCode GLES20 fragment shader program. - * @return GLES20 program id. - */ - public static int compileProgram(String vertexCode, String fragmentCode) { - int program = GLES20.glCreateProgram(); - checkGlError(); - - // Add the vertex and fragment shaders. - addShader(GLES20.GL_VERTEX_SHADER, vertexCode, program); - addShader(GLES20.GL_FRAGMENT_SHADER, fragmentCode, program); - - // Link and check for errors. - GLES20.glLinkProgram(program); - int[] linkStatus = new int[] {GLES20.GL_FALSE}; - GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); - if (linkStatus[0] != GLES20.GL_TRUE) { - throwGlException("Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(program)); - } - checkGlError(); - - return program; - } - - /** Returns the {@link Attribute}s in the specified {@code program}. */ - public static Attribute[] getAttributes(int program) { - int[] attributeCount = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); - if (attributeCount[0] != 2) { - throw new IllegalStateException("Expected two attributes."); - } - - Attribute[] attributes = new Attribute[attributeCount[0]]; - for (int i = 0; i < attributeCount[0]; i++) { - attributes[i] = new Attribute(program, i); - } - return attributes; - } - - /** Returns the {@link Uniform}s in the specified {@code program}. */ - public static Uniform[] getUniforms(int program) { - int[] uniformCount = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); - - Uniform[] uniforms = new Uniform[uniformCount[0]]; - for (int i = 0; i < uniformCount[0]; i++) { - uniforms[i] = new Uniform(program, i); - } - - return uniforms; - } - /** * Deletes a GL texture. * @@ -478,22 +533,6 @@ public final class GlUtil { return texId[0]; } - private static void addShader(int type, String source, int program) { - int shader = GLES20.glCreateShader(type); - GLES20.glShaderSource(shader, source); - GLES20.glCompileShader(shader); - - int[] result = new int[] {GLES20.GL_FALSE}; - GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); - if (result[0] != GLES20.GL_TRUE) { - throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + source); - } - - GLES20.glAttachShader(program, shader); - GLES20.glDeleteShader(shader); - checkGlError(); - } - private static void throwGlException(String errorMsg) { Log.e(TAG, errorMsg); if (glAssertionsEnabled) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java index f47a76760f..756f5ed7ee 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.video; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; @@ -140,7 +142,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView // glDrawArrays uses it. private final FloatBuffer[] textureCoords; - private int program; + @Nullable private GlUtil.Program program; private int colorMatrixLocation; // Accessed only from the GL thread. @@ -161,9 +163,9 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView @Override public void onSurfaceCreated(GL10 unused, EGLConfig config) { - program = GlUtil.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER); - GLES20.glUseProgram(program); - int posLocation = GLES20.glGetAttribLocation(program, "in_pos"); + program = new GlUtil.Program(VERTEX_SHADER, FRAGMENT_SHADER); + program.use(); + int posLocation = program.glGetAttribLocation("in_pos"); GLES20.glEnableVertexAttribArray(posLocation); GLES20.glVertexAttribPointer( posLocation, @@ -172,14 +174,14 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView /* normalized= */ false, /* stride= */ 0, TEXTURE_VERTICES); - texLocations[0] = GLES20.glGetAttribLocation(program, "in_tc_y"); + texLocations[0] = checkNotNull(program).glGetAttribLocation("in_tc_y"); GLES20.glEnableVertexAttribArray(texLocations[0]); - texLocations[1] = GLES20.glGetAttribLocation(program, "in_tc_u"); + texLocations[1] = checkNotNull(program).glGetAttribLocation("in_tc_u"); GLES20.glEnableVertexAttribArray(texLocations[1]); - texLocations[2] = GLES20.glGetAttribLocation(program, "in_tc_v"); + texLocations[2] = checkNotNull(program).glGetAttribLocation("in_tc_v"); GLES20.glEnableVertexAttribArray(texLocations[2]); GlUtil.checkGlError(); - colorMatrixLocation = GLES20.glGetUniformLocation(program, "mColorConversion"); + colorMatrixLocation = checkNotNull(program).glGetUniformLocation("mColorConversion"); GlUtil.checkGlError(); setupTextures(); GlUtil.checkGlError(); @@ -296,7 +298,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView private void setupTextures() { GLES20.glGenTextures(3, yuvTextures, /* offset= */ 0); for (int i = 0; i < 3; i++) { - GLES20.glUniform1i(GLES20.glGetUniformLocation(program, TEXTURE_UNIFORMS[i]), i); + GLES20.glUniform1i(checkNotNull(program).glGetUniformLocation(TEXTURE_UNIFORMS[i]), i); GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]); GLES20.glTexParameterf( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java index 4ba5dcca08..8f59f53718 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.video.spherical; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.GlUtil.checkGlError; import android.opengl.GLES11Ext; @@ -90,11 +91,12 @@ import java.nio.FloatBuffer; }; private int stereoMode; + + @Nullable private GlUtil.Program program; @Nullable private MeshData leftMeshData; @Nullable private MeshData rightMeshData; // Program related GL items. These are only valid if program != 0. - private int program; private int mvpMatrixHandle; private int uTexMatrixHandle; private int positionHandle; @@ -119,12 +121,12 @@ import java.nio.FloatBuffer; /** Initializes of the GL components. */ /* package */ void init() { - program = GlUtil.compileProgram(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); - mvpMatrixHandle = GLES20.glGetUniformLocation(program, "uMvpMatrix"); - uTexMatrixHandle = GLES20.glGetUniformLocation(program, "uTexMatrix"); - positionHandle = GLES20.glGetAttribLocation(program, "aPosition"); - texCoordsHandle = GLES20.glGetAttribLocation(program, "aTexCoords"); - textureHandle = GLES20.glGetUniformLocation(program, "uTexture"); + program = new GlUtil.Program(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); + mvpMatrixHandle = program.glGetUniformLocation("uMvpMatrix"); + uTexMatrixHandle = program.glGetUniformLocation("uTexMatrix"); + positionHandle = program.glGetAttribLocation("aPosition"); + texCoordsHandle = program.glGetAttribLocation("aTexCoords"); + textureHandle = program.glGetUniformLocation("uTexture"); } /** @@ -143,7 +145,7 @@ import java.nio.FloatBuffer; } // Configure shader. - GLES20.glUseProgram(program); + checkNotNull(program).use(); checkGlError(); GLES20.glEnableVertexAttribArray(positionHandle); @@ -196,8 +198,9 @@ import java.nio.FloatBuffer; /** Cleans up the GL resources. */ /* package */ void shutdown() { - if (program != 0) { - GLES20.glDeleteProgram(program); + if (program != null) { + program.delete(); + program = null; } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 88e04a0b70..8064927f00 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -186,6 +186,7 @@ import java.nio.ByteBuffer; } eglSurface = GlUtil.getEglSurface(eglDisplay, checkNotNull(checkNotNull(encoder).getInputSurface())); + GlUtil.focusSurface( eglDisplay, eglContext, @@ -193,17 +194,20 @@ import java.nio.ByteBuffer; encoderConfigurationOutputFormat.width, encoderConfigurationOutputFormat.height); decoderTextureId = GlUtil.createExternalTexture(); - String vertexShaderCode; - String fragmentShaderCode; + + GlUtil.Program copyProgram; try { - vertexShaderCode = GlUtil.loadAsset(context, "shaders/blit_vertex_shader.glsl"); - fragmentShaderCode = GlUtil.loadAsset(context, "shaders/copy_external_fragment_shader.glsl"); + copyProgram = + new GlUtil.Program( + context, + /* vertexShaderFilePath= */ "shaders/blit_vertex_shader.glsl", + /* fragmentShaderFilePath= */ "shaders/copy_external_fragment_shader.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - int copyProgram = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); - GLES20.glUseProgram(copyProgram); - GlUtil.Attribute[] copyAttributes = GlUtil.getAttributes(copyProgram); + + copyProgram.use(); + GlUtil.Attribute[] copyAttributes = copyProgram.getAttributes(); checkState(copyAttributes.length == 2, "Expected program to have two vertex attributes."); for (GlUtil.Attribute copyAttribute : copyAttributes) { if (copyAttribute.name.equals("a_position")) { @@ -229,7 +233,7 @@ import java.nio.ByteBuffer; } copyAttribute.bind(); } - GlUtil.Uniform[] copyUniforms = GlUtil.getUniforms(copyProgram); + GlUtil.Uniform[] copyUniforms = copyProgram.getUniforms(); checkState(copyUniforms.length == 2, "Expected program to have two uniforms."); for (GlUtil.Uniform copyUniform : copyUniforms) { if (copyUniform.name.equals("tex_sampler")) { From ac4a7e919a5a098a6657e9978ee75d9a533608ba Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 4 Oct 2021 14:41:06 +0100 Subject: [PATCH 271/441] Remove ExoPlayer link from UI module PiperOrigin-RevId: 400706800 --- .../android/exoplayer2/ui/PlayerNotificationManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 7fa3563629..a7c29321be 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -54,7 +54,6 @@ import androidx.media.app.NotificationCompat.MediaStyle; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.NotificationUtil; @@ -820,7 +819,7 @@ public class PlayerNotificationManager { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}), or configure whether the rewind + * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}), or configure whether the rewind * and fast forward actions should be used with {{@link #setUseRewindAction(boolean)}} and * {@link #setUseFastForwardAction(boolean)}. */ From 912c47ff6f4abc88d33665d27da33ec7997358ef Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 4 Oct 2021 14:42:09 +0100 Subject: [PATCH 272/441] Rollback of https://github.com/google/ExoPlayer/commit/8ed6c9fcf5e22ad859023703e479e21b2f578f83 *** Original commit *** Fix capitalization of language in track selector Issue: #9452 *** PiperOrigin-RevId: 400706984 --- RELEASENOTES.md | 2 -- .../java/com/google/android/exoplayer2/util/Util.java | 5 ----- .../exoplayer2/ui/DefaultTrackNameProvider.java | 10 ++-------- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 455697bde9..98e8659397 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -35,8 +35,6 @@ `Player.addListener`. * Fix initial timestamp display in `PlayerControlView` ([#9524](https://github.com/google/ExoPlayer/issues/9254)). - * Fix capitalization of languages in the track selector - ([#9452](https://github.com/google/ExoPlayer/issues/9452)). * Extractors: * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. 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 27a0d93670..e5bd28aca2 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 @@ -2243,11 +2243,6 @@ public final class Util { return systemLocales; } - /** Returns the default {@link Locale.Category#DISPLAY DISPLAY} {@link Locale}. */ - public static Locale getDefaultDisplayLocale() { - return Util.SDK_INT >= 24 ? Locale.getDefault(Locale.Category.DISPLAY) : Locale.getDefault(); - } - /** * Uncompresses the data in {@code input}. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java index 03b2cfb4fd..a3d20eadb7 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java @@ -104,14 +104,8 @@ public class DefaultTrackNameProvider implements TrackNameProvider { if (TextUtils.isEmpty(language) || C.LANGUAGE_UNDETERMINED.equals(language)) { return ""; } - Locale languageLocale = - Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); - Locale displayLocale = Util.getDefaultDisplayLocale(); - String languageName = languageLocale.getDisplayName(displayLocale); - // Capitalize the first letter. See: https://github.com/google/ExoPlayer/issues/9452. - int firstCodePointLength = languageName.offsetByCodePoints(0, 1); - return languageName.substring(0, firstCodePointLength).toUpperCase(displayLocale) - + languageName.substring(firstCodePointLength); + Locale locale = Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); + return locale.getDisplayName(); } private String buildRoleString(Format format) { From 84881739ee80af6c3795bb90a4eae5213e443531 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 4 Oct 2021 15:26:26 +0100 Subject: [PATCH 273/441] Map TS stream type 0x80 to H262 Issue: #9472 PiperOrigin-RevId: 400715255 --- RELEASENOTES.md | 2 ++ .../exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java | 1 + .../com/google/android/exoplayer2/extractor/ts/TsExtractor.java | 1 + 3 files changed, 4 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 98e8659397..793a5bacef 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -38,6 +38,8 @@ * Extractors: * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. + * TS: Map stream type 0x80 to H262 + ([#9472](https://github.com/google/ExoPlayer/issues/9472)). * Downloads and caching: * Modify `DownloadService` behavior when `DownloadService.getScheduler` returns `null`, or returns a `Scheduler` that does not support the diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java index 3d9c2b04c5..78af78efc0 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java @@ -161,6 +161,7 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact case TsExtractor.TS_STREAM_TYPE_DTS: return new PesReader(new DtsReader(esInfo.language)); case TsExtractor.TS_STREAM_TYPE_H262: + case TsExtractor.TS_STREAM_TYPE_DC2_H262: return new PesReader(new H262Reader(buildUserDataReader(esInfo))); case TsExtractor.TS_STREAM_TYPE_H263: return new PesReader(new H263Reader(buildUserDataReader(esInfo))); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java index 1fc399d6a5..fd678103ab 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java @@ -97,6 +97,7 @@ public final class TsExtractor implements Extractor { public static final int TS_STREAM_TYPE_DVBSUBS = 0x59; // Stream types that aren't defined by the MPEG-2 TS specification. + public static final int TS_STREAM_TYPE_DC2_H262 = 0x80; public static final int TS_STREAM_TYPE_AIT = 0x101; public static final int TS_SYNC_BYTE = 0x47; // First byte of each TS packet. From 7a2c7c3297ea7dbe265cab215974178648c7d009 Mon Sep 17 00:00:00 2001 From: christosts Date: Mon, 4 Oct 2021 16:57:12 +0100 Subject: [PATCH 274/441] Make asynchronous queueing non-experimental This change makes asynchronous queueing non-experimental, it enables the feature by default on devices with API level >= 31 (Android 12+) and exposes APIs for apps to either fully opt-in or opt-out from the feature. The choice to use or not asynchronous queueing is moved out of MediaCodecRenderer to a new MediaCodecAdapter factory, the DefaultMediaCodecAdapterFactory. This is because, at the moment, if an app passes a custom adapter factory to a MediaCodecRenderer and then enables asynchronous queueing on it, the custom adapter factory is not used but this is not visible to the user. The default behavior of DefaultMediaCodecAdapterFactory is to create asynchronous MediaCodec adapters for devices with API level >= 31 (Android 12+), and synchronous MediaCodec adapters on devices with older API versions. DefaultMediaCodecAdapterFactory exposes methods to force enable or force disable the use of asynchronous adapters so that applications can enable asynchronous queueing on devices with API versions before 31 (but not before 23), or fully disable the feature. For applications that build MediaCodecRenderers directly, they will need to create a DefaultMediaCodecAdapterFactory and pass it to the renderer constructor. For applications that rely on the DefaultRenderersFactory, additional methods have been added on the DefaultRenderersFactory to control enabling/disabling asynchronous queueing. Issue: #6348 PiperOrigin-RevId: 400733506 --- RELEASENOTES.md | 8 +- .../exoplayer2/DefaultRenderersFactory.java | 49 +++----- .../AsynchronousMediaCodecAdapter.java | 22 +--- .../AsynchronousMediaCodecBufferEnqueuer.java | 38 ++----- .../DefaultMediaCodecAdapterFactory.java | 105 ++++++++++++++++++ .../mediacodec/MediaCodecAdapter.java | 3 +- .../mediacodec/MediaCodecRenderer.java | 59 +--------- .../AsynchronousMediaCodecAdapterTest.java | 1 - ...nchronousMediaCodecBufferEnqueuerTest.java | 6 +- 9 files changed, 143 insertions(+), 148 deletions(-) create mode 100644 library/core/src/main/java/com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 793a5bacef..c880d831e8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -3,6 +3,10 @@ ### dev-v2 (not yet released) * Core Library: + * Enable MediaCodec asynchronous queueing by default on devices with API + level >= 31. Add methods in `DefaultMediaCodecRendererFactory` and + `DefaultRenderersFactory` to force enable or force disable asynchronous + queueing ([6348](https://github.com/google/ExoPlayer/issues/6348)). * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. * Move `com.google.android.exoplayer2.drm.DecryptionException` to @@ -13,8 +17,8 @@ `GlUtil.glAssertionsEnabled` instead. * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. - * Fix `mediaMetadata` being reset when media is - repeated ([#9458](https://github.com/google/ExoPlayer/issues/9458)). + * Fix `mediaMetadata` being reset when media is repeated + ([#9458](https://github.com/google/ExoPlayer/issues/9458)). * Video: * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java index d4284842df..03ccc297a8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java @@ -28,6 +28,7 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink.DefaultAudioProcessorChain; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; +import com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; @@ -87,13 +88,11 @@ public class DefaultRenderersFactory implements RenderersFactory { private static final String TAG = "DefaultRenderersFactory"; private final Context context; + private final DefaultMediaCodecAdapterFactory codecAdapterFactory; @ExtensionRendererMode private int extensionRendererMode; private long allowedVideoJoiningTimeMs; private boolean enableDecoderFallback; private MediaCodecSelector mediaCodecSelector; - private boolean enableAsyncQueueing; - private boolean forceAsyncQueueingSynchronizationWorkaround; - private boolean enableSynchronizeCodecInteractionsWithQueueing; private boolean enableFloatOutput; private boolean enableAudioTrackPlaybackParams; private boolean enableOffload; @@ -101,6 +100,7 @@ public class DefaultRenderersFactory implements RenderersFactory { /** @param context A {@link Context}. */ public DefaultRenderersFactory(Context context) { this.context = context; + codecAdapterFactory = new DefaultMediaCodecAdapterFactory(); extensionRendererMode = EXTENSION_RENDERER_MODE_OFF; allowedVideoJoiningTimeMs = DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS; mediaCodecSelector = MediaCodecSelector.DEFAULT; @@ -130,6 +130,7 @@ public class DefaultRenderersFactory implements RenderersFactory { this.extensionRendererMode = extensionRendererMode; this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs; mediaCodecSelector = MediaCodecSelector.DEFAULT; + codecAdapterFactory = new DefaultMediaCodecAdapterFactory(); } /** @@ -149,34 +150,28 @@ public class DefaultRenderersFactory implements RenderersFactory { } /** - * Enable asynchronous buffer queueing for both {@link MediaCodecAudioRenderer} and {@link - * MediaCodecVideoRenderer} instances. + * Enables {@link com.google.android.exoplayer2.mediacodec.MediaCodecRenderer} instances to + * operate their {@link MediaCodec} in asynchronous mode and perform asynchronous queueing. * - *

        This method is experimental, and will be renamed or removed in a future release. + *

        This feature can be enabled only on devices with API versions >= 23. For devices with + * older API versions, this method is a no-op. * - * @param enabled Whether asynchronous queueing is enabled. * @return This factory, for convenience. */ - public DefaultRenderersFactory experimentalSetAsynchronousBufferQueueingEnabled(boolean enabled) { - enableAsyncQueueing = enabled; + public DefaultRenderersFactory forceEnableMediaCodecAsynchronousQueueing() { + codecAdapterFactory.forceEnableAsynchronous(); return this; } /** - * Enable the asynchronous queueing synchronization workaround. + * Disables {@link com.google.android.exoplayer2.mediacodec.MediaCodecRenderer} instances from + * operating their {@link MediaCodec} in asynchronous mode and perform asynchronous queueing. + * {@link MediaCodec} instances will be operated synchronous mode. * - *

        When enabled, the queueing threads for {@link MediaCodec} instances will synchronize on a - * shared lock when submitting buffers to the respective {@link MediaCodec}. - * - *

        This method is experimental, and will be renamed or removed in a future release. - * - * @param enabled Whether the asynchronous queueing synchronization workaround is enabled by - * default. * @return This factory, for convenience. */ - public DefaultRenderersFactory experimentalSetForceAsyncQueueingSynchronizationWorkaround( - boolean enabled) { - this.forceAsyncQueueingSynchronizationWorkaround = enabled; + public DefaultRenderersFactory forceDisableMediaCodecAsynchronousQueueing() { + codecAdapterFactory.forceDisableAsynchronous(); return this; } @@ -191,7 +186,7 @@ public class DefaultRenderersFactory implements RenderersFactory { */ public DefaultRenderersFactory experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled( boolean enabled) { - enableSynchronizeCodecInteractionsWithQueueing = enabled; + codecAdapterFactory.experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(enabled); return this; } @@ -373,17 +368,13 @@ public class DefaultRenderersFactory implements RenderersFactory { MediaCodecVideoRenderer videoRenderer = new MediaCodecVideoRenderer( context, + codecAdapterFactory, mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler, eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY); - videoRenderer.experimentalSetAsynchronousBufferQueueingEnabled(enableAsyncQueueing); - videoRenderer.experimentalSetForceAsyncQueueingSynchronizationWorkaround( - forceAsyncQueueingSynchronizationWorkaround); - videoRenderer.experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled( - enableSynchronizeCodecInteractionsWithQueueing); out.add(videoRenderer); if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) { @@ -497,16 +488,12 @@ public class DefaultRenderersFactory implements RenderersFactory { MediaCodecAudioRenderer audioRenderer = new MediaCodecAudioRenderer( context, + codecAdapterFactory, mediaCodecSelector, enableDecoderFallback, eventHandler, eventListener, audioSink); - audioRenderer.experimentalSetAsynchronousBufferQueueingEnabled(enableAsyncQueueing); - audioRenderer.experimentalSetForceAsyncQueueingSynchronizationWorkaround( - forceAsyncQueueingSynchronizationWorkaround); - audioRenderer.experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled( - enableSynchronizeCodecInteractionsWithQueueing); out.add(audioRenderer); if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index 5832144f5a..8302bd2903 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java @@ -49,15 +49,11 @@ import java.nio.ByteBuffer; public static final class Factory implements MediaCodecAdapter.Factory { private final Supplier callbackThreadSupplier; private final Supplier queueingThreadSupplier; - private final boolean forceQueueingSynchronizationWorkaround; private final boolean synchronizeCodecInteractionsWithQueueing; /** Creates a factory for codecs handling the specified {@link C.TrackType track type}. */ public Factory(@C.TrackType int trackType) { - this( - trackType, - /* forceQueueingSynchronizationWorkaround= */ false, - /* synchronizeCodecInteractionsWithQueueing= */ false); + this(trackType, /* synchronizeCodecInteractionsWithQueueing= */ false); } /** @@ -65,23 +61,17 @@ import java.nio.ByteBuffer; * * @param trackType One of {@link C#TRACK_TYPE_AUDIO} or {@link C#TRACK_TYPE_VIDEO}. Used for * labelling the internal thread accordingly. - * @param forceQueueingSynchronizationWorkaround Whether the queueing synchronization workaround - * will be enabled by default or only for the predefined devices. * @param synchronizeCodecInteractionsWithQueueing Whether the adapter should synchronize {@link * MediaCodec} interactions with asynchronous buffer queueing. When {@code true}, codec * interactions will wait until all input buffers pending queueing wil be submitted to the * {@link MediaCodec}. */ - public Factory( - @C.TrackType int trackType, - boolean forceQueueingSynchronizationWorkaround, - boolean synchronizeCodecInteractionsWithQueueing) { + public Factory(@C.TrackType int trackType, boolean synchronizeCodecInteractionsWithQueueing) { this( /* callbackThreadSupplier= */ () -> new HandlerThread(createCallbackThreadLabel(trackType)), /* queueingThreadSupplier= */ () -> new HandlerThread(createQueueingThreadLabel(trackType)), - forceQueueingSynchronizationWorkaround, synchronizeCodecInteractionsWithQueueing); } @@ -89,11 +79,9 @@ import java.nio.ByteBuffer; /* package */ Factory( Supplier callbackThreadSupplier, Supplier queueingThreadSupplier, - boolean forceQueueingSynchronizationWorkaround, boolean synchronizeCodecInteractionsWithQueueing) { this.callbackThreadSupplier = callbackThreadSupplier; this.queueingThreadSupplier = queueingThreadSupplier; - this.forceQueueingSynchronizationWorkaround = forceQueueingSynchronizationWorkaround; this.synchronizeCodecInteractionsWithQueueing = synchronizeCodecInteractionsWithQueueing; } @@ -111,7 +99,6 @@ import java.nio.ByteBuffer; codec, callbackThreadSupplier.get(), queueingThreadSupplier.get(), - forceQueueingSynchronizationWorkaround, synchronizeCodecInteractionsWithQueueing); TraceUtil.endSection(); codecAdapter.initialize( @@ -153,13 +140,10 @@ import java.nio.ByteBuffer; MediaCodec codec, HandlerThread callbackThread, HandlerThread enqueueingThread, - boolean forceQueueingSynchronizationWorkaround, boolean synchronizeCodecInteractionsWithQueueing) { this.codec = codec; this.asynchronousMediaCodecCallback = new AsynchronousMediaCodecCallback(callbackThread); - this.bufferEnqueuer = - new AsynchronousMediaCodecBufferEnqueuer( - codec, enqueueingThread, forceQueueingSynchronizationWorkaround); + this.bufferEnqueuer = new AsynchronousMediaCodecBufferEnqueuer(codec, enqueueingThread); this.synchronizeCodecInteractionsWithQueueing = synchronizeCodecInteractionsWithQueueing; this.state = STATE_CREATED; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java index 8a2bb9a9bc..1605c669e7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java @@ -30,7 +30,6 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.Util; -import com.google.common.base.Ascii; import java.util.ArrayDeque; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; @@ -60,7 +59,6 @@ class AsynchronousMediaCodecBufferEnqueuer { private @MonotonicNonNull Handler handler; private final AtomicReference<@NullableType RuntimeException> pendingRuntimeException; private final ConditionVariable conditionVariable; - private final boolean needsSynchronizationWorkaround; private boolean started; /** @@ -69,29 +67,17 @@ class AsynchronousMediaCodecBufferEnqueuer { * @param codec The {@link MediaCodec} to submit input buffers to. * @param queueingThread The {@link HandlerThread} to use for queueing buffers. */ - public AsynchronousMediaCodecBufferEnqueuer( - MediaCodec codec, - HandlerThread queueingThread, - boolean forceQueueingSynchronizationWorkaround) { - this( - codec, - queueingThread, - forceQueueingSynchronizationWorkaround, - /* conditionVariable= */ new ConditionVariable()); + public AsynchronousMediaCodecBufferEnqueuer(MediaCodec codec, HandlerThread queueingThread) { + this(codec, queueingThread, /* conditionVariable= */ new ConditionVariable()); } @VisibleForTesting /* package */ AsynchronousMediaCodecBufferEnqueuer( - MediaCodec codec, - HandlerThread handlerThread, - boolean forceQueueingSynchronizationWorkaround, - ConditionVariable conditionVariable) { + MediaCodec codec, HandlerThread handlerThread, ConditionVariable conditionVariable) { this.codec = codec; this.handlerThread = handlerThread; this.conditionVariable = conditionVariable; pendingRuntimeException = new AtomicReference<>(); - needsSynchronizationWorkaround = - forceQueueingSynchronizationWorkaround || needsSynchronizationWorkaround(); } /** @@ -247,11 +233,10 @@ class AsynchronousMediaCodecBufferEnqueuer { private void doQueueSecureInputBuffer( int index, int offset, MediaCodec.CryptoInfo info, long presentationTimeUs, int flags) { try { - if (needsSynchronizationWorkaround) { - synchronized (QUEUE_SECURE_LOCK) { - codec.queueSecureInputBuffer(index, offset, info, presentationTimeUs, flags); - } - } else { + // Synchronize calls to MediaCodec.queueSecureInputBuffer() to avoid race conditions inside + // the crypto module when audio and video are sharing the same DRM session + // (see [Internal: b/149908061]). + synchronized (QUEUE_SECURE_LOCK) { codec.queueSecureInputBuffer(index, offset, info, presentationTimeUs, flags); } } catch (RuntimeException e) { @@ -299,15 +284,6 @@ class AsynchronousMediaCodecBufferEnqueuer { } } - /** - * Returns whether this device needs the synchronization workaround when queueing secure input - * buffers (see [Internal: b/149908061]). - */ - private static boolean needsSynchronizationWorkaround() { - String manufacturer = Ascii.toLowerCase(Util.MANUFACTURER); - return manufacturer.contains("samsung") || manufacturer.contains("motorola"); - } - /** Performs a deep copy of {@code cryptoInfo} to {@code frameworkCryptoInfo}. */ private static void copy( CryptoInfo cryptoInfo, android.media.MediaCodec.CryptoInfo frameworkCryptoInfo) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.java new file mode 100644 index 0000000000..f371d92598 --- /dev/null +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.java @@ -0,0 +1,105 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.mediacodec; + +import androidx.annotation.IntDef; +import com.google.android.exoplayer2.util.Log; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; +import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * The default {@link MediaCodecAdapter.Factory}. + * + *

        By default, this factory {@link #createAdapter creates} {@link AsynchronousMediaCodecAdapter} + * instances on devices with API level >= 31 (Android 12+). For devices with older API versions, + * the default behavior is to create {@link SynchronousMediaCodecAdapter} instances. The factory + * offers APIs to force the creation of {@link AsynchronousMediaCodecAdapter} (applicable for + * devices with API >= 23) or {@link SynchronousMediaCodecAdapter} instances. + */ +public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.Factory { + + @Retention(RetentionPolicy.SOURCE) + @IntDef({MODE_DEFAULT, MODE_ENABLED, MODE_DISABLED}) + private @interface Mode {} + + private static final int MODE_DEFAULT = 0; + private static final int MODE_ENABLED = 1; + private static final int MODE_DISABLED = 2; + + private static final String TAG = "DefaultMediaCodecAdapterFactory"; + + @Mode private int asynchronousMode; + private boolean enableSynchronizeCodecInteractionsWithQueueing; + + public DefaultMediaCodecAdapterFactory() { + asynchronousMode = MODE_DEFAULT; + } + + /** + * Forces this factory to always create {@link AsynchronousMediaCodecAdapter} instances, provided + * the device API level is >= 23. For devices with API level < 23, the factory will create + * {@link SynchronousMediaCodecAdapter SynchronousMediaCodecAdapters}. + * + * @return This factory, for convenience. + */ + public DefaultMediaCodecAdapterFactory forceEnableAsynchronous() { + asynchronousMode = MODE_ENABLED; + return this; + } + + /** + * Forces the factory to always create {@link SynchronousMediaCodecAdapter} instances. + * + * @return This factory, for convenience. + */ + public DefaultMediaCodecAdapterFactory forceDisableAsynchronous() { + asynchronousMode = MODE_DISABLED; + return this; + } + + /** + * Enable synchronizing codec interactions with asynchronous buffer queueing. + * + *

        This method is experimental, and will be renamed or removed in a future release. + * + * @param enabled Whether codec interactions will be synchronized with asynchronous buffer + * queueing. + */ + public void experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean enabled) { + enableSynchronizeCodecInteractionsWithQueueing = enabled; + } + + @Override + public MediaCodecAdapter createAdapter(MediaCodecAdapter.Configuration configuration) + throws IOException { + if ((asynchronousMode == MODE_ENABLED && Util.SDK_INT >= 23) + || (asynchronousMode == MODE_DEFAULT && Util.SDK_INT >= 31)) { + int trackType = MimeTypes.getTrackType(configuration.format.sampleMimeType); + Log.i( + TAG, + "Creating an asynchronous MediaCodec adapter for track type " + + Util.getTrackTypeString(trackType)); + AsynchronousMediaCodecAdapter.Factory factory = + new AsynchronousMediaCodecAdapter.Factory( + trackType, enableSynchronizeCodecInteractionsWithQueueing); + return factory.createAdapter(configuration); + } + return new SynchronousMediaCodecAdapter.Factory().createAdapter(configuration); + } +} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index 2353baf516..ffd7758680 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.google.android.exoplayer2.mediacodec; import android.media.MediaCodec; @@ -179,7 +178,7 @@ public interface MediaCodecAdapter { interface Factory { /** Default factory used in most cases. */ - Factory DEFAULT = new SynchronousMediaCodecAdapter.Factory(); + Factory DEFAULT = new DefaultMediaCodecAdapterFactory(); /** Creates a {@link MediaCodecAdapter} instance. */ MediaCodecAdapter createAdapter(Configuration configuration) throws IOException; 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 0836102ae6..389e675c59 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 @@ -350,9 +350,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { private boolean outputStreamEnded; private boolean waitingForFirstSampleInFormat; private boolean pendingOutputEndOfStream; - private boolean enableAsynchronousBufferQueueing; - private boolean forceAsyncQueueingSynchronizationWorkaround; - private boolean enableSynchronizeCodecInteractionsWithQueueing; @Nullable private ExoPlaybackException pendingPlaybackException; protected DecoderCounters decoderCounters; private long outputStreamStartPositionUs; @@ -428,46 +425,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { this.renderTimeLimitMs = renderTimeLimitMs; } - /** - * Enables asynchronous input buffer queueing. - * - *

        Operates the underlying {@link MediaCodec} in asynchronous mode and submits input buffers - * from a separate thread to unblock the playback thread. - * - *

        This method is experimental, and will be renamed or removed in a future release. It should - * only be called before the renderer is used. - */ - public void experimentalSetAsynchronousBufferQueueingEnabled(boolean enabled) { - enableAsynchronousBufferQueueing = enabled; - } - - /** - * Enables the asynchronous queueing synchronization workaround. - * - *

        When enabled, the queueing threads for {@link MediaCodec} instance will synchronize on a - * shared lock when submitting buffers to the respective {@link MediaCodec}. - * - *

        This method is experimental, and will be renamed or removed in a future release. It should - * only be called before the renderer is used. - */ - public void experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean enabled) { - this.forceAsyncQueueingSynchronizationWorkaround = enabled; - } - - /** - * Enables synchronizing codec interactions with asynchronous buffer queueing. - * - *

        When enabled, codec interactions will wait until all input buffers pending for asynchronous - * queueing are submitted to the {@link MediaCodec} first. This method is effective only if {@link - * #experimentalSetAsynchronousBufferQueueingEnabled asynchronous buffer queueing} is enabled. - * - *

        This method is experimental, and will be renamed or removed in a future release. It should - * only be called before the renderer is used. - */ - public void experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean enabled) { - enableSynchronizeCodecInteractionsWithQueueing = enabled; - } - @Override @AdaptiveSupport public final int supportsMixedMimeTypeAdaptation() { @@ -520,7 +477,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { * no codec operating rate should be set. * @return The parameters needed to call {@link MediaCodec#configure}. */ - @Nullable protected abstract MediaCodecAdapter.Configuration getMediaCodecConfiguration( MediaCodecInfo codecInfo, Format format, @@ -1092,7 +1048,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer { private void initCodec(MediaCodecInfo codecInfo, MediaCrypto crypto) throws Exception { long codecInitializingTimestamp; long codecInitializedTimestamp; - @Nullable MediaCodecAdapter codecAdapter = null; String codecName = codecInfo.name; float codecOperatingRate = Util.SDK_INT < 23 @@ -1105,19 +1060,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer { TraceUtil.beginSection("createCodec:" + codecName); MediaCodecAdapter.Configuration configuration = getMediaCodecConfiguration(codecInfo, inputFormat, crypto, codecOperatingRate); - if (enableAsynchronousBufferQueueing && Util.SDK_INT >= 23) { - codecAdapter = - new AsynchronousMediaCodecAdapter.Factory( - getTrackType(), - forceAsyncQueueingSynchronizationWorkaround, - enableSynchronizeCodecInteractionsWithQueueing) - .createAdapter(configuration); - } else { - codecAdapter = codecAdapterFactory.createAdapter(configuration); - } + codec = codecAdapterFactory.createAdapter(configuration); codecInitializedTimestamp = SystemClock.elapsedRealtime(); - this.codec = codecAdapter; this.codecInfo = codecInfo; this.codecOperatingRate = codecOperatingRate; codecInputFormat = inputFormat; @@ -1133,7 +1078,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecNeedsMonoChannelCountWorkaround(codecName, codecInputFormat); codecNeedsEosPropagation = codecNeedsEosPropagationWorkaround(codecInfo) || getCodecNeedsEosPropagation(); - if (codecAdapter.needsReconfiguration()) { + if (codec.needsReconfiguration()) { this.codecReconfigured = true; this.codecReconfigurationState = RECONFIGURATION_STATE_WRITE_PENDING; this.codecNeedsAdaptationWorkaroundBuffer = diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java index 94410ab11f..9aa2b5f3ba 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapterTest.java @@ -54,7 +54,6 @@ public class AsynchronousMediaCodecAdapterTest { new AsynchronousMediaCodecAdapter.Factory( /* callbackThreadSupplier= */ () -> callbackThread, /* queueingThreadSupplier= */ () -> queueingThread, - /* forceQueueingSynchronizationWorkaround= */ false, /* synchronizeCodecInteractionsWithQueueing= */ false) .createAdapter(configuration); bufferInfo = new MediaCodec.BufferInfo(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuerTest.java index e5fdd126f4..f3a08df819 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuerTest.java @@ -56,11 +56,7 @@ public class AsynchronousMediaCodecBufferEnqueuerTest { codec.start(); handlerThread = new TestHandlerThread("TestHandlerThread"); enqueuer = - new AsynchronousMediaCodecBufferEnqueuer( - codec, - handlerThread, - /* forceQueueingSynchronizationWorkaround= */ false, - mockConditionVariable); + new AsynchronousMediaCodecBufferEnqueuer(codec, handlerThread, mockConditionVariable); } @After From 47573d4575cb1c6f88197bd3748eade820a35b49 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 4 Oct 2021 17:34:45 +0100 Subject: [PATCH 275/441] Remove inlined, fully qualified class name PiperOrigin-RevId: 400742025 --- .../exoplayer2/ext/media2/DefaultMediaItemConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java index a7baef2241..12ac0fb4e8 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java @@ -27,6 +27,7 @@ import androidx.media2.common.FileMediaItem; import androidx.media2.common.UriMediaItem; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.util.Assertions; /** @@ -85,8 +86,7 @@ public class DefaultMediaItemConverter implements MediaItemConverter { return new MediaItem.Builder() .setUri(uri) .setMediaId(mediaId != null ? mediaId : MediaItem.DEFAULT_MEDIA_ID) - .setMediaMetadata( - new com.google.android.exoplayer2.MediaMetadata.Builder().setTitle(title).build()) + .setMediaMetadata(new MediaMetadata.Builder().setTitle(title).build()) .setTag(media2MediaItem) .setClipStartPositionMs(startPositionMs) .setClipEndPositionMs(endPositionMs) From ac881be2fccbbfe29fe3b4f094b85d6d16942c72 Mon Sep 17 00:00:00 2001 From: krocard Date: Tue, 5 Oct 2021 11:16:12 +0100 Subject: [PATCH 276/441] Add TracksInfo to the Player API TracksInfo is very similar to `MappingTrackSelector.MappedTracksInfo` with some fields removed to simplify the Player API, notably it doesn't expose the renderer concept. A significant difference is the addition of a `selected` boolean field which avoids having a separate `getCurrentTrackSelection` API. This cl is a part of the bigger track selection change, splitted for ease of review. In particular, the MediaSession implementation and UI usage have been slitted in child cls. Find all cls with the tag: #player-track-selection PiperOrigin-RevId: 400937124 --- .../exoplayer2/ext/cast/CastPlayer.java | 44 ++- .../exoplayer2/ext/ima/FakePlayer.java | 6 + .../android/exoplayer2/ForwardingPlayer.java | 10 + .../com/google/android/exoplayer2/Player.java | 49 ++- .../google/android/exoplayer2/TracksInfo.java | 300 ++++++++++++++++++ .../android/exoplayer2/TracksInfoTest.java | 111 +++++++ .../android/exoplayer2/ExoPlayerImpl.java | 12 +- .../android/exoplayer2/SimpleExoPlayer.java | 6 + .../analytics/AnalyticsCollector.java | 11 + .../analytics/AnalyticsListener.java | 14 +- .../trackselection/MappingTrackSelector.java | 58 +++- .../trackselection/TrackSelectorResult.java | 24 ++ .../android/exoplayer2/ExoPlayerTest.java | 5 +- .../exoplayer2/MediaPeriodQueueTest.java | 5 +- .../analytics/AnalyticsCollectorTest.java | 6 +- .../DefaultTrackSelectorTest.java | 28 ++ .../MappingTrackSelectorTest.java | 58 ++++ .../exoplayer2/transformer/Transformer.java | 6 +- .../android/exoplayer2/ui/PlayerView.java | 4 +- .../exoplayer2/ui/StyledPlayerView.java | 4 +- .../testutil/ExoPlayerTestRunner.java | 19 -- .../exoplayer2/testutil/StubExoPlayer.java | 6 + 22 files changed, 727 insertions(+), 59 deletions(-) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java create mode 100644 library/common/src/test/java/com/google/android/exoplayer2/TracksInfoTest.java diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 22dc83818e..e3f075e562 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -37,6 +37,7 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -66,6 +67,7 @@ import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.common.collect.ImmutableList; import java.util.List; +import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** @@ -101,7 +103,8 @@ public final class CastPlayer extends BasePlayer { COMMAND_GET_TIMELINE, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_SET_MEDIA_ITEMS_METADATA, - COMMAND_CHANGE_MEDIA_ITEMS) + COMMAND_CHANGE_MEDIA_ITEMS, + COMMAND_GET_TRACK_INFOS) .build(); public static final float MIN_SPEED_SUPPORTED = 0.5f; @@ -142,6 +145,7 @@ public final class CastPlayer extends BasePlayer { private CastTimeline currentTimeline; private TrackGroupArray currentTrackGroups; private TrackSelectionArray currentTrackSelection; + private TracksInfo currentTracksInfo; private Commands availableCommands; @Player.State private int playbackState; private int currentWindowIndex; @@ -219,6 +223,7 @@ public final class CastPlayer extends BasePlayer { currentTimeline = CastTimeline.EMPTY_CAST_TIMELINE; currentTrackGroups = TrackGroupArray.EMPTY; currentTrackSelection = EMPTY_TRACK_SELECTION_ARRAY; + currentTracksInfo = TracksInfo.EMPTY; availableCommands = new Commands.Builder().addAll(PERMANENT_AVAILABLE_COMMANDS).build(); pendingSeekWindowIndex = C.INDEX_UNSET; pendingSeekPositionMs = C.TIME_UNSET; @@ -583,14 +588,19 @@ public final class CastPlayer extends BasePlayer { return false; } + @Override + public TrackGroupArray getCurrentTrackGroups() { + return currentTrackGroups; + } + @Override public TrackSelectionArray getCurrentTrackSelections() { return currentTrackSelection; } @Override - public TrackGroupArray getCurrentTrackGroups() { - return currentTrackGroups; + public TracksInfo getCurrentTracksInfo() { + return currentTracksInfo; } @Override @@ -871,6 +881,8 @@ public final class CastPlayer extends BasePlayer { listeners.queueEvent( Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(currentTrackGroups, currentTrackSelection)); + listeners.queueEvent( + Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksInfoChanged(currentTracksInfo)); } updateAvailableCommandsAndNotifyIfChanged(); listeners.flushEvents(); @@ -1032,6 +1044,7 @@ public final class CastPlayer extends BasePlayer { boolean hasChanged = !currentTrackGroups.isEmpty(); currentTrackGroups = TrackGroupArray.EMPTY; currentTrackSelection = EMPTY_TRACK_SELECTION_ARRAY; + currentTracksInfo = TracksInfo.EMPTY; return hasChanged; } long[] activeTrackIds = mediaStatus.getActiveTrackIds(); @@ -1040,7 +1053,9 @@ public final class CastPlayer extends BasePlayer { } TrackGroup[] trackGroups = new TrackGroup[castMediaTracks.size()]; - TrackSelection[] trackSelections = new TrackSelection[RENDERER_COUNT]; + @NullableType TrackSelection[] trackSelections = new TrackSelection[RENDERER_COUNT]; + TracksInfo.TrackGroupInfo[] trackGroupInfos = + new TracksInfo.TrackGroupInfo[castMediaTracks.size()]; for (int i = 0; i < castMediaTracks.size(); i++) { MediaTrack mediaTrack = castMediaTracks.get(i); trackGroups[i] = new TrackGroup(CastUtils.mediaTrackToFormat(mediaTrack)); @@ -1048,19 +1063,28 @@ public final class CastPlayer extends BasePlayer { long id = mediaTrack.getId(); @C.TrackType int trackType = MimeTypes.getTrackType(mediaTrack.getContentType()); int rendererIndex = getRendererIndexForTrackType(trackType); - if (isTrackActive(id, activeTrackIds) - && rendererIndex != C.INDEX_UNSET - && trackSelections[rendererIndex] == null) { + boolean supported = rendererIndex != C.INDEX_UNSET; + boolean selected = + isTrackActive(id, activeTrackIds) && supported && trackSelections[rendererIndex] == null; + if (selected) { trackSelections[rendererIndex] = new CastTrackSelection(trackGroups[i]); } + @C.FormatSupport + int[] trackSupport = new int[] {supported ? C.FORMAT_HANDLED : C.FORMAT_UNSUPPORTED_TYPE}; + final boolean[] trackSelected = new boolean[] {selected}; + trackGroupInfos[i] = + new TracksInfo.TrackGroupInfo(trackGroups[i], trackSupport, trackType, trackSelected); } TrackGroupArray newTrackGroups = new TrackGroupArray(trackGroups); TrackSelectionArray newTrackSelections = new TrackSelectionArray(trackSelections); + TracksInfo newTracksInfo = new TracksInfo(ImmutableList.copyOf(trackGroupInfos)); if (!newTrackGroups.equals(currentTrackGroups) - || !newTrackSelections.equals(currentTrackSelection)) { - currentTrackSelection = new TrackSelectionArray(trackSelections); - currentTrackGroups = new TrackGroupArray(trackGroups); + || !newTrackSelections.equals(currentTrackSelection) + || !newTracksInfo.equals(currentTracksInfo)) { + currentTrackSelection = newTrackSelections; + currentTrackGroups = newTrackGroups; + currentTracksInfo = newTracksInfo; return true; } return false; diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index 66612a17a2..a958449b2a 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.testutil.StubExoPlayer; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; @@ -240,6 +241,11 @@ import com.google.android.exoplayer2.util.ListenerSet; return new TrackSelectionArray(); } + @Override + public TracksInfo getCurrentTracksInfo() { + return TracksInfo.EMPTY; + } + @Override public TrackSelectionParameters getTrackSelectionParameters() { return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 4fa547d2dc..c45c48495b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -360,6 +360,11 @@ public class ForwardingPlayer implements Player { return player.getCurrentTrackSelections(); } + @Override + public TracksInfo getCurrentTracksInfo() { + return player.getCurrentTracksInfo(); + } + @Override public TrackSelectionParameters getTrackSelectionParameters() { return player.getTrackSelectionParameters(); @@ -645,6 +650,11 @@ public class ForwardingPlayer implements Player { eventListener.onTracksChanged(trackGroups, trackSelections); } + @Override + public void onTracksInfoChanged(TracksInfo tracksInfo) { + eventListener.onTracksInfoChanged(tracksInfo); + } + @Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { eventListener.onMediaMetadataChanged(mediaMetadata); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 367194350b..96f6e12487 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -57,11 +57,8 @@ import java.util.List; *

          *
        • They can provide a {@link Timeline} representing the structure of the media being played, * which can be obtained by calling {@link #getCurrentTimeline()}. - *
        • They can provide a {@link TrackGroupArray} defining the currently available tracks, which - * can be obtained by calling {@link #getCurrentTrackGroups()}. - *
        • They can provide a {@link TrackSelectionArray} defining which of the currently available - * tracks are selected to be rendered. This can be obtained by calling {@link - * #getCurrentTrackSelections()}}. + *
        • They can provide a {@link TracksInfo} defining the currently available tracks and which are + * selected to be rendered, which can be obtained by calling {@link #getCurrentTracksInfo()}. *
        */ public interface Player { @@ -122,10 +119,22 @@ public interface Player { * concrete implementation may include null elements if it has a fixed number of renderer * components, wishes to report a TrackSelection for each of them, and has one or more * renderer components that is not assigned any selected tracks. + * @deprecated Use {@link #onTracksInfoChanged(TracksInfo)} instead. */ + @Deprecated default void onTracksChanged( TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} + /** + * Called when the available or selected tracks change. + * + *

        {@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * + * @param tracksInfo The available tracks information. Never null, but may be of length zero. + */ + default void onTracksInfoChanged(TracksInfo tracksInfo) {} + /** * Called when the combined {@link MediaMetadata} changes. * @@ -693,6 +702,7 @@ public interface Player { COMMAND_SET_VIDEO_SURFACE, COMMAND_GET_TEXT, COMMAND_SET_TRACK_SELECTION_PARAMETERS, + COMMAND_GET_TRACK_INFOS, }; private final FlagSet.Builder flagsBuilder; @@ -923,8 +933,7 @@ public interface Player { @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) {} @Override - default void onTracksChanged( - TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} + default void onTracksInfoChanged(TracksInfo tracksInfo) {} @Override default void onIsLoadingChanged(boolean isLoading) {} @@ -1278,7 +1287,7 @@ public interface Player { int EVENT_TIMELINE_CHANGED = 0; /** {@link #getCurrentMediaItem()} changed or the player started repeating the current item. */ int EVENT_MEDIA_ITEM_TRANSITION = 1; - /** {@link #getCurrentTrackGroups()} or {@link #getCurrentTrackSelections()} changed. */ + /** {@link #getCurrentTracksInfo()} changed. */ int EVENT_TRACKS_CHANGED = 2; /** {@link #isLoading()} ()} changed. */ int EVENT_IS_LOADING_CHANGED = 3; @@ -1331,8 +1340,8 @@ public interface Player { * #COMMAND_CHANGE_MEDIA_ITEMS}, {@link #COMMAND_GET_AUDIO_ATTRIBUTES}, {@link * #COMMAND_GET_VOLUME}, {@link #COMMAND_GET_DEVICE_VOLUME}, {@link #COMMAND_SET_VOLUME}, {@link * #COMMAND_SET_DEVICE_VOLUME}, {@link #COMMAND_ADJUST_DEVICE_VOLUME}, {@link - * #COMMAND_SET_VIDEO_SURFACE}, {@link #COMMAND_GET_TEXT} or {@link - * #COMMAND_SET_TRACK_SELECTION_PARAMETERS}. + * #COMMAND_SET_VIDEO_SURFACE}, {@link #COMMAND_GET_TEXT}, {@link + * #COMMAND_SET_TRACK_SELECTION_PARAMETERS} or {@link #COMMAND_GET_TRACK_INFOS}. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -1366,6 +1375,7 @@ public interface Player { COMMAND_SET_VIDEO_SURFACE, COMMAND_GET_TEXT, COMMAND_SET_TRACK_SELECTION_PARAMETERS, + COMMAND_GET_TRACK_INFOS, }) @interface Command {} /** Command to start, pause or resume playback. */ @@ -1424,6 +1434,8 @@ public interface Player { int COMMAND_GET_TEXT = 27; /** Command to set the player's track selection parameters. */ int COMMAND_SET_TRACK_SELECTION_PARAMETERS = 28; + /** Command to get track infos. */ + int COMMAND_GET_TRACK_INFOS = 29; /** Represents an invalid {@link Command}. */ int COMMAND_INVALID = -1; @@ -1962,7 +1974,9 @@ public interface Player { * Returns the available track groups. * * @see Listener#onTracksChanged(TrackGroupArray, TrackSelectionArray) + * @deprecated Use {@link #getCurrentTracksInfo()}. */ + @Deprecated TrackGroupArray getCurrentTrackGroups(); /** @@ -1973,10 +1987,23 @@ public interface Player { * components that is not assigned any selected tracks. * * @see Listener#onTracksChanged(TrackGroupArray, TrackSelectionArray) + * @deprecated Use {@link #getCurrentTracksInfo()}. */ + @Deprecated TrackSelectionArray getCurrentTrackSelections(); - /** Returns the parameters constraining the track selection. */ + /** + * Returns the available tracks, as well as the tracks' support, type, and selection status. + * + * @see Listener#onTracksChanged(TrackGroupArray, TrackSelectionArray) + */ + TracksInfo getCurrentTracksInfo(); + + /** + * Returns the parameters constraining the track selection. + * + * @see Listener#onTrackSelectionParametersChanged} + */ TrackSelectionParameters getTrackSelectionParameters(); /** diff --git a/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java new file mode 100644 index 0000000000..3f587ed8d0 --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2; + +import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; +import static com.google.android.exoplayer2.util.BundleableUtil.fromNullableBundle; +import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; + +import android.os.Bundle; +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; +import com.google.common.primitives.Booleans; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; +import java.util.List; + +/** Immutable information ({@link TrackGroupInfo}) about tracks. */ +public final class TracksInfo implements Bundleable { + /** + * Information about tracks in a {@link TrackGroup}: their {@link C.TrackType}, if their format is + * supported by the player and if they are selected for playback. + */ + public static final class TrackGroupInfo implements Bundleable { + private final TrackGroup trackGroup; + @C.FormatSupport private final int[] trackSupport; + private final @C.TrackType int trackType; + private final boolean[] trackSelected; + + /** + * Constructs a TrackGroupInfo. + * + * @param trackGroup The {@link TrackGroup} described. + * @param trackSupport The {@link C.FormatSupport} of each track in the {@code trackGroup}. + * @param trackType The {@link C.TrackType} of the tracks in the {@code trackGroup}. + * @param tracksSelected Whether a track is selected for each track in {@code trackGroup}. + */ + public TrackGroupInfo( + TrackGroup trackGroup, + @C.FormatSupport int[] trackSupport, + @C.TrackType int trackType, + boolean[] tracksSelected) { + int length = trackGroup.length; + checkArgument(length == trackSupport.length && length == tracksSelected.length); + this.trackGroup = trackGroup; + this.trackSupport = trackSupport.clone(); + this.trackType = trackType; + this.trackSelected = tracksSelected.clone(); + } + + /** Returns the {@link TrackGroup} described by this {@code TrackGroupInfo}. */ + public TrackGroup getTrackGroup() { + return trackGroup; + } + + /** + * Returns the level of support for a track in a {@link TrackGroup}. + * + * @param trackIndex The index of the track in the {@link TrackGroup}. + * @return The {@link C.FormatSupport} of the track. + */ + @C.FormatSupport + public int getTrackSupport(int trackIndex) { + return trackSupport[trackIndex]; + } + + /** + * Returns if a track in a {@link TrackGroup} is supported for playback. + * + * @param trackIndex The index of the track in the {@link TrackGroup}. + * @return True if the track's format can be played, false otherwise. + */ + public boolean isTrackSupported(int trackIndex) { + return trackSupport[trackIndex] == C.FORMAT_HANDLED; + } + + /** Returns if at least one track in a {@link TrackGroup} is selected for playback. */ + public boolean isSelected() { + return Booleans.contains(trackSelected, true); + } + + /** Returns if at least one track in a {@link TrackGroup} is supported. */ + public boolean isSupported() { + for (int i = 0; i < trackSupport.length; i++) { + if (isTrackSupported(i)) { + return true; + } + } + return false; + } + + /** + * Returns if a track in a {@link TrackGroup} is selected for playback. + * + *

        Multiple tracks of a track group may be selected, in which case the the active one + * (currently playing) is undefined. This is common in adaptive streaming, where multiple tracks + * of different quality are selected and the active one changes depending on the network and the + * {@link TrackSelectionParameters}. + * + * @param trackIndex The index of the track in the {@link TrackGroup}. + * @return true if the track is selected, false otherwise. + */ + public boolean isTrackSelected(int trackIndex) { + return trackSelected[trackIndex]; + } + + /** + * Returns the {@link C.TrackType} of the tracks in the {@link TrackGroup}. Tracks in a group + * are all of the same type. + */ + public @C.TrackType int getTrackType() { + return trackType; + } + + @Override + public boolean equals(@Nullable Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + TrackGroupInfo that = (TrackGroupInfo) other; + return trackType == that.trackType + && trackGroup.equals(that.trackGroup) + && Arrays.equals(trackSupport, that.trackSupport) + && Arrays.equals(trackSelected, that.trackSelected); + } + + @Override + public int hashCode() { + int result = trackGroup.hashCode(); + result = 31 * result + Arrays.hashCode(trackSupport); + result = 31 * result + trackType; + result = 31 * result + Arrays.hashCode(trackSelected); + return result; + } + + // Bundleable implementation. + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_TRACK_GROUP, + FIELD_TRACK_SUPPORT, + FIELD_TRACK_TYPE, + FIELD_TRACK_SELECTED, + }) + private @interface FieldNumber {} + + private static final int FIELD_TRACK_GROUP = 0; + private static final int FIELD_TRACK_SUPPORT = 1; + private static final int FIELD_TRACK_TYPE = 2; + private static final int FIELD_TRACK_SELECTED = 3; + + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putBundle(keyForField(FIELD_TRACK_GROUP), trackGroup.toBundle()); + bundle.putIntArray(keyForField(FIELD_TRACK_SUPPORT), trackSupport); + bundle.putInt(keyForField(FIELD_TRACK_TYPE), trackType); + bundle.putBooleanArray(keyForField(FIELD_TRACK_SELECTED), trackSelected); + return bundle; + } + + /** Object that can restores a {@code TracksInfo} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + TrackGroup trackGroup = + fromNullableBundle( + TrackGroup.CREATOR, bundle.getBundle(keyForField(FIELD_TRACK_GROUP))); + checkNotNull(trackGroup); // Can't create a trackGroup info without a trackGroup + @C.FormatSupport + final int[] trackSupport = + MoreObjects.firstNonNull( + bundle.getIntArray(keyForField(FIELD_TRACK_SUPPORT)), new int[trackGroup.length]); + @C.TrackType + int trackType = bundle.getInt(keyForField(FIELD_TRACK_TYPE), C.TRACK_TYPE_UNKNOWN); + boolean[] selected = + MoreObjects.firstNonNull( + bundle.getBooleanArray(keyForField(FIELD_TRACK_SELECTED)), + new boolean[trackGroup.length]); + return new TrackGroupInfo(trackGroup, trackSupport, trackType, selected); + }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } + } + + private final ImmutableList trackGroupInfos; + + /** An empty {@code TrackInfo} containing no {@link TrackGroupInfo}. */ + public static final TracksInfo EMPTY = new TracksInfo(ImmutableList.of()); + + /** Constructs {@code TracksInfo} from the provided {@link TrackGroupInfo}. */ + public TracksInfo(List trackGroupInfos) { + this.trackGroupInfos = ImmutableList.copyOf(trackGroupInfos); + } + + /** Returns the {@link TrackGroupInfo TrackGroupInfos}, describing each {@link TrackGroup}. */ + public ImmutableList getTrackGroupInfos() { + return trackGroupInfos; + } + + /** Returns if there is at least one track of type {@code trackType} but none are supported. */ + public boolean isTypeSupportedOrEmpty(@C.TrackType int trackType) { + boolean supported = true; + for (int i = 0; i < trackGroupInfos.size(); i++) { + if (trackGroupInfos.get(i).trackType == trackType) { + if (trackGroupInfos.get(i).isSupported()) { + return true; + } else { + supported = false; + } + } + } + return supported; + } + + /** Returns if at least one track of the type {@code trackType} is selected for playback. */ + public boolean isTypeSelected(@C.TrackType int trackType) { + for (int i = 0; i < trackGroupInfos.size(); i++) { + TrackGroupInfo trackGroupInfo = trackGroupInfos.get(i); + if (trackGroupInfo.isSelected() && trackGroupInfo.getTrackType() == trackType) { + return true; + } + } + return false; + } + + @Override + public boolean equals(@Nullable Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + TracksInfo that = (TracksInfo) other; + return trackGroupInfos.equals(that.trackGroupInfos); + } + + @Override + public int hashCode() { + return trackGroupInfos.hashCode(); + } + // Bundleable implementation. + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_TRACK_GROUP_INFOS, + }) + private @interface FieldNumber {} + + private static final int FIELD_TRACK_GROUP_INFOS = 0; + + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList( + keyForField(FIELD_TRACK_GROUP_INFOS), toBundleArrayList(trackGroupInfos)); + return bundle; + } + + /** Object that can restore a {@code TracksInfo} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + List trackGroupInfos = + fromBundleNullableList( + TrackGroupInfo.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_TRACK_GROUP_INFOS)), + /* defaultValue= */ ImmutableList.of()); + return new TracksInfo(trackGroupInfos); + }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } +} diff --git a/library/common/src/test/java/com/google/android/exoplayer2/TracksInfoTest.java b/library/common/src/test/java/com/google/android/exoplayer2/TracksInfoTest.java new file mode 100644 index 0000000000..3e285c9b35 --- /dev/null +++ b/library/common/src/test/java/com/google/android/exoplayer2/TracksInfoTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.source.TrackGroup; +import com.google.common.collect.ImmutableList; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit test for {@link TracksInfo}. */ +@RunWith(AndroidJUnit4.class) +public class TracksInfoTest { + + @Test + public void roundTripViaBundle_ofEmptyTracksInfo_yieldsEqualInstance() { + TracksInfo before = TracksInfo.EMPTY; + TracksInfo after = TracksInfo.CREATOR.fromBundle(before.toBundle()); + assertThat(after).isEqualTo(before); + } + + @Test + public void roundTripViaBundle_ofTracksInfo_yieldsEqualInstance() { + TracksInfo before = + new TracksInfo( + ImmutableList.of( + new TracksInfo.TrackGroupInfo( + new TrackGroup(new Format.Builder().build()), + new int[] {C.FORMAT_EXCEEDS_CAPABILITIES}, + C.TRACK_TYPE_AUDIO, + new boolean[] {true}), + new TracksInfo.TrackGroupInfo( + new TrackGroup(new Format.Builder().build(), new Format.Builder().build()), + new int[] {C.FORMAT_UNSUPPORTED_DRM, C.FORMAT_UNSUPPORTED_TYPE}, + C.TRACK_TYPE_VIDEO, + new boolean[] {false, true}))); + TracksInfo after = TracksInfo.CREATOR.fromBundle(before.toBundle()); + assertThat(after).isEqualTo(before); + } + + @Test + public void tracksInfoGetters_withoutTrack_returnExpectedValues() { + TracksInfo tracksInfo = new TracksInfo(ImmutableList.of()); + + assertThat(tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_AUDIO)).isTrue(); + assertThat(tracksInfo.isTypeSelected(C.TRACK_TYPE_AUDIO)).isFalse(); + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + assertThat(trackGroupInfos).isEmpty(); + } + + @Test + public void tracksInfo_emptyStaticInstance_isEmpty() { + TracksInfo tracksInfo = TracksInfo.EMPTY; + + assertThat(tracksInfo.getTrackGroupInfos()).isEmpty(); + assertThat(tracksInfo).isEqualTo(new TracksInfo(ImmutableList.of())); + } + + @Test + public void tracksInfoGetters_ofComplexTracksInfo_returnExpectedValues() { + TracksInfo.TrackGroupInfo trackGroupInfo0 = + new TracksInfo.TrackGroupInfo( + new TrackGroup(new Format.Builder().build()), + new int[] {C.FORMAT_EXCEEDS_CAPABILITIES}, + C.TRACK_TYPE_AUDIO, + /* tracksSelected= */ new boolean[] {false}); + TracksInfo.TrackGroupInfo trackGroupInfo1 = + new TracksInfo.TrackGroupInfo( + new TrackGroup(new Format.Builder().build(), new Format.Builder().build()), + new int[] {C.FORMAT_UNSUPPORTED_DRM, C.FORMAT_HANDLED}, + C.TRACK_TYPE_VIDEO, + /* tracksSelected= */ new boolean[] {false, true}); + TracksInfo tracksInfo = new TracksInfo(ImmutableList.of(trackGroupInfo0, trackGroupInfo1)); + + assertThat(tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_AUDIO)).isFalse(); + assertThat(tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_VIDEO)).isTrue(); + assertThat(tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_TEXT)).isTrue(); + assertThat(tracksInfo.isTypeSelected(C.TRACK_TYPE_AUDIO)).isFalse(); + assertThat(tracksInfo.isTypeSelected(C.TRACK_TYPE_VIDEO)).isTrue(); + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + assertThat(trackGroupInfos).hasSize(2); + assertThat(trackGroupInfos.get(0)).isSameInstanceAs(trackGroupInfo0); + assertThat(trackGroupInfos.get(1)).isSameInstanceAs(trackGroupInfo1); + assertThat(trackGroupInfos.get(0).isTrackSupported(0)).isFalse(); + assertThat(trackGroupInfos.get(1).isTrackSupported(0)).isFalse(); + assertThat(trackGroupInfos.get(1).isTrackSupported(1)).isTrue(); + assertThat(trackGroupInfos.get(0).getTrackSupport(0)).isEqualTo(C.FORMAT_EXCEEDS_CAPABILITIES); + assertThat(trackGroupInfos.get(1).getTrackSupport(0)).isEqualTo(C.FORMAT_UNSUPPORTED_DRM); + assertThat(trackGroupInfos.get(1).getTrackSupport(1)).isEqualTo(C.FORMAT_HANDLED); + assertThat(trackGroupInfos.get(0).isTrackSelected(0)).isFalse(); + assertThat(trackGroupInfos.get(1).isTrackSelected(0)).isFalse(); + assertThat(trackGroupInfos.get(1).isTrackSelected(1)).isTrue(); + assertThat(trackGroupInfos.get(0).getTrackType()).isEqualTo(C.TRACK_TYPE_AUDIO); + assertThat(trackGroupInfos.get(1).getTrackType()).isEqualTo(C.TRACK_TYPE_VIDEO); + } +} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index c91d0b746a..d3d041ce93 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -196,6 +196,7 @@ import java.util.concurrent.CopyOnWriteArraySet; new TrackSelectorResult( new RendererConfiguration[renderers.length], new ExoTrackSelection[renderers.length], + TracksInfo.EMPTY, /* info= */ null); period = new Timeline.Period(); permanentAvailableCommands = @@ -210,7 +211,8 @@ import java.util.concurrent.CopyOnWriteArraySet; COMMAND_GET_TIMELINE, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_SET_MEDIA_ITEMS_METADATA, - COMMAND_CHANGE_MEDIA_ITEMS) + COMMAND_CHANGE_MEDIA_ITEMS, + COMMAND_GET_TRACK_INFOS) .addIf(COMMAND_SET_TRACK_SELECTION_PARAMETERS, trackSelector.isSetParametersSupported()) .addAll(additionalPermanentAvailableCommands) .build(); @@ -951,6 +953,11 @@ import java.util.concurrent.CopyOnWriteArraySet; return new TrackSelectionArray(playbackInfo.trackSelectorResult.selections); } + @Override + public TracksInfo getCurrentTracksInfo() { + return playbackInfo.trackSelectorResult.tracksInfo; + } + @Override public TrackSelectionParameters getTrackSelectionParameters() { return trackSelector.getParameters(); @@ -1274,6 +1281,9 @@ import java.util.concurrent.CopyOnWriteArraySet; listeners.queueEvent( Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(newPlaybackInfo.trackGroups, newSelection)); + listeners.queueEvent( + Player.EVENT_TRACKS_CHANGED, + listener -> listener.onTracksInfoChanged(newPlaybackInfo.trackSelectorResult.tracksInfo)); } if (metadataChanged) { final MediaMetadata finalMediaMetadata = mediaMetadata; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 00a5d66be0..eb5dc12060 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1456,6 +1456,12 @@ public class SimpleExoPlayer extends BasePlayer return player.getCurrentTrackSelections(); } + @Override + public TracksInfo getCurrentTracksInfo() { + verifyApplicationThread(); + return player.getCurrentTracksInfo(); + } + @Override public TrackSelectionParameters getTrackSelectionParameters() { verifyApplicationThread(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 1e908e41e4..4d1bcd457f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.Player.PlaybackSuppressionReason; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.Timeline.Window; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioRendererEventListener; @@ -586,6 +587,7 @@ public class AnalyticsCollector } @Override + @SuppressWarnings("deprecation") // Implementing and calling deprecate listener method public final void onTracksChanged( TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); @@ -595,6 +597,15 @@ public class AnalyticsCollector listener -> listener.onTracksChanged(eventTime, trackGroups, trackSelections)); } + @Override + public void onTracksInfoChanged(TracksInfo tracksInfo) { + EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); + sendEvent( + eventTime, + AnalyticsListener.EVENT_TRACKS_CHANGED, + listener -> listener.onTracksInfoChanged(eventTime, tracksInfo)); + } + @SuppressWarnings("deprecation") // Calling deprecated listener method. @Override public final void onIsLoadingChanged(boolean isLoading) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index 0fca47cf56..9887f397ea 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Player.PlaybackSuppressionReason; import com.google.android.exoplayer2.Player.TimelineChangeReason; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.decoder.DecoderCounters; @@ -221,7 +222,8 @@ public interface AnalyticsListener { */ int EVENT_MEDIA_ITEM_TRANSITION = Player.EVENT_MEDIA_ITEM_TRANSITION; /** - * {@link Player#getCurrentTrackGroups()} or {@link Player#getCurrentTrackSelections()} changed. + * {@link Player#getCurrentTracksInfo()}, {@link Player#getCurrentTrackGroups()} or {@link + * Player#getCurrentTrackSelections()} changed. */ int EVENT_TRACKS_CHANGED = Player.EVENT_TRACKS_CHANGED; /** {@link Player#isLoading()} ()} changed. */ @@ -674,10 +676,20 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param trackGroups The available tracks. May be empty. * @param trackSelections The track selections for each renderer. May contain null elements. + * @deprecated Use {@link #onTracksInfoChanged}. */ + @Deprecated default void onTracksChanged( EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} + /** + * Called when the available or selected tracks change. + * + * @param eventTime The event time. + * @param tracksInfo The available tracks information. Never null, but may be of length zero. + */ + default void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) {} + /** * Called when the combined {@link MediaMetadata} changes. * 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 c45a69f45f..0287bb39b2 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 @@ -21,6 +21,7 @@ import static java.lang.Math.min; import android.util.Pair; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.FormatSupport; import com.google.android.exoplayer2.ExoPlaybackException; @@ -30,11 +31,13 @@ import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport; import com.google.android.exoplayer2.RendererCapabilities.Capabilities; import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableList; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -106,7 +109,7 @@ public abstract class MappingTrackSelector extends TrackSelector { * renderer, track group and track (in that order). * @param unmappedTrackGroups {@link TrackGroup}s not mapped to any renderer. */ - @SuppressWarnings("deprecation") + @VisibleForTesting /* package */ MappedTrackInfo( String[] rendererNames, @C.TrackType int[] rendererTrackTypes, @@ -144,7 +147,7 @@ public abstract class MappingTrackSelector extends TrackSelector { * * @see Renderer#getTrackType() * @param rendererIndex The renderer index. - * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. + * @return The {@link C.TrackType} of the renderer. */ public @C.TrackType int getRendererType(int rendererIndex) { return rendererTrackTypes[rendererIndex]; @@ -279,6 +282,7 @@ public abstract class MappingTrackSelector extends TrackSelector { String firstSampleMimeType = null; for (int i = 0; i < trackIndices.length; i++) { int trackIndex = trackIndices[i]; + @Nullable String sampleMimeType = rendererTrackGroups[rendererIndex].get(groupIndex).getFormat(trackIndex).sampleMimeType; if (handledTrackCount++ == 0) { @@ -406,7 +410,10 @@ public abstract class MappingTrackSelector extends TrackSelector { rendererMixedMimeTypeAdaptationSupports, periodId, timeline); - return new TrackSelectorResult(result.first, result.second, mappedTrackInfo); + + TracksInfo tracksInfo = buildTracksInfo(result.second, mappedTrackInfo); + + return new TrackSelectorResult(result.first, result.second, tracksInfo, mappedTrackInfo); } /** @@ -536,4 +543,49 @@ public abstract class MappingTrackSelector extends TrackSelector { } return mixedMimeTypeAdaptationSupport; } + + @VisibleForTesting + /* package */ static TracksInfo buildTracksInfo( + @NullableType TrackSelection[] selections, MappedTrackInfo mappedTrackInfo) { + ImmutableList.Builder builder = new ImmutableList.Builder<>(); + for (int rendererIndex = 0; + rendererIndex < mappedTrackInfo.getRendererCount(); + rendererIndex++) { + TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex); + @Nullable TrackSelection trackSelection = selections[rendererIndex]; + for (int groupIndex = 0; groupIndex < trackGroupArray.length; groupIndex++) { + TrackGroup trackGroup = trackGroupArray.get(groupIndex); + @C.FormatSupport int[] trackSupport = new int[trackGroup.length]; + boolean[] selected = new boolean[trackGroup.length]; + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + trackSupport[trackIndex] = + mappedTrackInfo.getTrackSupport(rendererIndex, groupIndex, trackIndex); + // Suppressing reference equality warning because the track group stored in the track + // selection must point to the exact track group object to be considered part of it. + @SuppressWarnings("ReferenceEquality") + boolean isTrackSelected = + (trackSelection != null) + && (trackSelection.getTrackGroup() == trackGroup) + && (trackSelection.indexOf(trackIndex) != C.INDEX_UNSET); + selected[trackIndex] = isTrackSelected; + } + @C.TrackType int trackGroupType = mappedTrackInfo.getRendererType(rendererIndex); + builder.add( + new TracksInfo.TrackGroupInfo(trackGroup, trackSupport, trackGroupType, selected)); + } + } + TrackGroupArray unmappedTrackGroups = mappedTrackInfo.getUnmappedTrackGroups(); + for (int groupIndex = 0; groupIndex < unmappedTrackGroups.length; groupIndex++) { + TrackGroup trackGroup = unmappedTrackGroups.get(groupIndex); + @C.FormatSupport int[] trackSupport = new int[trackGroup.length]; + Arrays.fill(trackSupport, C.FORMAT_UNSUPPORTED_TYPE); + // A track group only contains tracks of the same type, thus only consider the first track. + @C.TrackType + int trackGroupType = MimeTypes.getTrackType(trackGroup.getFormat(0).sampleMimeType); + boolean[] selected = new boolean[trackGroup.length]; // Initialized to false. + builder.add( + new TracksInfo.TrackGroupInfo(trackGroup, trackSupport, trackGroupType, selected)); + } + return new TracksInfo(builder.build()); + } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectorResult.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectorResult.java index e7f0caaedf..a7bef4324b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectorResult.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectorResult.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.trackselection; import androidx.annotation.Nullable; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.util.Util; import org.checkerframework.checker.nullness.compatqual.NullableType; @@ -32,6 +33,8 @@ public final class TrackSelectorResult { public final @NullableType RendererConfiguration[] rendererConfigurations; /** A {@link ExoTrackSelection} array containing the track selection for each renderer. */ public final @NullableType ExoTrackSelection[] selections; + /** Describe the tracks and which one were selected. */ + public final TracksInfo tracksInfo; /** * An opaque object that will be returned to {@link TrackSelector#onSelectionActivated(Object)} * should the selections be activated. @@ -45,13 +48,34 @@ public final class TrackSelectorResult { * @param info An opaque object that will be returned to {@link * TrackSelector#onSelectionActivated(Object)} should the selection be activated. May be * {@code null}. + * @deprecated Use {@link #TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], + * TracksInfo, Object)}. */ + @Deprecated public TrackSelectorResult( @NullableType RendererConfiguration[] rendererConfigurations, @NullableType ExoTrackSelection[] selections, @Nullable Object info) { + this(rendererConfigurations, selections, TracksInfo.EMPTY, info); + } + + /** + * @param rendererConfigurations A {@link RendererConfiguration} for each renderer. A null entry + * indicates the corresponding renderer should be disabled. + * @param selections A {@link ExoTrackSelection} array containing the selection for each renderer. + * @param tracksInfo Description of the available tracks and which one were selected. + * @param info An opaque object that will be returned to {@link + * TrackSelector#onSelectionActivated(Object)} should the selection be activated. May be + * {@code null}. + */ + public TrackSelectorResult( + @NullableType RendererConfiguration[] rendererConfigurations, + @NullableType ExoTrackSelection[] selections, + TracksInfo tracksInfo, + @Nullable Object info) { this.rendererConfigurations = rendererConfigurations; this.selections = selections.clone(); + this.tracksInfo = tracksInfo; this.info = info; length = rendererConfigurations.length; } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 105a90471b..1de7410140 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -23,6 +23,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_GET_DEVICE_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_GET_MEDIA_ITEMS_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_GET_TEXT; import static com.google.android.exoplayer2.Player.COMMAND_GET_TIMELINE; +import static com.google.android.exoplayer2.Player.COMMAND_GET_TRACK_INFOS; import static com.google.android.exoplayer2.Player.COMMAND_GET_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP; @@ -8344,6 +8345,7 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SET_VIDEO_SURFACE)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_GET_TEXT)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SET_TRACK_SELECTION_PARAMETERS)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_GET_TRACK_INFOS)).isTrue(); } @Test @@ -11238,7 +11240,8 @@ public final class ExoPlayerTest { COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_SET_VIDEO_SURFACE, COMMAND_GET_TEXT, - COMMAND_SET_TRACK_SELECTION_PARAMETERS); + COMMAND_SET_TRACK_SELECTION_PARAMETERS, + COMMAND_GET_TRACK_INFOS); if (!isTimelineEmpty) { builder.add(COMMAND_SEEK_TO_PREVIOUS); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java index 58d0d0c47b..635167e658 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java @@ -771,7 +771,10 @@ public final class MediaPeriodQueueTest { mediaSourceList, getNextMediaPeriodInfo(), new TrackSelectorResult( - new RendererConfiguration[0], new ExoTrackSelection[0], /* info= */ null)); + new RendererConfiguration[0], + new ExoTrackSelection[0], + TracksInfo.EMPTY, + /* info= */ null)); } private void clear() { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 0753464f04..4be75e1443 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -84,6 +84,7 @@ import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Window; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmInitData; @@ -100,7 +101,6 @@ import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.testutil.ActionSchedule; import com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable; @@ -115,7 +115,6 @@ import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinit import com.google.android.exoplayer2.testutil.FakeVideoRenderer; import com.google.android.exoplayer2.testutil.TestExoPlayerBuilder; import com.google.android.exoplayer2.testutil.TestUtil; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.MimeTypes; @@ -2224,8 +2223,7 @@ public final class AnalyticsCollectorTest { } @Override - public void onTracksChanged( - EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { reportedEvents.add(new ReportedEvent(EVENT_TRACKS_CHANGED, eventTime)); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 146e670798..e04a0530a7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -50,6 +51,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationLi import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.HashMap; @@ -1717,6 +1719,32 @@ public final class DefaultTrackSelectorTest { assertFixedSelection(result.selections[0], trackGroups, formatAac); } + /** Tests audio track selection when there are multiple audio renderers. */ + @Test + public void selectTracks_multipleRenderer_allSelected() throws Exception { + RendererCapabilities[] rendererCapabilities = + new RendererCapabilities[] {VIDEO_CAPABILITIES, AUDIO_CAPABILITIES, AUDIO_CAPABILITIES}; + TrackGroupArray trackGroups = new TrackGroupArray(AUDIO_TRACK_GROUP); + + TrackSelectorResult result = + trackSelector.selectTracks(rendererCapabilities, trackGroups, periodId, TIMELINE); + + assertThat(result.length).isEqualTo(3); + assertThat(result.rendererConfigurations) + .asList() + .containsExactly(null, DEFAULT, null) + .inOrder(); + assertThat(result.selections[0]).isNull(); + assertFixedSelection(result.selections[1], trackGroups, trackGroups.get(0).getFormat(0)); + assertThat(result.selections[2]).isNull(); + ImmutableList trackGroupInfos = + result.tracksInfo.getTrackGroupInfos(); + assertThat(trackGroupInfos).hasSize(1); + assertThat(trackGroupInfos.get(0).getTrackGroup()).isEqualTo(AUDIO_TRACK_GROUP); + assertThat(trackGroupInfos.get(0).isTrackSelected(0)).isTrue(); + assertThat(trackGroupInfos.get(0).getTrackSupport(0)).isEqualTo(FORMAT_HANDLED); + } + private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) { assertThat(result.length).isEqualTo(expected.length); for (int i = 0; i < expected.length; i++) { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java index 9a01f85aa9..ab1d3c14cc 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java @@ -27,12 +27,15 @@ import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport; import com.google.android.exoplayer2.RendererCapabilities.Capabilities; import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.TracksInfo.TrackGroupInfo; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.testutil.FakeTimeline; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableList; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -129,6 +132,61 @@ public final class MappingTrackSelectorTest { return new TrackGroup(new Format.Builder().setSampleMimeType(sampleMimeType).build()); } + @Test + public void buildTrackInfos_withTestValues_isAsExpected() { + MappingTrackSelector.MappedTrackInfo mappedTrackInfo = + new MappingTrackSelector.MappedTrackInfo( + new String[] {"1", "2"}, + new int[] {C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO}, + new TrackGroupArray[] { + new TrackGroupArray( + new TrackGroup(new Format.Builder().build()), + new TrackGroup(new Format.Builder().build())), + new TrackGroupArray( + new TrackGroup(new Format.Builder().build(), new Format.Builder().build())) + }, + new int[] { + RendererCapabilities.ADAPTIVE_SEAMLESS, RendererCapabilities.ADAPTIVE_NOT_SUPPORTED + }, + new int[][][] { + new int[][] {new int[] {C.FORMAT_HANDLED}, new int[] {C.FORMAT_UNSUPPORTED_SUBTYPE}}, + new int[][] {new int[] {C.FORMAT_UNSUPPORTED_DRM, C.FORMAT_EXCEEDS_CAPABILITIES}} + }, + new TrackGroupArray(new TrackGroup(new Format.Builder().build()))); + TrackSelection[] selections = + new TrackSelection[] { + new FixedTrackSelection(mappedTrackInfo.getTrackGroups(0).get(1), 0), + new FixedTrackSelection(mappedTrackInfo.getTrackGroups(1).get(0), 1) + }; + + TracksInfo tracksInfo = MappingTrackSelector.buildTracksInfo(selections, mappedTrackInfo); + + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + assertThat(trackGroupInfos).hasSize(4); + assertThat(trackGroupInfos.get(0).getTrackGroup()) + .isEqualTo(mappedTrackInfo.getTrackGroups(0).get(0)); + assertThat(trackGroupInfos.get(1).getTrackGroup()) + .isEqualTo(mappedTrackInfo.getTrackGroups(0).get(1)); + assertThat(trackGroupInfos.get(2).getTrackGroup()) + .isEqualTo(mappedTrackInfo.getTrackGroups(1).get(0)); + assertThat(trackGroupInfos.get(3).getTrackGroup()) + .isEqualTo(mappedTrackInfo.getUnmappedTrackGroups().get(0)); + assertThat(trackGroupInfos.get(0).getTrackSupport(0)).isEqualTo(C.FORMAT_HANDLED); + assertThat(trackGroupInfos.get(1).getTrackSupport(0)).isEqualTo(C.FORMAT_UNSUPPORTED_SUBTYPE); + assertThat(trackGroupInfos.get(2).getTrackSupport(0)).isEqualTo(C.FORMAT_UNSUPPORTED_DRM); + assertThat(trackGroupInfos.get(2).getTrackSupport(1)).isEqualTo(C.FORMAT_EXCEEDS_CAPABILITIES); + assertThat(trackGroupInfos.get(3).getTrackSupport(0)).isEqualTo(C.FORMAT_UNSUPPORTED_TYPE); + assertThat(trackGroupInfos.get(0).isTrackSelected(0)).isFalse(); + assertThat(trackGroupInfos.get(1).isTrackSelected(0)).isTrue(); + assertThat(trackGroupInfos.get(2).isTrackSelected(0)).isFalse(); + assertThat(trackGroupInfos.get(2).isTrackSelected(1)).isTrue(); + assertThat(trackGroupInfos.get(3).isTrackSelected(0)).isFalse(); + assertThat(trackGroupInfos.get(0).getTrackType()).isEqualTo(C.TRACK_TYPE_AUDIO); + assertThat(trackGroupInfos.get(1).getTrackType()).isEqualTo(C.TRACK_TYPE_AUDIO); + assertThat(trackGroupInfos.get(2).getTrackType()).isEqualTo(C.TRACK_TYPE_VIDEO); + assertThat(trackGroupInfos.get(3).getTrackType()).isEqualTo(C.TRACK_TYPE_UNKNOWN); + } + /** * A {@link MappingTrackSelector} that stashes the {@link MappedTrackInfo} passed to {@link * #selectTracks(MappedTrackInfo, int[][][], int[], MediaPeriodId, Timeline)}. diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 7e7ead9440..7c6ba909c9 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -45,6 +45,7 @@ import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; @@ -53,10 +54,8 @@ import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceFactory; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; @@ -636,8 +635,7 @@ public final class Transformer { } @Override - public void onTracksChanged( - EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { if (muxerWrapper.getTrackCount() == 0) { handleTransformationEnded( new IllegalStateException( diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index d96170d4e2..53255ff69d 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -56,7 +56,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; -import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; @@ -1511,7 +1511,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { } @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray selections) { + public void onTracksInfoChanged(TracksInfo tracksInfo) { // Suppress the update if transitioning to an unprepared period within the same window. This // is necessary to avoid closing the shutter when such a transition occurs. See: // https://github.com/google/ExoPlayer/issues/5507. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 72534209dc..6a30814673 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -57,7 +57,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; -import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; @@ -1551,7 +1551,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { } @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray selections) { + public void onTracksInfoChanged(TracksInfo tracksInfo) { // Suppress the update if transitioning to an unprepared period within the same window. This // is necessary to avoid closing the shutter when such a transition occurs. See: // https://github.com/google/ExoPlayer/issues/5507. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index d3cd7fccaf..4096548a5c 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -38,9 +38,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.HandlerWrapper; @@ -383,7 +381,6 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul private SimpleExoPlayer player; private Exception exception; - private TrackGroupArray trackGroups; private boolean playerWasPrepared; private ExoPlayerTestRunner( @@ -562,17 +559,6 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul assertThat(playbackStates).containsExactlyElementsIn(states).inOrder(); } - /** - * Asserts that the last track group array reported by {@link - * Player.Listener#onTracksChanged(TrackGroupArray, TrackSelectionArray)} is equal to the provided - * track group array. - * - * @param trackGroupArray The expected {@link TrackGroupArray}. - */ - public void assertTrackGroupsEqual(TrackGroupArray trackGroupArray) { - assertThat(this.trackGroups).isEqualTo(trackGroupArray); - } - /** * Asserts that {@link Player.Listener#onPositionDiscontinuity(Player.PositionInfo, * Player.PositionInfo, int)} was not called. @@ -656,11 +642,6 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul mediaItemTransitionReasons.add(reason); } - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - this.trackGroups = trackGroups; - } - @Override public void onPlaybackStateChanged(@Player.State int playbackState) { playbackStates.add(playbackState); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 72efc2b81b..db307b52db 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -33,6 +33,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.source.MediaSource; @@ -463,6 +464,11 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public TracksInfo getCurrentTracksInfo() { + throw new UnsupportedOperationException(); + } + @Override public TrackSelectionParameters getTrackSelectionParameters() { throw new UnsupportedOperationException(); From 80d365163d7d5ecefff84fd3c1707467b3228eb6 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 5 Oct 2021 11:53:35 +0100 Subject: [PATCH 277/441] Rollback of https://github.com/google/ExoPlayer/commit/912c47ff6f4abc88d33665d27da33ec7997358ef *** Original commit *** Rollback of https://github.com/google/ExoPlayer/commit/8ed6c9fcf5e22ad859023703e479e21b2f578f83 *** Original commit *** Fix capitalization of language in track selector Issue: #9452 *** *** PiperOrigin-RevId: 400942287 --- RELEASENOTES.md | 2 + .../google/android/exoplayer2/util/Util.java | 5 +++ .../ui/DefaultTrackNameProvider.java | 21 ++++++++-- .../ui/DefaultTrackNameProviderTest.java | 41 +++++++++++++++++++ 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 library/ui/src/test/java/com/google/android/exoplayer2/ui/DefaultTrackNameProviderTest.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c880d831e8..c376d3165d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -39,6 +39,8 @@ `Player.addListener`. * Fix initial timestamp display in `PlayerControlView` ([#9524](https://github.com/google/ExoPlayer/issues/9254)). + * Fix capitalization of languages in the track selector + ([#9452](https://github.com/google/ExoPlayer/issues/9452)). * Extractors: * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. 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 e5bd28aca2..27a0d93670 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 @@ -2243,6 +2243,11 @@ public final class Util { return systemLocales; } + /** Returns the default {@link Locale.Category#DISPLAY DISPLAY} {@link Locale}. */ + public static Locale getDefaultDisplayLocale() { + return Util.SDK_INT >= 24 ? Locale.getDefault(Locale.Category.DISPLAY) : Locale.getDefault(); + } + /** * Uncompresses the data in {@code input}. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java index a3d20eadb7..59fde6950f 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTrackNameProvider.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.ui; import android.content.res.Resources; import android.text.TextUtils; +import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.Assertions; @@ -100,12 +101,26 @@ public class DefaultTrackNameProvider implements TrackNameProvider { } private String buildLanguageString(Format format) { - String language = format.language; + @Nullable String language = format.language; if (TextUtils.isEmpty(language) || C.LANGUAGE_UNDETERMINED.equals(language)) { return ""; } - Locale locale = Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); - return locale.getDisplayName(); + Locale languageLocale = + Util.SDK_INT >= 21 ? Locale.forLanguageTag(language) : new Locale(language); + Locale displayLocale = Util.getDefaultDisplayLocale(); + String languageName = languageLocale.getDisplayName(displayLocale); + if (TextUtils.isEmpty(languageName)) { + return ""; + } + try { + // Capitalize the first letter. See: https://github.com/google/ExoPlayer/issues/9452. + int firstCodePointLength = languageName.offsetByCodePoints(0, 1); + return languageName.substring(0, firstCodePointLength).toUpperCase(displayLocale) + + languageName.substring(firstCodePointLength); + } catch (IndexOutOfBoundsException e) { + // Should never happen, but return the unmodified language name if it does. + return languageName; + } } private String buildRoleString(Format format) { diff --git a/library/ui/src/test/java/com/google/android/exoplayer2/ui/DefaultTrackNameProviderTest.java b/library/ui/src/test/java/com/google/android/exoplayer2/ui/DefaultTrackNameProviderTest.java new file mode 100644 index 0000000000..a5ea81f259 --- /dev/null +++ b/library/ui/src/test/java/com/google/android/exoplayer2/ui/DefaultTrackNameProviderTest.java @@ -0,0 +1,41 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.ui; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.res.Resources; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.Format; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for the {@link DefaultMediaDescriptionAdapter}. */ +@RunWith(AndroidJUnit4.class) +public class DefaultTrackNameProviderTest { + + @Test + public void getTrackName_handlesInvalidLanguage() { + Resources resources = ApplicationProvider.getApplicationContext().getResources(); + DefaultTrackNameProvider provider = new DefaultTrackNameProvider(resources); + Format format = new Format.Builder().setLanguage("```").build(); + + String name = provider.getTrackName(format); + + assertThat(name).isEqualTo(resources.getString(R.string.exo_track_unknown)); + } +} From 3eda590c875ac07f4ec16c09f5f68322f2890715 Mon Sep 17 00:00:00 2001 From: claincly Date: Tue, 5 Oct 2021 14:34:04 +0100 Subject: [PATCH 278/441] Rollback of https://github.com/google/ExoPlayer/commit/9788750ddb23b2064dddf99d6e1ea491b2e45cea *** Original commit *** Simplify GL program handling. *** PiperOrigin-RevId: 400970170 --- .../gldemo/BitmapOverlayVideoProcessor.java | 45 +-- .../android/exoplayer2/util/GlUtil.java | 289 ++++++++---------- .../video/VideoDecoderGLSurfaceView.java | 20 +- .../video/spherical/ProjectionRenderer.java | 23 +- .../TransformerTranscodingVideoRenderer.java | 20 +- 5 files changed, 168 insertions(+), 229 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java index cbc2bfe30c..13e2a60684 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java @@ -15,8 +15,6 @@ */ package com.google.android.exoplayer2.gldemo; -import static com.google.android.exoplayer2.util.Assertions.checkNotNull; - import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -28,6 +26,7 @@ import android.opengl.GLES20; import android.opengl.GLUtils; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.GlUtil; import java.io.IOException; import java.util.Locale; @@ -50,7 +49,7 @@ import javax.microedition.khronos.opengles.GL10; private final Bitmap logoBitmap; private final Canvas overlayCanvas; - @Nullable private GlUtil.Program program; + private int program; @Nullable private GlUtil.Attribute[] attributes; @Nullable private GlUtil.Uniform[] uniforms; @@ -78,40 +77,27 @@ import javax.microedition.khronos.opengles.GL10; @Override public void initialize() { + String vertexShaderCode; + String fragmentShaderCode; try { - program = - new GlUtil.Program( - context, - /* vertexShaderFilePath= */ "bitmap_overlay_video_processor_vertex.glsl", - /* fragmentShaderFilePath= */ "bitmap_overlay_video_processor_fragment.glsl"); + vertexShaderCode = GlUtil.loadAsset(context, "bitmap_overlay_video_processor_vertex.glsl"); + fragmentShaderCode = + GlUtil.loadAsset(context, "bitmap_overlay_video_processor_fragment.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - program.use(); - GlUtil.Attribute[] attributes = program.getAttributes(); + program = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); + GlUtil.Attribute[] attributes = GlUtil.getAttributes(program); + GlUtil.Uniform[] uniforms = GlUtil.getUniforms(program); for (GlUtil.Attribute attribute : attributes) { if (attribute.name.equals("a_position")) { - attribute.setBuffer( - new float[] { - -1, -1, 0, 1, - 1, -1, 0, 1, - -1, 1, 0, 1, - 1, 1, 0, 1 - }, - 4); + attribute.setBuffer(new float[] {-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, 1, 1, 0, 1}, 4); } else if (attribute.name.equals("a_texcoord")) { - attribute.setBuffer( - new float[] { - 0, 0, 0, 1, - 1, 0, 0, 1, - 0, 1, 0, 1, - 1, 1, 0, 1 - }, - 4); + attribute.setBuffer(new float[] {0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1}, 4); } } this.attributes = attributes; - this.uniforms = checkNotNull(program).getUniforms(); + this.uniforms = uniforms; GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); GLES20.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); @@ -140,8 +126,9 @@ import javax.microedition.khronos.opengles.GL10; GlUtil.checkGlError(); // Run the shader program. - GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms); - GlUtil.Attribute[] attributes = checkNotNull(this.attributes); + GlUtil.Uniform[] uniforms = Assertions.checkNotNull(this.uniforms); + GlUtil.Attribute[] attributes = Assertions.checkNotNull(this.attributes); + GLES20.glUseProgram(program); for (GlUtil.Uniform uniform : uniforms) { switch (uniform.name) { case "tex_sampler_0": diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index a46e6ca21c..a0643ad393 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -54,160 +54,6 @@ public final class GlUtil { /** Thrown when the required EGL version is not supported by the device. */ public static final class UnsupportedEglVersionException extends Exception {} - /** GL program. */ - public static final class Program { - /** The identifier of a compiled and linked GLSL shader program. */ - private final int programId; - - /** - * Compiles a GL shader program from vertex and fragment shader code. - * - * @param vertexShaderCode GLES20 vertex shader program. - * @param fragmentShaderCode GLES20 fragment shader program. - */ - public Program(String vertexShaderCode, String fragmentShaderCode) { - programId = GLES20.glCreateProgram(); - checkGlError(); - - // Add the vertex and fragment shaders. - addShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); - addShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); - - // Link and check for errors. - GLES20.glLinkProgram(programId); - int[] linkStatus = new int[] {GLES20.GL_FALSE}; - GLES20.glGetProgramiv(programId, GLES20.GL_LINK_STATUS, linkStatus, 0); - if (linkStatus[0] != GLES20.GL_TRUE) { - throwGlException( - "Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(programId)); - } - checkGlError(); - } - - /** - * Compiles a GL shader program from vertex and fragment shader code. - * - * @param context The {@link Context}. - * @param vertexShaderFilePath The path to a GLES20 vertex shader program. - * @param fragmentShaderFilePath The path to a fragment shader program. - * @throws IOException When failing to read the shader files. - */ - public Program(Context context, String vertexShaderFilePath, String fragmentShaderFilePath) - throws IOException { - this(loadAsset(context, vertexShaderFilePath), loadAsset(context, fragmentShaderFilePath)); - } - - /** - * Compiles a GL shader program from vertex and fragment shader code. - * - * @param vertexShaderCode GLES20 vertex shader program as arrays of strings. Strings are joined - * by adding a new line character in between each of them. - * @param fragmentShaderCode GLES20 fragment shader program as arrays of strings. Strings are - * joined by adding a new line character in between each of them. - */ - public Program(String[] vertexShaderCode, String[] fragmentShaderCode) { - this(TextUtils.join("\n", vertexShaderCode), TextUtils.join("\n", fragmentShaderCode)); - } - - /** Uses the program. */ - public void use() { - GLES20.glUseProgram(programId); - } - - /** Deletes the program. Deleted programs cannot be used again. */ - public void delete() { - GLES20.glDeleteProgram(programId); - } - - /** Returns the location of an {@link Attribute}. */ - public int glGetAttribLocation(String attributeName) { - return GLES20.glGetAttribLocation(programId, attributeName); - } - - /** Returns the location of a {@link Uniform}. */ - public int glGetUniformLocation(String uniformName) { - return GLES20.glGetUniformLocation(programId, uniformName); - } - - /** Returns the program's {@link Attribute}s. */ - public Attribute[] getAttributes() { - int[] attributeCount = new int[1]; - GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); - if (attributeCount[0] != 2) { - throw new IllegalStateException("Expected two attributes."); - } - - Attribute[] attributes = new Attribute[attributeCount[0]]; - for (int i = 0; i < attributeCount[0]; i++) { - attributes[i] = createAttribute(i); - } - return attributes; - } - - /** Returns the program's {@link Uniform}s. */ - public Uniform[] getUniforms() { - int[] uniformCount = new int[1]; - GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); - - Uniform[] uniforms = new Uniform[uniformCount[0]]; - for (int i = 0; i < uniformCount[0]; i++) { - uniforms[i] = createUniform(i); - } - - return uniforms; - } - - private Uniform createUniform(int index) { - int[] length = new int[1]; - GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, length, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] name = new byte[length[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveUniform(programId, index, length[0], ignore, 0, size, 0, type, 0, name, 0); - String nameString = new String(name, 0, strlen(name)); - int location = glGetAttribLocation(nameString); - int typeInt = type[0]; - - return new Uniform(nameString, location, typeInt); - } - - private Attribute createAttribute(int index) { - int[] length = new int[1]; - GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, length, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] nameBytes = new byte[length[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveAttrib( - programId, index, length[0], ignore, 0, size, 0, type, 0, nameBytes, 0); - String name = new String(nameBytes, 0, strlen(nameBytes)); - int location = glGetAttribLocation(name); - - return new Attribute(name, index, location); - } - - private void addShader(int type, String shaderCode) { - int shader = GLES20.glCreateShader(type); - GLES20.glShaderSource(shader, shaderCode); - GLES20.glCompileShader(shader); - - int[] result = new int[] {GLES20.GL_FALSE}; - GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); - if (result[0] != GLES20.GL_TRUE) { - throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + shaderCode); - } - - GLES20.glAttachShader(programId, shader); - GLES20.glDeleteShader(shader); - checkGlError(); - } - } - /** * GL attribute, which can be attached to a buffer with {@link Attribute#setBuffer(float[], int)}. */ @@ -222,11 +68,26 @@ public final class GlUtil { @Nullable private Buffer buffer; private int size; - /** Creates a new GL attribute. */ - public Attribute(String name, int index, int location) { - this.name = name; + /** + * Creates a new GL attribute. + * + * @param program The identifier of a compiled and linked GLSL shader program. + * @param index The index of the attribute. After this instance has been constructed, the name + * of the attribute is available via the {@link #name} field. + */ + public Attribute(int program, int index) { + int[] len = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, len, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] nameBytes = new byte[len[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveAttrib(program, index, len[0], ignore, 0, size, 0, type, 0, nameBytes, 0); + name = new String(nameBytes, 0, strlen(nameBytes)); + location = GLES20.glGetAttribLocation(program, name); this.index = index; - this.location = location; } /** @@ -276,12 +137,28 @@ public final class GlUtil { private int texId; private int unit; - /** Creates a new GL uniform. */ - public Uniform(String name, int location, int type) { - this.name = name; - this.location = location; - this.type = type; - this.value = new float[16]; + /** + * Creates a new GL uniform. + * + * @param program The identifier of a compiled and linked GLSL shader program. + * @param index The index of the uniform. After this instance has been constructed, the name of + * the uniform is available via the {@link #name} field. + */ + public Uniform(int program, int index) { + int[] len = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, len, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] name = new byte[len[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveUniform(program, index, len[0], ignore, 0, size, 0, type, 0, name, 0); + this.name = new String(name, 0, strlen(name)); + location = GLES20.glGetUniformLocation(program, this.name); + this.type = type[0]; + + value = new float[16]; } /** @@ -455,6 +332,74 @@ public final class GlUtil { Api17.focusSurface(eglDisplay, eglContext, surface, width, height); } + /** + * Builds a GL shader program from vertex and fragment shader code. + * + * @param vertexCode GLES20 vertex shader program as arrays of strings. Strings are joined by + * adding a new line character in between each of them. + * @param fragmentCode GLES20 fragment shader program as arrays of strings. Strings are joined by + * adding a new line character in between each of them. + * @return GLES20 program id. + */ + public static int compileProgram(String[] vertexCode, String[] fragmentCode) { + return compileProgram(TextUtils.join("\n", vertexCode), TextUtils.join("\n", fragmentCode)); + } + + /** + * Builds a GL shader program from vertex and fragment shader code. + * + * @param vertexCode GLES20 vertex shader program. + * @param fragmentCode GLES20 fragment shader program. + * @return GLES20 program id. + */ + public static int compileProgram(String vertexCode, String fragmentCode) { + int program = GLES20.glCreateProgram(); + checkGlError(); + + // Add the vertex and fragment shaders. + addShader(GLES20.GL_VERTEX_SHADER, vertexCode, program); + addShader(GLES20.GL_FRAGMENT_SHADER, fragmentCode, program); + + // Link and check for errors. + GLES20.glLinkProgram(program); + int[] linkStatus = new int[] {GLES20.GL_FALSE}; + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + throwGlException("Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(program)); + } + checkGlError(); + + return program; + } + + /** Returns the {@link Attribute}s in the specified {@code program}. */ + public static Attribute[] getAttributes(int program) { + int[] attributeCount = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); + if (attributeCount[0] != 2) { + throw new IllegalStateException("Expected two attributes."); + } + + Attribute[] attributes = new Attribute[attributeCount[0]]; + for (int i = 0; i < attributeCount[0]; i++) { + attributes[i] = new Attribute(program, i); + } + return attributes; + } + + /** Returns the {@link Uniform}s in the specified {@code program}. */ + public static Uniform[] getUniforms(int program) { + int[] uniformCount = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); + + Uniform[] uniforms = new Uniform[uniformCount[0]]; + for (int i = 0; i < uniformCount[0]; i++) { + uniforms[i] = new Uniform(program, i); + } + + return uniforms; + } + /** * Deletes a GL texture. * @@ -533,6 +478,22 @@ public final class GlUtil { return texId[0]; } + private static void addShader(int type, String source, int program) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + + int[] result = new int[] {GLES20.GL_FALSE}; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); + if (result[0] != GLES20.GL_TRUE) { + throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + source); + } + + GLES20.glAttachShader(program, shader); + GLES20.glDeleteShader(shader); + checkGlError(); + } + private static void throwGlException(String errorMsg) { Log.e(TAG, errorMsg); if (glAssertionsEnabled) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java index 756f5ed7ee..f47a76760f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java @@ -15,8 +15,6 @@ */ package com.google.android.exoplayer2.video; -import static com.google.android.exoplayer2.util.Assertions.checkNotNull; - import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; @@ -142,7 +140,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView // glDrawArrays uses it. private final FloatBuffer[] textureCoords; - @Nullable private GlUtil.Program program; + private int program; private int colorMatrixLocation; // Accessed only from the GL thread. @@ -163,9 +161,9 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView @Override public void onSurfaceCreated(GL10 unused, EGLConfig config) { - program = new GlUtil.Program(VERTEX_SHADER, FRAGMENT_SHADER); - program.use(); - int posLocation = program.glGetAttribLocation("in_pos"); + program = GlUtil.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER); + GLES20.glUseProgram(program); + int posLocation = GLES20.glGetAttribLocation(program, "in_pos"); GLES20.glEnableVertexAttribArray(posLocation); GLES20.glVertexAttribPointer( posLocation, @@ -174,14 +172,14 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView /* normalized= */ false, /* stride= */ 0, TEXTURE_VERTICES); - texLocations[0] = checkNotNull(program).glGetAttribLocation("in_tc_y"); + texLocations[0] = GLES20.glGetAttribLocation(program, "in_tc_y"); GLES20.glEnableVertexAttribArray(texLocations[0]); - texLocations[1] = checkNotNull(program).glGetAttribLocation("in_tc_u"); + texLocations[1] = GLES20.glGetAttribLocation(program, "in_tc_u"); GLES20.glEnableVertexAttribArray(texLocations[1]); - texLocations[2] = checkNotNull(program).glGetAttribLocation("in_tc_v"); + texLocations[2] = GLES20.glGetAttribLocation(program, "in_tc_v"); GLES20.glEnableVertexAttribArray(texLocations[2]); GlUtil.checkGlError(); - colorMatrixLocation = checkNotNull(program).glGetUniformLocation("mColorConversion"); + colorMatrixLocation = GLES20.glGetUniformLocation(program, "mColorConversion"); GlUtil.checkGlError(); setupTextures(); GlUtil.checkGlError(); @@ -298,7 +296,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView private void setupTextures() { GLES20.glGenTextures(3, yuvTextures, /* offset= */ 0); for (int i = 0; i < 3; i++) { - GLES20.glUniform1i(checkNotNull(program).glGetUniformLocation(TEXTURE_UNIFORMS[i]), i); + GLES20.glUniform1i(GLES20.glGetUniformLocation(program, TEXTURE_UNIFORMS[i]), i); GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]); GLES20.glTexParameterf( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java index 8f59f53718..4ba5dcca08 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.video.spherical; -import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.GlUtil.checkGlError; import android.opengl.GLES11Ext; @@ -91,12 +90,11 @@ import java.nio.FloatBuffer; }; private int stereoMode; - - @Nullable private GlUtil.Program program; @Nullable private MeshData leftMeshData; @Nullable private MeshData rightMeshData; // Program related GL items. These are only valid if program != 0. + private int program; private int mvpMatrixHandle; private int uTexMatrixHandle; private int positionHandle; @@ -121,12 +119,12 @@ import java.nio.FloatBuffer; /** Initializes of the GL components. */ /* package */ void init() { - program = new GlUtil.Program(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); - mvpMatrixHandle = program.glGetUniformLocation("uMvpMatrix"); - uTexMatrixHandle = program.glGetUniformLocation("uTexMatrix"); - positionHandle = program.glGetAttribLocation("aPosition"); - texCoordsHandle = program.glGetAttribLocation("aTexCoords"); - textureHandle = program.glGetUniformLocation("uTexture"); + program = GlUtil.compileProgram(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); + mvpMatrixHandle = GLES20.glGetUniformLocation(program, "uMvpMatrix"); + uTexMatrixHandle = GLES20.glGetUniformLocation(program, "uTexMatrix"); + positionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + texCoordsHandle = GLES20.glGetAttribLocation(program, "aTexCoords"); + textureHandle = GLES20.glGetUniformLocation(program, "uTexture"); } /** @@ -145,7 +143,7 @@ import java.nio.FloatBuffer; } // Configure shader. - checkNotNull(program).use(); + GLES20.glUseProgram(program); checkGlError(); GLES20.glEnableVertexAttribArray(positionHandle); @@ -198,9 +196,8 @@ import java.nio.FloatBuffer; /** Cleans up the GL resources. */ /* package */ void shutdown() { - if (program != null) { - program.delete(); - program = null; + if (program != 0) { + GLES20.glDeleteProgram(program); } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 8064927f00..88e04a0b70 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -186,7 +186,6 @@ import java.nio.ByteBuffer; } eglSurface = GlUtil.getEglSurface(eglDisplay, checkNotNull(checkNotNull(encoder).getInputSurface())); - GlUtil.focusSurface( eglDisplay, eglContext, @@ -194,20 +193,17 @@ import java.nio.ByteBuffer; encoderConfigurationOutputFormat.width, encoderConfigurationOutputFormat.height); decoderTextureId = GlUtil.createExternalTexture(); - - GlUtil.Program copyProgram; + String vertexShaderCode; + String fragmentShaderCode; try { - copyProgram = - new GlUtil.Program( - context, - /* vertexShaderFilePath= */ "shaders/blit_vertex_shader.glsl", - /* fragmentShaderFilePath= */ "shaders/copy_external_fragment_shader.glsl"); + vertexShaderCode = GlUtil.loadAsset(context, "shaders/blit_vertex_shader.glsl"); + fragmentShaderCode = GlUtil.loadAsset(context, "shaders/copy_external_fragment_shader.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - - copyProgram.use(); - GlUtil.Attribute[] copyAttributes = copyProgram.getAttributes(); + int copyProgram = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); + GLES20.glUseProgram(copyProgram); + GlUtil.Attribute[] copyAttributes = GlUtil.getAttributes(copyProgram); checkState(copyAttributes.length == 2, "Expected program to have two vertex attributes."); for (GlUtil.Attribute copyAttribute : copyAttributes) { if (copyAttribute.name.equals("a_position")) { @@ -233,7 +229,7 @@ import java.nio.ByteBuffer; } copyAttribute.bind(); } - GlUtil.Uniform[] copyUniforms = copyProgram.getUniforms(); + GlUtil.Uniform[] copyUniforms = GlUtil.getUniforms(copyProgram); checkState(copyUniforms.length == 2, "Expected program to have two uniforms."); for (GlUtil.Uniform copyUniform : copyUniforms) { if (copyUniform.name.equals("tex_sampler")) { From 6d9b050a38f6a4a6cad1ff3c33a3cce1c49ab7d0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 5 Oct 2021 16:24:48 +0100 Subject: [PATCH 279/441] Add range annotations to Player volume and percentage methods These are the most likely to cause developer confusion due to potential ambiguity. PiperOrigin-RevId: 400990454 --- .../java/com/google/android/exoplayer2/Player.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 96f6e12487..9a89a19586 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -2127,6 +2127,7 @@ public interface Player { * Returns an estimate of the percentage in the current content window or ad up to which data is * buffered, or 0 if no estimate is available. */ + @IntRange(from = 0, to = 100) int getBufferedPercentage(); /** @@ -2211,17 +2212,19 @@ public interface Player { AudioAttributes getAudioAttributes(); /** - * Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). + * Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + * unchanged), inclusive. * * @param volume Linear output gain to apply to all audio channels. */ - void setVolume(@FloatRange(from = 0) float volume); + void setVolume(@FloatRange(from = 0, to = 1.0) float volume); /** * Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged). * * @return The linear gain applied to all audio channels. */ + @FloatRange(from = 0, to = 1.0) float getVolume(); /** @@ -2337,6 +2340,7 @@ public interface Player { *

        For devices with {@link DeviceInfo#PLAYBACK_TYPE_REMOTE remote playback}, the volume of the * remote device is returned. */ + @IntRange(from = 0) int getDeviceVolume(); /** Gets whether the device is muted or not. */ @@ -2347,7 +2351,7 @@ public interface Player { * * @param volume The volume to set. */ - void setDeviceVolume(int volume); + void setDeviceVolume(@IntRange(from = 0) int volume); /** Increases the volume of the device. */ void increaseDeviceVolume(); From ea210e35fe15bc7c328616a429a09d76fc387564 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 5 Oct 2021 16:25:22 +0100 Subject: [PATCH 280/441] Remove IntRange annotations from index-based Player methods It can be assumed that indexes are always >=0. PiperOrigin-RevId: 400990569 --- .../com/google/android/exoplayer2/Player.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 9a89a19586..c5a9e9c559 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -443,7 +443,7 @@ public interface Player { * @throws IndexOutOfBoundsException If index is outside the allowed range. */ @Event - public int get(@IntRange(from = 0) int index) { + public int get(int index) { return flags.get(index); } @@ -856,7 +856,7 @@ public interface Player { * @throws IndexOutOfBoundsException If index is outside the allowed range. */ @Command - public int get(@IntRange(from = 0) int index) { + public int get(int index) { return flags.get(index); } @@ -1537,7 +1537,7 @@ public interface Player { * the playlist, the media item is added to the end of the playlist. * @param mediaItem The {@link MediaItem} to add. */ - void addMediaItem(@IntRange(from = 0) int index, MediaItem mediaItem); + void addMediaItem(int index, MediaItem mediaItem); /** * Adds a list of media items to the end of the playlist. @@ -1553,7 +1553,7 @@ public interface Player { * the playlist, the media items are added to the end of the playlist. * @param mediaItems The {@link MediaItem MediaItems} to add. */ - void addMediaItems(@IntRange(from = 0) int index, List mediaItems); + void addMediaItems(int index, List mediaItems); /** * Moves the media item at the current index to the new index. @@ -1562,7 +1562,7 @@ public interface Player { * @param newIndex The new index of the media item. If the new index is larger than the size of * the playlist the item is moved to the end of the playlist. */ - void moveMediaItem(@IntRange(from = 0) int currentIndex, @IntRange(from = 0) int newIndex); + void moveMediaItem(int currentIndex, int newIndex); /** * Moves the media item range to the new index. @@ -1573,17 +1573,14 @@ public interface Player { * than the size of the remaining playlist after removing the range, the range is moved to the * end of the playlist. */ - void moveMediaItems( - @IntRange(from = 0) int fromIndex, - @IntRange(from = 0) int toIndex, - @IntRange(from = 0) int newIndex); + void moveMediaItems(int fromIndex, int toIndex, int newIndex); /** * Removes the media item at the given index of the playlist. * * @param index The index at which to remove the media item. */ - void removeMediaItem(@IntRange(from = 0) int index); + void removeMediaItem(int index); /** * Removes a range of media items from the playlist. @@ -1592,7 +1589,7 @@ public interface Player { * @param toIndex The index of the first item to be kept (exclusive). If the index is larger than * the size of the playlist, media items to the end of the playlist are removed. */ - void removeMediaItems(@IntRange(from = 0) int fromIndex, @IntRange(from = 0) int toIndex); + void removeMediaItems(int fromIndex, int toIndex); /** Clears the playlist. */ void clearMediaItems(); @@ -1770,7 +1767,7 @@ public interface Player { * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided * {@code windowIndex} is not within the bounds of the current timeline. */ - void seekToDefaultPosition(@IntRange(from = 0) int windowIndex); + void seekToDefaultPosition(int windowIndex); /** * Seeks to a position specified in milliseconds in the current window. @@ -1789,7 +1786,7 @@ public interface Player { * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided * {@code windowIndex} is not within the bounds of the current timeline. */ - void seekTo(@IntRange(from = 0) int windowIndex, long positionMs); + void seekTo(int windowIndex, long positionMs); /** * Returns the {@link #seekBack()} increment. From 03ff5b661841bb3cd34766da17b91be81af4eed5 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Tue, 5 Oct 2021 18:35:27 +0100 Subject: [PATCH 281/441] Transformer: Add TranscodingTransformer. Temporary file copy of Transformer, which uses TransformerTranscodingVideoRenderer instead of TransformerMuxingVideoRenderer to transform files. This allows devs to test transcoding more easily using the Transformer demo, while external engineers continue to see the completely working Muxing-based transformer. In the future, this will replace the Transformer class. PiperOrigin-RevId: 401020893 --- .../transformer/TranscodingTransformer.java | 692 ++++++++++++++++++ 1 file changed, 692 insertions(+) create mode 100644 library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java new file mode 100644 index 0000000000..641d846af5 --- /dev/null +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -0,0 +1,692 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.exoplayer2.transformer; + +import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS; +import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS; +import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; +import static com.google.android.exoplayer2.DefaultLoadControl.DEFAULT_MIN_BUFFER_MS; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; +import static java.lang.Math.min; + +import android.content.Context; +import android.media.MediaFormat; +import android.media.MediaMuxer; +import android.os.Handler; +import android.os.Looper; +import android.os.ParcelFileDescriptor; +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.annotation.VisibleForTesting; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.RenderersFactory; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.analytics.AnalyticsListener; +import com.google.android.exoplayer2.audio.AudioRendererEventListener; +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; +import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; +import com.google.android.exoplayer2.metadata.MetadataOutput; +import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.MediaSourceFactory; +import com.google.android.exoplayer2.text.TextOutput; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.video.VideoRendererEventListener; +import java.io.IOException; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; + +/** + * A transcoding transformer to transform media inputs. + * + *

        Temporary copy of the {@link Transformer} class, which transforms by transcoding rather than + * by muxing. This class is intended to replace the Transformer class. + * + *

        TODO(http://b/202131097): Replace the Transformer class with TranscodingTransformer, and + * rename this class to Transformer. + * + *

        The same TranscodingTransformer instance can be used to transform multiple inputs + * (sequentially, not concurrently). + * + *

        TranscodingTransformer instances must be accessed from a single application thread. For the + * vast majority of cases this should be the application's main thread. The thread on which a + * TranscodingTransformer instance must be accessed can be explicitly specified by passing a {@link + * Looper} when creating the transcoding transformer. If no Looper is specified, then the Looper of + * the thread that the {@link TranscodingTransformer.Builder} is created on is used, or if that + * thread does not have a Looper, the Looper of the application's main thread is used. In all cases + * the Looper of the thread from which the transcoding transformer must be accessed can be queried + * using {@link #getApplicationLooper()}. + */ +@RequiresApi(18) +public final class TranscodingTransformer { + + /** A builder for {@link TranscodingTransformer} instances. */ + public static final class Builder { + + private @MonotonicNonNull Context context; + private @MonotonicNonNull MediaSourceFactory mediaSourceFactory; + private Muxer.Factory muxerFactory; + private boolean removeAudio; + private boolean removeVideo; + private boolean flattenForSlowMotion; + private String outputMimeType; + private TranscodingTransformer.Listener listener; + private Looper looper; + private Clock clock; + + /** Creates a builder with default values. */ + public Builder() { + muxerFactory = new FrameworkMuxer.Factory(); + outputMimeType = MimeTypes.VIDEO_MP4; + listener = new Listener() {}; + looper = Util.getCurrentOrMainLooper(); + clock = Clock.DEFAULT; + } + + /** Creates a builder with the values of the provided {@link TranscodingTransformer}. */ + private Builder(TranscodingTransformer transcodingTransformer) { + this.context = transcodingTransformer.context; + this.mediaSourceFactory = transcodingTransformer.mediaSourceFactory; + this.muxerFactory = transcodingTransformer.muxerFactory; + this.removeAudio = transcodingTransformer.transformation.removeAudio; + this.removeVideo = transcodingTransformer.transformation.removeVideo; + this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; + this.outputMimeType = transcodingTransformer.transformation.outputMimeType; + this.listener = transcodingTransformer.listener; + this.looper = transcodingTransformer.looper; + this.clock = transcodingTransformer.clock; + } + + /** + * Sets the {@link Context}. + * + *

        This parameter is mandatory. + * + * @param context The {@link Context}. + * @return This builder. + */ + public Builder setContext(Context context) { + this.context = context.getApplicationContext(); + return this; + } + + /** + * Sets the {@link MediaSourceFactory} to be used to retrieve the inputs to transform. The + * default value is a {@link DefaultMediaSourceFactory} built with the context provided in + * {@link #setContext(Context)}. + * + * @param mediaSourceFactory A {@link MediaSourceFactory}. + * @return This builder. + */ + public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { + this.mediaSourceFactory = mediaSourceFactory; + return this; + } + + /** + * Sets whether to remove the audio from the output. The default value is {@code false}. + * + *

        The audio and video cannot both be removed because the output would not contain any + * samples. + * + * @param removeAudio Whether to remove the audio. + * @return This builder. + */ + public Builder setRemoveAudio(boolean removeAudio) { + this.removeAudio = removeAudio; + return this; + } + + /** + * Sets whether to remove the video from the output. The default value is {@code false}. + * + *

        The audio and video cannot both be removed because the output would not contain any + * samples. + * + * @param removeVideo Whether to remove the video. + * @return This builder. + */ + public Builder setRemoveVideo(boolean removeVideo) { + this.removeVideo = removeVideo; + return this; + } + + /** + * Sets whether the input should be flattened for media containing slow motion markers. The + * transformed output is obtained by removing the slow motion metadata and by actually slowing + * down the parts of the video and audio streams defined in this metadata. The default value for + * {@code flattenForSlowMotion} is {@code false}. + * + *

        Only Samsung Extension Format (SEF) slow motion metadata type is supported. The + * transformation has no effect if the input does not contain this metadata type. + * + *

        For SEF slow motion media, the following assumptions are made on the input: + * + *

          + *
        • The input container format is (unfragmented) MP4. + *
        • The input contains an AVC video elementary stream with temporal SVC. + *
        • The recording frame rate of the video is 120 or 240 fps. + *
        + * + *

        If specifying a {@link MediaSourceFactory} using {@link + * #setMediaSourceFactory(MediaSourceFactory)}, make sure that {@link + * Mp4Extractor#FLAG_READ_SEF_DATA} is set on the {@link Mp4Extractor} used. Otherwise, the slow + * motion metadata will be ignored and the input won't be flattened. + * + * @param flattenForSlowMotion Whether to flatten for slow motion. + * @return This builder. + */ + public Builder setFlattenForSlowMotion(boolean flattenForSlowMotion) { + this.flattenForSlowMotion = flattenForSlowMotion; + return this; + } + + /** + * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. The + * output MIME type should be supported by the {@link + * Muxer.Factory#supportsOutputMimeType(String) muxer}. Values supported by the default {@link + * FrameworkMuxer} are: + * + *

          + *
        • {@link MimeTypes#VIDEO_MP4} + *
        • {@link MimeTypes#VIDEO_WEBM} from API level 21 + *
        + * + * @param outputMimeType The MIME type of the output. + * @return This builder. + */ + public Builder setOutputMimeType(String outputMimeType) { + this.outputMimeType = outputMimeType; + return this; + } + + /** + * Sets the {@link TranscodingTransformer.Listener} to listen to the transformation events. + * + *

        This is equivalent to {@link TranscodingTransformer#setListener(Listener)}. + * + * @param listener A {@link TranscodingTransformer.Listener}. + * @return This builder. + */ + public Builder setListener(TranscodingTransformer.Listener listener) { + this.listener = listener; + return this; + } + + /** + * Sets the {@link Looper} that must be used for all calls to the transcoding transformer and + * that is used to call listeners on. The default value is the Looper of the thread that this + * builder was created on, or if that thread does not have a Looper, the Looper of the + * application's main thread. + * + * @param looper A {@link Looper}. + * @return This builder. + */ + public Builder setLooper(Looper looper) { + this.looper = looper; + return this; + } + + /** + * Sets the {@link Clock} that will be used by the transcoding transformer. The default value is + * {@link Clock#DEFAULT}. + * + * @param clock The {@link Clock} instance. + * @return This builder. + */ + @VisibleForTesting + /* package */ Builder setClock(Clock clock) { + this.clock = clock; + return this; + } + + /** + * Sets the factory for muxers that write the media container. The default value is a {@link + * FrameworkMuxer.Factory}. + * + * @param muxerFactory A {@link Muxer.Factory}. + * @return This builder. + */ + @VisibleForTesting + /* package */ Builder setMuxerFactory(Muxer.Factory muxerFactory) { + this.muxerFactory = muxerFactory; + return this; + } + + /** + * Builds a {@link TranscodingTransformer} instance. + * + * @throws IllegalStateException If the {@link Context} has not been provided. + * @throws IllegalStateException If both audio and video have been removed (otherwise the output + * would not contain any samples). + * @throws IllegalStateException If the muxer doesn't support the requested output MIME type. + */ + public TranscodingTransformer build() { + checkStateNotNull(context); + if (mediaSourceFactory == null) { + DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory(); + if (flattenForSlowMotion) { + defaultExtractorsFactory.setMp4ExtractorFlags(Mp4Extractor.FLAG_READ_SEF_DATA); + } + mediaSourceFactory = new DefaultMediaSourceFactory(context, defaultExtractorsFactory); + } + checkState( + muxerFactory.supportsOutputMimeType(outputMimeType), + "Unsupported output MIME type: " + outputMimeType); + Transformation transformation = + new Transformation(removeAudio, removeVideo, flattenForSlowMotion, outputMimeType); + return new TranscodingTransformer( + context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); + } + } + + /** A listener for the transformation events. */ + public interface Listener { + + /** + * Called when the transformation is completed. + * + * @param inputMediaItem The {@link MediaItem} for which the transformation is completed. + */ + default void onTransformationCompleted(MediaItem inputMediaItem) {} + + /** + * Called if an error occurs during the transformation. + * + * @param inputMediaItem The {@link MediaItem} for which the error occurs. + * @param exception The exception describing the error. + */ + default void onTransformationError(MediaItem inputMediaItem, Exception exception) {} + } + + /** + * Progress state. One of {@link #PROGRESS_STATE_WAITING_FOR_AVAILABILITY}, {@link + * #PROGRESS_STATE_AVAILABLE}, {@link #PROGRESS_STATE_UNAVAILABLE}, {@link + * #PROGRESS_STATE_NO_TRANSFORMATION} + */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + PROGRESS_STATE_WAITING_FOR_AVAILABILITY, + PROGRESS_STATE_AVAILABLE, + PROGRESS_STATE_UNAVAILABLE, + PROGRESS_STATE_NO_TRANSFORMATION + }) + public @interface ProgressState {} + + /** + * Indicates that the progress is unavailable for the current transformation, but might become + * available. + */ + public static final int PROGRESS_STATE_WAITING_FOR_AVAILABILITY = 0; + /** Indicates that the progress is available. */ + public static final int PROGRESS_STATE_AVAILABLE = 1; + /** Indicates that the progress is permanently unavailable for the current transformation. */ + public static final int PROGRESS_STATE_UNAVAILABLE = 2; + /** Indicates that there is no current transformation. */ + public static final int PROGRESS_STATE_NO_TRANSFORMATION = 4; + + private final Context context; + private final MediaSourceFactory mediaSourceFactory; + private final Muxer.Factory muxerFactory; + private final Transformation transformation; + private final Looper looper; + private final Clock clock; + + private TranscodingTransformer.Listener listener; + @Nullable private MuxerWrapper muxerWrapper; + @Nullable private SimpleExoPlayer player; + @ProgressState private int progressState; + + private TranscodingTransformer( + Context context, + MediaSourceFactory mediaSourceFactory, + Muxer.Factory muxerFactory, + Transformation transformation, + TranscodingTransformer.Listener listener, + Looper looper, + Clock clock) { + checkState( + !transformation.removeAudio || !transformation.removeVideo, + "Audio and video cannot both be removed."); + this.context = context; + this.mediaSourceFactory = mediaSourceFactory; + this.muxerFactory = muxerFactory; + this.transformation = transformation; + this.listener = listener; + this.looper = looper; + this.clock = clock; + progressState = PROGRESS_STATE_NO_TRANSFORMATION; + } + + /** + * Returns a {@link TranscodingTransformer.Builder} initialized with the values of this instance. + */ + public Builder buildUpon() { + return new Builder(this); + } + + /** + * Sets the {@link TranscodingTransformer.Listener} to listen to the transformation events. + * + * @param listener A {@link TranscodingTransformer.Listener}. + * @throws IllegalStateException If this method is called from the wrong thread. + */ + public void setListener(TranscodingTransformer.Listener listener) { + verifyApplicationThread(); + this.listener = listener; + } + + /** + * Starts an asynchronous operation to transform the given {@link MediaItem}. + * + *

        The transformation state is notified through the {@link Builder#setListener(Listener) + * listener}. + * + *

        Concurrent transformations on the same TranscodingTransformer object are not allowed. + * + *

        The output can contain at most one video track and one audio track. Other track types are + * ignored. For adaptive bitrate {@link MediaSource media sources}, the highest bitrate video and + * audio streams are selected. + * + * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the + * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are + * described in {@link MediaMuxer#addTrack(MediaFormat)}. + * @param path The path to the output file. + * @throws IllegalArgumentException If the path is invalid. + * @throws IllegalStateException If this method is called from the wrong thread. + * @throws IllegalStateException If a transformation is already in progress. + * @throws IOException If an error occurs opening the output file for writing. + */ + public void startTransformation(MediaItem mediaItem, String path) throws IOException { + startTransformation(mediaItem, muxerFactory.create(path, transformation.outputMimeType)); + } + + /** + * Starts an asynchronous operation to transform the given {@link MediaItem}. + * + *

        The transformation state is notified through the {@link Builder#setListener(Listener) + * listener}. + * + *

        Concurrent transformations on the same TranscodingTransformer object are not allowed. + * + *

        The output can contain at most one video track and one audio track. Other track types are + * ignored. For adaptive bitrate {@link MediaSource media sources}, the highest bitrate video and + * audio streams are selected. + * + * @param mediaItem The {@link MediaItem} to transform. The supported sample formats depend on the + * {@link Muxer} and on the output container format. For the {@link FrameworkMuxer}, they are + * described in {@link MediaMuxer#addTrack(MediaFormat)}. + * @param parcelFileDescriptor A readable and writable {@link ParcelFileDescriptor} of the output. + * The file referenced by this ParcelFileDescriptor should not be used before the + * transformation is completed. It is the responsibility of the caller to close the + * ParcelFileDescriptor. This can be done after this method returns. + * @throws IllegalArgumentException If the file descriptor is invalid. + * @throws IllegalStateException If this method is called from the wrong thread. + * @throws IllegalStateException If a transformation is already in progress. + * @throws IOException If an error occurs opening the output file for writing. + */ + @RequiresApi(26) + public void startTransformation(MediaItem mediaItem, ParcelFileDescriptor parcelFileDescriptor) + throws IOException { + startTransformation( + mediaItem, muxerFactory.create(parcelFileDescriptor, transformation.outputMimeType)); + } + + private void startTransformation(MediaItem mediaItem, Muxer muxer) { + verifyApplicationThread(); + if (player != null) { + throw new IllegalStateException("There is already a transformation in progress."); + } + + MuxerWrapper muxerWrapper = new MuxerWrapper(muxer); + this.muxerWrapper = muxerWrapper; + DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); + trackSelector.setParameters( + new DefaultTrackSelector.ParametersBuilder(context) + .setForceHighestSupportedBitrate(true) + .build()); + // Arbitrarily decrease buffers for playback so that samples start being sent earlier to the + // muxer (rebuffers are less problematic for the transformation use case). + DefaultLoadControl loadControl = + new DefaultLoadControl.Builder() + .setBufferDurationsMs( + DEFAULT_MIN_BUFFER_MS, + DEFAULT_MAX_BUFFER_MS, + DEFAULT_BUFFER_FOR_PLAYBACK_MS / 10, + DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10) + .build(); + player = + new ExoPlayer.Builder( + context, + new TranscodingTransformerRenderersFactory(context, muxerWrapper, transformation)) + .setMediaSourceFactory(mediaSourceFactory) + .setTrackSelector(trackSelector) + .setLoadControl(loadControl) + .setLooper(looper) + .setClock(clock) + .buildExoPlayer(); + player.setMediaItem(mediaItem); + player.addAnalyticsListener( + new TranscodingTransformerAnalyticsListener(mediaItem, muxerWrapper)); + player.prepare(); + + progressState = PROGRESS_STATE_WAITING_FOR_AVAILABILITY; + } + + /** + * Returns the {@link Looper} associated with the application thread that's used to access the + * transcoding transformer and on which transcoding transformer events are received. + */ + public Looper getApplicationLooper() { + return looper; + } + + /** + * Returns the current {@link ProgressState} and updates {@code progressHolder} with the current + * progress if it is {@link #PROGRESS_STATE_AVAILABLE available}. + * + *

        After a transformation {@link Listener#onTransformationCompleted(MediaItem) completes}, this + * method returns {@link #PROGRESS_STATE_NO_TRANSFORMATION}. + * + * @param progressHolder A {@link ProgressHolder}, updated to hold the percentage progress if + * {@link #PROGRESS_STATE_AVAILABLE available}. + * @return The {@link ProgressState}. + * @throws IllegalStateException If this method is called from the wrong thread. + */ + @ProgressState + public int getProgress(ProgressHolder progressHolder) { + verifyApplicationThread(); + if (progressState == PROGRESS_STATE_AVAILABLE) { + Player player = checkNotNull(this.player); + long durationMs = player.getDuration(); + long positionMs = player.getCurrentPosition(); + progressHolder.progress = min((int) (positionMs * 100 / durationMs), 99); + } + return progressState; + } + + /** + * Cancels the transformation that is currently in progress, if any. + * + * @throws IllegalStateException If this method is called from the wrong thread. + */ + public void cancel() { + releaseResources(/* forCancellation= */ true); + } + + /** + * Releases the resources. + * + * @param forCancellation Whether the reason for releasing the resources is the transformation + * cancellation. + * @throws IllegalStateException If this method is called from the wrong thread. + * @throws IllegalStateException If the muxer is in the wrong state and {@code forCancellation} is + * false. + */ + private void releaseResources(boolean forCancellation) { + verifyApplicationThread(); + if (player != null) { + player.release(); + player = null; + } + if (muxerWrapper != null) { + muxerWrapper.release(forCancellation); + muxerWrapper = null; + } + progressState = PROGRESS_STATE_NO_TRANSFORMATION; + } + + private void verifyApplicationThread() { + if (Looper.myLooper() != looper) { + throw new IllegalStateException("Transcoding Transformer is accessed on the wrong thread."); + } + } + + private static final class TranscodingTransformerRenderersFactory implements RenderersFactory { + + private final Context context; + private final MuxerWrapper muxerWrapper; + private final TransformerMediaClock mediaClock; + private final Transformation transformation; + + public TranscodingTransformerRenderersFactory( + Context context, MuxerWrapper muxerWrapper, Transformation transformation) { + this.context = context; + this.muxerWrapper = muxerWrapper; + this.transformation = transformation; + mediaClock = new TransformerMediaClock(); + } + + @Override + public Renderer[] createRenderers( + Handler eventHandler, + VideoRendererEventListener videoRendererEventListener, + AudioRendererEventListener audioRendererEventListener, + TextOutput textRendererOutput, + MetadataOutput metadataRendererOutput) { + int rendererCount = transformation.removeAudio || transformation.removeVideo ? 1 : 2; + Renderer[] renderers = new Renderer[rendererCount]; + int index = 0; + if (!transformation.removeAudio) { + renderers[index] = new TransformerAudioRenderer(muxerWrapper, mediaClock, transformation); + index++; + } + if (!transformation.removeVideo) { + Format encoderOutputFormat = + new Format.Builder() + .setSampleMimeType(MimeTypes.VIDEO_H264) + .setWidth(480) + .setHeight(360) + .setAverageBitrate(413_000) + .setFrameRate(30) + .build(); + renderers[index] = + new TransformerTranscodingVideoRenderer( + context, muxerWrapper, mediaClock, transformation, encoderOutputFormat); + index++; + } + return renderers; + } + } + + private final class TranscodingTransformerAnalyticsListener implements AnalyticsListener { + + private final MediaItem mediaItem; + private final MuxerWrapper muxerWrapper; + + public TranscodingTransformerAnalyticsListener(MediaItem mediaItem, MuxerWrapper muxerWrapper) { + this.mediaItem = mediaItem; + this.muxerWrapper = muxerWrapper; + } + + @Override + public void onPlaybackStateChanged(EventTime eventTime, int state) { + if (state == Player.STATE_ENDED) { + handleTransformationEnded(/* exception= */ null); + } + } + + @Override + public void onTimelineChanged(EventTime eventTime, int reason) { + if (progressState != PROGRESS_STATE_WAITING_FOR_AVAILABILITY) { + return; + } + Timeline.Window window = new Timeline.Window(); + eventTime.timeline.getWindow(/* windowIndex= */ 0, window); + if (!window.isPlaceholder) { + long durationUs = window.durationUs; + // Make progress permanently unavailable if the duration is unknown, so that it doesn't jump + // to a high value at the end of the transformation if the duration is set once the media is + // entirely loaded. + progressState = + durationUs <= 0 || durationUs == C.TIME_UNSET + ? PROGRESS_STATE_UNAVAILABLE + : PROGRESS_STATE_AVAILABLE; + checkNotNull(player).play(); + } + } + + @Override + public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { + if (muxerWrapper.getTrackCount() == 0) { + handleTransformationEnded( + new IllegalStateException( + "The output does not contain any tracks. Check that at least one of the input" + + " sample formats is supported.")); + } + } + + @Override + public void onPlayerError(EventTime eventTime, PlaybackException error) { + handleTransformationEnded(error); + } + + private void handleTransformationEnded(@Nullable Exception exception) { + try { + releaseResources(/* forCancellation= */ false); + } catch (IllegalStateException e) { + if (exception == null) { + exception = e; + } + } + + if (exception == null) { + listener.onTransformationCompleted(mediaItem); + } else { + listener.onTransformationError(mediaItem, exception); + } + } + } +} From 585b0bddcc965e269ad9eb8810b6f8da2b062996 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 5 Oct 2021 23:55:06 +0100 Subject: [PATCH 282/441] DASH: Set MIME, width and height for image adaptation sets Issue: #9500 PiperOrigin-RevId: 401091261 --- RELEASENOTES.md | 4 +++ .../android/exoplayer2/util/MimeTypes.java | 7 +++++ .../exoplayer2/util/MimeTypesTest.java | 31 +++++++++++++++++++ .../dash/manifest/DashManifestParser.java | 5 +++ .../dash/manifest/DashManifestParserTest.java | 18 +++++++++++ .../test/assets/media/mpd/sample_mpd_images | 11 +++++++ 6 files changed, 76 insertions(+) create mode 100644 testdata/src/test/assets/media/mpd/sample_mpd_images diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c376d3165d..4dd7187546 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -57,6 +57,10 @@ * RTSP: * Support RFC4566 SDP attribute field grammar ([#9430](https://github.com/google/ExoPlayer/issues/9430)). +* DASH: + * Populate `Format.sampleMimeType`, `width` and `height` for image + `AdaptationSet` elements + ([#9500](https://github.com/google/ExoPlayer/issues/9500)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 493485133a..75c1b94566 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -201,6 +201,11 @@ public final class MimeTypes { || APPLICATION_DVBSUBS.equals(mimeType); } + /** Returns whether the given string is an image MIME type. */ + public static boolean isImage(@Nullable String mimeType) { + return BASE_TYPE_IMAGE.equals(getTopLevelType(mimeType)); + } + /** * Returns true if it is known that all samples in a stream of the given MIME type and codec are * guaranteed to be sync samples (i.e., {@link C#BUFFER_FLAG_KEY_FRAME} is guaranteed to be set on @@ -505,6 +510,8 @@ public final class MimeTypes { return C.TRACK_TYPE_VIDEO; } else if (isText(mimeType)) { return C.TRACK_TYPE_TEXT; + } else if (isImage(mimeType)) { + return C.TRACK_TYPE_IMAGE; } else if (APPLICATION_ID3.equals(mimeType) || APPLICATION_EMSG.equals(mimeType) || APPLICATION_SCTE35.equals(mimeType)) { diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java index 3309c972c4..4e185273d7 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; @@ -114,6 +115,36 @@ public final class MimeTypesTest { assertThat(MimeTypes.isText("application/custom")).isFalse(); } + @Test + public void isImage_returnsCorrectResult() { + assertThat(MimeTypes.isImage(MimeTypes.IMAGE_JPEG)).isTrue(); + assertThat(MimeTypes.isImage("image/custom")).isTrue(); + + assertThat(MimeTypes.isImage(MimeTypes.VIDEO_MP4)).isFalse(); + assertThat(MimeTypes.isImage("application/custom")).isFalse(); + } + + @Test + public void getTrackType_returnsCorrectResult() { + assertThat(MimeTypes.getTrackType(MimeTypes.VIDEO_H264)).isEqualTo(C.TRACK_TYPE_VIDEO); + assertThat(MimeTypes.getTrackType("video/custom")).isEqualTo(C.TRACK_TYPE_VIDEO); + + assertThat(MimeTypes.getTrackType(MimeTypes.AUDIO_AAC)).isEqualTo(C.TRACK_TYPE_AUDIO); + assertThat(MimeTypes.getTrackType("audio/custom")).isEqualTo(C.TRACK_TYPE_AUDIO); + + assertThat(MimeTypes.getTrackType(MimeTypes.TEXT_SSA)).isEqualTo(C.TRACK_TYPE_TEXT); + assertThat(MimeTypes.getTrackType("text/custom")).isEqualTo(C.TRACK_TYPE_TEXT); + + assertThat(MimeTypes.getTrackType(MimeTypes.IMAGE_JPEG)).isEqualTo(C.TRACK_TYPE_IMAGE); + assertThat(MimeTypes.getTrackType("image/custom")).isEqualTo(C.TRACK_TYPE_IMAGE); + + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_CEA608)).isEqualTo(C.TRACK_TYPE_TEXT); + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_EMSG)).isEqualTo(C.TRACK_TYPE_METADATA); + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_CAMERA_MOTION)) + .isEqualTo(C.TRACK_TYPE_CAMERA_MOTION); + assertThat(MimeTypes.getTrackType("application/custom")).isEqualTo(C.TRACK_TYPE_UNKNOWN); + } + @Test public void getMediaMimeType_fromValidCodecs_returnsCorrectMimeType() { assertThat(MimeTypes.getMediaMimeType("avc1")).isEqualTo(MimeTypes.VIDEO_H264); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index 9cff83646c..91bf3b2eca 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -807,6 +807,8 @@ public class DashManifestParser extends DefaultHandler accessibilityChannel = parseCea708AccessibilityChannel(accessibilityDescriptors); } formatBuilder.setAccessibilityChannel(accessibilityChannel); + } else if (MimeTypes.isImage(sampleMimeType)) { + formatBuilder.setWidth(width).setHeight(height); } return formatBuilder.build(); @@ -1635,6 +1637,9 @@ public class DashManifestParser extends DefaultHandler } // All other text types are raw formats. return containerMimeType; + } else if (MimeTypes.isImage(containerMimeType)) { + // Image types are raw formats. + return containerMimeType; } else if (MimeTypes.APPLICATION_MP4.equals(containerMimeType)) { @Nullable String mimeType = MimeTypes.getMediaMimeType(codecs); return MimeTypes.TEXT_VTT.equals(mimeType) ? MimeTypes.APPLICATION_MP4VTT : mimeType; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java index dc70713469..ce2961dd2e 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java @@ -48,6 +48,7 @@ public class DashManifestParserTest { "media/mpd/sample_mpd_unknown_mime_type"; private static final String SAMPLE_MPD_SEGMENT_TEMPLATE = "media/mpd/sample_mpd_segment_template"; private static final String SAMPLE_MPD_EVENT_STREAM = "media/mpd/sample_mpd_event_stream"; + private static final String SAMPLE_MPD_IMAGES = "media/mpd/sample_mpd_images"; private static final String SAMPLE_MPD_LABELS = "media/mpd/sample_mpd_labels"; private static final String SAMPLE_MPD_ASSET_IDENTIFIER = "media/mpd/sample_mpd_asset_identifier"; private static final String SAMPLE_MPD_TEXT = "media/mpd/sample_mpd_text"; @@ -192,6 +193,23 @@ public class DashManifestParserTest { assertThat(manifest.programInformation).isEqualTo(expectedProgramInformation); } + @Test + public void parseMediaPresentationDescription_images() throws IOException { + DashManifestParser parser = new DashManifestParser(); + DashManifest manifest = + parser.parse( + Uri.parse("https://example.com/test.mpd"), + TestUtil.getInputStream( + ApplicationProvider.getApplicationContext(), SAMPLE_MPD_IMAGES)); + + AdaptationSet adaptationSet = manifest.getPeriod(0).adaptationSets.get(0); + Format format = adaptationSet.representations.get(0).format; + + assertThat(format.sampleMimeType).isEqualTo("image/jpeg"); + assertThat(format.width).isEqualTo(320); + assertThat(format.height).isEqualTo(180); + } + @Test public void parseMediaPresentationDescription_labels() throws IOException { DashManifestParser parser = new DashManifestParser(); diff --git a/testdata/src/test/assets/media/mpd/sample_mpd_images b/testdata/src/test/assets/media/mpd/sample_mpd_images new file mode 100644 index 0000000000..981a29a23a --- /dev/null +++ b/testdata/src/test/assets/media/mpd/sample_mpd_images @@ -0,0 +1,11 @@ + + + + + + + + + + + From 670bc2f875390f01e437bb9aac3f5baa685d9e5d Mon Sep 17 00:00:00 2001 From: bachinger Date: Wed, 6 Oct 2021 00:32:33 +0100 Subject: [PATCH 283/441] Update hls package in PlaybackOutput PiperOrigin-RevId: 401099169 --- .../google/android/exoplayer2/robolectric/PlaybackOutput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java index 0fe00c4110..3f9718fc98 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java @@ -136,7 +136,7 @@ public final class PlaybackOutput implements Dumper.Dumpable { || entry instanceof IcyHeaders || entry instanceof IcyInfo || entry instanceof SpliceCommand - || "com.google.android.exoplayer2.hls.HlsTrackMetadataEntry" + || "com.google.android.exoplayer2.source.hls.HlsTrackMetadataEntry" .equals(entry.getClass().getCanonicalName())) { return entry.toString(); } else { From 96cfd0b41560cd3ee4013a95be4f2aeb3a3f43de Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 6 Oct 2021 13:56:56 +0100 Subject: [PATCH 284/441] Rename Player methods to refer to MediaItem instead of Window PiperOrigin-RevId: 401222863 --- .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../exoplayer2/ext/ima/FakePlayer.java | 2 +- .../google/android/exoplayer2/BasePlayer.java | 108 +++++-- .../android/exoplayer2/ForwardingPlayer.java | 60 ++++ .../com/google/android/exoplayer2/Player.java | 292 +++++++++++------- .../android/exoplayer2/ExoPlayerImpl.java | 2 +- .../android/exoplayer2/SimpleExoPlayer.java | 2 +- .../exoplayer2/testutil/StubExoPlayer.java | 2 +- 8 files changed, 323 insertions(+), 147 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index e3f075e562..6d479fef31 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -640,7 +640,7 @@ public final class CastPlayer extends BasePlayer { } @Override - public int getCurrentWindowIndex() { + public int getCurrentMediaItemIndex() { return pendingSeekWindowIndex != C.INDEX_UNSET ? pendingSeekWindowIndex : currentWindowIndex; } diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index a958449b2a..d0a9d4206b 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -265,7 +265,7 @@ import com.google.android.exoplayer2.util.ListenerSet; } @Override - public int getCurrentWindowIndex() { + public int getCurrentMediaItemIndex() { return 0; } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index da2e31d1d5..eeebb5e854 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -144,25 +144,37 @@ public abstract class BasePlayer implements Player { @Deprecated @Override public final boolean hasPrevious() { - return hasPreviousWindow(); + return hasPreviousMediaItem(); + } + + @Deprecated + @Override + public final boolean hasPreviousWindow() { + return hasPreviousMediaItem(); } @Override - public final boolean hasPreviousWindow() { - return getPreviousWindowIndex() != C.INDEX_UNSET; + public final boolean hasPreviousMediaItem() { + return getPreviousMediaItemIndex() != C.INDEX_UNSET; } @Deprecated @Override public final void previous() { - seekToPreviousWindow(); + seekToPreviousMediaItem(); + } + + @Deprecated + @Override + public final void seekToPreviousWindow() { + seekToPreviousMediaItem(); } @Override - public final void seekToPreviousWindow() { - int previousWindowIndex = getPreviousWindowIndex(); - if (previousWindowIndex != C.INDEX_UNSET) { - seekToDefaultPosition(previousWindowIndex); + public final void seekToPreviousMediaItem() { + int previousMediaItemIndex = getPreviousMediaItemIndex(); + if (previousMediaItemIndex != C.INDEX_UNSET) { + seekToDefaultPosition(previousMediaItemIndex); } } @@ -187,25 +199,37 @@ public abstract class BasePlayer implements Player { @Deprecated @Override public final boolean hasNext() { - return hasNextWindow(); + return hasNextMediaItem(); + } + + @Deprecated + @Override + public final boolean hasNextWindow() { + return hasNextMediaItem(); } @Override - public final boolean hasNextWindow() { - return getNextWindowIndex() != C.INDEX_UNSET; + public final boolean hasNextMediaItem() { + return getNextMediaItemIndex() != C.INDEX_UNSET; } @Deprecated @Override public final void next() { - seekToNextWindow(); + seekToNextMediaItem(); + } + + @Deprecated + @Override + public final void seekToNextWindow() { + seekToNextMediaItem(); } @Override - public final void seekToNextWindow() { - int nextWindowIndex = getNextWindowIndex(); - if (nextWindowIndex != C.INDEX_UNSET) { - seekToDefaultPosition(nextWindowIndex); + public final void seekToNextMediaItem() { + int nextMediaItemIndex = getNextMediaItemIndex(); + if (nextMediaItemIndex != C.INDEX_UNSET) { + seekToDefaultPosition(nextMediaItemIndex); } } @@ -227,22 +251,40 @@ public abstract class BasePlayer implements Player { setPlaybackParameters(getPlaybackParameters().withSpeed(speed)); } + @Deprecated + @Override + public final int getCurrentWindowIndex() { + return getCurrentMediaItemIndex(); + } + + @Deprecated @Override public final int getNextWindowIndex() { + return getNextMediaItemIndex(); + } + + @Override + public final int getNextMediaItemIndex() { Timeline timeline = getCurrentTimeline(); return timeline.isEmpty() ? C.INDEX_UNSET : timeline.getNextWindowIndex( - getCurrentWindowIndex(), getRepeatModeForNavigation(), getShuffleModeEnabled()); + getCurrentMediaItemIndex(), getRepeatModeForNavigation(), getShuffleModeEnabled()); + } + + @Deprecated + @Override + public final int getPreviousWindowIndex() { + return getPreviousMediaItemIndex(); } @Override - public final int getPreviousWindowIndex() { + public final int getPreviousMediaItemIndex() { Timeline timeline = getCurrentTimeline(); return timeline.isEmpty() ? C.INDEX_UNSET : timeline.getPreviousWindowIndex( - getCurrentWindowIndex(), getRepeatModeForNavigation(), getShuffleModeEnabled()); + getCurrentMediaItemIndex(), getRepeatModeForNavigation(), getShuffleModeEnabled()); } @Override @@ -280,16 +322,28 @@ public abstract class BasePlayer implements Player { : duration == 0 ? 100 : Util.constrainValue((int) ((position * 100) / duration), 0, 100); } + @Deprecated @Override public final boolean isCurrentWindowDynamic() { - Timeline timeline = getCurrentTimeline(); - return !timeline.isEmpty() && timeline.getWindow(getCurrentWindowIndex(), window).isDynamic; + return isCurrentMediaItemDynamic(); } @Override - public final boolean isCurrentWindowLive() { + public final boolean isCurrentMediaItemDynamic() { Timeline timeline = getCurrentTimeline(); - return !timeline.isEmpty() && timeline.getWindow(getCurrentWindowIndex(), window).isLive(); + return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isDynamic; + } + + @Deprecated + @Override + public final boolean isCurrentWindowLive() { + return isCurrentMediaItemLive(); + } + + @Override + public final boolean isCurrentMediaItemLive() { + Timeline timeline = getCurrentTimeline(); + return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isLive(); } @Override @@ -305,10 +359,16 @@ public abstract class BasePlayer implements Player { return window.getCurrentUnixTimeMs() - window.windowStartTimeMs - getContentPosition(); } + @Deprecated @Override public final boolean isCurrentWindowSeekable() { + return isCurrentMediaItemSeekable(); + } + + @Override + public final boolean isCurrentMediaItemSeekable() { Timeline timeline = getCurrentTimeline(); - return !timeline.isEmpty() && timeline.getWindow(getCurrentWindowIndex(), window).isSeekable; + return !timeline.isEmpty() && timeline.getWindow(getCurrentMediaItemIndex(), window).isSeekable; } @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index c45c48495b..62e113481d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -266,22 +266,34 @@ public class ForwardingPlayer implements Player { return player.hasPrevious(); } + @Deprecated @Override public boolean hasPreviousWindow() { return player.hasPreviousWindow(); } + @Override + public boolean hasPreviousMediaItem() { + return player.hasPreviousMediaItem(); + } + @Deprecated @Override public void previous() { player.previous(); } + @Deprecated @Override public void seekToPreviousWindow() { player.seekToPreviousWindow(); } + @Override + public void seekToPreviousMediaItem() { + player.seekToPreviousMediaItem(); + } + @Override public void seekToPrevious() { player.seekToPrevious(); @@ -298,22 +310,34 @@ public class ForwardingPlayer implements Player { return player.hasNext(); } + @Deprecated @Override public boolean hasNextWindow() { return player.hasNextWindow(); } + @Override + public boolean hasNextMediaItem() { + return player.hasNextMediaItem(); + } + @Deprecated @Override public void next() { player.next(); } + @Deprecated @Override public void seekToNextWindow() { player.seekToNextWindow(); } + @Override + public void seekToNextMediaItem() { + player.seekToNextMediaItem(); + } + @Override public void seekToNext() { player.seekToNext(); @@ -406,21 +430,39 @@ public class ForwardingPlayer implements Player { return player.getCurrentPeriodIndex(); } + @Deprecated @Override public int getCurrentWindowIndex() { return player.getCurrentWindowIndex(); } + @Override + public int getCurrentMediaItemIndex() { + return player.getCurrentMediaItemIndex(); + } + + @Deprecated @Override public int getNextWindowIndex() { return player.getNextWindowIndex(); } + @Override + public int getNextMediaItemIndex() { + return player.getNextMediaItemIndex(); + } + + @Deprecated @Override public int getPreviousWindowIndex() { return player.getPreviousWindowIndex(); } + @Override + public int getPreviousMediaItemIndex() { + return player.getPreviousMediaItemIndex(); + } + @Nullable @Override public MediaItem getCurrentMediaItem() { @@ -462,26 +504,44 @@ public class ForwardingPlayer implements Player { return player.getTotalBufferedDuration(); } + @Deprecated @Override public boolean isCurrentWindowDynamic() { return player.isCurrentWindowDynamic(); } + @Override + public boolean isCurrentMediaItemDynamic() { + return player.isCurrentMediaItemDynamic(); + } + + @Deprecated @Override public boolean isCurrentWindowLive() { return player.isCurrentWindowLive(); } + @Override + public boolean isCurrentMediaItemLive() { + return player.isCurrentMediaItemLive(); + } + @Override public long getCurrentLiveOffset() { return player.getCurrentLiveOffset(); } + @Deprecated @Override public boolean isCurrentWindowSeekable() { return player.isCurrentWindowSeekable(); } + @Override + public boolean isCurrentMediaItemSeekable() { + return player.isCurrentMediaItemSeekable(); + } + @Override public boolean isPlayingAd() { return player.isPlayingAd(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index c5a9e9c559..200db98a0e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -80,9 +80,10 @@ public interface Player { /** * Called when the timeline has been refreshed. * - *

        Note that the current window or period index may change as a result of a timeline change. - * If playback can't continue smoothly because of this timeline change, a separate {@link - * #onPositionDiscontinuity(PositionInfo, PositionInfo, int)} callback will be triggered. + *

        Note that the current {@link MediaItem} or playback position may change as a result of a + * timeline change. If playback can't continue smoothly because of this timeline change, a + * separate {@link #onPositionDiscontinuity(PositionInfo, PositionInfo, int)} callback will be + * triggered. * *

        {@link #onEvents(Player, Events)} will also be called to report this event along with * other events that happen in the same {@link Looper} message queue iteration. @@ -253,7 +254,7 @@ public interface Player { *

        {@link #onEvents(Player, Events)} will also be called to report this event along with * other events that happen in the same {@link Looper} message queue iteration. * - * @param shuffleModeEnabled Whether shuffling of windows is enabled. + * @param shuffleModeEnabled Whether shuffling of {@link MediaItem media items} is enabled. */ default void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {} @@ -377,7 +378,7 @@ public interface Player { *

      • They need access to the {@link Player} object to trigger further events (e.g. to call * {@link Player#seekTo(long)} after a {@link #onMediaItemTransition(MediaItem, int)}). *
      • They intend to use multiple state values together or in combination with {@link Player} - * getter methods. For example using {@link #getCurrentWindowIndex()} with the {@code + * getter methods. For example using {@link #getCurrentMediaItemIndex()} with the {@code * timeline} provided in {@link #onTimelineChanged(Timeline, int)} is only safe from * within this method. *
      • They are interested in events that logically happened together (e.g {@link @@ -677,12 +678,12 @@ public interface Player { COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, - COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_TO_PREVIOUS_WINDOW, + COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS, - COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, - COMMAND_SEEK_TO_WINDOW, + COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SET_SPEED_AND_PITCH, @@ -1145,20 +1146,22 @@ public interface Player { @interface RepeatMode {} /** * Normal playback without repetition. "Previous" and "Next" actions move to the previous and next - * windows respectively, and do nothing when there is no previous or next window to move to. + * {@link MediaItem} respectively, and do nothing when there is no previous or next {@link + * MediaItem} to move to. */ int REPEAT_MODE_OFF = 0; /** - * Repeats the currently playing window infinitely during ongoing playback. "Previous" and "Next" - * actions behave as they do in {@link #REPEAT_MODE_OFF}, moving to the previous and next windows - * respectively, and doing nothing when there is no previous or next window to move to. + * Repeats the currently playing {@link MediaItem} infinitely during ongoing playback. "Previous" + * and "Next" actions behave as they do in {@link #REPEAT_MODE_OFF}, moving to the previous and + * next {@link MediaItem} respectively, and doing nothing when there is no previous or next {@link + * MediaItem} to move to. */ int REPEAT_MODE_ONE = 1; /** * Repeats the entire timeline infinitely. "Previous" and "Next" actions behave as they do in * {@link #REPEAT_MODE_OFF}, but with looping at the ends so that "Previous" when playing the - * first window will move to the last window, and "Next" when playing the last window will move to - * the first window. + * first {@link MediaItem} will move to the last {@link MediaItem}, and "Next" when playing the + * last {@link MediaItem} will move to the first {@link MediaItem}. */ int REPEAT_MODE_ALL = 2; @@ -1330,9 +1333,9 @@ public interface Player { /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link * #COMMAND_PREPARE_STOP}, {@link #COMMAND_SEEK_TO_DEFAULT_POSITION}, {@link - * #COMMAND_SEEK_IN_CURRENT_WINDOW}, {@link #COMMAND_SEEK_TO_PREVIOUS_WINDOW}, {@link - * #COMMAND_SEEK_TO_PREVIOUS}, {@link #COMMAND_SEEK_TO_NEXT_WINDOW}, {@link - * #COMMAND_SEEK_TO_NEXT}, {@link #COMMAND_SEEK_TO_WINDOW}, {@link #COMMAND_SEEK_BACK}, {@link + * #COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM}, {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM}, {@link + * #COMMAND_SEEK_TO_PREVIOUS}, {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM}, {@link + * #COMMAND_SEEK_TO_NEXT}, {@link #COMMAND_SEEK_TO_MEDIA_ITEM}, {@link #COMMAND_SEEK_BACK}, {@link * #COMMAND_SEEK_FORWARD}, {@link #COMMAND_SET_SPEED_AND_PITCH}, {@link * #COMMAND_SET_SHUFFLE_MODE}, {@link #COMMAND_SET_REPEAT_MODE}, {@link * #COMMAND_GET_CURRENT_MEDIA_ITEM}, {@link #COMMAND_GET_TIMELINE}, {@link @@ -1350,12 +1353,12 @@ public interface Player { COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, - COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_TO_PREVIOUS_WINDOW, + COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS, - COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, - COMMAND_SEEK_TO_WINDOW, + COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SET_SPEED_AND_PITCH, @@ -1382,23 +1385,31 @@ public interface Player { int COMMAND_PLAY_PAUSE = 1; /** Command to prepare the player, stop playback or release the player. */ int COMMAND_PREPARE_STOP = 2; - /** Command to seek to the default position of the current window. */ + /** Command to seek to the default position of the current {@link MediaItem}. */ int COMMAND_SEEK_TO_DEFAULT_POSITION = 3; - /** Command to seek anywhere into the current window. */ - int COMMAND_SEEK_IN_CURRENT_WINDOW = 4; - /** Command to seek to the default position of the previous window. */ - int COMMAND_SEEK_TO_PREVIOUS_WINDOW = 5; - /** Command to seek to an earlier position in the current or previous window. */ + /** Command to seek anywhere into the current {@link MediaItem}. */ + int COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM = 4; + /** @deprecated Use {@link #COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM} instead. */ + @Deprecated int COMMAND_SEEK_IN_CURRENT_WINDOW = COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; + /** Command to seek to the default position of the previous {@link MediaItem}. */ + int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM = 5; + /** @deprecated Use {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} instead. */ + @Deprecated int COMMAND_SEEK_TO_PREVIOUS_WINDOW = COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; + /** Command to seek to an earlier position in the current or previous {@link MediaItem}. */ int COMMAND_SEEK_TO_PREVIOUS = 6; - /** Command to seek to the default position of the next window. */ - int COMMAND_SEEK_TO_NEXT_WINDOW = 7; - /** Command to seek to a later position in the current or next window. */ + /** Command to seek to the default position of the next {@link MediaItem}. */ + int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM = 7; + /** @deprecated Use {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} instead. */ + @Deprecated int COMMAND_SEEK_TO_NEXT_WINDOW = COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; + /** Command to seek to a later position in the current or next {@link MediaItem}. */ int COMMAND_SEEK_TO_NEXT = 8; - /** Command to seek anywhere in any window. */ - int COMMAND_SEEK_TO_WINDOW = 9; - /** Command to seek back by a fixed increment into the current window. */ + /** Command to seek anywhere in any {@link MediaItem}. */ + int COMMAND_SEEK_TO_MEDIA_ITEM = 9; + /** @deprecated Use {@link #COMMAND_SEEK_TO_MEDIA_ITEM} instead. */ + @Deprecated int COMMAND_SEEK_TO_WINDOW = COMMAND_SEEK_TO_MEDIA_ITEM; + /** Command to seek back by a fixed increment into the current {@link MediaItem}. */ int COMMAND_SEEK_BACK = 10; - /** Command to seek forward by a fixed increment into the current window. */ + /** Command to seek forward by a fixed increment into the current {@link MediaItem}. */ int COMMAND_SEEK_FORWARD = 11; /** Command to set the playback speed and pitch. */ int COMMAND_SET_SPEED_AND_PITCH = 12; @@ -1406,7 +1417,7 @@ public interface Player { int COMMAND_SET_SHUFFLE_MODE = 13; /** Command to set the repeat mode. */ int COMMAND_SET_REPEAT_MODE = 14; - /** Command to get the {@link MediaItem} of the current window. */ + /** Command to get the currently playing {@link MediaItem}. */ int COMMAND_GET_CURRENT_MEDIA_ITEM = 15; /** Command to get the information about the current timeline. */ int COMMAND_GET_TIMELINE = 16; @@ -1478,7 +1489,7 @@ public interface Player { * @param mediaItems The new {@link MediaItem MediaItems}. * @param resetPosition Whether the playback position should be reset to the default position in * the first {@link Timeline.Window}. If false, playback will start from the position defined - * by {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}. + * by {@link #getCurrentMediaItemIndex()} and {@link #getCurrentPosition()}. */ void setMediaItems(List mediaItems, boolean resetPosition); @@ -1518,7 +1529,7 @@ public interface Player { * * @param mediaItem The new {@link MediaItem}. * @param resetPosition Whether the playback position should be reset to the default position. If - * false, playback will start from the position defined by {@link #getCurrentWindowIndex()} + * false, playback will start from the position defined by {@link #getCurrentMediaItemIndex()} * and {@link #getCurrentPosition()}. */ void setMediaItem(MediaItem mediaItem, boolean resetPosition); @@ -1599,12 +1610,12 @@ public interface Player { * *

        This method does not execute the command. * - *

        Executing a command that is not available (for example, calling {@link #seekToNextWindow()} - * if {@link #COMMAND_SEEK_TO_NEXT_WINDOW} is unavailable) will neither throw an exception nor - * generate a {@link #getPlayerError()} player error}. + *

        Executing a command that is not available (for example, calling {@link + * #seekToNextMediaItem()} if {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} is unavailable) will + * neither throw an exception nor generate a {@link #getPlayerError()} player error}. * - *

        {@link #COMMAND_SEEK_TO_PREVIOUS_WINDOW} and {@link #COMMAND_SEEK_TO_NEXT_WINDOW} are - * unavailable if there is no such {@link MediaItem}. + *

        {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} and {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} + * are unavailable if there is no such {@link MediaItem}. * * @param command A {@link Command}. * @return Whether the {@link Command} is available. @@ -1623,11 +1634,11 @@ public interface Player { * change. * *

        Executing a command that is not available (for example, calling {@link #seekToNextWindow()} - * if {@link #COMMAND_SEEK_TO_NEXT_WINDOW} is unavailable) will neither throw an exception nor + * if {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} is unavailable) will neither throw an exception nor * generate a {@link #getPlayerError()} player error}. * - *

        {@link #COMMAND_SEEK_TO_PREVIOUS_WINDOW} and {@link #COMMAND_SEEK_TO_NEXT_WINDOW} are - * unavailable if there is no such {@link MediaItem}. + *

        {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} and {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} + * are unavailable if there is no such {@link MediaItem}. * * @return The currently available {@link Commands}. * @see Listener#onAvailableCommandsChanged @@ -1810,38 +1821,46 @@ public interface Player { /** Seeks forward in the current window by {@link #getSeekForwardIncrement()} milliseconds. */ void seekForward(); - /** @deprecated Use {@link #hasPreviousWindow()} instead. */ + /** @deprecated Use {@link #hasPreviousMediaItem()} instead. */ @Deprecated boolean hasPrevious(); + /** @deprecated Use {@link #hasPreviousMediaItem()} instead. */ + @Deprecated + boolean hasPreviousWindow(); + /** - * Returns whether a previous window exists, which may depend on the current repeat mode and + * Returns whether a previous media item exists, which may depend on the current repeat mode and * whether shuffle mode is enabled. * *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more * details. */ - boolean hasPreviousWindow(); + boolean hasPreviousMediaItem(); - /** @deprecated Use {@link #seekToPreviousWindow()} instead. */ + /** @deprecated Use {@link #seekToPreviousMediaItem()} instead. */ @Deprecated void previous(); + /** @deprecated Use {@link #seekToPreviousMediaItem()} instead. */ + @Deprecated + void seekToPreviousWindow(); + /** - * Seeks to the default position of the previous window, which may depend on the current repeat - * mode and whether shuffle mode is enabled. Does nothing if {@link #hasPreviousWindow()} is - * {@code false}. + * Seeks to the default position of the previous {@link MediaItem}, which may depend on the + * current repeat mode and whether shuffle mode is enabled. Does nothing if {@link + * #hasPreviousMediaItem()} is {@code false}. * *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more * details. */ - void seekToPreviousWindow(); + void seekToPreviousMediaItem(); /** - * Returns the maximum position for which {@link #seekToPrevious()} seeks to the previous window, - * in milliseconds. + * Returns the maximum position for which {@link #seekToPrevious()} seeks to the previous {@link + * MediaItem}, in milliseconds. * * @return The maximum seek to previous position, in milliseconds. * @see Listener#onMaxSeekToPreviousPositionChanged(long) @@ -1849,29 +1868,35 @@ public interface Player { long getMaxSeekToPreviousPosition(); /** - * Seeks to an earlier position in the current or previous window (if available). More precisely: + * Seeks to an earlier position in the current or previous {@link MediaItem} (if available). More + * precisely: * *

          *
        • If the timeline is empty or seeking is not possible, does nothing. - *
        • Otherwise, if the current window is {@link #isCurrentWindowLive() live} and {@link - * #isCurrentWindowSeekable() unseekable}, then: + *
        • Otherwise, if the current {@link MediaItem} is {@link #isCurrentMediaItemLive()} live} + * and {@link #isCurrentMediaItemSeekable() unseekable}, then: *
            - *
          • If {@link #hasPreviousWindow() a previous window exists}, seeks to the default - * position of the previous window. + *
          • If {@link #hasPreviousMediaItem() a previous media item exists}, seeks to the + * default position of the previous media item. *
          • Otherwise, does nothing. *
          - *
        • Otherwise, if {@link #hasPreviousWindow() a previous window exists} and the {@link + *
        • Otherwise, if {@link #hasPreviousMediaItem() a previous media item exists} and the {@link * #getCurrentPosition() current position} is less than {@link - * #getMaxSeekToPreviousPosition()}, seeks to the default position of the previous window. - *
        • Otherwise, seeks to 0 in the current window. + * #getMaxSeekToPreviousPosition()}, seeks to the default position of the previous {@link + * MediaItem}. + *
        • Otherwise, seeks to 0 in the current {@link MediaItem}. *
        */ void seekToPrevious(); - /** @deprecated Use {@link #hasNextWindow()} instead. */ + /** @deprecated Use {@link #hasNextMediaItem()} instead. */ @Deprecated boolean hasNext(); + /** @deprecated Use {@link #hasNextMediaItem()} instead. */ + @Deprecated + boolean hasNextWindow(); + /** * Returns whether a next window exists, which may depend on the current repeat mode and whether * shuffle mode is enabled. @@ -1880,31 +1905,37 @@ public interface Player { * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more * details. */ - boolean hasNextWindow(); + boolean hasNextMediaItem(); - /** @deprecated Use {@link #seekToNextWindow()} instead. */ + /** @deprecated Use {@link #seekToNextMediaItem()} instead. */ @Deprecated void next(); + /** @deprecated Use {@link #seekToNextMediaItem()} instead. */ + @Deprecated + void seekToNextWindow(); + /** * Seeks to the default position of the next window, which may depend on the current repeat mode - * and whether shuffle mode is enabled. Does nothing if {@link #hasNextWindow()} is {@code false}. + * and whether shuffle mode is enabled. Does nothing if {@link #hasNextMediaItem()} is {@code + * false}. * *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more * details. */ - void seekToNextWindow(); + void seekToNextMediaItem(); /** - * Seeks to a later position in the current or next window (if available). More precisely: + * Seeks to a later position in the current or next {@link MediaItem} (if available). More + * precisely: * *

          *
        • If the timeline is empty or seeking is not possible, does nothing. - *
        • Otherwise, if {@link #hasNextWindow() a next window exists}, seeks to the default - * position of the next window. - *
        • Otherwise, if the current window is {@link #isCurrentWindowLive() live} and has not - * ended, seeks to the live edge of the current window. + *
        • Otherwise, if {@link #hasNextMediaItem() a next media item exists}, seeks to the default + * position of the next {@link MediaItem}. + *
        • Otherwise, if the current window is {@link #isCurrentMediaItemLive() live} and has not + * ended, seeks to the live edge of the current {@link MediaItem}. *
        • Otherwise, does nothing. *
        */ @@ -2057,38 +2088,51 @@ public interface Player { /** Returns the index of the period currently being played. */ int getCurrentPeriodIndex(); - /** - * Returns the index of the current {@link Timeline.Window window} in the {@link - * #getCurrentTimeline() timeline}, or the prospective window index if the {@link - * #getCurrentTimeline() current timeline} is empty. - */ + /** @deprecated Use {@link #getCurrentMediaItem()} instead. */ + @Deprecated int getCurrentWindowIndex(); /** - * Returns the index of the window that will be played if {@link #seekToNextWindow()} is called, - * which may depend on the current repeat mode and whether shuffle mode is enabled. Returns {@link - * C#INDEX_UNSET} if {@link #hasNextWindow()} is {@code false}. - * - *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when - * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more - * details. + * Returns the index of the current {@link MediaItem} in the {@link #getCurrentTimeline() + * timeline}, or the prospective index if the {@link #getCurrentTimeline() current timeline} is + * empty. */ + int getCurrentMediaItemIndex(); + + /** @deprecated Use {@link #getNextMediaItemIndex()} instead. */ + @Deprecated int getNextWindowIndex(); /** - * Returns the index of the window that will be played if {@link #seekToPreviousWindow()} is - * called, which may depend on the current repeat mode and whether shuffle mode is enabled. - * Returns {@link C#INDEX_UNSET} if {@link #hasPreviousWindow()} is {@code false}. + * Returns the index of the {@link MediaItem} that will be played if {@link + * #seekToNextMediaItem()} is called, which may depend on the current repeat mode and whether + * shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if {@link #hasNextMediaItem()} is {@code + * false}. * *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more * details. */ + int getNextMediaItemIndex(); + + /** @deprecated Use {@link #getPreviousMediaItemIndex()} instead. */ + @Deprecated int getPreviousWindowIndex(); /** - * Returns the media item of the current window in the timeline. May be null if the timeline is - * empty. + * Returns the index of the {@link MediaItem} that will be played if {@link + * #seekToPreviousMediaItem()} is called, which may depend on the current repeat mode and whether + * shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if {@link #hasPreviousMediaItem()} is + * {@code false}. + * + *

        Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when + * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more + * details. + */ + int getPreviousMediaItemIndex(); + + /** + * Returns the currently playing {@link MediaItem}. May be null if the timeline is empty. * * @see Listener#onMediaItemTransition(MediaItem, int) */ @@ -2102,26 +2146,25 @@ public interface Player { MediaItem getMediaItemAt(@IntRange(from = 0) int index); /** - * Returns the duration of the current content window or ad in milliseconds, or {@link - * C#TIME_UNSET} if the duration is not known. + * Returns the duration of the current content or ad in milliseconds, or {@link C#TIME_UNSET} if + * the duration is not known. */ long getDuration(); /** - * Returns the playback position in the current content window or ad, in milliseconds, or the - * prospective position in milliseconds if the {@link #getCurrentTimeline() current timeline} is - * empty. + * Returns the playback position in the current content or ad, in milliseconds, or the prospective + * position in milliseconds if the {@link #getCurrentTimeline() current timeline} is empty. */ long getCurrentPosition(); /** - * Returns an estimate of the position in the current content window or ad up to which data is - * buffered, in milliseconds. + * Returns an estimate of the position in the current content or ad up to which data is buffered, + * in milliseconds. */ long getBufferedPosition(); /** - * Returns an estimate of the percentage in the current content window or ad up to which data is + * Returns an estimate of the percentage in the current content or ad up to which data is * buffered, or 0 if no estimate is available. */ @IntRange(from = 0, to = 100) @@ -2129,29 +2172,38 @@ public interface Player { /** * Returns an estimate of the total buffered duration from the current position, in milliseconds. - * This includes pre-buffered data for subsequent ads and windows. + * This includes pre-buffered data for subsequent ads and {@link MediaItem media items}. */ long getTotalBufferedDuration(); - /** - * Returns whether the current window is dynamic, or {@code false} if the {@link Timeline} is - * empty. - * - * @see Timeline.Window#isDynamic - */ + /** @deprecated Use {@link #isCurrentMediaItemDynamic()} instead. */ + @Deprecated boolean isCurrentWindowDynamic(); /** - * Returns whether the current window is live, or {@code false} if the {@link Timeline} is empty. + * Returns whether the current {@link MediaItem} is dynamic (may change when the {@link Timeline} + * is updated,) or {@code false} if the {@link Timeline} is empty. * - * @see Timeline.Window#isLive() + * @see Timeline.Window#isDynamic */ + boolean isCurrentMediaItemDynamic(); + + /** @deprecated Use {@link #isCurrentMediaItemLive()} instead. */ + @Deprecated boolean isCurrentWindowLive(); + /** + * Returns whether the current {@link MediaItem} is live, or {@code false} if the {@link Timeline} + * is empty. + * + * @see Timeline.Window#isLive() + */ + boolean isCurrentMediaItemLive(); + /** * Returns the offset of the current playback position from the live edge in milliseconds, or - * {@link C#TIME_UNSET} if the current window {@link #isCurrentWindowLive() isn't live} or the - * offset is unknown. + * {@link C#TIME_UNSET} if the current {@link MediaItem} {@link #isCurrentMediaItemLive()} isn't + * live} or the offset is unknown. * *

        The offset is calculated as {@code currentTime - playbackPosition}, so should usually be * positive. @@ -2161,13 +2213,17 @@ public interface Player { */ long getCurrentLiveOffset(); + /** @deprecated Use {@link #isCurrentMediaItemSeekable()} instead. */ + @Deprecated + boolean isCurrentWindowSeekable(); + /** - * Returns whether the current window is seekable, or {@code false} if the {@link Timeline} is - * empty. + * Returns whether the current {@link MediaItem} is seekable, or {@code false} if the {@link + * Timeline} is empty. * * @see Timeline.Window#isSeekable */ - boolean isCurrentWindowSeekable(); + boolean isCurrentMediaItemSeekable(); /** Returns whether the player is currently playing an ad. */ boolean isPlayingAd(); @@ -2185,9 +2241,9 @@ public interface Player { int getCurrentAdIndexInAdGroup(); /** - * If {@link #isPlayingAd()} returns {@code true}, returns the duration of the current content - * window in milliseconds, or {@link C#TIME_UNSET} if the duration is not known. If there is no ad - * playing, the returned duration is the same as that returned by {@link #getDuration()}. + * If {@link #isPlayingAd()} returns {@code true}, returns the duration of the current content in + * milliseconds, or {@link C#TIME_UNSET} if the duration is not known. If there is no ad playing, + * the returned duration is the same as that returned by {@link #getDuration()}. */ long getContentDuration(); @@ -2200,8 +2256,8 @@ public interface Player { /** * If {@link #isPlayingAd()} returns {@code true}, returns an estimate of the content position in - * the current content window up to which data is buffered, in milliseconds. If there is no ad - * playing, the returned position is the same as that returned by {@link #getBufferedPosition()}. + * the current content up to which data is buffered, in milliseconds. If there is no ad playing, + * the returned position is the same as that returned by {@link #getBufferedPosition()}. */ long getContentBufferedPosition(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index d3d041ce93..ab669cb737 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -843,7 +843,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } @Override - public int getCurrentWindowIndex() { + public int getCurrentMediaItemIndex() { int currentWindowIndex = getCurrentWindowIndexInternal(); return currentWindowIndex == C.INDEX_UNSET ? 0 : currentWindowIndex; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index eb5dc12060..589b196531 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1502,7 +1502,7 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public int getCurrentWindowIndex() { + public int getCurrentMediaItemIndex() { verifyApplicationThread(); return player.getCurrentWindowIndex(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index db307b52db..f46e394d38 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -505,7 +505,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override - public int getCurrentWindowIndex() { + public int getCurrentMediaItemIndex() { throw new UnsupportedOperationException(); } From d5f71a5dbd28867754a798a2f8287c84ceccdceb Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 6 Oct 2021 16:03:21 +0100 Subject: [PATCH 285/441] Move misplaced parenthesis. PiperOrigin-RevId: 401245843 --- .../src/main/java/com/google/android/exoplayer2/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 200db98a0e..4ca4e18c5a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -2182,7 +2182,7 @@ public interface Player { /** * Returns whether the current {@link MediaItem} is dynamic (may change when the {@link Timeline} - * is updated,) or {@code false} if the {@link Timeline} is empty. + * is updated), or {@code false} if the {@link Timeline} is empty. * * @see Timeline.Window#isDynamic */ From ee71c8387c7af05aee9ef73cc106c83a027d6e14 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 6 Oct 2021 19:16:21 +0100 Subject: [PATCH 286/441] Migrate usages of deprecated Player COMMAND_ constants PiperOrigin-RevId: 401292817 --- .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../exoplayer2/ext/cast/CastPlayerTest.java | 50 ++++++------ .../exoplayer2/ext/media2/PlayerWrapper.java | 10 +-- .../mediasession/MediaSessionConnector.java | 4 +- .../mediasession/TimelineQueueNavigator.java | 12 +-- .../google/android/exoplayer2/BasePlayer.java | 8 +- .../android/exoplayer2/ExoPlayerImpl.java | 2 +- .../android/exoplayer2/ExoPlayerTest.java | 78 ++++++++++--------- .../exoplayer2/ui/PlayerControlView.java | 4 +- .../ui/StyledPlayerControlView.java | 4 +- 10 files changed, 93 insertions(+), 81 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 6d479fef31..940eb28ba5 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -96,7 +96,7 @@ public final class CastPlayer extends BasePlayer { COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, - COMMAND_SEEK_TO_WINDOW, + COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_GET_CURRENT_MEDIA_ITEM, diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index 3195218b4e..30d227bb5b 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -28,13 +28,13 @@ import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_DEFAULT_POSITION; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SET_DEVICE_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_SET_MEDIA_ITEMS_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; @@ -1317,12 +1317,12 @@ public class CastPlayerTest { assertThat(castPlayer.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_PREPARE_STOP)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_DEFAULT_POSITION)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_BACK)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_FORWARD)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isTrue(); @@ -1360,7 +1360,7 @@ public class CastPlayerTest { durationsMs, /* positionMs= */ C.TIME_UNSET); - assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW)).isFalse(); + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); } @@ -1430,12 +1430,14 @@ public class CastPlayerTest { when(mockRemoteMediaClient.queueJumpToItem(anyInt(), anyLong(), eq(null))) .thenReturn(mockPendingResult); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1, 2, 3, 4}; List mediaItems = createMediaItems(mediaQueueItemIds); @@ -1462,12 +1464,14 @@ public class CastPlayerTest { when(mockRemoteMediaClient.queueJumpToItem(anyInt(), anyLong(), eq(null))) .thenReturn(mockPendingResult); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1, 2, 3, 4}; List mediaItems = createMediaItems(mediaQueueItemIds); @@ -1511,7 +1515,7 @@ public class CastPlayerTest { public void addMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); MediaItem mediaItem3 = createMediaItem(/* mediaQueueItemId= */ 3); @@ -1545,7 +1549,7 @@ public class CastPlayerTest { public void addMediaItem_atTheStart_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); MediaItem mediaItem3 = createMediaItem(/* mediaQueueItemId= */ 3); @@ -1579,7 +1583,7 @@ public class CastPlayerTest { public void removeMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty= */ true); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); @@ -1624,7 +1628,7 @@ public class CastPlayerTest { .thenReturn(mockPendingResult); Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty= */ true); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); @@ -1667,7 +1671,7 @@ public class CastPlayerTest { public void removeMediaItem_current_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); MediaItem mediaItem1 = createMediaItem(/* mediaQueueItemId= */ 1); MediaItem mediaItem2 = createMediaItem(/* mediaQueueItemId= */ 2); @@ -1696,7 +1700,9 @@ public class CastPlayerTest { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); int[] mediaQueueItemIds = new int[] {1}; List mediaItems = createMediaItems(mediaQueueItemIds); @@ -1821,7 +1827,7 @@ public class CastPlayerTest { Player.Commands.Builder builder = new Player.Commands.Builder(); builder.addAll(CastPlayer.PERMANENT_AVAILABLE_COMMANDS); if (!isTimelineEmpty) { - builder.add(COMMAND_SEEK_IN_CURRENT_WINDOW); + builder.add(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); builder.add(COMMAND_SEEK_TO_PREVIOUS); builder.add(COMMAND_SEEK_BACK); builder.add(COMMAND_SEEK_FORWARD); diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java index 739029a20e..d89be811c6 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java @@ -17,10 +17,10 @@ package com.google.android.exoplayer2.ext.media2; import static com.google.android.exoplayer2.Player.COMMAND_GET_AUDIO_ATTRIBUTES; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_WINDOW; import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE; import static com.google.android.exoplayer2.util.Util.postOrRun; @@ -264,7 +264,7 @@ import java.util.List; Assertions.checkState(0 <= index && index < timeline.getWindowCount()); int windowIndex = player.getCurrentWindowIndex(); if (windowIndex != index) { - return player.isCommandAvailable(COMMAND_SEEK_TO_WINDOW) + return player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM) && controlDispatcher.dispatchSeekTo(player, index, C.TIME_UNSET); } return false; @@ -334,7 +334,7 @@ import java.util.List; public boolean play() { if (player.getPlaybackState() == Player.STATE_ENDED) { boolean seekHandled = - player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW) + player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) && controlDispatcher.dispatchSeekTo( player, player.getCurrentWindowIndex(), /* positionMs= */ 0); if (!seekHandled) { @@ -361,7 +361,7 @@ import java.util.List; } public boolean seekTo(long position) { - return player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW) + return player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) && controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), position); } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index e1bc902dc3..317599f618 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -18,7 +18,7 @@ package com.google.android.exoplayer2.ext.mediasession; import static androidx.media.utils.MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_MEDIA_ID; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.EVENT_IS_PLAYING_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_PARAMETERS_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_PLAYBACK_STATE_CHANGED; @@ -931,7 +931,7 @@ public final class MediaSessionConnector { } private long buildPlaybackActions(Player player) { - boolean enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW); + boolean enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); boolean enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); boolean enableFastForward = diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java index 2b33d9b989..cb8927a2b5 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java @@ -15,9 +15,9 @@ */ package com.google.android.exoplayer2.ext.mediasession; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; import static java.lang.Math.min; import android.os.Bundle; @@ -102,12 +102,12 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu timeline.getWindow(player.getCurrentWindowIndex(), window); enableSkipTo = timeline.getWindowCount() > 1; enablePrevious = - player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW) + player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) || !window.isLive() - || player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + || player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); enableNext = (window.isLive() && window.isDynamic) - || player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW); + || player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM); } long actions = 0; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index eeebb5e854..06d675d59f 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -389,20 +389,20 @@ public abstract class BasePlayer implements Player { return new Commands.Builder() .addAll(permanentAvailableCommands) .addIf(COMMAND_SEEK_TO_DEFAULT_POSITION, !isPlayingAd()) - .addIf(COMMAND_SEEK_IN_CURRENT_WINDOW, isCurrentWindowSeekable() && !isPlayingAd()) - .addIf(COMMAND_SEEK_TO_PREVIOUS_WINDOW, hasPreviousWindow() && !isPlayingAd()) + .addIf(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, isCurrentWindowSeekable() && !isPlayingAd()) + .addIf(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, hasPreviousWindow() && !isPlayingAd()) .addIf( COMMAND_SEEK_TO_PREVIOUS, !getCurrentTimeline().isEmpty() && (hasPreviousWindow() || !isCurrentWindowLive() || isCurrentWindowSeekable()) && !isPlayingAd()) - .addIf(COMMAND_SEEK_TO_NEXT_WINDOW, hasNextWindow() && !isPlayingAd()) + .addIf(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, hasNextWindow() && !isPlayingAd()) .addIf( COMMAND_SEEK_TO_NEXT, !getCurrentTimeline().isEmpty() && (hasNextWindow() || (isCurrentWindowLive() && isCurrentWindowDynamic())) && !isPlayingAd()) - .addIf(COMMAND_SEEK_TO_WINDOW, !isPlayingAd()) + .addIf(COMMAND_SEEK_TO_MEDIA_ITEM, !isPlayingAd()) .addIf(COMMAND_SEEK_BACK, isCurrentWindowSeekable() && !isPlayingAd()) .addIf(COMMAND_SEEK_FORWARD, isCurrentWindowSeekable() && !isPlayingAd()) .build(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index ab669cb737..fbf79d766c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -220,7 +220,7 @@ import java.util.concurrent.CopyOnWriteArraySet; new Commands.Builder() .addAll(permanentAvailableCommands) .add(COMMAND_SEEK_TO_DEFAULT_POSITION) - .add(COMMAND_SEEK_TO_WINDOW) + .add(COMMAND_SEEK_TO_MEDIA_ITEM) .build(); mediaMetadata = MediaMetadata.EMPTY; playlistMetadata = MediaMetadata.EMPTY; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 1de7410140..5c3e2c8225 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -29,13 +29,13 @@ import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_DEFAULT_POSITION; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SET_DEVICE_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_SET_MEDIA_ITEMS_METADATA; import static com.google.android.exoplayer2.Player.COMMAND_SET_REPEAT_MODE; @@ -8320,12 +8320,12 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_PREPARE_STOP)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_DEFAULT_POSITION)).isTrue(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW)).isFalse(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isTrue(); @@ -8373,12 +8373,12 @@ public final class ExoPlayerTest { player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); - assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW)).isFalse(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isFalse(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isFalse(); - assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); } @@ -8398,7 +8398,7 @@ public final class ExoPlayerTest { player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); - assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW)).isFalse(); + assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); } @@ -8483,12 +8483,14 @@ public final class ExoPlayerTest { @Test public void seekTo_nextWindow_notifiesAvailableCommandsChanged() { Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8518,12 +8520,14 @@ public final class ExoPlayerTest { @Test public void seekTo_previousWindow_notifiesAvailableCommandsChanged() { Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8570,25 +8574,25 @@ public final class ExoPlayerTest { @Test public void automaticWindowTransition_notifiesAvailableCommandsChanged() throws Exception { Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands commandsWithSeekInCurrentAndToNextWindow = createWithDefaultCommands( - COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD); Player.Commands commandsWithSeekInCurrentAndToPreviousWindow = createWithDefaultCommands( - COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_TO_PREVIOUS_WINDOW, + COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD); Player.Commands commandsWithSeekAnywhere = createWithDefaultCommands( - COMMAND_SEEK_IN_CURRENT_WINDOW, - COMMAND_SEEK_TO_PREVIOUS_WINDOW, - COMMAND_SEEK_TO_NEXT_WINDOW, + COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD); @@ -8630,7 +8634,7 @@ public final class ExoPlayerTest { public void addMediaSource_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8652,7 +8656,7 @@ public final class ExoPlayerTest { public void addMediaSource_atTheStart_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8674,7 +8678,7 @@ public final class ExoPlayerTest { public void removeMediaItem_atTheEnd_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty */ true); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); @@ -8702,7 +8706,7 @@ public final class ExoPlayerTest { public void removeMediaItem_atTheStart_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands emptyTimelineCommands = createWithDefaultCommands(/* isTimelineEmpty */ true); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); @@ -8731,7 +8735,7 @@ public final class ExoPlayerTest { public void removeMediaItem_current_notifiesAvailableCommandsChanged() { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8751,7 +8755,9 @@ public final class ExoPlayerTest { Player.Commands defaultCommands = createWithDefaultCommands(); Player.Commands commandsWithSeekToPreviousAndNextWindow = createWithDefaultCommands( - COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, + COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -8783,9 +8789,9 @@ public final class ExoPlayerTest { @Test public void setShuffleModeEnabled_notifiesAvailableCommandsChanged() { Player.Commands commandsWithSeekToPreviousWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_WINDOW); + createWithDefaultCommands(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM); Player.Commands commandsWithSeekToNextWindow = - createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_NEXT); + createWithDefaultCommands(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT); Player.Listener mockListener = mock(Player.Listener.class); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); @@ -11223,7 +11229,7 @@ public final class ExoPlayerTest { COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, - COMMAND_SEEK_TO_WINDOW, + COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_REPEAT_MODE, diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index fad7753e17..18bad21a85 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -17,7 +17,7 @@ package com.google.android.exoplayer2.ui; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; import static com.google.android.exoplayer2.Player.EVENT_AVAILABLE_COMMANDS_CHANGED; @@ -880,7 +880,7 @@ public class PlayerControlView extends FrameLayout { boolean enableFastForward = false; boolean enableNext = false; if (player != null) { - enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW); + enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); enablePrevious = player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS); enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 69b0ad0fd1..69e9f6f516 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -17,7 +17,7 @@ package com.google.android.exoplayer2.ui; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; -import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW; +import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS; import static com.google.android.exoplayer2.Player.EVENT_AVAILABLE_COMMANDS_CHANGED; @@ -1126,7 +1126,7 @@ public class StyledPlayerControlView extends FrameLayout { boolean enableFastForward = false; boolean enableNext = false; if (player != null) { - enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_WINDOW); + enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); enablePrevious = player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS); enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); From f440aed4e947e5f2b2a4a025d376f582f2746fc3 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 7 Oct 2021 08:39:56 +0100 Subject: [PATCH 287/441] Make ExoPlayer.Builder#build return SimpleExoPlayer In a future change it will be updated to return ExoPlayer We no longer need separate methods to build Player and ExoPlayer, so buildExoPlayer will be removed shortly. PiperOrigin-RevId: 401441016 --- .../main/java/com/google/android/exoplayer2/ExoPlayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index c9dd336be6..b07113f69b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -838,12 +838,12 @@ public interface ExoPlayer extends Player { } /** - * Builds a {@link Player} instance. + * Builds a {@link SimpleExoPlayer} instance. * * @throws IllegalStateException If this method or {@link #buildExoPlayer()} has already been * called. */ - public Player build() { + public SimpleExoPlayer build() { return buildExoPlayer(); } From f3fb03e663d1e6cdea94d5dfe76b96a8d753e792 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 7 Oct 2021 09:49:45 +0100 Subject: [PATCH 288/441] Rollback of https://github.com/google/ExoPlayer/commit/ce0cf23a7f55bb721f7df9a5edb9fdf9e2000fd2 *** Original commit *** Migrate callers of ExoPlayer.Builder#build() to buildExoPlayer() An upcoming change will update build() to return Player. *** PiperOrigin-RevId: 401453039 --- .../com/google/android/exoplayer2/castdemo/PlayerManager.java | 2 +- .../java/com/google/android/exoplayer2/demo/PlayerActivity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index f3611bcbdb..e6a55b1ce5 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -90,7 +90,7 @@ import java.util.ArrayList; currentItemIndex = C.INDEX_UNSET; trackSelector = new DefaultTrackSelector(context); - exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).buildExoPlayer(); + exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); exoPlayer.addListener(this); localPlayerView.setPlayer(exoPlayer); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index e4b817db0b..5f5acea8ea 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -278,7 +278,7 @@ public class PlayerActivity extends AppCompatActivity new ExoPlayer.Builder(/* context= */ this, renderersFactory) .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) - .buildExoPlayer(); + .build(); player.addListener(new PlayerEventListener()); player.addAnalyticsListener(new EventLogger(trackSelector)); player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true); From e4221c384463dac43df496f61bf3bac7493bd71c Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 7 Oct 2021 11:24:18 +0100 Subject: [PATCH 289/441] Rollback of https://github.com/google/ExoPlayer/commit/ed23b2905bcf74b3cbe915fdb87ff3f6c50e28b9 *** Original commit *** Migrate callers of ExoPlayer.Builder#build() to buildExoPlayer() An upcoming change will update build() to return Player. PiperOrigin-RevId: 401468532 --- .../android/exoplayer2/gldemo/MainActivity.java | 2 +- .../exoplayer2/surfacedemo/MainActivity.java | 2 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 2 +- .../exoplayer2/ext/media2/PlayerTestRule.java | 2 +- .../ext/media2/SessionPlayerConnectorTest.java | 6 ++---- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 2 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 2 +- .../android/exoplayer2/ClippedPlaybackTest.java | 4 ++-- .../android/exoplayer2/drm/DrmPlaybackTest.java | 2 +- .../android/exoplayer2/SimpleExoPlayerTest.java | 14 ++++++-------- .../analytics/AnalyticsCollectorTest.java | 2 +- .../exoplayer2/e2etest/EndToEndGaplessTest.java | 2 +- .../exoplayer2/e2etest/FlacPlaybackTest.java | 2 +- .../exoplayer2/e2etest/FlvPlaybackTest.java | 2 +- .../exoplayer2/e2etest/MkaPlaybackTest.java | 2 +- .../exoplayer2/e2etest/MkvPlaybackTest.java | 2 +- .../exoplayer2/e2etest/Mp3PlaybackTest.java | 2 +- .../exoplayer2/e2etest/Mp4PlaybackTest.java | 2 +- .../exoplayer2/e2etest/OggPlaybackTest.java | 2 +- .../exoplayer2/e2etest/PlaylistPlaybackTest.java | 4 ++-- .../exoplayer2/e2etest/SilencePlaybackTest.java | 4 ++-- .../android/exoplayer2/e2etest/TsPlaybackTest.java | 2 +- .../exoplayer2/e2etest/Vp9PlaybackTest.java | 2 +- .../exoplayer2/e2etest/WavPlaybackTest.java | 2 +- .../ads/ServerSideInsertedAdMediaSourceTest.java | 10 ++++------ .../source/dash/e2etest/DashPlaybackTest.java | 4 ++-- .../exoplayer2/source/rtsp/RtspPlaybackTest.java | 2 +- .../transformer/TranscodingTransformer.java | 2 +- .../exoplayer2/transformer/Transformer.java | 2 +- .../playbacktests/gts/DashTestRunner.java | 2 +- .../android/exoplayer2/testutil/ExoHostedTest.java | 4 +--- .../exoplayer2/testutil/TestExoPlayerBuilder.java | 2 +- 32 files changed, 45 insertions(+), 53 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index aff3dbbf48..7488d94f98 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -173,7 +173,7 @@ public final class MainActivity extends Activity { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).buildExoPlayer(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setRepeatMode(Player.REPEAT_MODE_ALL); player.setMediaSource(mediaSource); player.prepare(); diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index a5fbd98431..44dd9d423b 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -217,7 +217,7 @@ public final class MainActivity extends Activity { } else { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).buildExoPlayer(); + SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setMediaSource(mediaSource); player.prepare(); player.play(); diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index f0f667ae4b..f5886505a9 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -117,7 +117,7 @@ public class FlacPlaybackTest { new Renderer[] { new LibflacAudioRenderer(eventHandler, audioRendererEventListener, audioSink) }; - player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index fcbd97e965..0dc6b89238 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -73,7 +73,7 @@ import org.junit.rules.ExternalResource; new ExoPlayer.Builder(context) .setLooper(Looper.myLooper()) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) - .buildExoPlayer(); + .build(); sessionPlayerConnector = new SessionPlayerConnector(exoPlayer); }); } diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java index 8a1712e3fe..5e78ba99a2 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java @@ -170,8 +170,7 @@ public class SessionPlayerConnectorTest { SimpleExoPlayer simpleExoPlayer = null; SessionPlayerConnector playerConnector = null; try { - simpleExoPlayer = - new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).buildExoPlayer(); + simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); playerConnector = new SessionPlayerConnector(simpleExoPlayer, new DefaultMediaItemConverter()); playerConnector.setControlDispatcher(controlDispatcher); @@ -196,8 +195,7 @@ public class SessionPlayerConnectorTest { Player forwardingPlayer = null; SessionPlayerConnector playerConnector = null; try { - Player simpleExoPlayer = - new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).buildExoPlayer(); + Player simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); forwardingPlayer = new ForwardingPlayer(simpleExoPlayer) { @Override diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 629a6b55ad..a398399068 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -97,7 +97,7 @@ public class OpusPlaybackTest { textRendererOutput, metadataRendererOutput) -> new Renderer[] {new LibopusAudioRenderer(eventHandler, audioRendererEventListener)}; - player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index a571f72c51..544418bd51 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -131,7 +131,7 @@ public class VpxPlaybackTest { videoRendererEventListener, /* maxDroppedFramesToNotify= */ -1) }; - player = new ExoPlayer.Builder(context, renderersFactory).buildExoPlayer(); + player = new ExoPlayer.Builder(context, renderersFactory).build(); player.addListener(this); MediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index 1ab81138aa..a8f0697167 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -59,7 +59,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); player.get().addListener(textCapturer); player.get().setMediaItem(mediaItem); player.get().prepare(); @@ -101,7 +101,7 @@ public final class ClippedPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); player.get().addListener(textCapturer); player.get().setMediaItems(mediaItems); player.get().prepare(); diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java index 57357974db..c342e9a1a7 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java @@ -70,7 +70,7 @@ public final class DrmPlaybackTest { getInstrumentation() .runOnMainSync( () -> { - player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).buildExoPlayer()); + player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build()); player .get() .addListener( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java index a758250fb4..15bd503925 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java @@ -52,9 +52,7 @@ public class SimpleExoPlayerTest { public void builder_inBackgroundThread_doesNotThrow() throws Exception { Thread builderThread = new Thread( - () -> - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) - .buildExoPlayer()); + () -> new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); AtomicReference builderThrow = new AtomicReference<>(); builderThread.setUncaughtExceptionHandler((thread, throwable) -> builderThrow.set(throwable)); @@ -67,7 +65,7 @@ public class SimpleExoPlayerTest { @Test public void onPlaylistMetadataChanged_calledWhenPlaylistMetadataSet() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener playerListener = mock(Player.Listener.class); player.addListener(playerListener); AnalyticsListener analyticsListener = mock(AnalyticsListener.class); @@ -88,7 +86,7 @@ public class SimpleExoPlayerTest { (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); AnalyticsListener listener = mock(AnalyticsListener.class); player.addAnalyticsListener(listener); // Do something that requires clean-up callbacks like decoder disabling. @@ -114,7 +112,7 @@ public class SimpleExoPlayerTest { (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); player.setMediaSource( @@ -135,7 +133,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingVolumeEventInListener() throws Exception { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); @@ -149,7 +147,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingDeviceVolumeEventsInListener() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(); + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 4be75e1443..58432dd227 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -1954,7 +1954,7 @@ public final class AnalyticsCollectorTest { public void recursiveListenerInvocation_arrivesInCorrectOrder() { AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); analyticsCollector.setPlayer( - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).buildExoPlayer(), + new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), Looper.myLooper()); AnalyticsListener listener1 = mock(AnalyticsListener.class); AnalyticsListener listener2 = diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java index 254a658981..3e2422f064 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java @@ -90,7 +90,7 @@ public class EndToEndGaplessTest { SimpleExoPlayer player = new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setMediaItems( ImmutableList.of( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java index 83d9e0db00..779199c7a7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java @@ -67,7 +67,7 @@ public class FlacPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/flac/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java index c00b1f4f01..51e9051b60 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java @@ -58,7 +58,7 @@ public final class FlvPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java index fedef9f8b6..a3e2c1c32e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java @@ -60,7 +60,7 @@ public final class MkaPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/mka/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index d8158efe9c..398d6c05d4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -64,7 +64,7 @@ public final class MkvPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java index e4ec831b70..53a2d62de7 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java @@ -63,7 +63,7 @@ public final class Mp3PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/mp3/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java index 9076c3c2b6..ccb6ca9961 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java @@ -80,7 +80,7 @@ public class Mp4PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java index 79b17c6952..3966dd59ca 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java @@ -61,7 +61,7 @@ public final class OggPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/ogg/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java index 37b2b1ed3f..a5ecc58580 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java @@ -48,7 +48,7 @@ public final class PlaylistPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.addMediaItem(MediaItem.fromUri("asset:///media/wav/sample.wav")); @@ -70,7 +70,7 @@ public final class PlaylistPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.addMediaItem(MediaItem.fromUri("asset:///media/mka/bear-opus.mka")); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java index 94438c922a..7acd02fc66 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java @@ -48,7 +48,7 @@ public final class SilencePlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaSource(new SilenceMediaSource(/* durationUs= */ 500_000)); @@ -69,7 +69,7 @@ public final class SilencePlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaSource(new SilenceMediaSource(/* durationUs= */ 0)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java index 3afe1c28ea..fc741e0710 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java @@ -84,7 +84,7 @@ public class TsPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java index 69ad00f769..01f12d272d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java @@ -62,7 +62,7 @@ public final class Vp9PlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java index f51dd92a71..451a9d9f8b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java @@ -55,7 +55,7 @@ public final class WavPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.setMediaItem(MediaItem.fromUri("asset:///media/wav/" + inputFile)); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java index 0bf3080830..d93f802190 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java @@ -146,7 +146,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -205,7 +205,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -265,7 +265,7 @@ public final class ServerSideInsertedAdMediaSourceTest { SimpleExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, renderersFactory); @@ -320,9 +320,7 @@ public final class ServerSideInsertedAdMediaSourceTest { public void playbackWithSeek_isHandledCorrectly() throws Exception { Context context = ApplicationProvider.getApplicationContext(); SimpleExoPlayer player = - new ExoPlayer.Builder(context) - .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + new ExoPlayer.Builder(context).setClock(new FakeClock(/* isAutoAdvancing= */ true)).build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); ServerSideInsertedAdsMediaSource mediaSource = diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index 52c6d0fa99..053fd707e4 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -54,7 +54,7 @@ public final class DashPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); @@ -81,7 +81,7 @@ public final class DashPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) - .buildExoPlayer(); + .build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java index 87b9064229..4fd7361444 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java @@ -153,7 +153,7 @@ public final class RtspPlaybackTest { SimpleExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(clock) - .buildExoPlayer(); + .build(); player.setMediaSource( new RtspMediaSource( MediaItem.fromUri(RtspTestUtils.getTestUri(serverRtspPortNumber)), diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 641d846af5..c768ad9476 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -496,7 +496,7 @@ public final class TranscodingTransformer { .setLoadControl(loadControl) .setLooper(looper) .setClock(clock) - .buildExoPlayer(); + .build(); player.setMediaItem(mediaItem); player.addAnalyticsListener( new TranscodingTransformerAnalyticsListener(mediaItem, muxerWrapper)); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 7c6ba909c9..80c0a73846 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -485,7 +485,7 @@ public final class Transformer { .setLoadControl(loadControl) .setLooper(looper) .setClock(clock) - .buildExoPlayer(); + .build(); player.setMediaItem(mediaItem); player.addAnalyticsListener(new TransformerAnalyticsListener(mediaItem, muxerWrapper)); player.prepare(); diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index 87419dc67d..e0ae2074e2 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -317,7 +317,7 @@ import java.util.List; SimpleExoPlayer player = new ExoPlayer.Builder(host, new DebugRenderersFactory(host)) .setTrackSelector(trackSelector) - .buildExoPlayer(); + .build(); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index d4aa6b259f..97004ddacb 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -248,9 +248,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); renderersFactory.setAllowedVideoJoiningTimeMs(/* allowedVideoJoiningTimeMs= */ 0); SimpleExoPlayer player = - new ExoPlayer.Builder(host, renderersFactory) - .setTrackSelector(trackSelector) - .buildExoPlayer(); + new ExoPlayer.Builder(host, renderersFactory).setTrackSelector(trackSelector).build(); player.setVideoSurface(surface); return player; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index ea524256c9..c7089dcc9d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -313,6 +313,6 @@ public class TestExoPlayerBuilder { if (mediaSourceFactory != null) { builder.setMediaSourceFactory(mediaSourceFactory); } - return builder.buildExoPlayer(); + return builder.build(); } } From fc25798af6d7393f68e67d4f4e3f013f583f44a1 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 7 Oct 2021 11:35:41 +0100 Subject: [PATCH 290/441] Add public.xml to UI module with an empty node This is the recommended way to mark all resources as private: https://developer.android.com/studio/projects/android-library#PrivateResources PiperOrigin-RevId: 401470108 --- library/ui/src/main/res/values/public.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 library/ui/src/main/res/values/public.xml diff --git a/library/ui/src/main/res/values/public.xml b/library/ui/src/main/res/values/public.xml new file mode 100644 index 0000000000..e9c958a03d --- /dev/null +++ b/library/ui/src/main/res/values/public.xml @@ -0,0 +1,16 @@ + + + From 96a2c03f59df2e8673f1c7fdc89fbbc9ad52486b Mon Sep 17 00:00:00 2001 From: samrobinson Date: Thu, 7 Oct 2021 17:45:22 +0100 Subject: [PATCH 291/441] Add public SimpleExoPlayer methods to ExoPlayer. PiperOrigin-RevId: 401535981 --- RELEASENOTES.md | 3 + .../google/android/exoplayer2/ExoPlayer.java | 89 +++++++++++++++++++ .../android/exoplayer2/SimpleExoPlayer.java | 82 +++-------------- .../exoplayer2/testutil/StubExoPlayer.java | 71 +++++++++++++++ 4 files changed, 175 insertions(+), 70 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4dd7187546..81e25f90eb 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,6 +7,9 @@ level >= 31. Add methods in `DefaultMediaCodecRendererFactory` and `DefaultRenderersFactory` to force enable or force disable asynchronous queueing ([6348](https://github.com/google/ExoPlayer/issues/6348)). + * Add 12 public method headers to `ExoPlayer` that exist in + `SimpleExoPlayer`, such that all public methods in `SimpleExoPlayer` + are overrides. * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. * Move `com.google.android.exoplayer2.drm.DecryptionException` to diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index b07113f69b..650317f32c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -27,6 +27,7 @@ import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioSink; @@ -943,6 +944,23 @@ public interface ExoPlayer extends Player { */ void removeAudioOffloadListener(AudioOffloadListener listener); + /** Returns the {@link AnalyticsCollector} used for collecting analytics events. */ + AnalyticsCollector getAnalyticsCollector(); + + /** + * Adds an {@link AnalyticsListener} to receive analytics events. + * + * @param listener The listener to be added. + */ + void addAnalyticsListener(AnalyticsListener listener); + + /** + * Removes an {@link AnalyticsListener}. + * + * @param listener The listener to be removed. + */ + void removeAnalyticsListener(AnalyticsListener listener); + /** Returns the number of renderers. */ int getRendererCount(); @@ -1268,6 +1286,77 @@ public interface ExoPlayer extends Player { */ boolean getPauseAtEndOfMediaItems(); + /** Returns the audio format currently being played, or null if no audio is being played. */ + @Nullable + Format getAudioFormat(); + + /** Returns the video format currently being played, or null if no video is being played. */ + @Nullable + Format getVideoFormat(); + + /** Returns {@link DecoderCounters} for audio, or null if no audio is being played. */ + @Nullable + DecoderCounters getAudioDecoderCounters(); + + /** Returns {@link DecoderCounters} for video, or null if no video is being played. */ + @Nullable + DecoderCounters getVideoDecoderCounters(); + + /** + * Sets whether the player should pause automatically when audio is rerouted from a headset to + * device speakers. See the audio + * becoming noisy documentation for more information. + * + * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is + * rerouted from a headset to device speakers. + */ + void setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy); + + /** @deprecated Use {@link #setWakeMode(int)} instead. */ + @Deprecated + void setHandleWakeLock(boolean handleWakeLock); + + /** + * Sets how the player should keep the device awake for playback when the screen is off. + * + *

        Enabling this feature requires the {@link android.Manifest.permission#WAKE_LOCK} permission. + * It should be used together with a foreground {@link android.app.Service} for use cases where + * playback occurs and the screen is off (e.g. background audio playback). It is not useful when + * the screen will be kept on during playback (e.g. foreground video playback). + * + *

        When enabled, the locks ({@link android.os.PowerManager.WakeLock} / {@link + * android.net.wifi.WifiManager.WifiLock}) will be held whenever the player is in the {@link + * #STATE_READY} or {@link #STATE_BUFFERING} states with {@code playWhenReady = true}. The locks + * held depends on the specified {@link C.WakeMode}. + * + * @param wakeMode The {@link C.WakeMode} option to keep the device awake during playback. + */ + void setWakeMode(@C.WakeMode int wakeMode); + + /** + * Sets a {@link PriorityTaskManager}, or null to clear a previously set priority task manager. + * + *

        The priority {@link C#PRIORITY_PLAYBACK} will be set while the player is loading. + * + * @param priorityTaskManager The {@link PriorityTaskManager}, or null to clear a previously set + * priority task manager. + */ + void setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager); + + /** + * Sets whether the player should throw an {@link IllegalStateException} when methods are called + * from a thread other than the one associated with {@link #getApplicationLooper()}. + * + *

        The default is {@code true} and this method will be removed in the future. + * + * @param throwsWhenUsingWrongThread Whether to throw when methods are called from a wrong thread. + * @deprecated Disabling the enforcement can result in hard-to-detect bugs. Do not use this method + * except to ease the transition while wrong thread access problems are fixed. + */ + @Deprecated + void setThrowsWhenUsingWrongThread(boolean throwsWhenUsingWrongThread); + /** * Sets whether audio offload scheduling is enabled. If enabled, ExoPlayer's main loop will run as * rarely as possible when playing an audio stream using audio offload. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 589b196531..11f09cf9c4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -906,41 +906,25 @@ public class SimpleExoPlayer extends BasePlayer notifySkipSilenceEnabledChanged(); } - /** Returns the {@link AnalyticsCollector} used for collecting analytics events. */ + @Override public AnalyticsCollector getAnalyticsCollector() { return analyticsCollector; } - /** - * Adds an {@link AnalyticsListener} to receive analytics events. - * - * @param listener The listener to be added. - */ + @Override public void addAnalyticsListener(AnalyticsListener listener) { // Don't verify application thread. We allow calls to this method from any thread. Assertions.checkNotNull(listener); analyticsCollector.addListener(listener); } - /** - * Removes an {@link AnalyticsListener}. - * - * @param listener The listener to be removed. - */ + @Override public void removeAnalyticsListener(AnalyticsListener listener) { // Don't verify application thread. We allow calls to this method from any thread. analyticsCollector.removeListener(listener); } - /** - * Sets whether the player should pause automatically when audio is rerouted from a headset to - * device speakers. See the audio - * becoming noisy documentation for more information. - * - * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is - * rerouted from a headset to device speakers. - */ + @Override public void setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { verifyApplicationThread(); if (playerReleased) { @@ -949,14 +933,7 @@ public class SimpleExoPlayer extends BasePlayer audioBecomingNoisyManager.setEnabled(handleAudioBecomingNoisy); } - /** - * Sets a {@link PriorityTaskManager}, or null to clear a previously set priority task manager. - * - *

        The priority {@link C#PRIORITY_PLAYBACK} will be set while the player is loading. - * - * @param priorityTaskManager The {@link PriorityTaskManager}, or null to clear a previously set - * priority task manager. - */ + @Override public void setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { verifyApplicationThread(); if (Util.areEqual(this.priorityTaskManager, priorityTaskManager)) { @@ -974,25 +951,25 @@ public class SimpleExoPlayer extends BasePlayer this.priorityTaskManager = priorityTaskManager; } - /** Returns the video format currently being played, or null if no video is being played. */ + @Override @Nullable public Format getVideoFormat() { return videoFormat; } - /** Returns the audio format currently being played, or null if no audio is being played. */ + @Override @Nullable public Format getAudioFormat() { return audioFormat; } - /** Returns {@link DecoderCounters} for video, or null if no video is being played. */ + @Override @Nullable public DecoderCounters getVideoDecoderCounters() { return videoDecoderCounters; } - /** Returns {@link DecoderCounters} for audio, or null if no audio is being played. */ + @Override @Nullable public DecoderCounters getAudioDecoderCounters() { return audioDecoderCounters; @@ -1561,39 +1538,13 @@ public class SimpleExoPlayer extends BasePlayer return player.getContentBufferedPosition(); } - /** - * Sets whether the player should use a {@link android.os.PowerManager.WakeLock} to ensure the - * device stays awake for playback, even when the screen is off. - * - *

        Enabling this feature requires the {@link android.Manifest.permission#WAKE_LOCK} permission. - * It should be used together with a foreground {@link android.app.Service} for use cases where - * playback can occur when the screen is off (e.g. background audio playback). It is not useful if - * the screen will always be on during playback (e.g. foreground video playback). - * - * @param handleWakeLock Whether the player should use a {@link android.os.PowerManager.WakeLock} - * to ensure the device stays awake for playback, even when the screen is off. - * @deprecated Use {@link #setWakeMode(int)} instead. - */ @Deprecated + @Override public void setHandleWakeLock(boolean handleWakeLock) { setWakeMode(handleWakeLock ? C.WAKE_MODE_LOCAL : C.WAKE_MODE_NONE); } - /** - * Sets how the player should keep the device awake for playback when the screen is off. - * - *

        Enabling this feature requires the {@link android.Manifest.permission#WAKE_LOCK} permission. - * It should be used together with a foreground {@link android.app.Service} for use cases where - * playback occurs and the screen is off (e.g. background audio playback). It is not useful when - * the screen will be kept on during playback (e.g. foreground video playback). - * - *

        When enabled, the locks ({@link android.os.PowerManager.WakeLock} / {@link - * android.net.wifi.WifiManager.WifiLock}) will be held whenever the player is in the {@link - * #STATE_READY} or {@link #STATE_BUFFERING} states with {@code playWhenReady = true}. The locks - * held depends on the specified {@link C.WakeMode}. - * - * @param wakeMode The {@link C.WakeMode} option to keep the device awake during playback. - */ + @Override public void setWakeMode(@C.WakeMode int wakeMode) { verifyApplicationThread(); switch (wakeMode) { @@ -1656,17 +1607,8 @@ public class SimpleExoPlayer extends BasePlayer streamVolumeManager.setMuted(muted); } - /** - * Sets whether the player should throw an {@link IllegalStateException} when methods are called - * from a thread other than the one associated with {@link #getApplicationLooper()}. - * - *

        The default is {@code true} and this method will be removed in the future. - * - * @param throwsWhenUsingWrongThread Whether to throw when methods are called from a wrong thread. - * @deprecated Disabling the enforcement can result in hard-to-detect bugs. Do not use this method - * except to ease the transition while wrong thread access problems are fixed. - */ @Deprecated + @Override public void setThrowsWhenUsingWrongThread(boolean throwsWhenUsingWrongThread) { this.throwsWhenUsingWrongThread = throwsWhenUsingWrongThread; } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index f46e394d38..eeb4c5856a 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.BasePlayer; import com.google.android.exoplayer2.DeviceInfo; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackParameters; @@ -34,8 +35,11 @@ import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AuxEffectInfo; +import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.source.TrackGroupArray; @@ -44,6 +48,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; @@ -128,6 +133,21 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public AnalyticsCollector getAnalyticsCollector() { + throw new UnsupportedOperationException(); + } + + @Override + public void addAnalyticsListener(AnalyticsListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeAnalyticsListener(AnalyticsListener listener) { + throw new UnsupportedOperationException(); + } + @Override @State public int getPlaybackState() { @@ -674,6 +694,57 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Nullable + @Override + public Format getAudioFormat() { + throw new UnsupportedOperationException(); + } + + @Nullable + @Override + public Format getVideoFormat() { + throw new UnsupportedOperationException(); + } + + @Nullable + @Override + public DecoderCounters getAudioDecoderCounters() { + throw new UnsupportedOperationException(); + } + + @Nullable + @Override + public DecoderCounters getVideoDecoderCounters() { + throw new UnsupportedOperationException(); + } + + @Override + public void setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public void setHandleWakeLock(boolean handleWakeLock) { + throw new UnsupportedOperationException(); + } + + @Override + public void setWakeMode(int wakeMode) { + throw new UnsupportedOperationException(); + } + + @Override + public void setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public void setThrowsWhenUsingWrongThread(boolean throwsWhenUsingWrongThread) { + throw new UnsupportedOperationException(); + } + @Override public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { throw new UnsupportedOperationException(); From b6bddc5000375c60ad1198a933c7f06a612c8fb1 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 7 Oct 2021 18:44:55 +0100 Subject: [PATCH 292/441] Remove play-services-ads-identifier from IMA extension dependencies. This is no longer needed since IMA depends on play-services-ads-identifier directly; see [article](https://ads-developers.googleblog.com/2019/12/the-interactive-media-ads-ima-sdk-for.html). PiperOrigin-RevId: 401550793 --- extensions/ima/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/ima/build.gradle b/extensions/ima/build.gradle index ad46882f7c..7cbcb0b485 100644 --- a/extensions/ima/build.gradle +++ b/extensions/ima/build.gradle @@ -28,7 +28,6 @@ dependencies { api 'com.google.ads.interactivemedia.v3:interactivemedia:3.24.0' implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion - implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1' compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion androidTestImplementation project(modulePrefix + 'testutils') From e66f9fafe1f5e0d89a24fd56c1abc44829e5f83a Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 8 Oct 2021 11:17:45 +0100 Subject: [PATCH 293/441] Clean up ExoPlayerLibraryInfo PiperOrigin-RevId: 401729859 --- .../android/exoplayer2/ExoPlayerLibraryInfo.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) 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 3751d05322..5687d76392 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 @@ -15,12 +15,11 @@ */ package com.google.android.exoplayer2; -import android.os.Build; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.TraceUtil; import java.util.HashSet; -/** Information about the ExoPlayer library. */ +/** Information about the library. */ public final class ExoPlayerLibraryInfo { /** A tag to use when logging library information. */ @@ -44,15 +43,6 @@ public final class ExoPlayerLibraryInfo { // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. public static final int VERSION_INT = 2015001; - /** - * The default user agent for requests made by the library. - * - * @deprecated ExoPlayer now uses the user agent of the underlying network stack by default. - */ - @Deprecated - public static final String DEFAULT_USER_AGENT = - VERSION_SLASHY + " (Linux; Android " + Build.VERSION.RELEASE + ") " + VERSION_SLASHY; - /** Whether the library was compiled with {@link Assertions} checks enabled. */ public static final boolean ASSERTIONS_ENABLED = true; From b03ebbeb89b03dd4b68bbd0902852850466c6747 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 12:40:30 +0100 Subject: [PATCH 294/441] Stop setting custom user agent in demo app PiperOrigin-RevId: 401741202 --- .../android/exoplayer2/demo/DemoUtil.java | 15 ++--------- .../exoplayer2/ext/cronet/CronetUtil.java | 27 ++++++++++++++++--- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java index dc283ddfe6..a4193184bc 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java @@ -16,9 +16,7 @@ package com.google.android.exoplayer2.demo; import android.content.Context; -import android.os.Build; import com.google.android.exoplayer2.DefaultRenderersFactory; -import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.database.DatabaseProvider; import com.google.android.exoplayer2.database.ExoDatabaseProvider; @@ -61,13 +59,6 @@ public final class DemoUtil { */ private static final boolean USE_CRONET_FOR_NETWORKING = true; - private static final String USER_AGENT = - "ExoPlayerDemo/" - + ExoPlayerLibraryInfo.VERSION - + " (Linux; Android " - + Build.VERSION.RELEASE - + ") " - + ExoPlayerLibraryInfo.VERSION_SLASHY; private static final String TAG = "DemoUtil"; private static final String DOWNLOAD_ACTION_FILE = "actions"; private static final String DOWNLOAD_TRACKER_ACTION_FILE = "tracked_actions"; @@ -104,9 +95,7 @@ public final class DemoUtil { if (httpDataSourceFactory == null) { if (USE_CRONET_FOR_NETWORKING) { context = context.getApplicationContext(); - @Nullable - CronetEngine cronetEngine = - CronetUtil.buildCronetEngine(context, USER_AGENT, /* preferGMSCoreCronet= */ false); + @Nullable CronetEngine cronetEngine = CronetUtil.buildCronetEngine(context); if (cronetEngine != null) { httpDataSourceFactory = new CronetDataSource.Factory(cronetEngine, Executors.newSingleThreadExecutor()); @@ -117,7 +106,7 @@ public final class DemoUtil { CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); CookieHandler.setDefault(cookieManager); - httpDataSourceFactory = new DefaultHttpDataSource.Factory().setUserAgent(USER_AGENT); + httpDataSourceFactory = new DefaultHttpDataSource.Factory(); } } return httpDataSourceFactory; diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetUtil.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetUtil.java index b448c67e2d..3be1f6671f 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetUtil.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetUtil.java @@ -35,9 +35,30 @@ public final class CronetUtil { private static final String TAG = "CronetUtil"; /** - * Builds a {@link CronetEngine} suitable for use with ExoPlayer. When choosing a {@link - * CronetProvider Cronet provider} to build the {@link CronetEngine}, disabled providers are not - * considered. Neither are fallback providers, since it's more efficient to use {@link + * Builds a {@link CronetEngine} suitable for use with {@link CronetDataSource}. When choosing a + * {@link CronetProvider Cronet provider} to build the {@link CronetEngine}, disabled providers + * are not considered. Neither are fallback providers, since it's more efficient to use {@link + * DefaultHttpDataSource} than it is to use {@link CronetDataSource} with a fallback {@link + * CronetEngine}. + * + *

        Note that it's recommended for applications to create only one instance of {@link + * CronetEngine}, so if your application already has an instance for performing other networking, + * then that instance should be used and calling this method is unnecessary. See the Android developer + * guide to learn more about using Cronet for network operations. + * + * @param context A context. + * @return The {@link CronetEngine}, or {@code null} if no suitable engine could be built. + */ + @Nullable + public static CronetEngine buildCronetEngine(Context context) { + return buildCronetEngine(context, /* userAgent= */ null, /* preferGooglePlayServices= */ false); + } + + /** + * Builds a {@link CronetEngine} suitable for use with {@link CronetDataSource}. When choosing a + * {@link CronetProvider Cronet provider} to build the {@link CronetEngine}, disabled providers + * are not considered. Neither are fallback providers, since it's more efficient to use {@link * DefaultHttpDataSource} than it is to use {@link CronetDataSource} with a fallback {@link * CronetEngine}. * From 3b77816001ae27bb23fe8ac08110b45e3724884c Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 12:42:12 +0100 Subject: [PATCH 295/441] Remove stray reference to ExoPlayer PiperOrigin-RevId: 401741416 --- .../exoplayer2/ext/leanback/LeanbackPlayerAdapter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index f0d7b246a4..d704a93c62 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -63,8 +63,8 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab * {@link Player} instance. The caller remains responsible for releasing the player when it's no * longer required. * - * @param context The current context (activity). - * @param player Instance of your exoplayer that needs to be configured. + * @param context The current {@link Context} (activity). + * @param player The {@link Player} being used. * @param updatePeriodMs The delay between player control updates, in milliseconds. */ public LeanbackPlayerAdapter(Context context, Player player, final int updatePeriodMs) { @@ -267,9 +267,9 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab callback.onError( LeanbackPlayerAdapter.this, error.errorCode, - // This string was probably tailored for MediaPlayer, whose callback takes 2 ints as - // error code. Since ExoPlayer provides a single error code, we just pass 0 as the - // extra. + // This string was probably tailored for MediaPlayer, whose error callback takes two + // int arguments (int what, int extra). Since PlaybackException defines a single error + // code, we pass 0 as the extra. context.getString( R.string.lb_media_player_error, /* formatArgs...= */ error.errorCode, 0)); } From 3d67400a8a6c37580bdaf016ca8cdd95a638f0c6 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 8 Oct 2021 13:00:18 +0100 Subject: [PATCH 296/441] Bump androidx.core version to 1.6.0 PiperOrigin-RevId: 401743951 --- constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index 9fa1488a53..ac96ab3f3f 100644 --- a/constants.gradle +++ b/constants.gradle @@ -38,7 +38,7 @@ project.ext { androidxAnnotationVersion = '1.2.0' androidxAppCompatVersion = '1.3.0' androidxCollectionVersion = '1.1.0' - androidxCoreVersion = '1.3.2' + androidxCoreVersion = '1.6.0' androidxFuturesVersion = '1.1.0' androidxMediaVersion = '1.4.2' androidxMedia2Version = '1.1.3' From d45cf6028d908c991c9fa505cee18b6c6f841373 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 13:55:06 +0100 Subject: [PATCH 297/441] Remove reference to ExoPlayer from UI module PiperOrigin-RevId: 401751490 --- .../google/android/exoplayer2/ui/PlayerControlView.java | 4 ++-- .../com/google/android/exoplayer2/ui/PlayerView.java | 9 ++++----- .../android/exoplayer2/ui/SpannedToHtmlConverter.java | 3 +-- .../android/exoplayer2/ui/StyledPlayerControlView.java | 8 ++++---- .../google/android/exoplayer2/ui/StyledPlayerView.java | 7 +++---- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 18bad21a85..7d352c0046 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -164,8 +164,8 @@ import java.util.concurrent.CopyOnWriteArrayList; * To customize the layout of PlayerControlView throughout your app, or just for certain * configurations, you can define {@code exo_player_control_view.xml} layout files in your * application {@code res/layout*} directories. These layouts will override the one provided by the - * ExoPlayer library, and will be inflated for use by PlayerControlView. The view identifies and - * binds its children by looking for the following ids: + * library, and will be inflated for use by PlayerControlView. The view identifies and binds its + * children by looking for the following ids: * *

          *
        • {@code exo_play} - The play button. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 53255ff69d..79e56a4d3d 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -47,7 +47,6 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; @@ -186,9 +185,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * * To customize the layout of PlayerView throughout your app, or just for certain configurations, * you can define {@code exo_player_view.xml} layout files in your application {@code res/layout*} - * directories. These layouts will override the one provided by the ExoPlayer library, and will be - * inflated for use by PlayerView. The view identifies and binds its children by looking for the - * following ids: + * directories. These layouts will override the one provided by the library, and will be inflated + * for use by PlayerView. The view identifies and binds its children by looking for the following + * ids: * *
            *
          • {@code exo_content_frame} - A frame whose aspect ratio is resized based on the video @@ -935,7 +934,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java index 20745563ad..367220aa92 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java @@ -50,8 +50,7 @@ import java.util.regex.Pattern; * Utility class to convert from span-styled text to HTML. * - *

            Supports all of the spans used by ExoPlayer's subtitle decoders, including custom ones found - * in {@link com.google.android.exoplayer2.text.span}. + *

            Supports all of the spans used by subtitle decoders. */ /* package */ final class SpannedToHtmlConverter { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 69e9f6f516..05360bc2a4 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -199,9 +199,9 @@ import java.util.concurrent.CopyOnWriteArrayList; * default animation implementation expects certain relative positions between children. See also Specifying a custom layout file. * - *

            The layout files in your {@code res/layout*} will override the one provided by the ExoPlayer - * library, and will be inflated for use by StyledPlayerControlView. The view identifies and binds - * its children by looking for the following ids: + *

            The layout files in your {@code res/layout*} will override the one provided by the library, + * and will be inflated for use by StyledPlayerControlView. The view identifies and binds its + * children by looking for the following ids: * *

              *
            • {@code exo_play_pause} - The play and pause button. @@ -843,7 +843,7 @@ public class StyledPlayerControlView extends FrameLayout { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 6a30814673..24bf154c77 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -48,7 +48,6 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; @@ -188,8 +187,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * To customize the layout of StyledPlayerView throughout your app, or just for certain * configurations, you can define {@code exo_styled_player_view.xml} layout files in your * application {@code res/layout*} directories. These layouts will override the one provided by the - * ExoPlayer library, and will be inflated for use by StyledPlayerView. The view identifies and - * binds its children by looking for the following ids: + * library, and will be inflated for use by StyledPlayerView. The view identifies and binds its + * children by looking for the following ids: * *
                *
              • {@code exo_content_frame} - A frame whose aspect ratio is resized based on the video @@ -952,7 +951,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { /** * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. * You can also customize some operations when configuring the player (for example by using - * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). + * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). */ @Deprecated public void setControlDispatcher(ControlDispatcher controlDispatcher) { From ce66b01ee24e53a878829ab053f614c7737a4bfd Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 8 Oct 2021 13:57:38 +0100 Subject: [PATCH 298/441] Remove ExoPlayer.Builder#buildExoPlayer We no longer need separate methods to build Player and ExoPlayer. PiperOrigin-RevId: 401751761 --- .../google/android/exoplayer2/ExoPlayer.java | 78 ++++++------------- 1 file changed, 23 insertions(+), 55 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 650317f32c..07ac8d6b0c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -501,8 +501,7 @@ public interface ExoPlayer extends Player { * * @param trackSelector A {@link TrackSelector}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setTrackSelector(TrackSelector trackSelector) { wrappedBuilder.setTrackSelector(trackSelector); @@ -514,8 +513,7 @@ public interface ExoPlayer extends Player { * * @param mediaSourceFactory A {@link MediaSourceFactory}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { wrappedBuilder.setMediaSourceFactory(mediaSourceFactory); @@ -527,8 +525,7 @@ public interface ExoPlayer extends Player { * * @param loadControl A {@link LoadControl}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLoadControl(LoadControl loadControl) { wrappedBuilder.setLoadControl(loadControl); @@ -540,8 +537,7 @@ public interface ExoPlayer extends Player { * * @param bandwidthMeter A {@link BandwidthMeter}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { wrappedBuilder.setBandwidthMeter(bandwidthMeter); @@ -554,8 +550,7 @@ public interface ExoPlayer extends Player { * * @param looper A {@link Looper}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLooper(Looper looper) { wrappedBuilder.setLooper(looper); @@ -567,8 +562,7 @@ public interface ExoPlayer extends Player { * * @param analyticsCollector An {@link AnalyticsCollector}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { wrappedBuilder.setAnalyticsCollector(analyticsCollector); @@ -582,8 +576,7 @@ public interface ExoPlayer extends Player { * * @param priorityTaskManager A {@link PriorityTaskManager}, or null to not use one. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { wrappedBuilder.setPriorityTaskManager(priorityTaskManager); @@ -601,8 +594,7 @@ public interface ExoPlayer extends Player { * @param audioAttributes {@link AudioAttributes}. * @param handleAudioFocus Whether the player should handle audio focus. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { wrappedBuilder.setAudioAttributes(audioAttributes, handleAudioFocus); @@ -624,8 +616,7 @@ public interface ExoPlayer extends Player { * * @param wakeMode A {@link C.WakeMode}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setWakeMode(@C.WakeMode int wakeMode) { wrappedBuilder.setWakeMode(wakeMode); @@ -641,8 +632,7 @@ public interface ExoPlayer extends Player { * @param handleAudioBecomingNoisy Whether the player should pause automatically when audio is * rerouted from a headset to device speakers. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { wrappedBuilder.setHandleAudioBecomingNoisy(handleAudioBecomingNoisy); @@ -654,8 +644,7 @@ public interface ExoPlayer extends Player { * * @param skipSilenceEnabled Whether skipping silences is enabled. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { wrappedBuilder.setSkipSilenceEnabled(skipSilenceEnabled); @@ -670,8 +659,7 @@ public interface ExoPlayer extends Player { * * @param videoScalingMode A {@link C.VideoScalingMode}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { wrappedBuilder.setVideoScalingMode(videoScalingMode); @@ -690,8 +678,7 @@ public interface ExoPlayer extends Player { * * @param videoChangeFrameRateStrategy A {@link C.VideoChangeFrameRateStrategy}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { @@ -708,8 +695,7 @@ public interface ExoPlayer extends Player { * * @param useLazyPreparation Whether to use lazy preparation. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setUseLazyPreparation(boolean useLazyPreparation) { wrappedBuilder.setUseLazyPreparation(useLazyPreparation); @@ -721,8 +707,7 @@ public interface ExoPlayer extends Player { * * @param seekParameters The {@link SeekParameters}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekParameters(SeekParameters seekParameters) { wrappedBuilder.setSeekParameters(seekParameters); @@ -735,8 +720,7 @@ public interface ExoPlayer extends Player { * @param seekBackIncrementMs The seek back increment, in milliseconds. * @return This builder. * @throws IllegalArgumentException If {@code seekBackIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { wrappedBuilder.setSeekBackIncrementMs(seekBackIncrementMs); @@ -749,8 +733,7 @@ public interface ExoPlayer extends Player { * @param seekForwardIncrementMs The seek forward increment, in milliseconds. * @return This builder. * @throws IllegalArgumentException If {@code seekForwardIncrementMs} is non-positive. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { wrappedBuilder.setSeekForwardIncrementMs(seekForwardIncrementMs); @@ -766,8 +749,7 @@ public interface ExoPlayer extends Player { * * @param releaseTimeoutMs The release timeout, in milliseconds. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { wrappedBuilder.setReleaseTimeoutMs(releaseTimeoutMs); @@ -783,8 +765,7 @@ public interface ExoPlayer extends Player { * * @param detachSurfaceTimeoutMs The timeout for detaching a surface, in milliseconds. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { wrappedBuilder.setDetachSurfaceTimeoutMs(detachSurfaceTimeoutMs); @@ -801,8 +782,7 @@ public interface ExoPlayer extends Player { * * @param pauseAtEndOfMediaItems Whether to pause playback at the end of each media item. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { wrappedBuilder.setPauseAtEndOfMediaItems(pauseAtEndOfMediaItems); @@ -815,8 +795,7 @@ public interface ExoPlayer extends Player { * * @param livePlaybackSpeedControl The {@link LivePlaybackSpeedControl}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { wrappedBuilder.setLivePlaybackSpeedControl(livePlaybackSpeedControl); @@ -829,8 +808,7 @@ public interface ExoPlayer extends Player { * * @param clock A {@link Clock}. * @return This builder. - * @throws IllegalStateException If {@link #build()} or {@link #buildExoPlayer()} has already - * been called. + * @throws IllegalStateException If {@link #build()} has already been called. */ @VisibleForTesting public Builder setClock(Clock clock) { @@ -841,19 +819,9 @@ public interface ExoPlayer extends Player { /** * Builds a {@link SimpleExoPlayer} instance. * - * @throws IllegalStateException If this method or {@link #buildExoPlayer()} has already been - * called. + * @throws IllegalStateException If this method has already been called. */ public SimpleExoPlayer build() { - return buildExoPlayer(); - } - - /** - * Builds a {@link SimpleExoPlayer} instance. - * - * @throws IllegalStateException If this method or {@link #build()} has already been called. - */ - public SimpleExoPlayer buildExoPlayer() { return wrappedBuilder.build(); } } From 046fb1d71ea65773514d93189d161d5fe3390232 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 15:15:24 +0100 Subject: [PATCH 299/441] Documentation tweak PiperOrigin-RevId: 401764435 --- .../android/exoplayer2/ext/cronet/CronetEngineWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.java index 8851ac2efe..c87ab4a80c 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetEngineWrapper.java @@ -27,7 +27,7 @@ import org.chromium.net.CronetProvider; * href="https://developer.android.com/guide/topics/connectivity/cronet/start">Android developer * guide to learn how to instantiate a {@link CronetEngine} for use by your application. You * can also use {@link CronetUtil#buildCronetEngine} to build a {@link CronetEngine} suitable - * for use by ExoPlayer. + * for use with {@link CronetDataSource}. */ @Deprecated public final class CronetEngineWrapper { From 1d29f1267712c0368806bf13ec253c5672b523a9 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Fri, 8 Oct 2021 15:31:17 +0100 Subject: [PATCH 300/441] Update translations PiperOrigin-RevId: 401767033 --- library/ui/src/main/res/values-af/strings.xml | 3 +++ library/ui/src/main/res/values-am/strings.xml | 3 +++ library/ui/src/main/res/values-ar/strings.xml | 3 +++ library/ui/src/main/res/values-az/strings.xml | 3 +++ library/ui/src/main/res/values-b+sr+Latn/strings.xml | 9 ++++++--- library/ui/src/main/res/values-be/strings.xml | 3 +++ library/ui/src/main/res/values-bg/strings.xml | 3 +++ library/ui/src/main/res/values-bn/strings.xml | 3 +++ library/ui/src/main/res/values-bs/strings.xml | 3 +++ library/ui/src/main/res/values-ca/strings.xml | 3 +++ library/ui/src/main/res/values-cs/strings.xml | 3 +++ library/ui/src/main/res/values-da/strings.xml | 3 +++ library/ui/src/main/res/values-de/strings.xml | 3 +++ library/ui/src/main/res/values-el/strings.xml | 3 +++ library/ui/src/main/res/values-en-rAU/strings.xml | 3 +++ library/ui/src/main/res/values-en-rGB/strings.xml | 3 +++ library/ui/src/main/res/values-en-rIN/strings.xml | 3 +++ library/ui/src/main/res/values-es-rUS/strings.xml | 3 +++ library/ui/src/main/res/values-es/strings.xml | 3 +++ library/ui/src/main/res/values-et/strings.xml | 3 +++ library/ui/src/main/res/values-eu/strings.xml | 3 +++ library/ui/src/main/res/values-fa/strings.xml | 3 +++ library/ui/src/main/res/values-fi/strings.xml | 3 +++ library/ui/src/main/res/values-fr-rCA/strings.xml | 3 +++ library/ui/src/main/res/values-fr/strings.xml | 3 +++ library/ui/src/main/res/values-gl/strings.xml | 3 +++ library/ui/src/main/res/values-gu/strings.xml | 3 +++ library/ui/src/main/res/values-hi/strings.xml | 3 +++ library/ui/src/main/res/values-hr/strings.xml | 3 +++ library/ui/src/main/res/values-hu/strings.xml | 3 +++ library/ui/src/main/res/values-hy/strings.xml | 3 +++ library/ui/src/main/res/values-in/strings.xml | 3 +++ library/ui/src/main/res/values-is/strings.xml | 3 +++ library/ui/src/main/res/values-it/strings.xml | 5 ++++- library/ui/src/main/res/values-iw/strings.xml | 3 +++ library/ui/src/main/res/values-ja/strings.xml | 3 +++ library/ui/src/main/res/values-ka/strings.xml | 3 +++ library/ui/src/main/res/values-kk/strings.xml | 3 +++ library/ui/src/main/res/values-km/strings.xml | 3 +++ library/ui/src/main/res/values-kn/strings.xml | 3 +++ library/ui/src/main/res/values-ko/strings.xml | 3 +++ library/ui/src/main/res/values-ky/strings.xml | 3 +++ library/ui/src/main/res/values-lo/strings.xml | 3 +++ library/ui/src/main/res/values-lt/strings.xml | 3 +++ library/ui/src/main/res/values-lv/strings.xml | 3 +++ library/ui/src/main/res/values-mk/strings.xml | 3 +++ library/ui/src/main/res/values-ml/strings.xml | 3 +++ library/ui/src/main/res/values-mn/strings.xml | 3 +++ library/ui/src/main/res/values-mr/strings.xml | 5 ++++- library/ui/src/main/res/values-ms/strings.xml | 3 +++ library/ui/src/main/res/values-my/strings.xml | 3 +++ library/ui/src/main/res/values-nb/strings.xml | 3 +++ library/ui/src/main/res/values-ne/strings.xml | 3 +++ library/ui/src/main/res/values-nl/strings.xml | 3 +++ library/ui/src/main/res/values-pa/strings.xml | 3 +++ library/ui/src/main/res/values-pl/strings.xml | 3 +++ library/ui/src/main/res/values-pt-rPT/strings.xml | 3 +++ library/ui/src/main/res/values-pt/strings.xml | 3 +++ library/ui/src/main/res/values-ro/strings.xml | 3 +++ library/ui/src/main/res/values-ru/strings.xml | 3 +++ library/ui/src/main/res/values-si/strings.xml | 3 +++ library/ui/src/main/res/values-sk/strings.xml | 3 +++ library/ui/src/main/res/values-sl/strings.xml | 3 +++ library/ui/src/main/res/values-sq/strings.xml | 3 +++ library/ui/src/main/res/values-sr/strings.xml | 9 ++++++--- library/ui/src/main/res/values-sv/strings.xml | 3 +++ library/ui/src/main/res/values-sw/strings.xml | 3 +++ library/ui/src/main/res/values-ta/strings.xml | 3 +++ library/ui/src/main/res/values-te/strings.xml | 3 +++ library/ui/src/main/res/values-th/strings.xml | 3 +++ library/ui/src/main/res/values-tl/strings.xml | 3 +++ library/ui/src/main/res/values-tr/strings.xml | 3 +++ library/ui/src/main/res/values-uk/strings.xml | 3 +++ library/ui/src/main/res/values-ur/strings.xml | 3 +++ library/ui/src/main/res/values-uz/strings.xml | 3 +++ library/ui/src/main/res/values-vi/strings.xml | 3 +++ library/ui/src/main/res/values-zh-rCN/strings.xml | 3 +++ library/ui/src/main/res/values-zh-rHK/strings.xml | 3 +++ library/ui/src/main/res/values-zh-rTW/strings.xml | 3 +++ library/ui/src/main/res/values-zu/strings.xml | 3 +++ 80 files changed, 248 insertions(+), 8 deletions(-) diff --git a/library/ui/src/main/res/values-af/strings.xml b/library/ui/src/main/res/values-af/strings.xml index 066527a320..a9f2a33964 100644 --- a/library/ui/src/main/res/values-af/strings.xml +++ b/library/ui/src/main/res/values-af/strings.xml @@ -53,6 +53,9 @@ Aflaai is voltooi Kon nie aflaai nie Verwyder tans aflaaie + Aflaaie is onderbreek + Aflaaie wag tans vir netwerk + Aflaaie wag tans vir wi-fi Video Oudio Teks diff --git a/library/ui/src/main/res/values-am/strings.xml b/library/ui/src/main/res/values-am/strings.xml index 3205df705b..8b3b27f71b 100644 --- a/library/ui/src/main/res/values-am/strings.xml +++ b/library/ui/src/main/res/values-am/strings.xml @@ -53,6 +53,9 @@ ማውረድ ተጠናቋል ማውረድ አልተሳካም ውርዶችን በማስወገድ ላይ + ውርዶች ባሉበት ቆመዋል + አውታረ መረቦችን በመጠባበቅ ላይ ያሉ ውርዶች + WiFiን በመጠባበቅ ላይ ያሉ ውርዶች ቪዲዮ ኦዲዮ ጽሑፍ diff --git a/library/ui/src/main/res/values-ar/strings.xml b/library/ui/src/main/res/values-ar/strings.xml index 8c58819712..cc59c357d4 100644 --- a/library/ui/src/main/res/values-ar/strings.xml +++ b/library/ui/src/main/res/values-ar/strings.xml @@ -61,6 +61,9 @@ اكتمل التنزيل تعذّر التنزيل تجري إزالة المحتوى الذي تم تنزيله + تمّ إيقاف عمليات التنزيل مؤقتًا. + عمليات التنزيل في انتظار الاتصال بالشبكة + عمليات التنزيل في انتظار اتصال Wi-Fi. فيديو صوت نص diff --git a/library/ui/src/main/res/values-az/strings.xml b/library/ui/src/main/res/values-az/strings.xml index 9143c45776..3a522a8340 100644 --- a/library/ui/src/main/res/values-az/strings.xml +++ b/library/ui/src/main/res/values-az/strings.xml @@ -53,6 +53,9 @@ Endirmə tamamlandı Endirmə alınmadı Endirilənlər silinir + Endirmə durdurulub + Endirmələr şəbəkəni gözləyir + Endirmələr WiFi şəbəkəsini gözləyir Video Audio Mətn diff --git a/library/ui/src/main/res/values-b+sr+Latn/strings.xml b/library/ui/src/main/res/values-b+sr+Latn/strings.xml index f6d1eaa963..b8f81f233f 100644 --- a/library/ui/src/main/res/values-b+sr+Latn/strings.xml +++ b/library/ui/src/main/res/values-b+sr+Latn/strings.xml @@ -55,6 +55,9 @@ Preuzimanje je završeno Preuzimanje nije uspelo Preuzimanja se uklanjaju + Preuzimanja su pauzirana + Preuzimanja čekaju na mrežu + Preuzimanja čekaju na WiFi Video Audio Tekst @@ -64,9 +67,9 @@ %1$d × %2$d Mono Stereo - Zvučni sistem - Zvučni sistem 5.1 - Zvučni sistem 7.1 + Prostorni zvuk + Prostorni zvuk 5.1 + Prostorni zvuk 7.1 Alternativno Dodatno Komentar diff --git a/library/ui/src/main/res/values-be/strings.xml b/library/ui/src/main/res/values-be/strings.xml index 178b21b67f..d78f354d48 100644 --- a/library/ui/src/main/res/values-be/strings.xml +++ b/library/ui/src/main/res/values-be/strings.xml @@ -57,6 +57,9 @@ Спампоўка завершана Збой спампоўкі Выдаленне спамповак + Спампоўкі прыпынены + Спампоўкі чакаюць падключэння да сеткі + Спампоўкі чакаюць падключэння да Wi-Fi Відэа Аўдыя Тэкст diff --git a/library/ui/src/main/res/values-bg/strings.xml b/library/ui/src/main/res/values-bg/strings.xml index eca60f5f18..41dbe5098a 100644 --- a/library/ui/src/main/res/values-bg/strings.xml +++ b/library/ui/src/main/res/values-bg/strings.xml @@ -53,6 +53,9 @@ Изтеглянето завърши Изтеглянето не бе успешно Изтеглянията се премахват + Изтеглянията са на пауза + Изтеглянията чакат връзка с интернет + Изтеглянията чакат връзка с Wi-Fi Видеозапис Аудиозапис Текст diff --git a/library/ui/src/main/res/values-bn/strings.xml b/library/ui/src/main/res/values-bn/strings.xml index 47b28aedbc..ad7125a456 100644 --- a/library/ui/src/main/res/values-bn/strings.xml +++ b/library/ui/src/main/res/values-bn/strings.xml @@ -53,6 +53,9 @@ ডাউনলোড হয়ে গেছে ডাউনলোড করা যায়নি ডাউনলোড করা কন্টেন্ট সরিয়ে দেওয়া হচ্ছে + ডাউনলোড পজ করা আছে + ডাউনলোড চালু করার জন্য নেটওয়ার্কের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে + ডাউনলোড চালু করার জন্য ওয়াই-ফাইয়ের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে ভিডিও অডিও টেক্সট diff --git a/library/ui/src/main/res/values-bs/strings.xml b/library/ui/src/main/res/values-bs/strings.xml index 4e4d82832b..375096ee94 100644 --- a/library/ui/src/main/res/values-bs/strings.xml +++ b/library/ui/src/main/res/values-bs/strings.xml @@ -55,6 +55,9 @@ Preuzimanje je završeno Preuzimanje nije uspjelo Uklanjanje preuzimanja + Preuzimanja su pauzirana + Preuzimanja čekaju povezivanje s mrežom + Preuzimanja čekaju WiFi Videozapis Zvuk Tekst diff --git a/library/ui/src/main/res/values-ca/strings.xml b/library/ui/src/main/res/values-ca/strings.xml index b3f870050c..c6dcdb2c3f 100644 --- a/library/ui/src/main/res/values-ca/strings.xml +++ b/library/ui/src/main/res/values-ca/strings.xml @@ -53,6 +53,9 @@ S\'ha completat la baixada No s\'ha pogut baixar S\'estan suprimint les baixades + Les baixades estan en pausa + Les baixades estan esperant una xarxa + Les baixades estan esperant una Wi‑Fi Vídeo Àudio Text diff --git a/library/ui/src/main/res/values-cs/strings.xml b/library/ui/src/main/res/values-cs/strings.xml index afc7193bd1..ad401cb20d 100644 --- a/library/ui/src/main/res/values-cs/strings.xml +++ b/library/ui/src/main/res/values-cs/strings.xml @@ -57,6 +57,9 @@ Stahování bylo dokončeno Stažení se nezdařilo Odstraňování staženého obsahu + Stahování pozastaveno + Stahování čeká na síť + Stahování čeká na WiFi Videa Zvuk Text diff --git a/library/ui/src/main/res/values-da/strings.xml b/library/ui/src/main/res/values-da/strings.xml index 40d9f780d4..28fd9d82d0 100644 --- a/library/ui/src/main/res/values-da/strings.xml +++ b/library/ui/src/main/res/values-da/strings.xml @@ -53,6 +53,9 @@ Downloaden er udført Download mislykkedes Fjerner downloads + Downloads er sat på pause + Downloads venter på netværksforbindelse + Downloads venter på Wi-Fi-netværk Video Lyd Undertekst diff --git a/library/ui/src/main/res/values-de/strings.xml b/library/ui/src/main/res/values-de/strings.xml index d14610d4f9..16b186cc33 100644 --- a/library/ui/src/main/res/values-de/strings.xml +++ b/library/ui/src/main/res/values-de/strings.xml @@ -53,6 +53,9 @@ Download abgeschlossen Download fehlgeschlagen Downloads werden entfernt + Downloads pausiert + Auf Netzwerkverbindung wird gewartet + Auf WLAN-Verbindung wird gewartet Video Audio Text diff --git a/library/ui/src/main/res/values-el/strings.xml b/library/ui/src/main/res/values-el/strings.xml index 9b90848ab7..4ad8c12dac 100644 --- a/library/ui/src/main/res/values-el/strings.xml +++ b/library/ui/src/main/res/values-el/strings.xml @@ -53,6 +53,9 @@ Η λήψη ολοκληρώθηκε Η λήψη απέτυχε Κατάργηση λήψεων + Οι λήψεις τέθηκαν σε παύση. + Οι λήψεις είναι σε αναμονή για δίκτυο. + Οι λήψεις είναι σε αναμονή για Wi-Fi. Βίντεο Ήχος Κείμενο diff --git a/library/ui/src/main/res/values-en-rAU/strings.xml b/library/ui/src/main/res/values-en-rAU/strings.xml index 700eddabc2..dd8348dd78 100644 --- a/library/ui/src/main/res/values-en-rAU/strings.xml +++ b/library/ui/src/main/res/values-en-rAU/strings.xml @@ -53,6 +53,9 @@ Download completed Download failed Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-en-rGB/strings.xml b/library/ui/src/main/res/values-en-rGB/strings.xml index 700eddabc2..dd8348dd78 100644 --- a/library/ui/src/main/res/values-en-rGB/strings.xml +++ b/library/ui/src/main/res/values-en-rGB/strings.xml @@ -53,6 +53,9 @@ Download completed Download failed Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-en-rIN/strings.xml b/library/ui/src/main/res/values-en-rIN/strings.xml index 700eddabc2..dd8348dd78 100644 --- a/library/ui/src/main/res/values-en-rIN/strings.xml +++ b/library/ui/src/main/res/values-en-rIN/strings.xml @@ -53,6 +53,9 @@ Download completed Download failed Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-es-rUS/strings.xml b/library/ui/src/main/res/values-es-rUS/strings.xml index ed8a99bc43..50f88383f1 100644 --- a/library/ui/src/main/res/values-es-rUS/strings.xml +++ b/library/ui/src/main/res/values-es-rUS/strings.xml @@ -53,6 +53,9 @@ Se completó la descarga No se pudo descargar Quitando descargas + Se pausaron las descargas + Esperando red para descargas + Esperando Wi-Fi para descargas Video Audio Texto diff --git a/library/ui/src/main/res/values-es/strings.xml b/library/ui/src/main/res/values-es/strings.xml index 5f3038817a..854d2c4f00 100644 --- a/library/ui/src/main/res/values-es/strings.xml +++ b/library/ui/src/main/res/values-es/strings.xml @@ -53,6 +53,9 @@ Descarga de archivos completado No se ha podido descargar Quitando descargas + Descargas pausadas + Descargas en espera de red + Descargas en espera de Wi-Fi Vídeo Audio Texto diff --git a/library/ui/src/main/res/values-et/strings.xml b/library/ui/src/main/res/values-et/strings.xml index c9f99a4177..ccba8656a6 100644 --- a/library/ui/src/main/res/values-et/strings.xml +++ b/library/ui/src/main/res/values-et/strings.xml @@ -53,6 +53,9 @@ Allalaadimine lõpetati Allalaadimine ebaõnnestus Allalaadimiste eemaldamine + Allalaadimised peatati + Allalaadimised on võrgu ootel + Allalaadimised on WiFi-võrgu ootel Video Heli Tekst diff --git a/library/ui/src/main/res/values-eu/strings.xml b/library/ui/src/main/res/values-eu/strings.xml index 48e54e7965..c50426aa25 100644 --- a/library/ui/src/main/res/values-eu/strings.xml +++ b/library/ui/src/main/res/values-eu/strings.xml @@ -53,6 +53,9 @@ Osatu da deskarga Ezin izan da deskargatu Deskargak kentzen + Deskargak pausatuta daude + Deskargak sare mugikorrera konektatzeko zain daude + Deskargak wifira konektatzeko zain daude Bideoa Audioa Testua diff --git a/library/ui/src/main/res/values-fa/strings.xml b/library/ui/src/main/res/values-fa/strings.xml index 42146ecda2..61df23a4ea 100644 --- a/library/ui/src/main/res/values-fa/strings.xml +++ b/library/ui/src/main/res/values-fa/strings.xml @@ -53,6 +53,9 @@ بارگیری کامل شد بارگیری نشد حذف بارگیری‌ها + بارگیری‌ها موقتاً متوقف شد + بارگیری‌ها درانتظار شبکه است + بارگیری‌ها در انتظار Wi-Fi است ویدیو صوتی نوشتار diff --git a/library/ui/src/main/res/values-fi/strings.xml b/library/ui/src/main/res/values-fi/strings.xml index 30b57ba73d..0b8041bdd1 100644 --- a/library/ui/src/main/res/values-fi/strings.xml +++ b/library/ui/src/main/res/values-fi/strings.xml @@ -53,6 +53,9 @@ Lataus valmis Lataus epäonnistui Poistetaan latauksia + Lataukset keskeytetty + Lataukse odottavat verkkoyhteyttä + Lataukset odottavat Wi-Fi-yhteyttä Video Ääni Teksti diff --git a/library/ui/src/main/res/values-fr-rCA/strings.xml b/library/ui/src/main/res/values-fr-rCA/strings.xml index 360bc2424b..eb7f45b27a 100644 --- a/library/ui/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui/src/main/res/values-fr-rCA/strings.xml @@ -53,6 +53,9 @@ Téléchargement terminé Échec du téléchargement Suppression des téléchargements en cours… + Téléchargements interrompus + Téléchargements en attente du réseau + Téléchargements en attente du Wi-Fi Vidéo Audio Texte diff --git a/library/ui/src/main/res/values-fr/strings.xml b/library/ui/src/main/res/values-fr/strings.xml index 9050b68db4..74efce5af8 100644 --- a/library/ui/src/main/res/values-fr/strings.xml +++ b/library/ui/src/main/res/values-fr/strings.xml @@ -53,6 +53,9 @@ Téléchargement terminé Échec du téléchargement Suppression des téléchargements… + Téléchargements mis en pause + Téléchargements en attente de réseau + Téléchargements en attente de Wi-Fi Vidéo Audio Texte diff --git a/library/ui/src/main/res/values-gl/strings.xml b/library/ui/src/main/res/values-gl/strings.xml index 6fd9bb92d1..b960bc2bd0 100644 --- a/library/ui/src/main/res/values-gl/strings.xml +++ b/library/ui/src/main/res/values-gl/strings.xml @@ -53,6 +53,9 @@ Completouse a descarga Produciuse un erro na descarga Quitando descargas + As descargas están en pausa + As descargas están agardando pola rede + As descargas están agardando pola wifi Vídeo Audio Texto diff --git a/library/ui/src/main/res/values-gu/strings.xml b/library/ui/src/main/res/values-gu/strings.xml index f7f752fdec..6587ecd67d 100644 --- a/library/ui/src/main/res/values-gu/strings.xml +++ b/library/ui/src/main/res/values-gu/strings.xml @@ -53,6 +53,9 @@ ડાઉનલોડ પૂર્ણ થયું ડાઉનલોડ નિષ્ફળ થયું ડાઉનલોડ કાઢી નાખી રહ્યાં છીએ + ડાઉનલોડ થોભાવ્યા છે + ડાઉનલોડ થવા નેટવર્કની રાહ જોવાઈ રહી છે + ડાઉનલોડ થવા વાઇ-ફાઇની રાહ જોવાઈ રહી છે વીડિયો ઑડિયો ટેક્સ્ટ diff --git a/library/ui/src/main/res/values-hi/strings.xml b/library/ui/src/main/res/values-hi/strings.xml index e86a68073b..85b5cc63cd 100644 --- a/library/ui/src/main/res/values-hi/strings.xml +++ b/library/ui/src/main/res/values-hi/strings.xml @@ -53,6 +53,9 @@ डाउनलोड पूरा हुआ डाउनलोड नहीं हो सका डाउनलोड की गई फ़ाइलें हटाई जा रही हैं + डाउनलोड रोका गया है + डाउनलोड शुरू करने के लिए, इंटरनेट से कनेक्ट होने का इंतज़ार है + डाउनलोड शुरू करने के लिए, वाई-फ़ाई से कनेक्ट होने का इंतज़ार है वीडियो ऑडियो लेख diff --git a/library/ui/src/main/res/values-hr/strings.xml b/library/ui/src/main/res/values-hr/strings.xml index e73732aace..a9672aef78 100644 --- a/library/ui/src/main/res/values-hr/strings.xml +++ b/library/ui/src/main/res/values-hr/strings.xml @@ -55,6 +55,9 @@ Preuzimanje je dovršeno Preuzimanje nije uspjelo Uklanjanje preuzimanja + Preuzimanja su pauzirana + Preuzimanja čekaju mrežu + Preuzimanja čekaju Wi-Fi Videozapis Audiozapis Tekst diff --git a/library/ui/src/main/res/values-hu/strings.xml b/library/ui/src/main/res/values-hu/strings.xml index 97874e85b5..2daf10a7e6 100644 --- a/library/ui/src/main/res/values-hu/strings.xml +++ b/library/ui/src/main/res/values-hu/strings.xml @@ -53,6 +53,9 @@ A letöltés befejeződött Nem sikerült a letöltés Letöltések törlése folyamatban + Letöltések szüneteltetve + A letöltések hálózatra várakoznak + A letöltések Wi-Fi-re várakoznak Videó Hang Szöveg diff --git a/library/ui/src/main/res/values-hy/strings.xml b/library/ui/src/main/res/values-hy/strings.xml index fe1a712723..5f83e8949e 100644 --- a/library/ui/src/main/res/values-hy/strings.xml +++ b/library/ui/src/main/res/values-hy/strings.xml @@ -53,6 +53,9 @@ Ներբեռնումն ավարտվեց Չհաջողվեց ներբեռնել Ներբեռնումները հեռացվում են + Ներբեռնումները դադարեցված են + Ցանցի որոնում + Wi-Fi ցանցի որոնում Տեսանյութ Աուդիո Տեքստ diff --git a/library/ui/src/main/res/values-in/strings.xml b/library/ui/src/main/res/values-in/strings.xml index 073e6bb261..ea7d0f5437 100644 --- a/library/ui/src/main/res/values-in/strings.xml +++ b/library/ui/src/main/res/values-in/strings.xml @@ -53,6 +53,9 @@ Download selesai Download gagal Menghapus download + Download dijeda + Download menunggu konektivitas jaringan + Download menunggu konektivitas Wi-Fi Video Audio Teks diff --git a/library/ui/src/main/res/values-is/strings.xml b/library/ui/src/main/res/values-is/strings.xml index fb2129f0bb..d64c4dc491 100644 --- a/library/ui/src/main/res/values-is/strings.xml +++ b/library/ui/src/main/res/values-is/strings.xml @@ -53,6 +53,9 @@ Niðurhali lokið Niðurhal mistókst Fjarlægir niðurhal + Niðurhöl í bið + Niðurhöl bíða eftir netkerfi + Niðurhöl bíða eftir WiFi Myndskeið Hljóð Texti diff --git a/library/ui/src/main/res/values-it/strings.xml b/library/ui/src/main/res/values-it/strings.xml index 845d78949f..a7ffec9d4f 100644 --- a/library/ui/src/main/res/values-it/strings.xml +++ b/library/ui/src/main/res/values-it/strings.xml @@ -49,10 +49,13 @@ Normale Scarica Download - Download… + Download in corso… Download completato Download non riuscito Rimozione dei download… + Download in pausa + Download in attesa di rete + Download in attesa di Wi-Fi Video Audio Testo diff --git a/library/ui/src/main/res/values-iw/strings.xml b/library/ui/src/main/res/values-iw/strings.xml index d2f04a30e4..6c040273b0 100644 --- a/library/ui/src/main/res/values-iw/strings.xml +++ b/library/ui/src/main/res/values-iw/strings.xml @@ -57,6 +57,9 @@ ההורדה הושלמה ההורדה לא הושלמה מסיר הורדות + ההורדות הושהו + ההורדות בהמתנה לרשת + ההורדות בהמתנה ל-Wi-Fi סרטון אודיו טקסט diff --git a/library/ui/src/main/res/values-ja/strings.xml b/library/ui/src/main/res/values-ja/strings.xml index 6325afacf6..1360c0497e 100644 --- a/library/ui/src/main/res/values-ja/strings.xml +++ b/library/ui/src/main/res/values-ja/strings.xml @@ -53,6 +53,9 @@ ダウンロードが完了しました ダウンロードに失敗しました ダウンロードを削除しています + ダウンロード一時停止 + ダウンロード停止: ネットワーク接続中 + ダウンロード停止: Wi-Fi 接続中 動画 音声 文字 diff --git a/library/ui/src/main/res/values-ka/strings.xml b/library/ui/src/main/res/values-ka/strings.xml index f562fb1c3f..1e6dd476ea 100644 --- a/library/ui/src/main/res/values-ka/strings.xml +++ b/library/ui/src/main/res/values-ka/strings.xml @@ -53,6 +53,9 @@ ჩამოტვირთვა დასრულდა ჩამოტვირთვა ვერ მოხერხდა მიმდინარეობს ჩამოტვირთვების ამოშლა + ჩამოტვირთვები დაპაუზებულია + ჩამოტვირთვები ქსელს ელოდება + ჩამოტვირთვები Wi-Fi-ს ელოდება ვიდეო აუდიო ტექსტი diff --git a/library/ui/src/main/res/values-kk/strings.xml b/library/ui/src/main/res/values-kk/strings.xml index 7f9803c9d0..6a690eeea8 100644 --- a/library/ui/src/main/res/values-kk/strings.xml +++ b/library/ui/src/main/res/values-kk/strings.xml @@ -53,6 +53,9 @@ Жүктеп алынды Жүктеп алынбады Жүктеп алынғандар өшірілуде + Жүктеп алу процестері уақытша тоқтады. + Жүктеп алу үшін желіге қосылу керек. + Жүктеп алу үшін Wi-Fi-ға қосылу керек. Бейне Aудиомазмұн Мәтін diff --git a/library/ui/src/main/res/values-km/strings.xml b/library/ui/src/main/res/values-km/strings.xml index b0af4ec2ba..7065540d5a 100644 --- a/library/ui/src/main/res/values-km/strings.xml +++ b/library/ui/src/main/res/values-km/strings.xml @@ -53,6 +53,9 @@ បាន​បញ្ចប់​ការទាញយក មិន​អាច​ទាញយក​បាន​ទេ កំពុង​លុប​ការទាញយក + ការទាញយក​ត្រូវបានផ្អាក + ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់បណ្ដាញ + ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់ Wi-Fi វីដេអូ សំឡេង អក្សរ diff --git a/library/ui/src/main/res/values-kn/strings.xml b/library/ui/src/main/res/values-kn/strings.xml index eccb309aa4..ac4b2674e6 100644 --- a/library/ui/src/main/res/values-kn/strings.xml +++ b/library/ui/src/main/res/values-kn/strings.xml @@ -53,6 +53,9 @@ ಡೌನ್‌ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ ಡೌನ್‌ಲೋಡ್‌ ವಿಫಲಗೊಂಡಿದೆ ಡೌನ್ಲೋಡ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳು ನೆಟ್‌ವರ್ಕ್‌ಗಾಗಿ ಕಾಯುತ್ತಿವೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳು Wi-Fi ಗಾಗಿ ಕಾಯುತ್ತಿವೆ ವೀಡಿಯೊ ಆಡಿಯೊ ಪಠ್ಯ diff --git a/library/ui/src/main/res/values-ko/strings.xml b/library/ui/src/main/res/values-ko/strings.xml index 6eed14c9a7..6696bfcb30 100644 --- a/library/ui/src/main/res/values-ko/strings.xml +++ b/library/ui/src/main/res/values-ko/strings.xml @@ -53,6 +53,9 @@ 다운로드 완료 다운로드 실패 다운로드 항목 삭제 중 + 다운로드 일시중지됨 + 다운로드를 위해 네트워크 연결 대기 중 + 다운로드를 위해 Wi-Fi 연결 대기 중 동영상 오디오 텍스트 diff --git a/library/ui/src/main/res/values-ky/strings.xml b/library/ui/src/main/res/values-ky/strings.xml index 96911158f5..73d4fcb286 100644 --- a/library/ui/src/main/res/values-ky/strings.xml +++ b/library/ui/src/main/res/values-ky/strings.xml @@ -53,6 +53,9 @@ Жүктөп алуу аяктады Жүктөлүп алынбай калды Жүктөлүп алынгандар өчүрүлүүдө + Жүктөп алуу тындырылды + Тармакка туташуу күтүлүүдө + WiFi\'га туташуу күтүлүүдө Видео Аудио Текст diff --git a/library/ui/src/main/res/values-lo/strings.xml b/library/ui/src/main/res/values-lo/strings.xml index 322cc120a4..b416862c7e 100644 --- a/library/ui/src/main/res/values-lo/strings.xml +++ b/library/ui/src/main/res/values-lo/strings.xml @@ -53,6 +53,9 @@ ດາວໂຫລດສຳເລັດແລ້ວ ດາວໂຫຼດບໍ່ສຳເລັດ ກຳລັງລຶບການດາວໂຫລດອອກ + ຢຸດດາວໂຫຼດຊົ່ວຄາວແລ້ວ + ການດາວໂຫຼດກຳລັງລໍຖ້າເຄືອຂ່າຍຢູ່ + ການດາວໂຫຼດກຳລັງລໍຖ້າ WiFi ຢູ່ ວິດີໂອ ສຽງ ຂໍ້ຄວາມ diff --git a/library/ui/src/main/res/values-lt/strings.xml b/library/ui/src/main/res/values-lt/strings.xml index 4dd9018da7..54a5cb42a6 100644 --- a/library/ui/src/main/res/values-lt/strings.xml +++ b/library/ui/src/main/res/values-lt/strings.xml @@ -57,6 +57,9 @@ Atsisiuntimo procesas baigtas Nepavyko atsisiųsti Pašalinami atsisiuntimai + Atsisiuntimai pristabdyti + Norint tęsti atsis., laukiama tinklo + Norint tęsti atsis., laukiama „Wi-Fi“ Vaizdo įrašas Garso įrašas Tekstas diff --git a/library/ui/src/main/res/values-lv/strings.xml b/library/ui/src/main/res/values-lv/strings.xml index cf741e1698..7449afd71c 100644 --- a/library/ui/src/main/res/values-lv/strings.xml +++ b/library/ui/src/main/res/values-lv/strings.xml @@ -55,6 +55,9 @@ Lejupielāde ir pabeigta Lejupielāde neizdevās Notiek lejupielāžu noņemšana + Lejupielādes ir pārtrauktas. + Lejupielādes gaida savienojumu ar tīklu. + Lejupielādes gaida savienojumu ar Wi-Fi. Video Audio Teksts diff --git a/library/ui/src/main/res/values-mk/strings.xml b/library/ui/src/main/res/values-mk/strings.xml index 6f03a7f0ab..6f0b952586 100644 --- a/library/ui/src/main/res/values-mk/strings.xml +++ b/library/ui/src/main/res/values-mk/strings.xml @@ -53,6 +53,9 @@ Преземањето заврши Неуспешно преземање Се отстрануваат преземањата + Преземањата се паузирани + Се чека мрежа за преземањата + Се чека WiFi за преземањата Видео Аудио Текст diff --git a/library/ui/src/main/res/values-ml/strings.xml b/library/ui/src/main/res/values-ml/strings.xml index 2e024c3f89..4f7320f9cc 100644 --- a/library/ui/src/main/res/values-ml/strings.xml +++ b/library/ui/src/main/res/values-ml/strings.xml @@ -53,6 +53,9 @@ ഡൗൺലോഡ് പൂർത്തിയായി ഡൗൺലോഡ് പരാജയപ്പെട്ടു ഡൗൺലോഡുകൾ നീക്കം ചെയ്യുന്നു + ഡൗൺലോഡുകൾ താൽക്കാലികമായി നിർത്തി + ഡൗൺലോഡുകൾ നെറ്റ്‌വർക്കിന് കാത്തിരിക്കുന്നു + ഡൗൺലോഡുകൾ വൈഫൈയ്ക്കായി കാത്തിരിക്കുന്നു വീഡിയോ ഓഡിയോ ടെക്‌സ്റ്റ് diff --git a/library/ui/src/main/res/values-mn/strings.xml b/library/ui/src/main/res/values-mn/strings.xml index 64a46466c0..0df9da7395 100644 --- a/library/ui/src/main/res/values-mn/strings.xml +++ b/library/ui/src/main/res/values-mn/strings.xml @@ -53,6 +53,9 @@ Татаж дууссан Татаж чадсангүй Татаж авсан файлыг хасаж байна + Таталтуудыг түр зогсоосон + Таталтууд сүлжээг хүлээж байна + Таталтууд Wi-Fi-г хүлээж байна Видео Дуу Текст diff --git a/library/ui/src/main/res/values-mr/strings.xml b/library/ui/src/main/res/values-mr/strings.xml index 3819f847f2..9e20adf3b2 100644 --- a/library/ui/src/main/res/values-mr/strings.xml +++ b/library/ui/src/main/res/values-mr/strings.xml @@ -20,7 +20,7 @@ सेटिंग्ज अतिरिक्त सेटिंग्ज लपवा अतिरिक्त सेटिंग्ज दाखवा - फुलस्क्रीनवर पाहा + फुलस्क्रीनवर पहा फुलस्क्रीनवरून बाहेर पडा मागील पुढील @@ -53,6 +53,9 @@ डाउनलोड पूर्ण झाले डाउनलोड अयशस्वी झाले डाउनलोड काढून टाकत आहे + डाउनलोड थांबवले + डाउनलोड नेटवर्कची प्रतीक्षा करत आहेत + डाउनलोड वायफाय ची प्रतीक्षा करत आहेत व्हिडिओ ऑडिओ मजकूर diff --git a/library/ui/src/main/res/values-ms/strings.xml b/library/ui/src/main/res/values-ms/strings.xml index a381cf92ef..3cc85b4e99 100644 --- a/library/ui/src/main/res/values-ms/strings.xml +++ b/library/ui/src/main/res/values-ms/strings.xml @@ -53,6 +53,9 @@ Muat turun selesai Muat turun gagal Mengalih keluar muat turun + Muat turun dijeda + Muat turun menunggu rangkaian + Muat turun menunggu Wi-Fi Video Audio Teks diff --git a/library/ui/src/main/res/values-my/strings.xml b/library/ui/src/main/res/values-my/strings.xml index 8f4d4a2e7d..0cba594121 100644 --- a/library/ui/src/main/res/values-my/strings.xml +++ b/library/ui/src/main/res/values-my/strings.xml @@ -53,6 +53,9 @@ ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ ဒေါင်းလုဒ်လုပ်၍ မရပါ ဒေါင်းလုဒ်များ ဖယ်ရှားနေသည် + ဒေါင်းလုဒ်များ ခဏရပ်ထားသည် + ဒေါင်းလုဒ်များက အင်တာနက်ရရန် စောင့်နေသည် + ဒေါင်းလုဒ်များက WiFi ရရန် စောင့်နေသည် ဗီဒီယို အသံ စာသား diff --git a/library/ui/src/main/res/values-nb/strings.xml b/library/ui/src/main/res/values-nb/strings.xml index 28fff42b65..3d407cf930 100644 --- a/library/ui/src/main/res/values-nb/strings.xml +++ b/library/ui/src/main/res/values-nb/strings.xml @@ -53,6 +53,9 @@ Nedlastingen er fullført Nedlastingen mislyktes Fjerner nedlastinger + Nedlastinger er satt på pause + Nedlastinger venter på nettverket + Nedlastinger venter på Wi-FI-tilkobling Video Lyd Tekst diff --git a/library/ui/src/main/res/values-ne/strings.xml b/library/ui/src/main/res/values-ne/strings.xml index d9ce39e61c..d922159d92 100644 --- a/library/ui/src/main/res/values-ne/strings.xml +++ b/library/ui/src/main/res/values-ne/strings.xml @@ -53,6 +53,9 @@ डाउनलोड सम्पन्न भयो डाउनलोड गर्न सकिएन डाउनलोडहरू हटाउँदै + डाउनलोड गर्ने कार्य पज गरियो + इन्टरनेटमा कनेक्ट भएपछि डाउनलोड गरिने छ + WiFi मा कनेक्ट भएपछि डाउनलोड गरिने छ भिडियो अडियो पाठ diff --git a/library/ui/src/main/res/values-nl/strings.xml b/library/ui/src/main/res/values-nl/strings.xml index 11e9c8cf01..18822455a8 100644 --- a/library/ui/src/main/res/values-nl/strings.xml +++ b/library/ui/src/main/res/values-nl/strings.xml @@ -53,6 +53,9 @@ Downloaden voltooid Downloaden mislukt Downloads verwijderen + Downloads gepauzeerd + Downloads wachten op netwerk + Downloads wachten op wifi Video Audio Tekst diff --git a/library/ui/src/main/res/values-pa/strings.xml b/library/ui/src/main/res/values-pa/strings.xml index cf866c7d0a..96793a05a4 100644 --- a/library/ui/src/main/res/values-pa/strings.xml +++ b/library/ui/src/main/res/values-pa/strings.xml @@ -53,6 +53,9 @@ ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ ਡਾਊਨਲੋਡ ਕੀਤੀ ਸਮੱਗਰੀ ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ + ਡਾਊਨਲੋਡ ਰੁਕ ਗਏ ਹਨ + ਡਾਊਨਲੋਡਾਂ ਲਈ ਨੈੱਟਵਰਕ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ + ਡਾਊਨਲੋਡਾਂ ਲਈ ਵਾਈ-ਫਾਈ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ ਵੀਡੀਓ ਆਡੀਓ ਲਿਖਤ diff --git a/library/ui/src/main/res/values-pl/strings.xml b/library/ui/src/main/res/values-pl/strings.xml index fba552c6fc..4ff02a28b0 100644 --- a/library/ui/src/main/res/values-pl/strings.xml +++ b/library/ui/src/main/res/values-pl/strings.xml @@ -57,6 +57,9 @@ Zakończono pobieranie Nie udało się pobrać Usuwam pobrane + Wstrzymano pobieranie + Pobierane pliki oczekują na sieć + Pobierane pliki oczekują na Wi-Fi Film Dźwięk Tekst diff --git a/library/ui/src/main/res/values-pt-rPT/strings.xml b/library/ui/src/main/res/values-pt-rPT/strings.xml index 6ff368d8f2..6a123c6d97 100644 --- a/library/ui/src/main/res/values-pt-rPT/strings.xml +++ b/library/ui/src/main/res/values-pt-rPT/strings.xml @@ -53,6 +53,9 @@ Transferência concluída Falha na transferência A remover as transferências… + Transferências colocadas em pausa + Transferências a aguardar uma rede + Transferências a aguardar Wi-Fi Vídeo Áudio Texto diff --git a/library/ui/src/main/res/values-pt/strings.xml b/library/ui/src/main/res/values-pt/strings.xml index 3de210b724..20758e4906 100644 --- a/library/ui/src/main/res/values-pt/strings.xml +++ b/library/ui/src/main/res/values-pt/strings.xml @@ -53,6 +53,9 @@ Download concluído Falha no download Removendo downloads + Downloads pausados + Downloads aguardando uma conexão de rede + Downloads aguardando uma rede Wi-Fi Vídeo Áudio Texto diff --git a/library/ui/src/main/res/values-ro/strings.xml b/library/ui/src/main/res/values-ro/strings.xml index 59dd1ba4b2..5dbd79d279 100644 --- a/library/ui/src/main/res/values-ro/strings.xml +++ b/library/ui/src/main/res/values-ro/strings.xml @@ -55,6 +55,9 @@ Descărcarea a fost finalizată Descărcarea nu a reușit Se elimină descărcările + Descărcările au fost întrerupte + Descărcările așteaptă rețeaua + Descărcările așteaptă rețeaua Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-ru/strings.xml b/library/ui/src/main/res/values-ru/strings.xml index 8e0686e52c..651c0a19bc 100644 --- a/library/ui/src/main/res/values-ru/strings.xml +++ b/library/ui/src/main/res/values-ru/strings.xml @@ -57,6 +57,9 @@ Скачивание завершено Ошибка скачивания Удаление скачанных файлов… + Скачивание приостановлено + Ожидание подключения к сети + Ожидание подключения к Wi-Fi Видео Аудио Текст diff --git a/library/ui/src/main/res/values-si/strings.xml b/library/ui/src/main/res/values-si/strings.xml index 79305599e4..2f98ed649c 100644 --- a/library/ui/src/main/res/values-si/strings.xml +++ b/library/ui/src/main/res/values-si/strings.xml @@ -53,6 +53,9 @@ බාගැනීම සම්පූර්ණ කරන ලදී බාගැනීම අසමත් විය බාගැනීම් ඉවත් කිරීම + බාගැනීම් විරාම කර ඇත + ජාලය සඳහා බාගැනීම් රැඳී සිටී + WiFi සඳහා බාගැනීම් රැඳී සිටී වීඩියෝ ශ්‍රව්‍ය පෙළ diff --git a/library/ui/src/main/res/values-sk/strings.xml b/library/ui/src/main/res/values-sk/strings.xml index ad90fc0634..b6822bf46a 100644 --- a/library/ui/src/main/res/values-sk/strings.xml +++ b/library/ui/src/main/res/values-sk/strings.xml @@ -57,6 +57,9 @@ Sťahovanie bolo dokončené Nepodarilo sa stiahnuť Odstraňuje sa stiahnutý obsah + Sťahovanie je pozastavené + Sťahovanie čaká na sieť + Sťahovanie čaká na Wi‑Fi Video Zvuk Text diff --git a/library/ui/src/main/res/values-sl/strings.xml b/library/ui/src/main/res/values-sl/strings.xml index 96e1c9d1e0..d26d7bbc46 100644 --- a/library/ui/src/main/res/values-sl/strings.xml +++ b/library/ui/src/main/res/values-sl/strings.xml @@ -57,6 +57,9 @@ Prenos je končan Prenos ni uspel Odstranjevanje prenosov + Prenosi so začasno zaustavljeni. + Prenosi čakajo na povezavo z omrežjem. + Prenosi čakajo na povezavo Wi-Fi. Videoposnetki Zvočni posnetki Podnapisi diff --git a/library/ui/src/main/res/values-sq/strings.xml b/library/ui/src/main/res/values-sq/strings.xml index 97a0d2ec2e..9d7300c51c 100644 --- a/library/ui/src/main/res/values-sq/strings.xml +++ b/library/ui/src/main/res/values-sq/strings.xml @@ -53,6 +53,9 @@ Shkarkimi përfundoi Shkarkimi dështoi Shkarkimet po hiqen + Shkarkimet u vendosën në pauzë + Shkarkimet në pritje të rrjetit + Shkarkimet në pritje të WiFi Video Audio Tekst diff --git a/library/ui/src/main/res/values-sr/strings.xml b/library/ui/src/main/res/values-sr/strings.xml index fac5dbf113..1e16b8aeab 100644 --- a/library/ui/src/main/res/values-sr/strings.xml +++ b/library/ui/src/main/res/values-sr/strings.xml @@ -55,6 +55,9 @@ Преузимање је завршено Преузимање није успело Преузимања се уклањају + Преузимања су паузирана + Преузимања чекају на мрежу + Преузимања чекају на WiFi Видео Аудио Текст @@ -64,9 +67,9 @@ %1$d × %2$d Моно Стерео - Звучни систем - Звучни систем 5.1 - Звучни систем 7.1 + Просторни звук + Просторни звук 5.1 + Просторни звук 7.1 Алтернативно Додатно Коментар diff --git a/library/ui/src/main/res/values-sv/strings.xml b/library/ui/src/main/res/values-sv/strings.xml index 9d6caf4f2f..0476d861c5 100644 --- a/library/ui/src/main/res/values-sv/strings.xml +++ b/library/ui/src/main/res/values-sv/strings.xml @@ -53,6 +53,9 @@ Nedladdningen är klar Nedladdningen misslyckades Nedladdningar tas bort + Nedladdningar har pausats + Nedladdningar väntar på nätverket + Nedladdningar väntar på wifi Video Ljud Text diff --git a/library/ui/src/main/res/values-sw/strings.xml b/library/ui/src/main/res/values-sw/strings.xml index 245848588b..b17dd7b0c4 100644 --- a/library/ui/src/main/res/values-sw/strings.xml +++ b/library/ui/src/main/res/values-sw/strings.xml @@ -53,6 +53,9 @@ Imepakuliwa Imeshindwa kupakua Inaondoa vipakuliwa + Imesimamisha shughuli ya kupakua + Upakuaji unasubiri mtandao + Upakuaji unasubiri Wi-Fi Video Sauti Maandishi diff --git a/library/ui/src/main/res/values-ta/strings.xml b/library/ui/src/main/res/values-ta/strings.xml index e99fc564f5..f0d61f8dc3 100644 --- a/library/ui/src/main/res/values-ta/strings.xml +++ b/library/ui/src/main/res/values-ta/strings.xml @@ -53,6 +53,9 @@ பதிவிறக்கப்பட்டது பதிவிறக்க முடியவில்லை பதிவிறக்கங்கள் அகற்றப்படுகின்றன + பதிவிறக்கங்கள் இடைநிறுத்தப்பட்டன + நெட்வொர்க்கிற்காகக் காத்திருக்கின்றன + Wi-Fiகாகக் காத்திருக்கின்றன வீடியோ ஆடியோ உரை diff --git a/library/ui/src/main/res/values-te/strings.xml b/library/ui/src/main/res/values-te/strings.xml index 7750f11869..fc5c5291f1 100644 --- a/library/ui/src/main/res/values-te/strings.xml +++ b/library/ui/src/main/res/values-te/strings.xml @@ -53,6 +53,9 @@ డౌన్‌లోడ్ పూర్తయింది డౌన్‌లోడ్ విఫలమైంది డౌన్‌లోడ్‌లను తీసివేస్తోంది + డౌన్‌లోడ్‌లు పాజ్ చేయబడ్డాయి + డౌన్‌లోడ్స్ నెట్‌వర్క్ కోసం చూస్తున్నాయి + డౌన్‌లోడ్‌లు WiFi కోసం చూస్తున్నాయి వీడియో ఆడియో వచనం diff --git a/library/ui/src/main/res/values-th/strings.xml b/library/ui/src/main/res/values-th/strings.xml index c0deabb979..4aff37af51 100644 --- a/library/ui/src/main/res/values-th/strings.xml +++ b/library/ui/src/main/res/values-th/strings.xml @@ -53,6 +53,9 @@ การดาวน์โหลดเสร็จสมบูรณ์ การดาวน์โหลดล้มเหลว กำลังนำรายการที่ดาวน์โหลดออก + การดาวน์โหลดหยุดชั่วคราว + กำลังรอเครือข่ายเพื่อดาวน์โหลด + กำลังรอ Wi-Fi เพื่อดาวน์โหลด วิดีโอ เสียง ข้อความ diff --git a/library/ui/src/main/res/values-tl/strings.xml b/library/ui/src/main/res/values-tl/strings.xml index 96b663f7e3..ddeed95f0b 100644 --- a/library/ui/src/main/res/values-tl/strings.xml +++ b/library/ui/src/main/res/values-tl/strings.xml @@ -53,6 +53,9 @@ Tapos na ang pag-download Hindi na-download Inaalis ang mga na-download + Na-pause ang mga pag-download + Naghihintay ng network ang pag-download + Naghihintay ng WiFi ang mga pag-download Video Audio Text diff --git a/library/ui/src/main/res/values-tr/strings.xml b/library/ui/src/main/res/values-tr/strings.xml index 426e3a68bf..71b0dfe531 100644 --- a/library/ui/src/main/res/values-tr/strings.xml +++ b/library/ui/src/main/res/values-tr/strings.xml @@ -53,6 +53,9 @@ İndirme işlemi tamamlandı İndirilemedi İndirilenler kaldırılıyor + İndirmeler duraklatıldı + İndirmeler için ağ bekleniyor + İndirmeler için kablosuz ağ bekleniyor Video Ses Metin diff --git a/library/ui/src/main/res/values-uk/strings.xml b/library/ui/src/main/res/values-uk/strings.xml index 8103d0d569..f3a48e1925 100644 --- a/library/ui/src/main/res/values-uk/strings.xml +++ b/library/ui/src/main/res/values-uk/strings.xml @@ -57,6 +57,9 @@ Завантаження завершено Не вдалося завантажити Завантаження видаляються + Завантаження призупинено + Очікується підключення до мережі + Очікується підключення до Wi-Fi Відео Аудіо Текст diff --git a/library/ui/src/main/res/values-ur/strings.xml b/library/ui/src/main/res/values-ur/strings.xml index d8c3b46f13..998873bc69 100644 --- a/library/ui/src/main/res/values-ur/strings.xml +++ b/library/ui/src/main/res/values-ur/strings.xml @@ -53,6 +53,9 @@ ڈاؤن لوڈ مکمل ہو گیا ڈاؤن لوڈ ناکام ہو گیا ڈاؤن لوڈز کو ہٹایا جا رہا ہے + ڈاؤن لوڈز موقوف ہو گئے + ڈاؤن لوڈز نیٹ ورک کے منتظر ہیں + ڈاؤن لوڈز WiFi کے منتظر ہیں ویڈیو آڈیو متن diff --git a/library/ui/src/main/res/values-uz/strings.xml b/library/ui/src/main/res/values-uz/strings.xml index dee4ba9ac3..083aceedfd 100644 --- a/library/ui/src/main/res/values-uz/strings.xml +++ b/library/ui/src/main/res/values-uz/strings.xml @@ -53,6 +53,9 @@ Yuklab olindi Yuklab olinmadi Yuklanmalar olib tashlanmoqda + Yuklanmalar pauzada + Yuklanmalar internetga ulanishni kutmoqda + Yuklanmalar Wi-Fi aloqasini kutmoqda Video Audio Matn diff --git a/library/ui/src/main/res/values-vi/strings.xml b/library/ui/src/main/res/values-vi/strings.xml index 1b30f68ea1..166febbd1f 100644 --- a/library/ui/src/main/res/values-vi/strings.xml +++ b/library/ui/src/main/res/values-vi/strings.xml @@ -53,6 +53,9 @@ Đã hoàn tất tải xuống Không tải xuống được Đang xóa các mục đã tải xuống + Đã tạm dừng tải xuống + Đang chờ có mạng để tải xuống + Đang chờ có Wi-Fi để tải xuống Video Âm thanh Văn bản diff --git a/library/ui/src/main/res/values-zh-rCN/strings.xml b/library/ui/src/main/res/values-zh-rCN/strings.xml index 86742f1805..81b7a4df0e 100644 --- a/library/ui/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui/src/main/res/values-zh-rCN/strings.xml @@ -53,6 +53,9 @@ 下载完毕 下载失败 正在移除下载内容 + 下载已暂停 + 正在等待连接到网络以进行下载 + 正在等待连接到 WLAN 网络以进行下载 视频 音频 文字 diff --git a/library/ui/src/main/res/values-zh-rHK/strings.xml b/library/ui/src/main/res/values-zh-rHK/strings.xml index 672a8b4737..2e8246fb4c 100644 --- a/library/ui/src/main/res/values-zh-rHK/strings.xml +++ b/library/ui/src/main/res/values-zh-rHK/strings.xml @@ -53,6 +53,9 @@ 下載完畢 下載失敗 正在移除下載內容 + 已暫停下載 + 正在等待網絡連線以下載檔案 + 正在等待 Wi-Fi 連線以下載檔案 影片 音訊 文字 diff --git a/library/ui/src/main/res/values-zh-rTW/strings.xml b/library/ui/src/main/res/values-zh-rTW/strings.xml index 7e8066c386..e8b46e6c81 100644 --- a/library/ui/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui/src/main/res/values-zh-rTW/strings.xml @@ -53,6 +53,9 @@ 下載完成 無法下載 正在移除下載內容 + 已暫停下載 + 系統會等到連上網路後再開始下載 + 系統會等到連上 Wi-Fi 後再開始下載 影片 音訊 文字 diff --git a/library/ui/src/main/res/values-zu/strings.xml b/library/ui/src/main/res/values-zu/strings.xml index ed7a4ac79f..b663314821 100644 --- a/library/ui/src/main/res/values-zu/strings.xml +++ b/library/ui/src/main/res/values-zu/strings.xml @@ -53,6 +53,9 @@ Ukulanda kuqedile Ukulanda kuhlulekile Kususwa okulandiwe + Okulandwayo kumiswe isikhashana + Ukulanda kulinde inethiwekhi + Ukulanda kulinde i-WiFi Ividiyo Umsindo Umbhalo From e7c6ed5e7f05f750bf2fe97bb0115dcadc1cafc8 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 15:31:27 +0100 Subject: [PATCH 301/441] Mechanical README cleanups PiperOrigin-RevId: 401767060 --- README.md | 20 ++++++++++---------- demos/cast/README.md | 2 +- demos/main/README.md | 2 +- docs/README.md | 2 +- extensions/av1/README.md | 16 ++++++++-------- extensions/cast/README.md | 14 +++++++------- extensions/cronet/README.md | 26 +++++++++++++------------- extensions/ffmpeg/README.md | 14 +++++++------- extensions/flac/README.md | 18 +++++++++--------- extensions/ima/README.md | 14 +++++++------- extensions/leanback/README.md | 12 ++++++------ extensions/media2/README.md | 18 +++++++++--------- extensions/mediasession/README.md | 12 ++++++------ extensions/okhttp/README.md | 16 ++++++++-------- extensions/opus/README.md | 16 ++++++++-------- extensions/rtmp/README.md | 16 ++++++++-------- extensions/vp9/README.md | 18 +++++++++--------- extensions/workmanager/README.md | 8 ++++---- library/all/README.md | 6 +++--- library/common/README.md | 6 +++--- library/core/README.md | 6 +++--- library/dash/README.md | 4 ++-- library/hls/README.md | 4 ++-- library/smoothstreaming/README.md | 4 ++-- library/transformer/README.md | 4 ++-- library/ui/README.md | 4 ++-- testdata/README.md | 2 +- testutils/README.md | 4 ++-- 28 files changed, 144 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index 3933f0bc18..b838068459 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ExoPlayer # +# 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 @@ -7,7 +7,7 @@ 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. -## Documentation ## +## Documentation * The [developer guide][] provides a wealth of information. * The [class reference][] documents ExoPlayer classes. @@ -20,7 +20,7 @@ and extend, and can be updated through Play Store application updates. [release notes]: https://github.com/google/ExoPlayer/blob/release-v2/RELEASENOTES.md [developer blog]: https://medium.com/google-exoplayer -## Using ExoPlayer ## +## Using ExoPlayer ExoPlayer modules can be obtained from [the Google Maven repository][]. It's also possible to clone the repository and depend on the modules locally. @@ -29,7 +29,7 @@ also possible to clone the repository and depend on the modules locally. ### From the Google Maven repository -#### 1. Add ExoPlayer module dependencies #### +#### 1. Add ExoPlayer module dependencies The easiest way to get started using ExoPlayer is to add it as a gradle dependency in the `build.gradle` file of your app module. The following will add @@ -77,7 +77,7 @@ found on the [Google Maven ExoPlayer page][]. [extensions directory]: https://github.com/google/ExoPlayer/tree/release-v2/extensions/ [Google Maven ExoPlayer page]: https://maven.google.com/web/index.html#com.google.android.exoplayer -#### 2. Turn on Java 8 support #### +#### 2. Turn on Java 8 support If not enabled already, you also need to turn on Java 8 support in all `build.gradle` files depending on ExoPlayer, by adding the following to the @@ -89,13 +89,13 @@ compileOptions { } ``` -#### 3. Enable multidex #### +#### 3. Enable multidex If your Gradle `minSdkVersion` is 20 or lower, you should [enable multidex](https://developer.android.com/studio/build/multidex) in order to prevent build errors. -### Locally ### +### Locally Cloning the repository and depending on the modules locally is required when using some ExoPlayer extension modules. It's also a suitable approach if you @@ -128,15 +128,15 @@ implementation project(':exoplayer-library-dash') implementation project(':exoplayer-library-ui') ``` -## Developing ExoPlayer ## +## Developing ExoPlayer -#### Project branches #### +#### 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 #### +#### Using Android Studio To develop ExoPlayer using Android Studio, simply open the ExoPlayer project in the root directory of the repository. diff --git a/demos/cast/README.md b/demos/cast/README.md index fd682433f9..84c4bae8d1 100644 --- a/demos/cast/README.md +++ b/demos/cast/README.md @@ -1,4 +1,4 @@ -# Cast demo application # +# Cast demo application This folder contains a demo application that showcases ExoPlayer integration with Google Cast. diff --git a/demos/main/README.md b/demos/main/README.md index 00072c070b..0d9eb28cf9 100644 --- a/demos/main/README.md +++ b/demos/main/README.md @@ -1,4 +1,4 @@ -# ExoPlayer main demo # +# ExoPlayer main demo This is the main ExoPlayer demo application. It uses ExoPlayer to play a number of test streams. It can be used as a starting point or reference project when diff --git a/docs/README.md b/docs/README.md index bb169336b1..775776676a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# ExoPlayer website # +# ExoPlayer website The [ExoPlayer website](https://exoplayer.dev/) is hosted on GitHub Pages, and is statically generated using Jekyll. diff --git a/extensions/av1/README.md b/extensions/av1/README.md index fad332a00e..1dd3ace119 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -1,9 +1,9 @@ -# ExoPlayer AV1 extension # +# ExoPlayer AV1 extension The AV1 extension provides `Libgav1VideoRenderer`, which uses libgav1 native library to decode AV1 videos. -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension also requires building and including one or @@ -11,7 +11,7 @@ more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Build instructions (Linux, macOS) ## +## Build instructions (Linux, macOS) To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's @@ -61,14 +61,14 @@ to configure and build libgav1 and the extension's [JNI wrapper library][]. [Ninja]: https://ninja-build.org [JNI wrapper library]: https://github.com/google/ExoPlayer/blob/release-v2/extensions/av1/src/main/jni/gav1_jni.cc -## Build instructions (Windows) ## +## Build instructions (Windows) We do not provide support for building this extension on Windows, however it should be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell -## Using the extension ## +## Using the module Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `Libgav1VideoRenderer`. @@ -96,7 +96,7 @@ a custom track selector the choice of `Renderer` is up to your implementation. You need to make sure you are passing a `Libgav1VideoRenderer` to the player and then you need to implement your own logic to use the renderer for a given track. -## Using the extension in the demo application ## +## Using the module in the demo application To try out playback using the extension in the [demo application][], see [enabling extension decoders][]. @@ -104,7 +104,7 @@ To try out playback using the extension in the [demo application][], see [demo application]: https://exoplayer.dev/demo-application.html [enabling extension decoders]: https://exoplayer.dev/demo-application.html#enabling-extension-decoders -## Rendering options ## +## Rendering options There are two possibilities for rendering the output `Libgav1VideoRenderer` gets from the libgav1 decoder: @@ -129,7 +129,7 @@ gets from the libgav1 decoder: Note: Although the default option uses `ANativeWindow`, based on our testing the GL rendering mode has better performance, so should be preferred -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.av1.*` belong to this module. diff --git a/extensions/cast/README.md b/extensions/cast/README.md index 1c0d7ac56f..a93ef38918 100644 --- a/extensions/cast/README.md +++ b/extensions/cast/README.md @@ -1,22 +1,22 @@ -# ExoPlayer Cast extension # +# ExoPlayer Cast extension -## Description ## +## Description The cast extension is a [Player][] implementation that controls playback on a Cast receiver app. [Player]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/Player.html -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-cast:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -24,7 +24,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module Create a `CastPlayer` and use it to integrate Cast into your app using ExoPlayer's common `Player` interface. diff --git a/extensions/cronet/README.md b/extensions/cronet/README.md index 91248583f8..9d32be0c44 100644 --- a/extensions/cronet/README.md +++ b/extensions/cronet/README.md @@ -1,4 +1,4 @@ -# ExoPlayer Cronet extension # +# ExoPlayer Cronet extension The Cronet extension is an [HttpDataSource][] implementation that uses [Cronet][]. @@ -14,16 +14,16 @@ for most use cases. [HttpDataSource]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html [Cronet]: https://developer.android.com/guide/topics/connectivity/cronet -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-cronet:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -31,7 +31,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module ExoPlayer requests data through `DataSource` instances. These instances are obtained from instances of `DataSource.Factory`, which are instantiated and @@ -47,16 +47,16 @@ new DefaultDataSourceFactory( /* baseDataSourceFactory= */ new CronetDataSource.Factory(...) ); ``` -## Cronet implementations ## +## Cronet implementations To instantiate a `CronetDataSource.Factory` you'll need a `CronetEngine`. A `CronetEngine` can be obtained from one of a number of Cronet implementations. It's recommended that an application should only have a single `CronetEngine` instance. -### Available implementations ### +### Available implementations -#### Google Play Services #### +#### Google Play Services By default, ExoPlayer's Cronet extension depends on `com.google.android.gms:play-services-cronet`, which loads an implementation of @@ -72,7 +72,7 @@ includes one of the alternative Cronet implementations described below, you will not be able to instantiate a `CronetEngine` in this case. Your application code should handle this by falling back to use `DefaultHttpDataSource` instead. -#### Cronet Embedded #### +#### Cronet Embedded Cronet Embedded bundles a full Cronet implementation directly into your application. To use it, add an additional dependency on @@ -84,7 +84,7 @@ use of Cronet Embedded may be appropriate if: not widely available. * You want to control the exact version of the Cronet implementation being used. -#### Cronet Fallback #### +#### Cronet Fallback There's also a fallback implementation of Cronet, which uses Android's default network stack under the hood. It can be used by adding a dependency on @@ -98,7 +98,7 @@ you know when your application's `CronetEngine` has been obtained from the fallback implementation. In this case, avoid using it with ExoPlayer and use `DefaultHttpDataSource` instead. -### CronetEngine instantiation ### +### CronetEngine instantiation Cronet's [Send a simple request][] page documents the simplest way of building a `CronetEngine`, which is suitable if your application is only using the @@ -121,7 +121,7 @@ still using it for other networking performed by your application. [Send a simple request]: https://developer.android.com/guide/topics/connectivity/cronet/start -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.cronet.*` belong to this module. diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index ad3481c4f6..11a178e203 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -1,9 +1,9 @@ -# ExoPlayer FFmpeg extension # +# ExoPlayer FFmpeg extension The FFmpeg extension provides `FfmpegAudioRenderer`, which uses FFmpeg for decoding and can render audio encoded in a variety of formats. -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension also requires building and including one or @@ -11,7 +11,7 @@ more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Build instructions (Linux, macOS) ## +## Build instructions (Linux, macOS) To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's @@ -77,14 +77,14 @@ cd "${FFMPEG_EXT_PATH}/jni" && \ "${FFMPEG_EXT_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}" ``` -## Build instructions (Windows) ## +## Build instructions (Windows) We do not provide support for building this extension on Windows, however it should be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell -## Using the extension ## +## Using the module Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `FfmpegAudioRenderer`. @@ -116,7 +116,7 @@ then implement your own logic to use the renderer for a given track. [#2781]: https://github.com/google/ExoPlayer/issues/2781 [Supported formats]: https://exoplayer.dev/supported-formats.html#ffmpeg-extension -## Using the extension in the demo application ## +## Using the module in the demo application To try out playback using the extension in the [demo application][], see [enabling extension decoders][]. @@ -124,7 +124,7 @@ To try out playback using the extension in the [demo application][], see [demo application]: https://exoplayer.dev/demo-application.html [enabling extension decoders]: https://exoplayer.dev/demo-application.html#enabling-extension-decoders -## Links ## +## Links * [Troubleshooting using extensions][] * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.ffmpeg.*` diff --git a/extensions/flac/README.md b/extensions/flac/README.md index 8b58a3fc6b..ff7ab4f9e4 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -1,9 +1,9 @@ -# ExoPlayer Flac extension # +# ExoPlayer Flac extension The Flac extension provides `FlacExtractor` and `LibflacAudioRenderer`, which use libFLAC (the Flac decoding library) to extract and decode FLAC audio. -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension also requires building and including one or @@ -11,7 +11,7 @@ more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Build instructions (Linux, macOS) ## +## Build instructions (Linux, macOS) To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's @@ -53,27 +53,27 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md [Android NDK]: https://developer.android.com/tools/sdk/ndk/index.html -## Build instructions (Windows) ## +## Build instructions (Windows) We do not provide support for building this extension on Windows, however it should be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell -## Using the extension ## +## Using the module Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use the extractor and/or renderer. -### Using `FlacExtractor` ### +### Using `FlacExtractor` `FlacExtractor` is used via `ProgressiveMediaSource`. If you're using `DefaultExtractorsFactory`, `FlacExtractor` will automatically be used to read `.flac` files. If you're not using `DefaultExtractorsFactory`, return a `FlacExtractor` from your `ExtractorsFactory.createExtractors` implementation. -### Using `LibflacAudioRenderer` ### +### Using `LibflacAudioRenderer` * If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can enable using the extension by setting the `extensionRendererMode` parameter of @@ -96,7 +96,7 @@ a custom track selector the choice of `Renderer` is up to your implementation, so you need to make sure you are passing an `LibflacAudioRenderer` to the player, then implement your own logic to use the renderer for a given track. -## Using the extension in the demo application ## +## Using the module in the demo application To try out playback using the extension in the [demo application][], see [enabling extension decoders][]. @@ -104,7 +104,7 @@ To try out playback using the extension in the [demo application][], see [demo application]: https://exoplayer.dev/demo-application.html [enabling extension decoders]: https://exoplayer.dev/demo-application.html#enabling-extension-decoders -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.flac.*` belong to this module. diff --git a/extensions/ima/README.md b/extensions/ima/README.md index 016f848c7a..d93fd8c1d2 100644 --- a/extensions/ima/README.md +++ b/extensions/ima/README.md @@ -1,4 +1,4 @@ -# ExoPlayer IMA extension # +# ExoPlayer IMA extension The IMA extension is an [AdsLoader][] implementation wrapping the [Interactive Media Ads SDK for Android][IMA]. You can use it to insert ads @@ -7,16 +7,16 @@ alongside content. [IMA]: https://developers.google.com/interactive-media-ads/docs/sdks/android/ [AdsLoader]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/source/ads/AdsLoader.html -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-ima:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -24,7 +24,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module To use the extension, follow the instructions on the [Ad insertion page](https://exoplayer.dev/ad-insertion.html#declarative-ad-support) @@ -52,7 +52,7 @@ in the "IMA sample ad tags" section of the sample chooser. The demo app's `PlayerActivity` also shows how to persist the `ImaAdsLoader` instance and the player position when backgrounded during ad playback. -## Links ## +## Links * [ExoPlayer documentation on ad insertion][] * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.ima.*` diff --git a/extensions/leanback/README.md b/extensions/leanback/README.md index b6eb085247..bf777ea659 100644 --- a/extensions/leanback/README.md +++ b/extensions/leanback/README.md @@ -1,4 +1,4 @@ -# ExoPlayer Leanback extension # +# ExoPlayer Leanback extension This [Leanback][] Extension provides a [PlayerAdapter][] implementation for ExoPlayer. @@ -6,16 +6,16 @@ ExoPlayer. [PlayerAdapter]: https://developer.android.com/reference/android/support/v17/leanback/media/PlayerAdapter.html [Leanback]: https://developer.android.com/reference/android/support/v17/leanback/package-summary.html -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-leanback:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -23,7 +23,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.leanback.*` belong to this module. diff --git a/extensions/media2/README.md b/extensions/media2/README.md index 32ea864940..63b8f549ee 100644 --- a/extensions/media2/README.md +++ b/extensions/media2/README.md @@ -1,4 +1,4 @@ -# ExoPlayer Media2 extension # +# ExoPlayer Media2 extension The Media2 extension provides builders for [SessionPlayer][] and [MediaSession.SessionCallback][] in the [Media2 library][]. @@ -6,16 +6,16 @@ the [Media2 library][]. Compared to [MediaSessionConnector][] that uses [MediaSessionCompat][], this provides finer grained control for incoming calls, so you can selectively allow/reject commands per controller. -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-media2:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -23,20 +23,20 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module -### Using `SessionPlayerConnector` ### +### Using `SessionPlayerConnector` `SessionPlayerConnector` is a [SessionPlayer][] implementation wrapping a given `Player`. You can use a [SessionPlayer][] instance to build a [MediaSession][], or to set the player associated with a [VideoView][] or [MediaControlView][] -### Using `SessionCallbackBuilder` ### +### Using `SessionCallbackBuilder` `SessionCallbackBuilder` lets you build a [MediaSession.SessionCallback][] instance given its collaborators. You can use a [MediaSession.SessionCallback][] to build a [MediaSession][]. -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.media2.*` belong to this module. diff --git a/extensions/mediasession/README.md b/extensions/mediasession/README.md index 64b55a8036..9a2949b679 100644 --- a/extensions/mediasession/README.md +++ b/extensions/mediasession/README.md @@ -1,4 +1,4 @@ -# ExoPlayer MediaSession extension # +# ExoPlayer MediaSession extension The MediaSession extension mediates between a Player (or ExoPlayer) instance and a [MediaSession][]. It automatically retrieves and implements playback @@ -7,16 +7,16 @@ behaviour can be extended to support other playback and custom actions. [MediaSession]: https://developer.android.com/reference/android/support/v4/media/session/MediaSessionCompat.html -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-mediasession:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -24,7 +24,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.mediasession.*` belong to this module. diff --git a/extensions/okhttp/README.md b/extensions/okhttp/README.md index 2aad867e79..c5a250c255 100644 --- a/extensions/okhttp/README.md +++ b/extensions/okhttp/README.md @@ -1,4 +1,4 @@ -# ExoPlayer OkHttp extension # +# ExoPlayer OkHttp extension The OkHttp extension is an [HttpDataSource][] implementation that uses Square's [OkHttp][]. @@ -9,7 +9,7 @@ applications. It supports the HTTP and HTTP/2 protocols. [HttpDataSource]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html [OkHttp]: https://square.github.io/okhttp/ -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension requires depending on OkHttp, which is @@ -17,16 +17,16 @@ licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-okhttp:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -34,7 +34,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module ExoPlayer requests data through `DataSource` instances. These instances are obtained from instances of `DataSource.Factory`, which are instantiated and @@ -50,7 +50,7 @@ new DefaultDataSourceFactory( /* baseDataSourceFactory= */ new OkHttpDataSource.Factory(...)); ``` -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.okhttp.*` belong to this module. diff --git a/extensions/opus/README.md b/extensions/opus/README.md index 29c4a46357..87078fe2a8 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -1,9 +1,9 @@ -# ExoPlayer Opus extension # +# ExoPlayer Opus extension The Opus extension provides `LibopusAudioRenderer`, which uses libopus (the Opus decoding library) to decode Opus audio. -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension also requires building and including one or @@ -11,7 +11,7 @@ more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Build instructions (Linux, macOS) ## +## Build instructions (Linux, macOS) To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's @@ -58,14 +58,14 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md [Android NDK]: https://developer.android.com/tools/sdk/ndk/index.html -## Build instructions (Windows) ## +## Build instructions (Windows) We do not provide support for building this extension on Windows, however it should be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell -## Notes ## +## Notes * Every time there is a change to the libopus checkout: * Arm assembly should be converted by running `convert_android_asm.sh` @@ -73,7 +73,7 @@ should be possible to follow the Linux instructions in [Windows PowerShell][]. * If you want to use your own version of libopus, place it in `${OPUS_EXT_PATH}/jni/libopus`. -## Using the extension ## +## Using the module Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `LibopusAudioRenderer`. @@ -100,7 +100,7 @@ a custom track selector the choice of `Renderer` is up to your implementation, so you need to make sure you are passing an `LibopusAudioRenderer` to the player, then implement your own logic to use the renderer for a given track. -## Using the extension in the demo application ## +## Using the module in the demo application To try out playback using the extension in the [demo application][], see [enabling extension decoders][]. @@ -108,7 +108,7 @@ To try out playback using the extension in the [demo application][], see [demo application]: https://exoplayer.dev/demo-application.html [enabling extension decoders]: https://exoplayer.dev/demo-application.html#enabling-extension-decoders -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.opus.*` belong to this module. diff --git a/extensions/rtmp/README.md b/extensions/rtmp/README.md index 99e9d25e8e..0d56ca81b6 100644 --- a/extensions/rtmp/README.md +++ b/extensions/rtmp/README.md @@ -1,4 +1,4 @@ -# ExoPlayer RTMP extension # +# ExoPlayer RTMP extension The RTMP extension is a [DataSource][] implementation for playing [RTMP][] streams using [LibRtmp Client for Android][]. @@ -7,7 +7,7 @@ streams using [LibRtmp Client for Android][]. [RTMP]: https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol [LibRtmp Client for Android]: https://github.com/ant-media/LibRtmp-Client-for-Android -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension requires depending on LibRtmp Client for @@ -15,16 +15,16 @@ Android, which is licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Getting the extension ## +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-rtmp:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's @@ -32,7 +32,7 @@ locally. Instructions for doing this can be found in ExoPlayer's [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Using the extension ## +## Using the module ExoPlayer requests data through `DataSource` instances. These instances are obtained from instances of `DataSource.Factory`, which are instantiated and @@ -47,7 +47,7 @@ doesn't need to handle any other protocols, you can update any `DataSource.Factory` instantiations in your application code to use `RtmpDataSource.Factory` directly. -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.rtmp.*` belong to this module. diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index 557e7e6d70..ad6d5ecf97 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -1,9 +1,9 @@ -# ExoPlayer VP9 extension # +# ExoPlayer VP9 extension The VP9 extension provides `LibvpxVideoRenderer`, which uses libvpx (the VPx decoding library) to decode VP9 video. -## License note ## +## License note Please note that whilst the code in this repository is licensed under [Apache 2.0][], using this extension also requires building and including one or @@ -11,7 +11,7 @@ more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE -## Build instructions (Linux, macOS) ## +## Build instructions (Linux, macOS) To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's @@ -65,14 +65,14 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md [Android NDK]: https://developer.android.com/tools/sdk/ndk/index.html -## Build instructions (Windows) ## +## Build instructions (Windows) We do not provide support for building this extension on Windows, however it should be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell -## Notes ## +## Notes * Every time there is a change to the libvpx checkout: * Android config scripts should be re-generated by running @@ -83,7 +83,7 @@ should be possible to follow the Linux instructions in [Windows PowerShell][]. `generate_libvpx_android_configs.sh` and the makefiles may need to be modified to work with arbitrary versions of libvpx. -## Using the extension ## +## Using the module Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `LibvpxVideoRenderer`. @@ -111,7 +111,7 @@ a custom track selector the choice of `Renderer` is up to your implementation, so you need to make sure you are passing an `LibvpxVideoRenderer` to the player, then implement your own logic to use the renderer for a given track. -## Using the extension in the demo application ## +## Using the module in the demo application To try out playback using the extension in the [demo application][], see [enabling extension decoders][]. @@ -119,7 +119,7 @@ To try out playback using the extension in the [demo application][], see [demo application]: https://exoplayer.dev/demo-application.html [enabling extension decoders]: https://exoplayer.dev/demo-application.html#enabling-extension-decoders -## Rendering options ## +## Rendering options There are two possibilities for rendering the output `LibvpxVideoRenderer` gets from the libvpx decoder: @@ -144,7 +144,7 @@ gets from the libvpx decoder: Note: Although the default option uses `ANativeWindow`, based on our testing the GL rendering mode has better performance, so should be preferred. -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.vp9.*` belong to this module. diff --git a/extensions/workmanager/README.md b/extensions/workmanager/README.md index bd2dbc71ad..4f00976d7e 100644 --- a/extensions/workmanager/README.md +++ b/extensions/workmanager/README.md @@ -4,16 +4,16 @@ This extension provides a Scheduler implementation which uses [WorkManager][]. [WorkManager]: https://developer.android.com/topic/libraries/architecture/workmanager.html -## Getting the extension +## Getting the module -The easiest way to use the extension is to add it as a gradle dependency: +The easiest way to get the module is to add it as a gradle dependency: ```gradle implementation 'com.google.android.exoplayer:extension-workmanager:2.X.X' ``` -where `2.X.X` is the version, which must match the version of the ExoPlayer -library being used. +where `2.X.X` is the version, which must match the version of the other media +modules being used. Alternatively, you can clone the ExoPlayer repository and depend on the module locally. Instructions for doing this can be found in ExoPlayer's diff --git a/library/all/README.md b/library/all/README.md index 43f942116e..f55879c671 100644 --- a/library/all/README.md +++ b/library/all/README.md @@ -1,4 +1,4 @@ -# ExoPlayer full library # +# ExoPlayer full library An empty module that depends on all of the other library modules. Depending on the full library is equivalent to depending on all of the other library modules @@ -6,8 +6,8 @@ individually. See ExoPlayer's [top level README][] for more information. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md -## Links ## +## Links -* [Javadoc][]: Note that this Javadoc is combined with that of other modules. +* [Javadoc][]: Note that this Javadoc is combined with that of other modules. [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/common/README.md b/library/common/README.md index af7264bcad..9e78e273b6 100644 --- a/library/common/README.md +++ b/library/common/README.md @@ -1,10 +1,10 @@ -# ExoPlayer common library module # +# ExoPlayer common library module Common code used by other ExoPlayer modules. -## Links ## +## Links -* [Javadoc][]: Note that this Javadoc is combined with that of other modules. +* [Javadoc][]: Note that this Javadoc is combined with that of other modules. [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/core/README.md b/library/core/README.md index 7fa89dda8d..6275c98352 100644 --- a/library/core/README.md +++ b/library/core/README.md @@ -1,9 +1,9 @@ -# ExoPlayer core library module # +# ExoPlayer core library module The core of the ExoPlayer library. -## Links ## +## Links -* [Javadoc][]: Note that this Javadoc is combined with that of other modules. +* [Javadoc][]: Note that this Javadoc is combined with that of other modules. [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/dash/README.md b/library/dash/README.md index 2ae77c41aa..b33e763e3b 100644 --- a/library/dash/README.md +++ b/library/dash/README.md @@ -1,4 +1,4 @@ -# ExoPlayer DASH library module # +# ExoPlayer DASH library module Provides support for Dynamic Adaptive Streaming over HTTP (DASH) content. @@ -16,7 +16,7 @@ For advanced playback use cases, applications can build `DashMediaSource` instances and pass them directly to the player. For advanced download use cases, `DashDownloader` can be used directly. -## Links ## +## Links * [Developer Guide][]. * [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.dash.*` diff --git a/library/hls/README.md b/library/hls/README.md index d8b86e1832..f11bb4f94c 100644 --- a/library/hls/README.md +++ b/library/hls/README.md @@ -1,4 +1,4 @@ -# ExoPlayer HLS library module # +# ExoPlayer HLS library module Provides support for HTTP Live Streaming (HLS) content. @@ -16,7 +16,7 @@ For advanced playback use cases, applications can build `HlsMediaSource` instances and pass them directly to the player. For advanced download use cases, `HlsDownloader` can be used directly. -## Links ## +## Links * [Developer Guide][]. * [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.hls.*` belong to diff --git a/library/smoothstreaming/README.md b/library/smoothstreaming/README.md index 2fab69c756..1400c6dc6e 100644 --- a/library/smoothstreaming/README.md +++ b/library/smoothstreaming/README.md @@ -1,4 +1,4 @@ -# ExoPlayer SmoothStreaming library module # +# ExoPlayer SmoothStreaming library module Provides support for SmoothStreaming content. @@ -17,7 +17,7 @@ For advanced playback use cases, applications can build `SsMediaSource` instances and pass them directly to the player. For advanced download use cases, `SsDownloader` can be used directly. -## Links ## +## Links * [Developer Guide][]. * [Javadoc][]: Classes matching diff --git a/library/transformer/README.md b/library/transformer/README.md index 5de22fa583..6cba7c60a7 100644 --- a/library/transformer/README.md +++ b/library/transformer/README.md @@ -1,8 +1,8 @@ -# ExoPlayer transformer library module # +# ExoPlayer transformer library module Provides support for transforming media files. -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.transformer.*` belong to this module. diff --git a/library/ui/README.md b/library/ui/README.md index 16136b3d94..21e13e1dc7 100644 --- a/library/ui/README.md +++ b/library/ui/README.md @@ -1,8 +1,8 @@ -# ExoPlayer UI library module # +# ExoPlayer UI library module Provides UI components and resources for use with ExoPlayer. -## Links ## +## Links * [Developer Guide][]. * [Javadoc][]: Classes matching `com.google.android.exoplayer2.ui.*` diff --git a/testdata/README.md b/testdata/README.md index 911505926b..6ca8a8577e 100644 --- a/testdata/README.md +++ b/testdata/README.md @@ -1,4 +1,4 @@ -# ExoPlayer test data # +# ExoPlayer test data Provides sample data for ExoPlayer unit and instrumentation tests. diff --git a/testutils/README.md b/testutils/README.md index 61aa708066..3089e566e4 100644 --- a/testutils/README.md +++ b/testutils/README.md @@ -1,8 +1,8 @@ -# ExoPlayer test utils # +# ExoPlayer test utils Provides utility classes for ExoPlayer unit and instrumentation tests. -## Links ## +## Links * [Javadoc][]: Classes matching `com.google.android.exoplayer2.testutil` belong to this module. From e4a5c07b5fdfb7211d91b3a33aaa1039ee032f04 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 16:34:13 +0100 Subject: [PATCH 302/441] Mechanical README cleanups 2 PiperOrigin-RevId: 401777730 --- extensions/av1/README.md | 4 ++-- extensions/cast/README.md | 5 ++--- extensions/cronet/README.md | 5 ++--- extensions/ffmpeg/README.md | 4 ++-- extensions/flac/README.md | 4 ++-- extensions/ima/README.md | 5 ++--- extensions/leanback/README.md | 5 ++--- extensions/media2/README.md | 5 ++--- extensions/mediasession/README.md | 5 ++--- extensions/okhttp/README.md | 5 ++--- extensions/opus/README.md | 4 ++-- extensions/rtmp/README.md | 5 ++--- extensions/vp9/README.md | 4 ++-- extensions/workmanager/README.md | 5 ++--- library/all/README.md | 2 +- 15 files changed, 29 insertions(+), 38 deletions(-) diff --git a/extensions/av1/README.md b/extensions/av1/README.md index 1dd3ace119..983931b937 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -13,8 +13,8 @@ more external libraries as described below. These are licensed separately. ## Build instructions (Linux, macOS) -To use this extension you need to clone the ExoPlayer repository and depend on -its modules locally. Instructions for doing this can be found in ExoPlayer's +To use the module you need to clone this GitHub project and depend on its +modules locally. Instructions for doing this can be found in the [top level README][]. In addition, it's necessary to fetch cpu_features library and libgav1 with its diff --git a/extensions/cast/README.md b/extensions/cast/README.md index a93ef38918..2a373d9bd1 100644 --- a/extensions/cast/README.md +++ b/extensions/cast/README.md @@ -18,9 +18,8 @@ implementation 'com.google.android.exoplayer:extension-cast:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/cronet/README.md b/extensions/cronet/README.md index 9d32be0c44..0496e12dd5 100644 --- a/extensions/cronet/README.md +++ b/extensions/cronet/README.md @@ -25,9 +25,8 @@ implementation 'com.google.android.exoplayer:extension-cronet:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index 11a178e203..2587657fae 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -13,8 +13,8 @@ more external libraries as described below. These are licensed separately. ## Build instructions (Linux, macOS) -To use this extension you need to clone the ExoPlayer repository and depend on -its modules locally. Instructions for doing this can be found in ExoPlayer's +To use the module you need to clone this GitHub project and depend on its +modules locally. Instructions for doing this can be found in the [top level README][]. The extension is not provided via Google's Maven repository (see [#2781][] for more information). diff --git a/extensions/flac/README.md b/extensions/flac/README.md index ff7ab4f9e4..e8324c034e 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -13,8 +13,8 @@ more external libraries as described below. These are licensed separately. ## Build instructions (Linux, macOS) -To use this extension you need to clone the ExoPlayer repository and depend on -its modules locally. Instructions for doing this can be found in ExoPlayer's +To use the module you need to clone this GitHub project and depend on its +modules locally. Instructions for doing this can be found in the [top level README][]. In addition, it's necessary to build the extension's native components as diff --git a/extensions/ima/README.md b/extensions/ima/README.md index d93fd8c1d2..873bc4b41a 100644 --- a/extensions/ima/README.md +++ b/extensions/ima/README.md @@ -18,9 +18,8 @@ implementation 'com.google.android.exoplayer:extension-ima:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/leanback/README.md b/extensions/leanback/README.md index bf777ea659..961d674182 100644 --- a/extensions/leanback/README.md +++ b/extensions/leanback/README.md @@ -17,9 +17,8 @@ implementation 'com.google.android.exoplayer:extension-leanback:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/media2/README.md b/extensions/media2/README.md index 63b8f549ee..beffaaccb3 100644 --- a/extensions/media2/README.md +++ b/extensions/media2/README.md @@ -17,9 +17,8 @@ implementation 'com.google.android.exoplayer:extension-media2:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/mediasession/README.md b/extensions/mediasession/README.md index 9a2949b679..506b63bb41 100644 --- a/extensions/mediasession/README.md +++ b/extensions/mediasession/README.md @@ -18,9 +18,8 @@ implementation 'com.google.android.exoplayer:extension-mediasession:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/okhttp/README.md b/extensions/okhttp/README.md index c5a250c255..14f7799a2c 100644 --- a/extensions/okhttp/README.md +++ b/extensions/okhttp/README.md @@ -28,9 +28,8 @@ implementation 'com.google.android.exoplayer:extension-okhttp:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/opus/README.md b/extensions/opus/README.md index 87078fe2a8..bf4f953cbd 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -13,8 +13,8 @@ more external libraries as described below. These are licensed separately. ## Build instructions (Linux, macOS) -To use this extension you need to clone the ExoPlayer repository and depend on -its modules locally. Instructions for doing this can be found in ExoPlayer's +To use the module you need to clone this GitHub project and depend on its +modules locally. Instructions for doing this can be found in the [top level README][]. In addition, it's necessary to build the extension's native components as diff --git a/extensions/rtmp/README.md b/extensions/rtmp/README.md index 0d56ca81b6..cc8d0b2ac7 100644 --- a/extensions/rtmp/README.md +++ b/extensions/rtmp/README.md @@ -26,9 +26,8 @@ implementation 'com.google.android.exoplayer:extension-rtmp:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index ad6d5ecf97..68a2f2381e 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -13,8 +13,8 @@ more external libraries as described below. These are licensed separately. ## Build instructions (Linux, macOS) -To use this extension you need to clone the ExoPlayer repository and depend on -its modules locally. Instructions for doing this can be found in ExoPlayer's +To use the module you need to clone this GitHub project and depend on its +modules locally. Instructions for doing this can be found in the [top level README][]. In addition, it's necessary to build the extension's native components as diff --git a/extensions/workmanager/README.md b/extensions/workmanager/README.md index 4f00976d7e..fcda0d89c3 100644 --- a/extensions/workmanager/README.md +++ b/extensions/workmanager/README.md @@ -15,8 +15,7 @@ implementation 'com.google.android.exoplayer:extension-workmanager:2.X.X' where `2.X.X` is the version, which must match the version of the other media modules being used. -Alternatively, you can clone the ExoPlayer repository and depend on the module -locally. Instructions for doing this can be found in ExoPlayer's -[top level README][]. +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/library/all/README.md b/library/all/README.md index f55879c671..57a142dfcf 100644 --- a/library/all/README.md +++ b/library/all/README.md @@ -2,7 +2,7 @@ An empty module that depends on all of the other library modules. Depending on the full library is equivalent to depending on all of the other library modules -individually. See ExoPlayer's [top level README][] for more information. +individually. See the [top level README][] for more information. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md From e160649d9c4e0588df5f6ce06b39f18b959be0db Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Oct 2021 17:52:04 +0100 Subject: [PATCH 303/441] README updates for MediaSource, DataSource and UI modules PiperOrigin-RevId: 401793145 --- extensions/cronet/README.md | 37 +++++++++++++++--------------- extensions/leanback/README.md | 7 +++--- extensions/okhttp/README.md | 8 +++---- extensions/rtmp/README.md | 8 +++---- library/dash/README.md | 30 +++++++++++++++++++----- library/hls/README.md | 29 ++++++++++++++++++----- library/rtsp/README.md | 38 +++++++++++++++++++++++++++++++ library/smoothstreaming/README.md | 28 ++++++++++++++++++----- library/ui/README.md | 25 ++++++++++++++++---- 9 files changed, 157 insertions(+), 53 deletions(-) create mode 100644 library/rtsp/README.md diff --git a/extensions/cronet/README.md b/extensions/cronet/README.md index 0496e12dd5..7749d27d6b 100644 --- a/extensions/cronet/README.md +++ b/extensions/cronet/README.md @@ -1,15 +1,13 @@ -# ExoPlayer Cronet extension +# Cronet DataSource module -The Cronet extension is an [HttpDataSource][] implementation that uses -[Cronet][]. +This module provides an [HttpDataSource][] implementation that uses [Cronet][]. Cronet is the Chromium network stack made available to Android apps as a library. It takes advantage of multiple technologies that reduce the latency and -increase the throughput of the network requests that your app needs to work, -including those made by ExoPlayer. It natively supports the HTTP, HTTP/2, and -HTTP/3 over QUIC protocols. Cronet is used by some of the world's biggest -streaming applications, including YouTube, and is our recommended network stack -for most use cases. +increase the throughput of the network requests that your app needs to work. It +natively supports the HTTP, HTTP/2, and HTTP/3 over QUIC protocols. Cronet is +used by some of the world's biggest streaming applications, including YouTube, +and is our recommended network stack for most use cases. [HttpDataSource]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/upstream/HttpDataSource.html [Cronet]: https://developer.android.com/guide/topics/connectivity/cronet @@ -32,8 +30,8 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Using the module -ExoPlayer requests data through `DataSource` instances. These instances are -obtained from instances of `DataSource.Factory`, which are instantiated and +Media components request data through `DataSource` instances. These instances +are obtained from instances of `DataSource.Factory`, which are instantiated and injected from application code. If your application only needs to play http(s) content, using the Cronet @@ -57,10 +55,10 @@ instance. #### Google Play Services -By default, ExoPlayer's Cronet extension depends on +By default, this module depends on `com.google.android.gms:play-services-cronet`, which loads an implementation of -Cronet from Google Play Services. When Google Play Services is available, -this approach is beneficial because: +Cronet from Google Play Services. When Google Play Services is available, this +approach is beneficial because: * The increase in application size is negligible. * The implementation is updated automatically by Google Play Services. @@ -87,14 +85,14 @@ use of Cronet Embedded may be appropriate if: There's also a fallback implementation of Cronet, which uses Android's default network stack under the hood. It can be used by adding a dependency on -`org.chromium.net:cronet-fallback`. This implementation should _not_ be used -with ExoPlayer, since it's more efficient to use `DefaultHttpDataSource` -directly in this case. +`org.chromium.net:cronet-fallback`. This implementation should *not* be used +with `CronetDataSource`, since it's more efficient to use +`DefaultHttpDataSource` directly in this case. When using Cronet Fallback for other networking in your application, use the more advanced approach to instantiating a `CronetEngine` described below so that you know when your application's `CronetEngine` has been obtained from the -fallback implementation. In this case, avoid using it with ExoPlayer and use +fallback implementation. In this case, avoid `CronetDataSource` and use `DefaultHttpDataSource` instead. ### CronetEngine instantiation @@ -115,8 +113,9 @@ This makes it possible to iterate through the providers in your own order of preference, trying to build a `CronetEngine` from each in turn using `CronetProvider.createBuilder()` until one has been successfully created. This approach also allows you to determine when the `CronetEngine` has been obtained -from Cronet Fallback, in which case you can avoid using it for ExoPlayer whilst -still using it for other networking performed by your application. +from Cronet Fallback, in which case you can avoid using `CronetDataSource` +whilst still using Cronet Fallback for other networking performed by your +application. [Send a simple request]: https://developer.android.com/guide/topics/connectivity/cronet/start diff --git a/extensions/leanback/README.md b/extensions/leanback/README.md index 961d674182..19b1659c45 100644 --- a/extensions/leanback/README.md +++ b/extensions/leanback/README.md @@ -1,7 +1,8 @@ -# ExoPlayer Leanback extension +# Leanback UI module -This [Leanback][] Extension provides a [PlayerAdapter][] implementation for -ExoPlayer. +This module provides a [PlayerAdapter][] wrapper for `Player`, making it +possible to connect `Player` implementations such as `ExoPlayer` to the playback +widgets provided by `androidx.leanback:leanback`. [PlayerAdapter]: https://developer.android.com/reference/android/support/v17/leanback/media/PlayerAdapter.html [Leanback]: https://developer.android.com/reference/android/support/v17/leanback/package-summary.html diff --git a/extensions/okhttp/README.md b/extensions/okhttp/README.md index 14f7799a2c..269b9a6100 100644 --- a/extensions/okhttp/README.md +++ b/extensions/okhttp/README.md @@ -1,6 +1,6 @@ -# ExoPlayer OkHttp extension +# OkHttp DataSource module -The OkHttp extension is an [HttpDataSource][] implementation that uses Square's +This module provides an [HttpDataSource][] implementation that uses Square's [OkHttp][]. OkHttp is a modern network stack that's widely used by many popular Android @@ -35,8 +35,8 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Using the module -ExoPlayer requests data through `DataSource` instances. These instances are -obtained from instances of `DataSource.Factory`, which are instantiated and +Media components request data through `DataSource` instances. These instances +are obtained from instances of `DataSource.Factory`, which are instantiated and injected from application code. If your application only needs to play http(s) content, using the OkHttp diff --git a/extensions/rtmp/README.md b/extensions/rtmp/README.md index cc8d0b2ac7..3df7db9a56 100644 --- a/extensions/rtmp/README.md +++ b/extensions/rtmp/README.md @@ -1,6 +1,6 @@ -# ExoPlayer RTMP extension +# RTMP DataSource module -The RTMP extension is a [DataSource][] implementation for playing [RTMP][] +This module provides a [DataSource][] implementation for requesting [RTMP][] streams using [LibRtmp Client for Android][]. [DataSource]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/upstream/DataSource.html @@ -33,8 +33,8 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Using the module -ExoPlayer requests data through `DataSource` instances. These instances are -obtained from instances of `DataSource.Factory`, which are instantiated and +Media components request data through `DataSource` instances. These instances +are obtained from instances of `DataSource.Factory`, which are instantiated and injected from application code. `DefaultDataSource` will automatically use the RTMP extension whenever it's diff --git a/library/dash/README.md b/library/dash/README.md index b33e763e3b..0eb871a040 100644 --- a/library/dash/README.md +++ b/library/dash/README.md @@ -1,12 +1,30 @@ -# ExoPlayer DASH library module +# ExoPlayer DASH module -Provides support for Dynamic Adaptive Streaming over HTTP (DASH) content. +Provides support for Dynamic Adaptive Streaming over HTTP (DASH) content in +ExoPlayer. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-dash:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Using the module Adding a dependency to this module is all that's required to enable playback of -DASH `MediaItem`s added to an `ExoPlayer` or `SimpleExoPlayer` in their default -configurations. Internally, `DefaultMediaSourceFactory` will automatically -detect the presence of the module and convert DASH `MediaItem`s into -`DashMediaSource` instances for playback. +DASH media items added to `ExoPlayer` in its default configuration. Internally, +`DefaultMediaSourceFactory` will automatically detect the presence of the module +and convert a DASH `MediaItem` into a `DashMediaSource` for playback. Similarly, a `DownloadManager` in its default configuration will use `DefaultDownloaderFactory`, which will automatically detect the presence of diff --git a/library/hls/README.md b/library/hls/README.md index f11bb4f94c..93f776c25f 100644 --- a/library/hls/README.md +++ b/library/hls/README.md @@ -1,12 +1,29 @@ -# ExoPlayer HLS library module +# ExoPlayer HLS module -Provides support for HTTP Live Streaming (HLS) content. +Provides support for HTTP Live Streaming (HLS) content in ExoPlayer. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-hls:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Using the module Adding a dependency to this module is all that's required to enable playback of -HLS `MediaItem`s added to an `ExoPlayer` or `SimpleExoPlayer` in their default -configurations. Internally, `DefaultMediaSourceFactory` will automatically -detect the presence of the module and convert HLS `MediaItem`s into -`HlsMediaSource` instances for playback. +HLS media items added to `ExoPlayer` in its default configuration. Internally, +`DefaultMediaSourceFactory` will automatically detect the presence of the module +and convert an HLS `MediaItem` into an `HlsMediaSource` for playback. Similarly, a `DownloadManager` in its default configuration will use `DefaultDownloaderFactory`, which will automatically detect the presence of diff --git a/library/rtsp/README.md b/library/rtsp/README.md new file mode 100644 index 0000000000..08837189b0 --- /dev/null +++ b/library/rtsp/README.md @@ -0,0 +1,38 @@ +# ExoPlayer RTSP module + +Provides support for RTSP playbacks in ExoPlayer. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-rtsp:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Using the module + +Adding a dependency to this module is all that's required to enable playback of +RTSP media items added to `ExoPlayer` in its default configuration. Internally, +`DefaultMediaSourceFactory` will automatically detect the presence of the module +and convert a RTSP `MediaItem` into a `RtspMediaSource` for playback. + +For advanced playback use cases, applications can build `RtspMediaSource` +instances and pass them directly to the player. + +## Links + +* [Developer Guide][]. +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.rtsp.*` belong to + this module. + +[Developer Guide]: https://exoplayer.dev/dash.html +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/smoothstreaming/README.md b/library/smoothstreaming/README.md index 1400c6dc6e..f187288666 100644 --- a/library/smoothstreaming/README.md +++ b/library/smoothstreaming/README.md @@ -1,12 +1,28 @@ -# ExoPlayer SmoothStreaming library module +# ExoPlayer SmoothStreaming module -Provides support for SmoothStreaming content. +Provides support for SmoothStreaming content in ExoPlayer. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md Adding a dependency to this module is all that's required to enable playback of -SmoothStreaming `MediaItem`s added to an `ExoPlayer` or `SimpleExoPlayer` in -their default configurations. Internally, `DefaultMediaSourceFactory` will -automatically detect the presence of the module and convert SmoothStreaming -`MediaItem`s into `SsMediaSource` instances for playback. +SmoothStreaming media items added to `ExoPlayer` in its default configuration. +Internally, `DefaultMediaSourceFactory` will automatically detect the presence +of the module and convert a SmoothStreaming `MediaItem` into a `SsMediaSource` +for playback. Similarly, a `DownloadManager` in its default configuration will use `DefaultDownloaderFactory`, which will automatically detect the presence of diff --git a/library/ui/README.md b/library/ui/README.md index 21e13e1dc7..b41072427a 100644 --- a/library/ui/README.md +++ b/library/ui/README.md @@ -1,12 +1,27 @@ -# ExoPlayer UI library module +# UI module -Provides UI components and resources for use with ExoPlayer. +Provides UI components for media playback. + +## Getting the module + +The easiest way to use the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ui.*` - belong to this module. +* [Developer Guide][]. +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ui.*` belong to this module. [Developer Guide]: https://exoplayer.dev/ui-components.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html From 63844a58febb02d854e3ba9a7929f10303433732 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Oct 2021 12:29:26 +0100 Subject: [PATCH 304/441] Cast module cleanup PiperOrigin-RevId: 402259951 --- extensions/cast/README.md | 21 ++++++++++++------- .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../exoplayer2/ext/cast/CastUtils.java | 2 +- .../ext/cast/DefaultMediaItemConverter.java | 12 +++++------ 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/extensions/cast/README.md b/extensions/cast/README.md index 2a373d9bd1..880636f154 100644 --- a/extensions/cast/README.md +++ b/extensions/cast/README.md @@ -1,9 +1,7 @@ -# ExoPlayer Cast extension +# Cast module -## Description - -The cast extension is a [Player][] implementation that controls playback on a -Cast receiver app. +This module provides a [Player][] implementation that controls a Cast receiver +app. [Player]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/Player.html @@ -25,5 +23,14 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Using the module -Create a `CastPlayer` and use it to integrate Cast into your app using -ExoPlayer's common `Player` interface. +Create a `CastPlayer` and use it to control a Cast receiver app. Since +`CastPlayer` implements the `Player` interface, it can be passed to all media +components that accept a `Player`, including the UI components provided by the +UI module. + +## Links + +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.cast.*` belong to this + module. + +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 940eb28ba5..ce371c5666 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -1322,7 +1322,7 @@ public final class CastPlayer extends BasePlayer { currentWindowIndex = timeline.getIndexOfPeriod(currentItem.getItemId()); } if (currentWindowIndex == C.INDEX_UNSET) { - // The timeline is empty. Fall back to index 0, which is what ExoPlayer would do. + // The timeline is empty. Fall back to index 0. currentWindowIndex = 0; } return currentWindowIndex; diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java index 8ff4e37d43..3077077616 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java @@ -22,7 +22,7 @@ import com.google.android.gms.cast.CastStatusCodes; import com.google.android.gms.cast.MediaInfo; import com.google.android.gms.cast.MediaTrack; -/** Utility methods for ExoPlayer/Cast integration. */ +/** Utility methods for Cast integration. */ /* package */ final class CastUtils { /** The duration returned by {@link MediaInfo#getStreamDuration()} for live streams. */ diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java index 8612316452..da0045a2db 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java @@ -167,16 +167,16 @@ public final class DefaultMediaItemConverter implements MediaItemConverter { return null; } - JSONObject exoPlayerConfigJson = new JSONObject(); - exoPlayerConfigJson.put("withCredentials", false); - exoPlayerConfigJson.put("protectionSystem", drmScheme); + JSONObject playerConfigJson = new JSONObject(); + playerConfigJson.put("withCredentials", false); + playerConfigJson.put("protectionSystem", drmScheme); if (drmConfiguration.licenseUri != null) { - exoPlayerConfigJson.put("licenseUrl", drmConfiguration.licenseUri); + playerConfigJson.put("licenseUrl", drmConfiguration.licenseUri); } if (!drmConfiguration.licenseRequestHeaders.isEmpty()) { - exoPlayerConfigJson.put("headers", new JSONObject(drmConfiguration.licenseRequestHeaders)); + playerConfigJson.put("headers", new JSONObject(drmConfiguration.licenseRequestHeaders)); } - return exoPlayerConfigJson; + return playerConfigJson; } } From 69f269238955c901cd524fee5a6164e89ee952f7 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Oct 2021 13:16:11 +0100 Subject: [PATCH 305/441] Register modules with common PiperOrigin-RevId: 402267733 --- .../exoplayer2/ext/workmanager/WorkManagerScheduler.java | 5 +++++ .../java/com/google/android/exoplayer2/ExoPlayerImpl.java | 4 ++++ .../android/exoplayer2/extractor/DefaultExtractorInput.java | 5 +++++ .../google/android/exoplayer2/transformer/Transformer.java | 5 +++++ 4 files changed, 19 insertions(+) diff --git a/extensions/workmanager/src/main/java/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.java b/extensions/workmanager/src/main/java/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.java index ff9335ad84..1c593e5291 100644 --- a/extensions/workmanager/src/main/java/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.java +++ b/extensions/workmanager/src/main/java/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.java @@ -26,6 +26,7 @@ import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; import androidx.work.Worker; import androidx.work.WorkerParameters; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.scheduler.Requirements; import com.google.android.exoplayer2.scheduler.Scheduler; import com.google.android.exoplayer2.util.Assertions; @@ -35,6 +36,10 @@ import com.google.android.exoplayer2.util.Util; /** A {@link Scheduler} that uses {@link WorkManager}. */ public final class WorkManagerScheduler implements Scheduler { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.workmanager"); + } + private static final String TAG = "WorkManagerScheduler"; private static final String KEY_SERVICE_ACTION = "service_action"; private static final String KEY_SERVICE_PACKAGE = "service_package"; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index fbf79d766c..bb66139cd1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -63,6 +63,10 @@ import java.util.concurrent.CopyOnWriteArraySet; /** An {@link ExoPlayer} implementation. */ /* package */ final class ExoPlayerImpl extends BasePlayer { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.exoplayer"); + } + private static final String TAG = "ExoPlayerImpl"; /** diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java index e04307bad7..b54131ce55 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.min; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; @@ -29,6 +30,10 @@ import java.util.Arrays; /** An {@link ExtractorInput} that wraps a {@link DataReader}. */ public final class DefaultExtractorInput implements ExtractorInput { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.extractor"); + } + private static final int PEEK_MIN_FREE_SPACE_AFTER_RESIZE = 64 * 1024; private static final int PEEK_MAX_FREE_SPACE = 512 * 1024; private static final int SCRATCH_SPACE_SIZE = 4096; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 80c0a73846..370ff1e167 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -38,6 +38,7 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -83,6 +84,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @RequiresApi(18) public final class Transformer { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.transformer"); + } + /** A builder for {@link Transformer} instances. */ public static final class Builder { From 67f9f18d8d28949ad596a7e918e32863dc4df9c1 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Oct 2021 15:08:55 +0100 Subject: [PATCH 306/441] README updates for remaining ExoPlayer modules PiperOrigin-RevId: 402287125 --- extensions/ima/README.md | 17 ++++++++--------- extensions/workmanager/README.md | 11 +++++++++-- library/all/README.md | 6 +++--- library/core/README.md | 26 ++++++++++++++++++++++++-- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/extensions/ima/README.md b/extensions/ima/README.md index 873bc4b41a..335f4bf8c5 100644 --- a/extensions/ima/README.md +++ b/extensions/ima/README.md @@ -1,8 +1,8 @@ -# ExoPlayer IMA extension +# ExoPlayer IMA module -The IMA extension is an [AdsLoader][] implementation wrapping the -[Interactive Media Ads SDK for Android][IMA]. You can use it to insert ads -alongside content. +The ExoPlayer IMA module provides an [AdsLoader][] implementation wrapping the +[Interactive Media Ads SDK for Android][IMA]. You can use it to insert ads into +content played using ExoPlayer. [IMA]: https://developers.google.com/interactive-media-ads/docs/sdks/android/ [AdsLoader]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/source/ads/AdsLoader.html @@ -25,12 +25,11 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Using the module -To use the extension, follow the instructions on the +To use the module, follow the instructions on the [Ad insertion page](https://exoplayer.dev/ad-insertion.html#declarative-ad-support) of the developer guide. The `AdsLoaderProvider` passed to the player's `DefaultMediaSourceFactory` should return an `ImaAdsLoader`. Note that the IMA -extension only supports players which are accessed on the application's main -thread. +module only supports players that are accessed on the application's main thread. Resuming the player after entering the background requires some special handling when playing ads. The player and its media source are released on @@ -46,8 +45,8 @@ position before preparing the new player instance. Finally, it is important to call `ImaAdsLoader.release()` when playback has finished and will not be resumed. -You can try the IMA extension in the ExoPlayer demo app, which has test content -in the "IMA sample ad tags" section of the sample chooser. The demo app's +You can try the IMA module in the ExoPlayer demo app, which has test content in +the "IMA sample ad tags" section of the sample chooser. The demo app's `PlayerActivity` also shows how to persist the `ImaAdsLoader` instance and the player position when backgrounded during ad playback. diff --git a/extensions/workmanager/README.md b/extensions/workmanager/README.md index fcda0d89c3..d69b47cae4 100644 --- a/extensions/workmanager/README.md +++ b/extensions/workmanager/README.md @@ -1,6 +1,6 @@ -# ExoPlayer WorkManager extension +# ExoPlayer WorkManager module -This extension provides a Scheduler implementation which uses [WorkManager][]. +This module provides a `Scheduler` implementation that uses [WorkManager][]. [WorkManager]: https://developer.android.com/topic/libraries/architecture/workmanager.html @@ -19,3 +19,10 @@ Alternatively, you can clone this GitHub project and depend on the module locally. Instructions for doing this can be found in the [top level README][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Links + +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.workmanager.*` + belong to this module. + +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/all/README.md b/library/all/README.md index 57a142dfcf..0f54ee7310 100644 --- a/library/all/README.md +++ b/library/all/README.md @@ -1,8 +1,8 @@ # ExoPlayer full library -An empty module that depends on all of the other library modules. Depending on -the full library is equivalent to depending on all of the other library modules -individually. See the [top level README][] for more information. +An empty module that depends on all of the other ExoPlayer library modules. +Depending on the full library is equivalent to depending on all of the other +library modules individually. See the [top level README][] for more information. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md diff --git a/library/core/README.md b/library/core/README.md index 6275c98352..a8c13c9e70 100644 --- a/library/core/README.md +++ b/library/core/README.md @@ -1,6 +1,28 @@ -# ExoPlayer core library module +# ExoPlayer module -The core of the ExoPlayer library. +This module provides `ExoPlayer`, the `Player` implementation for local media +playback on Android. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Using the module + +The [developer guide](https://exoplayer.dev/hello-world.html) documents how to +get started. ## Links From b7d53fa4b22869fd30524727e953c2add3c12fdf Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Oct 2021 15:21:46 +0100 Subject: [PATCH 307/441] README updates for session and media2 PiperOrigin-RevId: 402290115 --- extensions/media2/README.md | 6 +++--- extensions/mediasession/README.md | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/media2/README.md b/extensions/media2/README.md index beffaaccb3..b1926e7a6d 100644 --- a/extensions/media2/README.md +++ b/extensions/media2/README.md @@ -1,7 +1,7 @@ -# ExoPlayer Media2 extension +# Media2 module -The Media2 extension provides builders for [SessionPlayer][] and [MediaSession.SessionCallback][] in -the [Media2 library][]. +The Media2 module provides builders for [SessionPlayer][] and +[MediaSession.SessionCallback][] in the [Media2 library][]. Compared to [MediaSessionConnector][] that uses [MediaSessionCompat][], this provides finer grained control for incoming calls, so you can selectively allow/reject commands per controller. diff --git a/extensions/mediasession/README.md b/extensions/mediasession/README.md index 506b63bb41..4438dcf1d3 100644 --- a/extensions/mediasession/README.md +++ b/extensions/mediasession/README.md @@ -1,9 +1,9 @@ -# ExoPlayer MediaSession extension +# MediaSession module -The MediaSession extension mediates between a Player (or ExoPlayer) instance -and a [MediaSession][]. It automatically retrieves and implements playback -actions and syncs the player state with the state of the media session. The -behaviour can be extended to support other playback and custom actions. +The MediaSession module mediates between a `Player` and a [MediaSession][]. It +automatically retrieves and implements playback actions and syncs the player +state with the state of the media session. The behaviour can be extended to +support other playback and custom actions. [MediaSession]: https://developer.android.com/reference/android/support/v4/media/session/MediaSessionCompat.html From 8a9dcadef3660cb22ab0e5d79dc4501280815681 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Oct 2021 15:29:36 +0100 Subject: [PATCH 308/441] README updates for misc modules PiperOrigin-RevId: 402292139 --- demos/cast/README.md | 10 +++++----- demos/main/README.md | 10 +++++----- demos/surface/README.md | 4 ++-- library/common/README.md | 6 +++--- library/extractor/README.md | 5 +++-- library/transformer/README.md | 29 +++++++++++++++++++++++++---- 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/demos/cast/README.md b/demos/cast/README.md index 84c4bae8d1..b636d2c2e0 100644 --- a/demos/cast/README.md +++ b/demos/cast/README.md @@ -1,7 +1,7 @@ -# Cast demo application +# Cast demo -This folder contains a demo application that showcases ExoPlayer integration -with Google Cast. +This app demonstrates integration with Google Cast, as well as switching between +Google Cast and local playback using ExoPlayer. -Please see the [demos README](../README.md) for instructions on how to build and -run this demo. +See the [demos README](../README.md) for instructions on how to build and run +this demo. diff --git a/demos/main/README.md b/demos/main/README.md index 0d9eb28cf9..91aa2742bf 100644 --- a/demos/main/README.md +++ b/demos/main/README.md @@ -1,8 +1,8 @@ # ExoPlayer main demo -This is the main ExoPlayer demo application. It uses ExoPlayer to play a number -of test streams. It can be used as a starting point or reference project when -developing other applications that make use of the ExoPlayer library. +This is the main ExoPlayer demo app. It uses ExoPlayer to play a number of test +streams. It can be used as a starting point or reference project when developing +other applications that make use of the ExoPlayer library. -Please see the [demos README](../README.md) for instructions on how to build and -run this demo. +See the [demos README](../README.md) for instructions on how to build and run +this demo. diff --git a/demos/surface/README.md b/demos/surface/README.md index 3febb23feb..496e1b4931 100644 --- a/demos/surface/README.md +++ b/demos/surface/README.md @@ -18,7 +18,7 @@ called, and because you can move output off-screen easily (`setOutputSurface` can't take a `null` surface, so the player has to use a `DummySurface`, which doesn't handle protected output on all devices). -Please see the [demos README](../README.md) for instructions on how to build and -run this demo. +See the [demos README](../README.md) for instructions on how to build and run +this demo. [SurfaceControl]: https://developer.android.com/reference/android/view/SurfaceControl diff --git a/library/common/README.md b/library/common/README.md index 9e78e273b6..f2f8e2cca9 100644 --- a/library/common/README.md +++ b/library/common/README.md @@ -1,10 +1,10 @@ -# ExoPlayer common library module +# Common module -Common code used by other ExoPlayer modules. +Provides common code and utilities used by other media modules. Application code +will not normally need to depend on this module directly. ## Links * [Javadoc][]: Note that this Javadoc is combined with that of other modules. [Javadoc]: https://exoplayer.dev/doc/reference/index.html - diff --git a/library/extractor/README.md b/library/extractor/README.md index fa2a23ee20..f7aaad1e4c 100644 --- a/library/extractor/README.md +++ b/library/extractor/README.md @@ -1,6 +1,7 @@ -# ExoPlayer extractor library module +# Extractor module -Provides media container extractors. +Provides media container extractors and related utilities. Application code will +not normally need to depend on this module directly. ## Links diff --git a/library/transformer/README.md b/library/transformer/README.md index 6cba7c60a7..0d7ba4f0d1 100644 --- a/library/transformer/README.md +++ b/library/transformer/README.md @@ -1,10 +1,31 @@ -# ExoPlayer transformer library module +# Transformer module -Provides support for transforming media files. +Provides functionality for transforming media files. + +## Getting the module + +The easiest way to get the module is to add it as a gradle dependency: + +```gradle +implementation 'com.google.android.exoplayer:exoplayer-transformer:2.X.X' +``` + +where `2.X.X` is the version, which must match the version of the other media +modules being used. + +Alternatively, you can clone this GitHub project and depend on the module +locally. Instructions for doing this can be found in the [top level README][]. + +[top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md + +## Using the module + +Use of the Transformer module is documented in the +[developer guide](https://exoplayer.dev/transforming-media.html). ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.transformer.*` - belong to this module. +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.transformer.*` belong to this + module. [Javadoc]: https://exoplayer.dev/doc/reference/index.html From a56af3d0e05f66fad5191413f371d2f4fa3d7f23 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 12 Oct 2021 12:00:13 +0100 Subject: [PATCH 309/441] SubtitleExtractor: mark the limit of the input buffer Before this change, the SubtitleExtractor did not mark the limit of the input buffer, thus the SubtitleDecoder attempted to decode more bytes. If the subtitle file had a new line at the end, this bug would make the SubtitleDecoder append an line break after the last subtitle. PiperOrigin-RevId: 402523039 --- .../com/google/android/exoplayer2/text/SubtitleExtractor.java | 1 + .../google/android/exoplayer2/text/SubtitleExtractorTest.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java index 3642ff177e..0336f23de1 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java @@ -212,6 +212,7 @@ public class SubtitleExtractor implements Extractor { } inputBuffer.ensureSpaceForWrite(bytesRead); inputBuffer.data.put(subtitleData.getData(), /* offset= */ 0, bytesRead); + inputBuffer.data.limit(bytesRead); subtitleDecoder.queueInputBuffer(inputBuffer); @Nullable SubtitleOutputBuffer outputBuffer = subtitleDecoder.dequeueOutputBuffer(); while (outputBuffer == null) { diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java index 8e09ef0662..2dfafd88d0 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/text/SubtitleExtractorTest.java @@ -44,7 +44,7 @@ public class SubtitleExtractorTest { + "This is the second subtitle.\n" + "\n" + "00:02.600 --> 00:04.567\n" - + "This is the third subtitle."; + + "This is the third subtitle.\n"; @Test public void extractor_outputsCues() throws Exception { From 4b3cbfd64fc2c78843d76201909db41e5e8d1d14 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 12 Oct 2021 12:22:15 +0100 Subject: [PATCH 310/441] End to end test for WebVTT sideloaded subtitles Enable subtitle output in the PlaybackOutput and disable the text renderer in the MkvPlaybackTest. Add WebvttPlaybackTest to test the output of side-loaded WebVTT subtitles. PiperOrigin-RevId: 402526588 --- .../exoplayer2/e2etest/MkvPlaybackTest.java | 15 + .../e2etest/WebvttPlaybackTest.java | 93 +++++ .../source/dash/e2etest/DashPlaybackTest.java | 3 + .../robolectric/PlaybackOutput.java | 11 +- .../assets/playbackdumps/webvtt/typical.dump | 375 ++++++++++++++++++ 5 files changed, 491 insertions(+), 6 deletions(-) create mode 100644 library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java create mode 100644 testdata/src/test/assets/playbackdumps/webvtt/typical.dump diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index 398d6c05d4..b5d242f52e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -19,6 +19,7 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.view.Surface; import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; @@ -29,6 +30,7 @@ import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.FakeClock; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.common.collect.ImmutableList; import org.junit.Rule; import org.junit.Test; @@ -65,6 +67,19 @@ public final class MkvPlaybackTest { new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); + // TODO(internal b/174661563): Remove the for-loop below to enable the text renderer when + // subtitle output is not flaky. + for (int textRendererIndex = 0; + textRendererIndex < player.getRendererCount(); + textRendererIndex++) { + if (player.getRendererType(textRendererIndex) == C.TRACK_TYPE_TEXT) { + player.setTrackSelectionParameters( + new DefaultTrackSelector.ParametersBuilder(applicationContext) + .setRendererDisabled(textRendererIndex, /* disabled= */ true) + .build()); + break; + } + } player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java new file mode 100644 index 0000000000..49b29f3c5c --- /dev/null +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WebvttPlaybackTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.e2etest; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.net.Uri; +import android.view.Surface; +import androidx.test.core.app.ApplicationProvider; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.robolectric.PlaybackOutput; +import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; +import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; +import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; +import com.google.android.exoplayer2.source.MediaSourceFactory; +import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; +import com.google.android.exoplayer2.testutil.DumpFileAsserts; +import com.google.android.exoplayer2.testutil.FakeClock; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableList; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.ParameterizedRobolectricTestRunner; + +/** End-to-end tests using side-loaded WebVTT subtitles. */ +@RunWith(ParameterizedRobolectricTestRunner.class) +public class WebvttPlaybackTest { + @ParameterizedRobolectricTestRunner.Parameters(name = "{0}") + public static ImmutableList mediaSamples() { + return ImmutableList.of("typical"); + } + + @ParameterizedRobolectricTestRunner.Parameter public String inputFile; + + @Rule + public ShadowMediaCodecConfig mediaCodecConfig = + ShadowMediaCodecConfig.forAllSupportedMimeTypes(); + + @Test + public void test() throws Exception { + Context applicationContext = ApplicationProvider.getApplicationContext(); + CapturingRenderersFactory capturingRenderersFactory = + new CapturingRenderersFactory(applicationContext); + MediaSourceFactory mediaSourceFactory = + new DefaultMediaSourceFactory(applicationContext) + .experimentalUseProgressiveMediaSourceForSubtitles(true); + ExoPlayer player = + new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) + .setClock(new FakeClock(/* isAutoAdvancing= */ true)) + .setMediaSourceFactory(mediaSourceFactory) + .build(); + player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); + PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri("asset:///media/mp4/preroll-5s.mp4") + .setSubtitleConfigurations( + ImmutableList.of( + new MediaItem.SubtitleConfiguration.Builder( + Uri.parse("asset:///media/webvtt/" + inputFile)) + .setMimeType(MimeTypes.TEXT_VTT) + .setLanguage("en") + .setSelectionFlags(C.SELECTION_FLAG_DEFAULT) + .build())) + .build(); + + player.setMediaItem(mediaItem); + player.prepare(); + player.play(); + TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); + player.release(); + + DumpFileAsserts.assertOutput( + applicationContext, playbackOutput, "playbackdumps/webvtt/" + inputFile + ".dump"); + } +} diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index 053fd707e4..a6f7cf5aec 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -33,6 +33,7 @@ import com.google.android.exoplayer2.testutil.CapturingRenderersFactory; import com.google.android.exoplayer2.testutil.DumpFileAsserts; import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,6 +48,8 @@ public final class DashPlaybackTest { // https://github.com/google/ExoPlayer/issues/7985 @Test + @Ignore( + "Disabled until subtitles are reliably asserted in robolectric tests [internal b/174661563].") public void webvttInMp4() throws Exception { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java index 3f9718fc98..000f9e627e 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/PlaybackOutput.java @@ -17,8 +17,8 @@ package com.google.android.exoplayer2.robolectric; import android.graphics.Bitmap; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable; import com.google.android.exoplayer2.metadata.emsg.EventMessage; @@ -55,8 +55,7 @@ public final class PlaybackOutput implements Dumper.Dumpable { private final List metadatas; private final List> subtitles; - private PlaybackOutput( - SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { + private PlaybackOutput(ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { this.capturingRenderersFactory = capturingRenderersFactory; metadatas = Collections.synchronizedList(new ArrayList<>()); @@ -73,7 +72,7 @@ public final class PlaybackOutput implements Dumper.Dumpable { @Override public void onCues(List cues) { - // TODO(internal b/174661563): Output subtitle data when it's not flaky. + subtitles.add(cues); } }); } @@ -85,13 +84,13 @@ public final class PlaybackOutput implements Dumper.Dumpable { *

                Must be called before playback to ensure metadata and text output is captured * correctly. * - * @param player The {@link SimpleExoPlayer} to capture metadata and text output from. + * @param player The {@link ExoPlayer} to capture metadata and text output from. * @param capturingRenderersFactory The {@link CapturingRenderersFactory} to capture audio and * video output from. * @return A new instance that can be used to dump the playback output. */ public static PlaybackOutput register( - SimpleExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { + ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory) { return new PlaybackOutput(player, capturingRenderersFactory); } diff --git a/testdata/src/test/assets/playbackdumps/webvtt/typical.dump b/testdata/src/test/assets/playbackdumps/webvtt/typical.dump new file mode 100644 index 0000000000..db4b4047c5 --- /dev/null +++ b/testdata/src/test/assets/playbackdumps/webvtt/typical.dump @@ -0,0 +1,375 @@ +MediaCodecAdapter (exotest.audio.aac): + buffers.length = 218 + buffers[0] = length 21, hash D57A2CCC + buffers[1] = length 4, hash EE9DF + buffers[2] = length 4, hash EE9DF + buffers[3] = length 4, hash EE9DF + buffers[4] = length 4, hash EE9DF + buffers[5] = length 4, hash EE9DF + buffers[6] = length 4, hash EE9DF + buffers[7] = length 4, hash EE9DF + buffers[8] = length 4, hash EE9DF + buffers[9] = length 4, hash EE9DF + buffers[10] = length 4, hash EE9DF + buffers[11] = length 4, hash EE9DF + buffers[12] = length 4, hash EE9DF + buffers[13] = length 4, hash EE9DF + buffers[14] = length 4, hash EE9DF + buffers[15] = length 4, hash EE9DF + buffers[16] = length 4, hash EE9DF + buffers[17] = length 4, hash EE9DF + buffers[18] = length 4, hash EE9DF + buffers[19] = length 4, hash EE9DF + buffers[20] = length 4, hash EE9DF + buffers[21] = length 4, hash EE9DF + buffers[22] = length 4, hash EE9DF + buffers[23] = length 4, hash EE9DF + buffers[24] = length 4, hash EE9DF + buffers[25] = length 4, hash EE9DF + buffers[26] = length 4, hash EE9DF + buffers[27] = length 4, hash EE9DF + buffers[28] = length 4, hash EE9DF + buffers[29] = length 4, hash EE9DF + buffers[30] = length 4, hash EE9DF + buffers[31] = length 4, hash EE9DF + buffers[32] = length 4, hash EE9DF + buffers[33] = length 4, hash EE9DF + buffers[34] = length 4, hash EE9DF + buffers[35] = length 4, hash EE9DF + buffers[36] = length 4, hash EE9DF + buffers[37] = length 4, hash EE9DF + buffers[38] = length 4, hash EE9DF + buffers[39] = length 4, hash EE9DF + buffers[40] = length 4, hash EE9DF + buffers[41] = length 4, hash EE9DF + buffers[42] = length 4, hash EE9DF + buffers[43] = length 4, hash EE9DF + buffers[44] = length 4, hash EE9DF + buffers[45] = length 4, hash EE9DF + buffers[46] = length 4, hash EE9DF + buffers[47] = length 4, hash EE9DF + buffers[48] = length 4, hash EE9DF + buffers[49] = length 4, hash EE9DF + buffers[50] = length 4, hash EE9DF + buffers[51] = length 4, hash EE9DF + buffers[52] = length 4, hash EE9DF + buffers[53] = length 4, hash EE9DF + buffers[54] = length 4, hash EE9DF + buffers[55] = length 4, hash EE9DF + buffers[56] = length 4, hash EE9DF + buffers[57] = length 4, hash EE9DF + buffers[58] = length 4, hash EE9DF + buffers[59] = length 4, hash EE9DF + buffers[60] = length 4, hash EE9DF + buffers[61] = length 4, hash EE9DF + buffers[62] = length 4, hash EE9DF + buffers[63] = length 4, hash EE9DF + buffers[64] = length 4, hash EE9DF + buffers[65] = length 4, hash EE9DF + buffers[66] = length 4, hash EE9DF + buffers[67] = length 4, hash EE9DF + buffers[68] = length 4, hash EE9DF + buffers[69] = length 4, hash EE9DF + buffers[70] = length 4, hash EE9DF + buffers[71] = length 4, hash EE9DF + buffers[72] = length 4, hash EE9DF + buffers[73] = length 4, hash EE9DF + buffers[74] = length 4, hash EE9DF + buffers[75] = length 4, hash EE9DF + buffers[76] = length 4, hash EE9DF + buffers[77] = length 4, hash EE9DF + buffers[78] = length 4, hash EE9DF + buffers[79] = length 4, hash EE9DF + buffers[80] = length 4, hash EE9DF + buffers[81] = length 4, hash EE9DF + buffers[82] = length 4, hash EE9DF + buffers[83] = length 4, hash EE9DF + buffers[84] = length 4, hash EE9DF + buffers[85] = length 4, hash EE9DF + buffers[86] = length 4, hash EE9DF + buffers[87] = length 4, hash EE9DF + buffers[88] = length 4, hash EE9DF + buffers[89] = length 4, hash EE9DF + buffers[90] = length 4, hash EE9DF + buffers[91] = length 4, hash EE9DF + buffers[92] = length 4, hash EE9DF + buffers[93] = length 4, hash EE9DF + buffers[94] = length 4, hash EE9DF + buffers[95] = length 4, hash EE9DF + buffers[96] = length 4, hash EE9DF + buffers[97] = length 4, hash EE9DF + buffers[98] = length 4, hash EE9DF + buffers[99] = length 4, hash EE9DF + buffers[100] = length 4, hash EE9DF + buffers[101] = length 4, hash EE9DF + buffers[102] = length 4, hash EE9DF + buffers[103] = length 4, hash EE9DF + buffers[104] = length 4, hash EE9DF + buffers[105] = length 4, hash EE9DF + buffers[106] = length 4, hash EE9DF + buffers[107] = length 4, hash EE9DF + buffers[108] = length 4, hash EE9DF + buffers[109] = length 4, hash EE9DF + buffers[110] = length 4, hash EE9DF + buffers[111] = length 4, hash EE9DF + buffers[112] = length 4, hash EE9DF + buffers[113] = length 4, hash EE9DF + buffers[114] = length 4, hash EE9DF + buffers[115] = length 4, hash EE9DF + buffers[116] = length 4, hash EE9DF + buffers[117] = length 4, hash EE9DF + buffers[118] = length 4, hash EE9DF + buffers[119] = length 4, hash EE9DF + buffers[120] = length 4, hash EE9DF + buffers[121] = length 4, hash EE9DF + buffers[122] = length 4, hash EE9DF + buffers[123] = length 4, hash EE9DF + buffers[124] = length 4, hash EE9DF + buffers[125] = length 4, hash EE9DF + buffers[126] = length 4, hash EE9DF + buffers[127] = length 4, hash EE9DF + buffers[128] = length 4, hash EE9DF + buffers[129] = length 4, hash EE9DF + buffers[130] = length 4, hash EE9DF + buffers[131] = length 4, hash EE9DF + buffers[132] = length 4, hash EE9DF + buffers[133] = length 4, hash EE9DF + buffers[134] = length 4, hash EE9DF + buffers[135] = length 4, hash EE9DF + buffers[136] = length 4, hash EE9DF + buffers[137] = length 4, hash EE9DF + buffers[138] = length 4, hash EE9DF + buffers[139] = length 4, hash EE9DF + buffers[140] = length 4, hash EE9DF + buffers[141] = length 4, hash EE9DF + buffers[142] = length 4, hash EE9DF + buffers[143] = length 4, hash EE9DF + buffers[144] = length 4, hash EE9DF + buffers[145] = length 4, hash EE9DF + buffers[146] = length 4, hash EE9DF + buffers[147] = length 4, hash EE9DF + buffers[148] = length 4, hash EE9DF + buffers[149] = length 4, hash EE9DF + buffers[150] = length 4, hash EE9DF + buffers[151] = length 4, hash EE9DF + buffers[152] = length 4, hash EE9DF + buffers[153] = length 4, hash EE9DF + buffers[154] = length 4, hash EE9DF + buffers[155] = length 4, hash EE9DF + buffers[156] = length 4, hash EE9DF + buffers[157] = length 4, hash EE9DF + buffers[158] = length 4, hash EE9DF + buffers[159] = length 4, hash EE9DF + buffers[160] = length 4, hash EE9DF + buffers[161] = length 4, hash EE9DF + buffers[162] = length 4, hash EE9DF + buffers[163] = length 4, hash EE9DF + buffers[164] = length 4, hash EE9DF + buffers[165] = length 4, hash EE9DF + buffers[166] = length 4, hash EE9DF + buffers[167] = length 4, hash EE9DF + buffers[168] = length 4, hash EE9DF + buffers[169] = length 4, hash EE9DF + buffers[170] = length 4, hash EE9DF + buffers[171] = length 4, hash EE9DF + buffers[172] = length 4, hash EE9DF + buffers[173] = length 4, hash EE9DF + buffers[174] = length 4, hash EE9DF + buffers[175] = length 4, hash EE9DF + buffers[176] = length 4, hash EE9DF + buffers[177] = length 4, hash EE9DF + buffers[178] = length 4, hash EE9DF + buffers[179] = length 4, hash EE9DF + buffers[180] = length 4, hash EE9DF + buffers[181] = length 4, hash EE9DF + buffers[182] = length 4, hash EE9DF + buffers[183] = length 4, hash EE9DF + buffers[184] = length 4, hash EE9DF + buffers[185] = length 4, hash EE9DF + buffers[186] = length 4, hash EE9DF + buffers[187] = length 4, hash EE9DF + buffers[188] = length 4, hash EE9DF + buffers[189] = length 4, hash EE9DF + buffers[190] = length 4, hash EE9DF + buffers[191] = length 4, hash EE9DF + buffers[192] = length 4, hash EE9DF + buffers[193] = length 4, hash EE9DF + buffers[194] = length 4, hash EE9DF + buffers[195] = length 4, hash EE9DF + buffers[196] = length 4, hash EE9DF + buffers[197] = length 4, hash EE9DF + buffers[198] = length 4, hash EE9DF + buffers[199] = length 4, hash EE9DF + buffers[200] = length 4, hash EE9DF + buffers[201] = length 4, hash EE9DF + buffers[202] = length 4, hash EE9DF + buffers[203] = length 4, hash EE9DF + buffers[204] = length 4, hash EE9DF + buffers[205] = length 4, hash EE9DF + buffers[206] = length 4, hash EE9DF + buffers[207] = length 4, hash EE9DF + buffers[208] = length 4, hash EE9DF + buffers[209] = length 4, hash EE9DF + buffers[210] = length 4, hash EE9DF + buffers[211] = length 4, hash EE9DF + buffers[212] = length 4, hash EE9DF + buffers[213] = length 4, hash EE9DF + buffers[214] = length 4, hash EE9DF + buffers[215] = length 4, hash EE9DF + buffers[216] = length 4, hash EE9DF + buffers[217] = length 0, hash 1 +MediaCodecAdapter (exotest.video.avc): + buffers.length = 126 + buffers[0] = length 5245, hash C090A41E + buffers[1] = length 63, hash 5141C80D + buffers[2] = length 22, hash A32E59A1 + buffers[3] = length 20, hash A09DEAB8 + buffers[4] = length 18, hash B64DA059 + buffers[5] = length 28, hash FC8EF2BB + buffers[6] = length 22, hash BF8A4A9F + buffers[7] = length 18, hash D163DF61 + buffers[8] = length 18, hash FD82E95 + buffers[9] = length 28, hash 44A16E72 + buffers[10] = length 22, hash 31C06057 + buffers[11] = length 18, hash DC93CC9D + buffers[12] = length 18, hash 1B081BD1 + buffers[13] = length 28, hash 2700AF + buffers[14] = length 22, hash 6D292D94 + buffers[15] = length 18, hash D646C05A + buffers[16] = length 18, hash 14BB0F8E + buffers[17] = length 28, hash 5DE2C2B + buffers[18] = length 22, hash 57E81CD0 + buffers[19] = length 18, hash E176AD96 + buffers[20] = length 18, hash 1FEAFCCA + buffers[21] = length 28, hash C163BE68 + buffers[22] = length 22, hash B0C92D0B + buffers[23] = length 18, hash 3B013BD2 + buffers[24] = length 18, hash 79758B06 + buffers[25] = length 28, hash F72EB1A3 + buffers[26] = length 22, hash 9B881C48 + buffers[27] = length 18, hash 4631290E + buffers[28] = length 18, hash 84A57842 + buffers[29] = length 28, hash E1FCF000 + buffers[30] = length 22, hash 359D2D82 + buffers[31] = length 18, hash 62DE0FC9 + buffers[32] = length 18, hash A1525EFD + buffers[33] = length 28, hash 5350E8FA + buffers[34] = length 22, hash EE2060DF + buffers[35] = length 18, hash 77D95125 + buffers[36] = length 18, hash B64DA059 + buffers[37] = length 28, hash ED67B37 + buffers[38] = length 22, hash 4701711B + buffers[39] = length 18, hash D163DF61 + buffers[40] = length 18, hash FD82E95 + buffers[41] = length 28, hash 44A16E72 + buffers[42] = length 22, hash 31C06057 + buffers[43] = length 18, hash DC93CC9D + buffers[44] = length 18, hash 1B081BD1 + buffers[45] = length 28, hash 2700AF + buffers[46] = length 22, hash 6D292D94 + buffers[47] = length 18, hash D646C05A + buffers[48] = length 18, hash 14BB0F8E + buffers[49] = length 28, hash 5DE2C2B + buffers[50] = length 22, hash 57E81CD0 + buffers[51] = length 18, hash E176AD96 + buffers[52] = length 18, hash 1FEAFCCA + buffers[53] = length 28, hash C163BE68 + buffers[54] = length 22, hash B0C92D0B + buffers[55] = length 18, hash 3B013BD2 + buffers[56] = length 18, hash 79758B06 + buffers[57] = length 28, hash F72EB1A3 + buffers[58] = length 22, hash 9B881C48 + buffers[59] = length 18, hash 4631290E + buffers[60] = length 18, hash 84A57842 + buffers[61] = length 28, hash E1FCF000 + buffers[62] = length 22, hash 359D2D82 + buffers[63] = length 18, hash 62DE0FC9 + buffers[64] = length 18, hash A1525EFD + buffers[65] = length 28, hash 5350E8FA + buffers[66] = length 22, hash EE2060DF + buffers[67] = length 18, hash 77D95125 + buffers[68] = length 18, hash B64DA059 + buffers[69] = length 28, hash ED67B37 + buffers[70] = length 22, hash 4701711B + buffers[71] = length 18, hash D163DF61 + buffers[72] = length 18, hash FD82E95 + buffers[73] = length 28, hash 44A16E72 + buffers[74] = length 22, hash 31C06057 + buffers[75] = length 18, hash DC93CC9D + buffers[76] = length 18, hash 1B081BD1 + buffers[77] = length 28, hash 2700AF + buffers[78] = length 22, hash 6D292D94 + buffers[79] = length 18, hash D646C05A + buffers[80] = length 18, hash 14BB0F8E + buffers[81] = length 28, hash 5DE2C2B + buffers[82] = length 22, hash 57E81CD0 + buffers[83] = length 18, hash E176AD96 + buffers[84] = length 18, hash 1FEAFCCA + buffers[85] = length 28, hash C163BE68 + buffers[86] = length 22, hash B0C92D0B + buffers[87] = length 18, hash 3B013BD2 + buffers[88] = length 18, hash 79758B06 + buffers[89] = length 28, hash F72EB1A3 + buffers[90] = length 22, hash 9B881C48 + buffers[91] = length 18, hash 4631290E + buffers[92] = length 18, hash 84A57842 + buffers[93] = length 33, hash AF5CF49E + buffers[94] = length 22, hash 359D2D82 + buffers[95] = length 18, hash 62DE0FC9 + buffers[96] = length 18, hash A1525EFD + buffers[97] = length 33, hash F4C6DE46 + buffers[98] = length 22, hash EE2060DF + buffers[99] = length 18, hash 77D95125 + buffers[100] = length 18, hash B64DA059 + buffers[101] = length 28, hash ED67B37 + buffers[102] = length 22, hash 4701711B + buffers[103] = length 18, hash D163DF61 + buffers[104] = length 18, hash FD82E95 + buffers[105] = length 28, hash 44A16E72 + buffers[106] = length 22, hash 31C06057 + buffers[107] = length 18, hash DC93CC9D + buffers[108] = length 18, hash 1B081BD1 + buffers[109] = length 28, hash 2700AF + buffers[110] = length 22, hash 6D292D94 + buffers[111] = length 18, hash D646C05A + buffers[112] = length 18, hash 14BB0F8E + buffers[113] = length 27, hash 5292D9E + buffers[114] = length 22, hash 57E81CD0 + buffers[115] = length 18, hash E176AD96 + buffers[116] = length 18, hash 1FEAFCCA + buffers[117] = length 26, hash B0CAA4C9 + buffers[118] = length 22, hash B0C92D0B + buffers[119] = length 18, hash 3B013BD2 + buffers[120] = length 18, hash 79758B06 + buffers[121] = length 26, hash C63A1445 + buffers[122] = length 22, hash 9B881C48 + buffers[123] = length 18, hash 4631290E + buffers[124] = length 18, hash 84A57842 + buffers[125] = length 0, hash 1 +TextOutput: + Subtitle[0]: + Cues = [] + Subtitle[1]: + Cue[0]: + text = This is the first subtitle. + textAlignment = ALIGN_CENTER + line = -1.0 + lineType = 1 + lineAnchor = 0 + position = 0.5 + positionAnchor = 1 + size = 1.0 + Subtitle[2]: + Cues = [] + Subtitle[3]: + Cue[0]: + text = This is the second subtitle. + textAlignment = ALIGN_CENTER + line = -1.0 + lineType = 1 + lineAnchor = 0 + position = 0.5 + positionAnchor = 1 + size = 1.0 + Subtitle[4]: + Cues = [] From eeec2b2e77e48e18a362e1fb123d6f273c44d89c Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 12 Oct 2021 14:34:55 +0100 Subject: [PATCH 311/441] Final README updates PiperOrigin-RevId: 402547071 --- extensions/av1/README.md | 54 ++++++++++++++++++----------------- extensions/ffmpeg/README.md | 56 +++++++++++++++++++------------------ extensions/flac/README.md | 51 ++++++++++++++++----------------- extensions/opus/README.md | 49 ++++++++++++++++---------------- extensions/vp9/README.md | 52 +++++++++++++++++----------------- playbacktests/README.md | 3 ++ robolectricutils/README.md | 6 ++-- testdata/README.md | 5 ++-- testutils/README.md | 6 ++-- 9 files changed, 145 insertions(+), 137 deletions(-) create mode 100644 playbacktests/README.md diff --git a/extensions/av1/README.md b/extensions/av1/README.md index 983931b937..f9bef64791 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -1,12 +1,12 @@ -# ExoPlayer AV1 extension +# ExoPlayer AV1 module -The AV1 extension provides `Libgav1VideoRenderer`, which uses libgav1 native +The AV1 module provides `Libgav1VideoRenderer`, which uses libgav1 native library to decode AV1 videos. ## License note Please note that whilst the code in this repository is licensed under -[Apache 2.0][], using this extension also requires building and including one or +[Apache 2.0][], using this module also requires building and including one or more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE @@ -51,9 +51,9 @@ git clone https://github.com/abseil/abseil-cpp.git third_party/abseil-cpp * [Install CMake][]. -Having followed these steps, gradle will build the extension automatically when -run on the command line or via Android Studio, using [CMake][] and [Ninja][] -to configure and build libgav1 and the extension's [JNI wrapper library][]. +Having followed these steps, gradle will build the module automatically when run +on the command line or via Android Studio, using [CMake][] and [Ninja][] to +configure and build libgav1 and the module's [JNI wrapper library][]. [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md [Install CMake]: https://developer.android.com/studio/projects/install-ndk @@ -63,33 +63,35 @@ to configure and build libgav1 and the extension's [JNI wrapper library][]. ## Build instructions (Windows) -We do not provide support for building this extension on Windows, however it -should be possible to follow the Linux instructions in [Windows PowerShell][]. +We do not provide support for building this module on Windows, however it should +be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell ## Using the module Once you've followed the instructions above to check out, build and depend on -the extension, the next step is to tell ExoPlayer to use `Libgav1VideoRenderer`. +the module, the next step is to tell ExoPlayer to use `Libgav1VideoRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can - enable using the extension by setting the `extensionRendererMode` parameter of - the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. - This will use `Libgav1VideoRenderer` for playback if `MediaCodecVideoRenderer` - doesn't support decoding the input AV1 stream. Pass - `EXTENSION_RENDERER_MODE_PREFER` to give `Libgav1VideoRenderer` priority over - `MediaCodecVideoRenderer`. -* If you've subclassed `DefaultRenderersFactory`, add a `Libvgav1VideoRenderer` - to the output list in `buildVideoRenderers`. ExoPlayer will use the first - `Renderer` in the list that supports the input media format. -* If you've implemented your own `RenderersFactory`, return a - `Libgav1VideoRenderer` instance from `createRenderers`. ExoPlayer will use the - first `Renderer` in the returned array that supports the input media format. -* If you're using `ExoPlayer.Builder`, pass a `Libgav1VideoRenderer` in the - array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list that - supports the input media format. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you + can enable using the module by setting the `extensionRendererMode` parameter + of the `DefaultRenderersFactory` constructor to + `EXTENSION_RENDERER_MODE_ON`. This will use `Libgav1VideoRenderer` for + playback if `MediaCodecVideoRenderer` doesn't support decoding the input AV1 + stream. Pass `EXTENSION_RENDERER_MODE_PREFER` to give `Libgav1VideoRenderer` + priority over `MediaCodecVideoRenderer`. +* If you've subclassed `DefaultRenderersFactory`, add a + `Libvgav1VideoRenderer` to the output list in `buildVideoRenderers`. + ExoPlayer will use the first `Renderer` in the list that supports the input + media format. +* If you've implemented your own `RenderersFactory`, return a + `Libgav1VideoRenderer` instance from `createRenderers`. ExoPlayer will use + the first `Renderer` in the returned array that supports the input media + format. +* If you're using `ExoPlayer.Builder`, pass a `Libgav1VideoRenderer` in the + array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list + that supports the input media format. Note: These instructions assume you're using `DefaultTrackSelector`. If you have a custom track selector the choice of `Renderer` is up to your implementation. @@ -98,7 +100,7 @@ then you need to implement your own logic to use the renderer for a given track. ## Using the module in the demo application -To try out playback using the extension in the [demo application][], see +To try out playback using the module in the [demo application][], see [enabling extension decoders][]. [demo application]: https://exoplayer.dev/demo-application.html diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index 2587657fae..d54c94944f 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -1,12 +1,12 @@ -# ExoPlayer FFmpeg extension +# ExoPlayer FFmpeg module -The FFmpeg extension provides `FfmpegAudioRenderer`, which uses FFmpeg for -decoding and can render audio encoded in a variety of formats. +The FFmpeg module provides `FfmpegAudioRenderer`, which uses FFmpeg for decoding +and can render audio encoded in a variety of formats. ## License note Please note that whilst the code in this repository is licensed under -[Apache 2.0][], using this extension also requires building and including one or +[Apache 2.0][], using this module also requires building and including one or more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE @@ -15,8 +15,8 @@ more external libraries as described below. These are licensed separately. To use the module you need to clone this GitHub project and depend on its modules locally. Instructions for doing this can be found in the -[top level README][]. The extension is not provided via Google's Maven -repository (see [#2781][] for more information). +[top level README][]. The module is not provided via Google's Maven repository +(see [#2781][] for more information). In addition, it's necessary to manually build the FFmpeg library, so that gradle can bundle the FFmpeg binaries in the APK: @@ -60,7 +60,7 @@ FFMPEG_PATH="$(pwd)" ENABLED_DECODERS=(vorbis opus flac) ``` -* Add a link to the FFmpeg source code in the FFmpeg extension `jni` directory. +* Add a link to the FFmpeg source code in the FFmpeg module `jni` directory. ``` cd "${FFMPEG_EXT_PATH}/jni" && \ @@ -79,32 +79,34 @@ cd "${FFMPEG_EXT_PATH}/jni" && \ ## Build instructions (Windows) -We do not provide support for building this extension on Windows, however it -should be possible to follow the Linux instructions in [Windows PowerShell][]. +We do not provide support for building this module on Windows, however it should +be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell ## Using the module Once you've followed the instructions above to check out, build and depend on -the extension, the next step is to tell ExoPlayer to use `FfmpegAudioRenderer`. -How you do this depends on which player API you're using: +the module, the next step is to tell ExoPlayer to use `FfmpegAudioRenderer`. How +you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can - enable using the extension by setting the `extensionRendererMode` parameter of - the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. - This will use `FfmpegAudioRenderer` for playback if `MediaCodecAudioRenderer` - doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to - give `FfmpegAudioRenderer` priority over `MediaCodecAudioRenderer`. -* If you've subclassed `DefaultRenderersFactory`, add an `FfmpegAudioRenderer` - to the output list in `buildAudioRenderers`. ExoPlayer will use the first - `Renderer` in the list that supports the input media format. -* If you've implemented your own `RenderersFactory`, return an - `FfmpegAudioRenderer` instance from `createRenderers`. ExoPlayer will use the - first `Renderer` in the returned array that supports the input media format. -* If you're using `ExoPlayer.Builder`, pass an `FfmpegAudioRenderer` in the - array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list that - supports the input media format. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you + can enable using the module by setting the `extensionRendererMode` parameter + of the `DefaultRenderersFactory` constructor to + `EXTENSION_RENDERER_MODE_ON`. This will use `FfmpegAudioRenderer` for + playback if `MediaCodecAudioRenderer` doesn't support the input format. Pass + `EXTENSION_RENDERER_MODE_PREFER` to give `FfmpegAudioRenderer` priority over + `MediaCodecAudioRenderer`. +* If you've subclassed `DefaultRenderersFactory`, add an `FfmpegAudioRenderer` + to the output list in `buildAudioRenderers`. ExoPlayer will use the first + `Renderer` in the list that supports the input media format. +* If you've implemented your own `RenderersFactory`, return an + `FfmpegAudioRenderer` instance from `createRenderers`. ExoPlayer will use + the first `Renderer` in the returned array that supports the input media + format. +* If you're using `ExoPlayer.Builder`, pass an `FfmpegAudioRenderer` in the + array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list + that supports the input media format. Note: These instructions assume you're using `DefaultTrackSelector`. If you have a custom track selector the choice of `Renderer` is up to your implementation, @@ -118,7 +120,7 @@ then implement your own logic to use the renderer for a given track. ## Using the module in the demo application -To try out playback using the extension in the [demo application][], see +To try out playback using the module in the [demo application][], see [enabling extension decoders][]. [demo application]: https://exoplayer.dev/demo-application.html diff --git a/extensions/flac/README.md b/extensions/flac/README.md index e8324c034e..d7b6e7bc00 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -1,12 +1,12 @@ -# ExoPlayer Flac extension +# ExoPlayer Flac module -The Flac extension provides `FlacExtractor` and `LibflacAudioRenderer`, which -use libFLAC (the Flac decoding library) to extract and decode FLAC audio. +The Flac module provides `FlacExtractor` and `LibflacAudioRenderer`, which use +libFLAC (the Flac decoding library) to extract and decode FLAC audio. ## License note Please note that whilst the code in this repository is licensed under -[Apache 2.0][], using this extension also requires building and including one or +[Apache 2.0][], using this module also requires building and including one or more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE @@ -17,8 +17,7 @@ To use the module you need to clone this GitHub project and depend on its modules locally. Instructions for doing this can be found in the [top level README][]. -In addition, it's necessary to build the extension's native components as -follows: +In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: @@ -55,15 +54,15 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ## Build instructions (Windows) -We do not provide support for building this extension on Windows, however it -should be possible to follow the Linux instructions in [Windows PowerShell][]. +We do not provide support for building this module on Windows, however it should +be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell ## Using the module Once you've followed the instructions above to check out, build and depend on -the extension, the next step is to tell ExoPlayer to use the extractor and/or +the module, the next step is to tell ExoPlayer to use the extractor and/or renderer. ### Using `FlacExtractor` @@ -75,21 +74,23 @@ renderer. ### Using `LibflacAudioRenderer` -* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can - enable using the extension by setting the `extensionRendererMode` parameter of - the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. - This will use `LibflacAudioRenderer` for playback if `MediaCodecAudioRenderer` - doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to - give `LibflacAudioRenderer` priority over `MediaCodecAudioRenderer`. -* If you've subclassed `DefaultRenderersFactory`, add a `LibflacAudioRenderer` - to the output list in `buildAudioRenderers`. ExoPlayer will use the first - `Renderer` in the list that supports the input media format. -* If you've implemented your own `RenderersFactory`, return a - `LibflacAudioRenderer` instance from `createRenderers`. ExoPlayer will use the - first `Renderer` in the returned array that supports the input media format. -* If you're using `ExoPlayer.Builder`, pass a `LibflacAudioRenderer` in the - array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list that - supports the input media format. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you + can enable using the module by setting the `extensionRendererMode` parameter + of the `DefaultRenderersFactory` constructor to + `EXTENSION_RENDERER_MODE_ON`. This will use `LibflacAudioRenderer` for + playback if `MediaCodecAudioRenderer` doesn't support the input format. Pass + `EXTENSION_RENDERER_MODE_PREFER` to give `LibflacAudioRenderer` priority + over `MediaCodecAudioRenderer`. +* If you've subclassed `DefaultRenderersFactory`, add a `LibflacAudioRenderer` + to the output list in `buildAudioRenderers`. ExoPlayer will use the first + `Renderer` in the list that supports the input media format. +* If you've implemented your own `RenderersFactory`, return a + `LibflacAudioRenderer` instance from `createRenderers`. ExoPlayer will use + the first `Renderer` in the returned array that supports the input media + format. +* If you're using `ExoPlayer.Builder`, pass a `LibflacAudioRenderer` in the + array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list + that supports the input media format. Note: These instructions assume you're using `DefaultTrackSelector`. If you have a custom track selector the choice of `Renderer` is up to your implementation, @@ -98,7 +99,7 @@ player, then implement your own logic to use the renderer for a given track. ## Using the module in the demo application -To try out playback using the extension in the [demo application][], see +To try out playback using the module in the [demo application][], see [enabling extension decoders][]. [demo application]: https://exoplayer.dev/demo-application.html diff --git a/extensions/opus/README.md b/extensions/opus/README.md index bf4f953cbd..f4a77d924d 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -1,12 +1,12 @@ -# ExoPlayer Opus extension +# ExoPlayer Opus module -The Opus extension provides `LibopusAudioRenderer`, which uses libopus (the Opus +The Opus module provides `LibopusAudioRenderer`, which uses libopus (the Opus decoding library) to decode Opus audio. ## License note Please note that whilst the code in this repository is licensed under -[Apache 2.0][], using this extension also requires building and including one or +[Apache 2.0][], using this module also requires building and including one or more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE @@ -17,8 +17,7 @@ To use the module you need to clone this GitHub project and depend on its modules locally. Instructions for doing this can be found in the [top level README][]. -In addition, it's necessary to build the extension's native components as -follows: +In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: @@ -60,8 +59,8 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ## Build instructions (Windows) -We do not provide support for building this extension on Windows, however it -should be possible to follow the Linux instructions in [Windows PowerShell][]. +We do not provide support for building this module on Windows, however it should +be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell @@ -76,24 +75,26 @@ should be possible to follow the Linux instructions in [Windows PowerShell][]. ## Using the module Once you've followed the instructions above to check out, build and depend on -the extension, the next step is to tell ExoPlayer to use `LibopusAudioRenderer`. +the module, the next step is to tell ExoPlayer to use `LibopusAudioRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can - enable using the extension by setting the `extensionRendererMode` parameter of - the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. - This will use `LibopusAudioRenderer` for playback if `MediaCodecAudioRenderer` - doesn't support the input format. Pass `EXTENSION_RENDERER_MODE_PREFER` to - give `LibopusAudioRenderer` priority over `MediaCodecAudioRenderer`. -* If you've subclassed `DefaultRenderersFactory`, add a `LibopusAudioRenderer` - to the output list in `buildAudioRenderers`. ExoPlayer will use the first - `Renderer` in the list that supports the input media format. -* If you've implemented your own `RenderersFactory`, return a - `LibopusAudioRenderer` instance from `createRenderers`. ExoPlayer will use the - first `Renderer` in the returned array that supports the input media format. -* If you're using `ExoPlayer.Builder`, pass a `LibopusAudioRenderer` in the - array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list that - supports the input media format. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you + can enable using the module by setting the `extensionRendererMode` parameter + of the `DefaultRenderersFactory` constructor to + `EXTENSION_RENDERER_MODE_ON`. This will use `LibopusAudioRenderer` for + playback if `MediaCodecAudioRenderer` doesn't support the input format. Pass + `EXTENSION_RENDERER_MODE_PREFER` to give `LibopusAudioRenderer` priority + over `MediaCodecAudioRenderer`. +* If you've subclassed `DefaultRenderersFactory`, add a `LibopusAudioRenderer` + to the output list in `buildAudioRenderers`. ExoPlayer will use the first + `Renderer` in the list that supports the input media format. +* If you've implemented your own `RenderersFactory`, return a + `LibopusAudioRenderer` instance from `createRenderers`. ExoPlayer will use + the first `Renderer` in the returned array that supports the input media + format. +* If you're using `ExoPlayer.Builder`, pass a `LibopusAudioRenderer` in the + array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list + that supports the input media format. Note: These instructions assume you're using `DefaultTrackSelector`. If you have a custom track selector the choice of `Renderer` is up to your implementation, @@ -102,7 +103,7 @@ player, then implement your own logic to use the renderer for a given track. ## Using the module in the demo application -To try out playback using the extension in the [demo application][], see +To try out playback using the module in the [demo application][], see [enabling extension decoders][]. [demo application]: https://exoplayer.dev/demo-application.html diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index 68a2f2381e..e961435263 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -1,12 +1,12 @@ -# ExoPlayer VP9 extension +# ExoPlayer VP9 module -The VP9 extension provides `LibvpxVideoRenderer`, which uses libvpx (the VPx +The VP9 module provides `LibvpxVideoRenderer`, which uses libvpx (the VPx decoding library) to decode VP9 video. ## License note Please note that whilst the code in this repository is licensed under -[Apache 2.0][], using this extension also requires building and including one or +[Apache 2.0][], using this module also requires building and including one or more external libraries as described below. These are licensed separately. [Apache 2.0]: https://github.com/google/ExoPlayer/blob/release-v2/LICENSE @@ -17,8 +17,7 @@ To use the module you need to clone this GitHub project and depend on its modules locally. Instructions for doing this can be found in the [top level README][]. -In addition, it's necessary to build the extension's native components as -follows: +In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: @@ -46,8 +45,8 @@ git checkout tags/v1.8.0 -b v1.8.0 && \ LIBVPX_PATH="$(pwd)" ``` -* Add a link to the libvpx source code in the vp9 extension `jni` directory and - run a script that generates necessary configuration files for libvpx: +* Add a link to the libvpx source code in the vp9 module `jni` directory and + run a script that generates necessary configuration files for libvpx: ``` cd ${VP9_EXT_PATH}/jni && \ @@ -67,8 +66,8 @@ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ## Build instructions (Windows) -We do not provide support for building this extension on Windows, however it -should be possible to follow the Linux instructions in [Windows PowerShell][]. +We do not provide support for building this module on Windows, however it should +be possible to follow the Linux instructions in [Windows PowerShell][]. [Windows PowerShell]: https://docs.microsoft.com/en-us/powershell/scripting/getting-started/getting-started-with-windows-powershell @@ -89,22 +88,23 @@ Once you've followed the instructions above to check out, build and depend on the extension, the next step is to tell ExoPlayer to use `LibvpxVideoRenderer`. How you do this depends on which player API you're using: -* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you can - enable using the extension by setting the `extensionRendererMode` parameter of - the `DefaultRenderersFactory` constructor to `EXTENSION_RENDERER_MODE_ON`. - This will use `LibvpxVideoRenderer` for playback if `MediaCodecVideoRenderer` - doesn't support decoding the input VP9 stream. Pass - `EXTENSION_RENDERER_MODE_PREFER` to give `LibvpxVideoRenderer` priority over - `MediaCodecVideoRenderer`. -* If you've subclassed `DefaultRenderersFactory`, add a `LibvpxVideoRenderer` - to the output list in `buildVideoRenderers`. ExoPlayer will use the first - `Renderer` in the list that supports the input media format. -* If you've implemented your own `RenderersFactory`, return a - `LibvpxVideoRenderer` instance from `createRenderers`. ExoPlayer will use the - first `Renderer` in the returned array that supports the input media format. -* If you're using `ExoPlayer.Builder`, pass a `LibvpxVideoRenderer` in the array - of `Renderer`s. ExoPlayer will use the first `Renderer` in the list that - supports the input media format. +* If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you + can enable using the module by setting the `extensionRendererMode` parameter + of the `DefaultRenderersFactory` constructor to + `EXTENSION_RENDERER_MODE_ON`. This will use `LibvpxVideoRenderer` for + playback if `MediaCodecVideoRenderer` doesn't support decoding the input VP9 + stream. Pass `EXTENSION_RENDERER_MODE_PREFER` to give `LibvpxVideoRenderer` + priority over `MediaCodecVideoRenderer`. +* If you've subclassed `DefaultRenderersFactory`, add a `LibvpxVideoRenderer` + to the output list in `buildVideoRenderers`. ExoPlayer will use the first + `Renderer` in the list that supports the input media format. +* If you've implemented your own `RenderersFactory`, return a + `LibvpxVideoRenderer` instance from `createRenderers`. ExoPlayer will use + the first `Renderer` in the returned array that supports the input media + format. +* If you're using `ExoPlayer.Builder`, pass a `LibvpxVideoRenderer` in the + array of `Renderer`s. ExoPlayer will use the first `Renderer` in the list + that supports the input media format. Note: These instructions assume you're using `DefaultTrackSelector`. If you have a custom track selector the choice of `Renderer` is up to your implementation, @@ -113,7 +113,7 @@ player, then implement your own logic to use the renderer for a given track. ## Using the module in the demo application -To try out playback using the extension in the [demo application][], see +To try out playback using the module in the [demo application][], see [enabling extension decoders][]. [demo application]: https://exoplayer.dev/demo-application.html diff --git a/playbacktests/README.md b/playbacktests/README.md new file mode 100644 index 0000000000..2e0c4799a8 --- /dev/null +++ b/playbacktests/README.md @@ -0,0 +1,3 @@ +# ExoPlayer playback test module + +Tests playback using ExoPlayer. diff --git a/robolectricutils/README.md b/robolectricutils/README.md index 430a907c2d..84f9139c5c 100644 --- a/robolectricutils/README.md +++ b/robolectricutils/README.md @@ -1,10 +1,10 @@ -# ExoPlayer Robolectric utils +# Robolectric test utils module -Provides test infrastructure for ExoPlayer Robolectric-based tests. +Provides test infrastructure for Robolectric-based media tests. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.robolectric` +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.robolectric.*` belong to this module. [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/testdata/README.md b/testdata/README.md index 6ca8a8577e..de1ead4b24 100644 --- a/testdata/README.md +++ b/testdata/README.md @@ -1,4 +1,3 @@ -# ExoPlayer test data - -Provides sample data for ExoPlayer unit and instrumentation tests. +# Test data module +Provides sample data for media unit and instrumentation tests. diff --git a/testutils/README.md b/testutils/README.md index 3089e566e4..9f7f924261 100644 --- a/testutils/README.md +++ b/testutils/README.md @@ -1,10 +1,10 @@ -# ExoPlayer test utils +# Test utils module -Provides utility classes for ExoPlayer unit and instrumentation tests. +Provides utility classes for media unit and instrumentation tests. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.testutil` belong to this +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.testutil.*` belong to this module. [Javadoc]: https://exoplayer.dev/doc/reference/index.html From 86162c69b78a2ee1a6274f97e69145b2085388ef Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 12 Oct 2021 14:39:33 +0100 Subject: [PATCH 312/441] Final README updates - Fix missing update PiperOrigin-RevId: 402548081 --- extensions/vp9/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index e961435263..d352a349c1 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -85,7 +85,7 @@ be possible to follow the Linux instructions in [Windows PowerShell][]. ## Using the module Once you've followed the instructions above to check out, build and depend on -the extension, the next step is to tell ExoPlayer to use `LibvpxVideoRenderer`. +the module, the next step is to tell ExoPlayer to use `LibvpxVideoRenderer`. How you do this depends on which player API you're using: * If you're passing a `DefaultRenderersFactory` to `ExoPlayer.Builder`, you From a18e2812755e848ae906d01c3c0ad36631c254f2 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 12 Oct 2021 17:31:28 +0100 Subject: [PATCH 313/441] SubtitleExtractor: optimize calls to ExtractorInput.read() When ExtractorInput.getLength() returns a defined length, the SubtitleExtractor will create a buffer of the same length, call ExtractorInput.read() until it has read the input bytes, plus one more time where ExtractorInput.read() returns RESULT_END_OF_INPUT. The last call to ExtractorInput.read() however will make the SubtitleExtractor to increase its buffer (including a copy) unnecessarily. This change makes the SubtitleExtractor avoid calling ExtractorInput.read() if the expected number of bytes have already been read, so that the internal buffer does not grow. PiperOrigin-RevId: 402583610 --- .../com/google/android/exoplayer2/text/SubtitleExtractor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java index 0336f23de1..be3a582a3d 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleExtractor.java @@ -199,7 +199,9 @@ public class SubtitleExtractor implements Extractor { if (readResult != C.RESULT_END_OF_INPUT) { bytesRead += readResult; } - return readResult == C.RESULT_END_OF_INPUT; + long inputLength = input.getLength(); + return (inputLength != C.LENGTH_UNSET && bytesRead == inputLength) + || readResult == C.RESULT_END_OF_INPUT; } /** Decodes the subtitle data and stores the samples in the memory of the extractor. */ From 11becc050acce102c903987add1d7685e854dd7f Mon Sep 17 00:00:00 2001 From: jaewan Date: Wed, 13 Oct 2021 08:53:46 +0100 Subject: [PATCH 314/441] Separate command code for prepare() and stop() PiperOrigin-RevId: 402757305 --- .../exoplayer2/ext/cast/CastPlayer.java | 3 +- .../exoplayer2/ext/cast/CastPlayerTest.java | 6 +- .../com/google/android/exoplayer2/Player.java | 68 ++++++++++--------- .../android/exoplayer2/ExoPlayerImpl.java | 3 +- .../android/exoplayer2/ExoPlayerTest.java | 9 ++- .../source/rtsp/reader/RtpPayloadReader.java | 3 +- 6 files changed, 51 insertions(+), 41 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index ce371c5666..5e0f497e0c 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -94,7 +94,8 @@ public final class CastPlayer extends BasePlayer { new Commands.Builder() .addAll( COMMAND_PLAY_PAUSE, - COMMAND_PREPARE_STOP, + COMMAND_PREPARE, + COMMAND_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SET_REPEAT_MODE, diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java index 30d227bb5b..516a6fdde4 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastPlayerTest.java @@ -25,7 +25,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_GET_TEXT; import static com.google.android.exoplayer2.Player.COMMAND_GET_TIMELINE; import static com.google.android.exoplayer2.Player.COMMAND_GET_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; -import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP; +import static com.google.android.exoplayer2.Player.COMMAND_PREPARE; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; @@ -42,6 +42,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SET_SHUFFLE_MODE; import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH; import static com.google.android.exoplayer2.Player.COMMAND_SET_VIDEO_SURFACE; import static com.google.android.exoplayer2.Player.COMMAND_SET_VOLUME; +import static com.google.android.exoplayer2.Player.COMMAND_STOP; import static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_REMOVE; import static com.google.android.exoplayer2.Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED; import static com.google.common.truth.Truth.assertThat; @@ -1315,7 +1316,8 @@ public class CastPlayerTest { updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */ 1); assertThat(castPlayer.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); - assertThat(castPlayer.isCommandAvailable(COMMAND_PREPARE_STOP)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_PREPARE)).isTrue(); + assertThat(castPlayer.isCommandAvailable(COMMAND_STOP)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_DEFAULT_POSITION)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isTrue(); assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 4ca4e18c5a..dbad56dad1 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -676,7 +676,8 @@ public interface Player { @Command private static final int[] SUPPORTED_COMMANDS = { COMMAND_PLAY_PAUSE, - COMMAND_PREPARE_STOP, + COMMAND_PREPARE, + COMMAND_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, @@ -1332,7 +1333,7 @@ public interface Player { /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link - * #COMMAND_PREPARE_STOP}, {@link #COMMAND_SEEK_TO_DEFAULT_POSITION}, {@link + * #COMMAND_PREPARE}, {@link #COMMAND_STOP}, {@link #COMMAND_SEEK_TO_DEFAULT_POSITION}, {@link * #COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM}, {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM}, {@link * #COMMAND_SEEK_TO_PREVIOUS}, {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM}, {@link * #COMMAND_SEEK_TO_NEXT}, {@link #COMMAND_SEEK_TO_MEDIA_ITEM}, {@link #COMMAND_SEEK_BACK}, {@link @@ -1351,7 +1352,8 @@ public interface Player { @IntDef({ COMMAND_INVALID, COMMAND_PLAY_PAUSE, - COMMAND_PREPARE_STOP, + COMMAND_PREPARE, + COMMAND_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, @@ -1383,70 +1385,72 @@ public interface Player { @interface Command {} /** Command to start, pause or resume playback. */ int COMMAND_PLAY_PAUSE = 1; - /** Command to prepare the player, stop playback or release the player. */ - int COMMAND_PREPARE_STOP = 2; + /** Command to prepare the player. */ + int COMMAND_PREPARE = 2; + /** Command to stop playback or release the player. */ + int COMMAND_STOP = 3; /** Command to seek to the default position of the current {@link MediaItem}. */ - int COMMAND_SEEK_TO_DEFAULT_POSITION = 3; + int COMMAND_SEEK_TO_DEFAULT_POSITION = 4; /** Command to seek anywhere into the current {@link MediaItem}. */ - int COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM = 4; + int COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM = 5; /** @deprecated Use {@link #COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM} instead. */ @Deprecated int COMMAND_SEEK_IN_CURRENT_WINDOW = COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; /** Command to seek to the default position of the previous {@link MediaItem}. */ - int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM = 5; + int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM = 6; /** @deprecated Use {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} instead. */ @Deprecated int COMMAND_SEEK_TO_PREVIOUS_WINDOW = COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM; /** Command to seek to an earlier position in the current or previous {@link MediaItem}. */ - int COMMAND_SEEK_TO_PREVIOUS = 6; + int COMMAND_SEEK_TO_PREVIOUS = 7; /** Command to seek to the default position of the next {@link MediaItem}. */ - int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM = 7; + int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM = 8; /** @deprecated Use {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} instead. */ @Deprecated int COMMAND_SEEK_TO_NEXT_WINDOW = COMMAND_SEEK_TO_NEXT_MEDIA_ITEM; /** Command to seek to a later position in the current or next {@link MediaItem}. */ - int COMMAND_SEEK_TO_NEXT = 8; + int COMMAND_SEEK_TO_NEXT = 9; /** Command to seek anywhere in any {@link MediaItem}. */ - int COMMAND_SEEK_TO_MEDIA_ITEM = 9; + int COMMAND_SEEK_TO_MEDIA_ITEM = 10; /** @deprecated Use {@link #COMMAND_SEEK_TO_MEDIA_ITEM} instead. */ @Deprecated int COMMAND_SEEK_TO_WINDOW = COMMAND_SEEK_TO_MEDIA_ITEM; /** Command to seek back by a fixed increment into the current {@link MediaItem}. */ - int COMMAND_SEEK_BACK = 10; + int COMMAND_SEEK_BACK = 11; /** Command to seek forward by a fixed increment into the current {@link MediaItem}. */ - int COMMAND_SEEK_FORWARD = 11; + int COMMAND_SEEK_FORWARD = 12; /** Command to set the playback speed and pitch. */ - int COMMAND_SET_SPEED_AND_PITCH = 12; + int COMMAND_SET_SPEED_AND_PITCH = 13; /** Command to enable shuffling. */ - int COMMAND_SET_SHUFFLE_MODE = 13; + int COMMAND_SET_SHUFFLE_MODE = 14; /** Command to set the repeat mode. */ - int COMMAND_SET_REPEAT_MODE = 14; + int COMMAND_SET_REPEAT_MODE = 15; /** Command to get the currently playing {@link MediaItem}. */ - int COMMAND_GET_CURRENT_MEDIA_ITEM = 15; + int COMMAND_GET_CURRENT_MEDIA_ITEM = 16; /** Command to get the information about the current timeline. */ - int COMMAND_GET_TIMELINE = 16; + int COMMAND_GET_TIMELINE = 17; /** Command to get the {@link MediaItem MediaItems} metadata. */ - int COMMAND_GET_MEDIA_ITEMS_METADATA = 17; + int COMMAND_GET_MEDIA_ITEMS_METADATA = 18; /** Command to set the {@link MediaItem MediaItems} metadata. */ - int COMMAND_SET_MEDIA_ITEMS_METADATA = 18; + int COMMAND_SET_MEDIA_ITEMS_METADATA = 19; /** Command to change the {@link MediaItem MediaItems} in the playlist. */ - int COMMAND_CHANGE_MEDIA_ITEMS = 19; + int COMMAND_CHANGE_MEDIA_ITEMS = 20; /** Command to get the player current {@link AudioAttributes}. */ - int COMMAND_GET_AUDIO_ATTRIBUTES = 20; + int COMMAND_GET_AUDIO_ATTRIBUTES = 21; /** Command to get the player volume. */ - int COMMAND_GET_VOLUME = 21; + int COMMAND_GET_VOLUME = 22; /** Command to get the device volume and whether it is muted. */ - int COMMAND_GET_DEVICE_VOLUME = 22; + int COMMAND_GET_DEVICE_VOLUME = 23; /** Command to set the player volume. */ - int COMMAND_SET_VOLUME = 23; + int COMMAND_SET_VOLUME = 24; /** Command to set the device volume and mute it. */ - int COMMAND_SET_DEVICE_VOLUME = 24; + int COMMAND_SET_DEVICE_VOLUME = 25; /** Command to increase and decrease the device volume and mute it. */ - int COMMAND_ADJUST_DEVICE_VOLUME = 25; + int COMMAND_ADJUST_DEVICE_VOLUME = 26; /** Command to set and clear the surface on which to render the video. */ - int COMMAND_SET_VIDEO_SURFACE = 26; + int COMMAND_SET_VIDEO_SURFACE = 27; /** Command to get the text that should currently be displayed by the player. */ - int COMMAND_GET_TEXT = 27; + int COMMAND_GET_TEXT = 28; /** Command to set the player's track selection parameters. */ - int COMMAND_SET_TRACK_SELECTION_PARAMETERS = 28; + int COMMAND_SET_TRACK_SELECTION_PARAMETERS = 29; /** Command to get track infos. */ - int COMMAND_GET_TRACK_INFOS = 29; + int COMMAND_GET_TRACK_INFOS = 30; /** Represents an invalid {@link Command}. */ int COMMAND_INVALID = -1; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index bb66139cd1..bee9a64ea6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -207,7 +207,8 @@ import java.util.concurrent.CopyOnWriteArraySet; new Commands.Builder() .addAll( COMMAND_PLAY_PAUSE, - COMMAND_PREPARE_STOP, + COMMAND_PREPARE, + COMMAND_STOP, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_REPEAT_MODE, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 5c3e2c8225..ea9df3399e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -26,7 +26,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_GET_TIMELINE; import static com.google.android.exoplayer2.Player.COMMAND_GET_TRACK_INFOS; import static com.google.android.exoplayer2.Player.COMMAND_GET_VOLUME; import static com.google.android.exoplayer2.Player.COMMAND_PLAY_PAUSE; -import static com.google.android.exoplayer2.Player.COMMAND_PREPARE_STOP; +import static com.google.android.exoplayer2.Player.COMMAND_PREPARE; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_BACK; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_FORWARD; import static com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM; @@ -44,6 +44,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_SET_SPEED_AND_PITCH; import static com.google.android.exoplayer2.Player.COMMAND_SET_TRACK_SELECTION_PARAMETERS; import static com.google.android.exoplayer2.Player.COMMAND_SET_VIDEO_SURFACE; import static com.google.android.exoplayer2.Player.COMMAND_SET_VOLUME; +import static com.google.android.exoplayer2.Player.COMMAND_STOP; import static com.google.android.exoplayer2.Player.STATE_ENDED; import static com.google.android.exoplayer2.robolectric.RobolectricUtil.runMainLooperUntil; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilPosition; @@ -8318,7 +8319,8 @@ public final class ExoPlayerTest { player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource())); assertThat(player.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); - assertThat(player.isCommandAvailable(COMMAND_PREPARE_STOP)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_PREPARE)).isTrue(); + assertThat(player.isCommandAvailable(COMMAND_STOP)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_DEFAULT_POSITION)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); @@ -11227,7 +11229,8 @@ public final class ExoPlayerTest { Player.Commands.Builder builder = new Player.Commands.Builder(); builder.addAll( COMMAND_PLAY_PAUSE, - COMMAND_PREPARE_STOP, + COMMAND_PREPARE, + COMMAND_STOP, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SET_SPEED_AND_PITCH, diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpPayloadReader.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpPayloadReader.java index aa790372d3..fef22be090 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpPayloadReader.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpPayloadReader.java @@ -35,8 +35,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @return A {@link RtpPayloadReader} for the packet stream, or {@code null} if the stream * format is not supported. */ - @Nullable - RtpPayloadReader createPayloadReader(RtpPayloadFormat payloadFormat); + @Nullable RtpPayloadReader createPayloadReader(RtpPayloadFormat payloadFormat); } /** From b75d68782e22f59b264d1526a7baeeda4059abb3 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 09:44:00 +0100 Subject: [PATCH 315/441] Fix import PiperOrigin-RevId: 402765438 --- .../src/main/java/com/google/android/exoplayer2/ExoPlayer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 07ac8d6b0c..ed6d1b5278 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; +import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.MetadataRenderer; From 91da6a34344f880a926867cd9548e4cd525a1a1b Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 09:45:05 +0100 Subject: [PATCH 316/441] Fix nullness checks for UdpDataSource PiperOrigin-RevId: 402765571 --- .../android/exoplayer2/upstream/UdpDataSource.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java index df0ff1f1cc..19ea9726f1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.upstream; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static java.lang.Math.min; import android.net.Uri; @@ -63,7 +64,6 @@ public final class UdpDataSource extends BaseDataSource { @Nullable private DatagramSocket socket; @Nullable private MulticastSocket multicastSocket; @Nullable private InetAddress address; - @Nullable private InetSocketAddress socketAddress; private boolean opened; private int packetRemaining; @@ -98,12 +98,12 @@ public final class UdpDataSource extends BaseDataSource { @Override public long open(DataSpec dataSpec) throws UdpDataSourceException { uri = dataSpec.uri; - String host = uri.getHost(); + String host = checkNotNull(uri.getHost()); int port = uri.getPort(); transferInitializing(dataSpec); try { address = InetAddress.getByName(host); - socketAddress = new InetSocketAddress(address, port); + InetSocketAddress socketAddress = new InetSocketAddress(address, port); if (address.isMulticastAddress()) { multicastSocket = new MulticastSocket(socketAddress); multicastSocket.joinGroup(address); @@ -133,7 +133,7 @@ public final class UdpDataSource extends BaseDataSource { if (packetRemaining == 0) { // We've read all of the data from the current packet. Get another. try { - socket.receive(packet); + checkNotNull(socket).receive(packet); } catch (SocketTimeoutException e) { throw new UdpDataSourceException( e, PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT); @@ -163,7 +163,7 @@ public final class UdpDataSource extends BaseDataSource { uri = null; if (multicastSocket != null) { try { - multicastSocket.leaveGroup(address); + multicastSocket.leaveGroup(checkNotNull(address)); } catch (IOException e) { // Do nothing. } @@ -174,7 +174,6 @@ public final class UdpDataSource extends BaseDataSource { socket = null; } address = null; - socketAddress = null; packetRemaining = 0; if (opened) { opened = false; From 02719fd5b991f76ef3fc9e292f6db2210a532ea6 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 10:28:51 +0100 Subject: [PATCH 317/441] Move test asset ContentProvider to testutil PiperOrigin-RevId: 402772598 --- .../core/src/androidTest/AndroidManifest.xml | 4 ++-- .../ContentDataSourceContractTest.java | 7 +++--- .../upstream/ContentDataSourceTest.java | 5 +++-- .../testutil/AssetContentProvider.java | 22 ++++++++++++------- 4 files changed, 23 insertions(+), 15 deletions(-) rename library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/TestContentProvider.java => testutils/src/main/java/com/google/android/exoplayer2/testutil/AssetContentProvider.java (86%) diff --git a/library/core/src/androidTest/AndroidManifest.xml b/library/core/src/androidTest/AndroidManifest.xml index db8d89e66e..6ccd2b3429 100644 --- a/library/core/src/androidTest/AndroidManifest.xml +++ b/library/core/src/androidTest/AndroidManifest.xml @@ -27,8 +27,8 @@ tools:ignore="MissingApplicationIcon,HardcodedDebugMode" android:usesCleartextTraffic="true"> + android:authorities="com.google.android.exoplayer2.testutil.AssetContentProvider" + android:name="com.google.android.exoplayer2.testutil.AssetContentProvider"/> { - private static final String AUTHORITY = "com.google.android.exoplayer2.core.test"; + private static final String AUTHORITY = + "com.google.android.exoplayer2.testutil.AssetContentProvider"; private static final String PARAM_PIPE_MODE = "pipe-mode"; public static Uri buildUri(String filePath, boolean pipeMode) { @@ -45,7 +46,7 @@ public final class TestContentProvider extends ContentProvider .authority(AUTHORITY) .path(filePath); if (pipeMode) { - builder.appendQueryParameter(TestContentProvider.PARAM_PIPE_MODE, "1"); + builder.appendQueryParameter(PARAM_PIPE_MODE, "1"); } return builder.build(); } @@ -116,8 +117,7 @@ public final class TestContentProvider extends ContentProvider byte[] data = TestUtil.getByteArray(getContext(), getFileName(uri)); outputStream.write(data); } catch (IOException e) { - if (e.getCause() instanceof ErrnoException - && ((ErrnoException) e.getCause()).errno == OsConstants.EPIPE) { + if (isBrokenPipe(e)) { // Swallow the exception if it's caused by a broken pipe - this indicates the reader has // closed the pipe and is therefore no longer interested in the data being written. // [See internal b/186728171]. @@ -130,4 +130,10 @@ public final class TestContentProvider extends ContentProvider private static String getFileName(Uri uri) { return uri.getPath().replaceFirst("/", ""); } + + private static boolean isBrokenPipe(IOException e) { + return Util.SDK_INT >= 21 + && e.getCause() instanceof ErrnoException + && ((ErrnoException) e.getCause()).errno == OsConstants.EPIPE; + } } From 0dc2567179d2155bea32f4aa778376d115e0d863 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 11:27:32 +0100 Subject: [PATCH 318/441] Remove one method class in crypto package PiperOrigin-RevId: 402787577 --- .../upstream/crypto/AesCipherDataSink.java | 6 ++- .../upstream/crypto/AesCipherDataSource.java | 6 ++- .../upstream/crypto/AesFlushingCipher.java | 24 +++++++++++ .../upstream/crypto/CryptoUtil.java | 43 ------------------- 4 files changed, 32 insertions(+), 47 deletions(-) delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/CryptoUtil.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java index 691e496c3b..4e5b9f2b8e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java @@ -66,10 +66,12 @@ public final class AesCipherDataSink implements DataSink { @Override public void open(DataSpec dataSpec) throws IOException { wrappedDataSink.open(dataSpec); - long nonce = CryptoUtil.getFNV64Hash(dataSpec.key); cipher = new AesFlushingCipher( - Cipher.ENCRYPT_MODE, secretKey, nonce, dataSpec.uriPositionOffset + dataSpec.position); + Cipher.ENCRYPT_MODE, + secretKey, + dataSpec.key, + dataSpec.uriPositionOffset + dataSpec.position); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java index 52352729eb..98ec914fa0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java @@ -51,10 +51,12 @@ public final class AesCipherDataSource implements DataSource { @Override public long open(DataSpec dataSpec) throws IOException { long dataLength = upstream.open(dataSpec); - long nonce = CryptoUtil.getFNV64Hash(dataSpec.key); cipher = new AesFlushingCipher( - Cipher.DECRYPT_MODE, secretKey, nonce, dataSpec.uriPositionOffset + dataSpec.position); + Cipher.DECRYPT_MODE, + secretKey, + dataSpec.key, + dataSpec.uriPositionOffset + dataSpec.position); return dataLength; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java index b539d31ab9..96cb13604e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.upstream.crypto; +import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; @@ -42,6 +43,10 @@ public final class AesFlushingCipher { private int pendingXorBytes; + public AesFlushingCipher(int mode, byte[] secretKey, @Nullable String nonce, long offset) { + this(mode, secretKey, getFNV64Hash(nonce), offset); + } + public AesFlushingCipher(int mode, byte[] secretKey, long nonce, long offset) { try { cipher = Cipher.getInstance("AES/CTR/NoPadding"); @@ -121,4 +126,23 @@ public final class AesFlushingCipher { private byte[] getInitializationVector(long nonce, long counter) { return ByteBuffer.allocate(16).putLong(nonce).putLong(counter).array(); } + + /** + * Returns the hash value of the input as a long using the 64 bit FNV-1a hash function. The hash + * values produced by this function are less likely to collide than those produced by {@link + * #hashCode()}. + */ + private static long getFNV64Hash(@Nullable String input) { + if (input == null) { + return 0; + } + + long hash = 0; + for (int i = 0; i < input.length(); i++) { + hash ^= input.charAt(i); + // This is equivalent to hash *= 0x100000001b3 (the FNV magic prime number). + hash += (hash << 1) + (hash << 4) + (hash << 5) + (hash << 7) + (hash << 8) + (hash << 40); + } + return hash; + } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/CryptoUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/CryptoUtil.java deleted file mode 100644 index 20681ee15a..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/CryptoUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.upstream.crypto; - -import androidx.annotation.Nullable; - -/** Utility functions for the crypto package. */ -/* package */ final class CryptoUtil { - - private CryptoUtil() {} - - /** - * Returns the hash value of the input as a long using the 64 bit FNV-1a hash function. The hash - * values produced by this function are less likely to collide than those produced by {@link - * #hashCode()}. - */ - public static long getFNV64Hash(@Nullable String input) { - if (input == null) { - return 0; - } - - long hash = 0; - for (int i = 0; i < input.length(); i++) { - hash ^= input.charAt(i); - // This is equivalent to hash *= 0x100000001b3 (the FNV magic prime number). - hash += (hash << 1) + (hash << 4) + (hash << 5) + (hash << 7) + (hash << 8) + (hash << 40); - } - return hash; - } -} From db84773c01546f07fc480c6f75ba7a3d40edb747 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 14:11:51 +0100 Subject: [PATCH 319/441] Further README tweaks PiperOrigin-RevId: 402811825 --- extensions/av1/README.md | 26 +++++++++-------- extensions/ffmpeg/README.md | 11 ++++---- .../ffmpeg/src/main/jni/build_ffmpeg.sh | 4 +-- extensions/flac/README.md | 11 ++++---- extensions/opus/README.md | 13 ++++----- extensions/vp9/README.md | 28 ++++++++++--------- 6 files changed, 47 insertions(+), 46 deletions(-) diff --git a/extensions/av1/README.md b/extensions/av1/README.md index f9bef64791..c7b59baca2 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -23,29 +23,28 @@ dependencies as follows: * Set the following environment variables: ``` -cd "" -EXOPLAYER_ROOT="$(pwd)" -AV1_EXT_PATH="${EXOPLAYER_ROOT}/extensions/av1/src/main" +cd "" +AV1_MODULE_PATH="$(pwd)/extensions/av1/src/main" ``` * Fetch cpu_features library: ``` -cd "${AV1_EXT_PATH}/jni" && \ +cd "${AV1_MODULE_PATH}/jni" && \ git clone https://github.com/google/cpu_features ``` * Fetch libgav1: ``` -cd "${AV1_EXT_PATH}/jni" && \ +cd "${AV1_MODULE_PATH}/jni" && \ git clone https://chromium.googlesource.com/codecs/libgav1 ``` * Fetch Abseil: ``` -cd "${AV1_EXT_PATH}/jni/libgav1" && \ +cd "${AV1_MODULE_PATH}/jni/libgav1" && \ git clone https://github.com/abseil/abseil-cpp.git third_party/abseil-cpp ``` @@ -113,19 +112,22 @@ gets from the libgav1 decoder: * GL rendering using GL shader for color space conversion - * If you are using `SimpleExoPlayer` with `PlayerView`, enable this option - by setting `surface_type` of `PlayerView` to be + * If you are using `ExoPlayer` with `PlayerView` or `StyledPlayerView`, + enable this option by setting `surface_type` of view to be `video_decoder_gl_surface_view`. * Otherwise, enable this option by sending `Libgav1VideoRenderer` a - message of type `Renderer.MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER` + message of type `Renderer.MSG_SET_VIDEO_OUTPUT` with an instance of `VideoDecoderOutputBufferRenderer` as its object. + `VideoDecoderGLSurfaceView` is the concrete + `VideoDecoderOutputBufferRenderer` implementation used by + `(Styled)PlayerView`. * Native rendering using `ANativeWindow` - * If you are using `SimpleExoPlayer` with `PlayerView`, this option is - enabled by default. + * If you are using `ExoPlayer` with `PlayerView` or `StyledPlayerView`, + this option is enabled by default. * Otherwise, enable this option by sending `Libgav1VideoRenderer` a - message of type `Renderer.MSG_SET_SURFACE` with an instance of + message of type `Renderer.MSG_SET_VIDEO_OUTPUT` with an instance of `SurfaceView` as its object. Note: Although the default option uses `ANativeWindow`, based on our testing the diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index d54c94944f..cb0fdf3f7c 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -24,9 +24,8 @@ can bundle the FFmpeg binaries in the APK: * Set the following shell variable: ``` -cd "" -EXOPLAYER_ROOT="$(pwd)" -FFMPEG_EXT_PATH="${EXOPLAYER_ROOT}/extensions/ffmpeg/src/main" +cd "" +FFMPEG_MODULE_PATH="$(pwd)/extensions/ffmpeg/src/main" ``` * Download the [Android NDK][] and set its location in a shell variable. @@ -63,7 +62,7 @@ ENABLED_DECODERS=(vorbis opus flac) * Add a link to the FFmpeg source code in the FFmpeg module `jni` directory. ``` -cd "${FFMPEG_EXT_PATH}/jni" && \ +cd "${FFMPEG_MODULE_PATH}/jni" && \ ln -s "$FFMPEG_PATH" ffmpeg ``` @@ -72,9 +71,9 @@ ln -s "$FFMPEG_PATH" ffmpeg different architectures: ``` -cd "${FFMPEG_EXT_PATH}/jni" && \ +cd "${FFMPEG_MODULE_PATH}/jni" && \ ./build_ffmpeg.sh \ - "${FFMPEG_EXT_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}" + "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}" ``` ## Build instructions (Windows) diff --git a/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh b/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh index 7b2e933902..49f1d028d6 100755 --- a/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh +++ b/extensions/ffmpeg/src/main/jni/build_ffmpeg.sh @@ -15,7 +15,7 @@ # limitations under the License. # -FFMPEG_EXT_PATH=$1 +FFMPEG_MODULE_PATH=$1 NDK_PATH=$2 HOST_PLATFORM=$3 ENABLED_DECODERS=("${@:4}") @@ -43,7 +43,7 @@ for decoder in "${ENABLED_DECODERS[@]}" do COMMON_OPTIONS="${COMMON_OPTIONS} --enable-decoder=${decoder}" done -cd "${FFMPEG_EXT_PATH}/jni/ffmpeg" +cd "${FFMPEG_MODULE_PATH}/jni/ffmpeg" ./configure \ --libdir=android-libs/armeabi-v7a \ --arch=arm \ diff --git a/extensions/flac/README.md b/extensions/flac/README.md index d7b6e7bc00..aaa4e35191 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -22,9 +22,8 @@ In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: ``` -cd "" -EXOPLAYER_ROOT="$(pwd)" -FLAC_EXT_PATH="${EXOPLAYER_ROOT}/extensions/flac/src/main" +cd "" +FLAC_MODULE_PATH="$(pwd)/extensions/flac/src/main" ``` * Download the [Android NDK][] and set its location in an environment variable. @@ -34,10 +33,10 @@ FLAC_EXT_PATH="${EXOPLAYER_ROOT}/extensions/flac/src/main" NDK_PATH="" ``` -* Download and extract flac-1.3.2 as "${FLAC_EXT_PATH}/jni/flac" folder: +* Download and extract flac-1.3.2 as "${FLAC_MODULE_PATH}/jni/flac" folder: ``` -cd "${FLAC_EXT_PATH}/jni" && \ +cd "${FLAC_MODULE_PATH}/jni" && \ curl https://ftp.osuosl.org/pub/xiph/releases/flac/flac-1.3.2.tar.xz | tar xJ && \ mv flac-1.3.2 flac ``` @@ -45,7 +44,7 @@ mv flac-1.3.2 flac * Build the JNI native libraries from the command line: ``` -cd "${FLAC_EXT_PATH}"/jni && \ +cd "${FLAC_MODULE_PATH}"/jni && \ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ``` diff --git a/extensions/opus/README.md b/extensions/opus/README.md index f4a77d924d..e3242c3f32 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -22,9 +22,8 @@ In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: ``` -cd "" -EXOPLAYER_ROOT="$(pwd)" -OPUS_EXT_PATH="${EXOPLAYER_ROOT}/extensions/opus/src/main" +cd "" +OPUS_MODULE_PATH="$(pwd)/extensions/opus/src/main" ``` * Download the [Android NDK][] and set its location in an environment variable. @@ -37,20 +36,20 @@ NDK_PATH="" * Fetch libopus: ``` -cd "${OPUS_EXT_PATH}/jni" && \ +cd "${OPUS_MODULE_PATH}/jni" && \ git clone https://gitlab.xiph.org/xiph/opus.git libopus ``` * Run the script to convert arm assembly to NDK compatible format: ``` -cd ${OPUS_EXT_PATH}/jni && ./convert_android_asm.sh +cd ${OPUS_MODULE_PATH}/jni && ./convert_android_asm.sh ``` * Build the JNI native libraries from the command line: ``` -cd "${OPUS_EXT_PATH}"/jni && \ +cd "${OPUS_MODULE_PATH}"/jni && \ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ``` @@ -70,7 +69,7 @@ be possible to follow the Linux instructions in [Windows PowerShell][]. * Arm assembly should be converted by running `convert_android_asm.sh` * Clean and re-build the project. * If you want to use your own version of libopus, place it in - `${OPUS_EXT_PATH}/jni/libopus`. + `${OPUS_MODULE_PATH}/jni/libopus`. ## Using the module diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index d352a349c1..b24d089549 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -22,9 +22,8 @@ In addition, it's necessary to build the module's native components as follows: * Set the following environment variables: ``` -cd "" -EXOPLAYER_ROOT="$(pwd)" -VP9_EXT_PATH="${EXOPLAYER_ROOT}/extensions/vp9/src/main" +cd "" +VP9_MODULE_PATH="$(pwd)/extensions/vp9/src/main" ``` * Download the [Android NDK][] and set its location in an environment variable. @@ -49,7 +48,7 @@ LIBVPX_PATH="$(pwd)" run a script that generates necessary configuration files for libvpx: ``` -cd ${VP9_EXT_PATH}/jni && \ +cd ${VP9_MODULE_PATH}/jni && \ ln -s "$LIBVPX_PATH" libvpx && \ ./generate_libvpx_android_configs.sh ``` @@ -57,7 +56,7 @@ ln -s "$LIBVPX_PATH" libvpx && \ * Build the JNI native libraries from the command line: ``` -cd "${VP9_EXT_PATH}"/jni && \ +cd "${VP9_MODULE_PATH}"/jni && \ ${NDK_PATH}/ndk-build APP_ABI=all -j4 ``` @@ -78,7 +77,7 @@ be possible to follow the Linux instructions in [Windows PowerShell][]. `generate_libvpx_android_configs.sh` * Clean and re-build the project. * If you want to use your own version of libvpx, point to it with the - `${VP9_EXT_PATH}/jni/libvpx` symlink. Please note that + `${VP9_MODULE_PATH}/jni/libvpx` symlink. Please note that `generate_libvpx_android_configs.sh` and the makefiles may need to be modified to work with arbitrary versions of libvpx. @@ -126,20 +125,23 @@ gets from the libvpx decoder: * GL rendering using GL shader for color space conversion - * If you are using `SimpleExoPlayer` with `PlayerView`, enable this option - by setting `surface_type` of `PlayerView` to be + * If you are using `ExoPlayer` with `PlayerView` or `StyledPlayerView`, + enable this option by setting `surface_type` of view to be `video_decoder_gl_surface_view`. * Otherwise, enable this option by sending `LibvpxVideoRenderer` a message - of type `Renderer.MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER` with an + of type `Renderer.MSG_SET_VIDEO_OUTPUT` with an instance of `VideoDecoderOutputBufferRenderer` as its object. + `VideoDecoderGLSurfaceView` is the concrete + `VideoDecoderOutputBufferRenderer` implementation used by + `(Styled)PlayerView`. * Native rendering using `ANativeWindow` - * If you are using `SimpleExoPlayer` with `PlayerView`, this option is - enabled by default. + * If you are using `ExoPlayer` with `PlayerView` or `StyledPlayerView`, + this option is enabled by default. * Otherwise, enable this option by sending `LibvpxVideoRenderer` a message - of type `Renderer.MSG_SET_SURFACE` with an instance of `SurfaceView` as - its object. + of type `Renderer.MSG_SET_VIDEO_OUTPUT` with an instance of + `SurfaceView` as its object. Note: Although the default option uses `ANativeWindow`, based on our testing the GL rendering mode has better performance, so should be preferred. From fe0a5662de93552e1cda9fbcaf43badcd2ecbb9b Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 13 Oct 2021 14:18:40 +0100 Subject: [PATCH 320/441] Move DataSink and upstream.crypto to common PiperOrigin-RevId: 402812895 --- .../media/github/package-info-exoplayer-upstream-crypto.java | 0 .../java/com/google/android/exoplayer2/upstream/DataSink.java | 0 .../android/exoplayer2/upstream/crypto/AesCipherDataSink.java | 2 -- .../exoplayer2/upstream/crypto/AesCipherDataSource.java | 3 --- .../android/exoplayer2/upstream/crypto/AesFlushingCipher.java | 0 .../exoplayer2/upstream/crypto/AesFlushingCipherTest.java | 0 6 files changed, 5 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java => google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java (97%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java (93%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java b/google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java rename to google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java similarity index 97% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java index 4e5b9f2b8e..1966f76a83 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java @@ -19,8 +19,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import static java.lang.Math.min; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.upstream.DataSink; -import com.google.android.exoplayer2.upstream.DataSpec; import java.io.IOException; import javax.crypto.Cipher; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java similarity index 93% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java index 98ec914fa0..633b54fb20 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java @@ -21,9 +21,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java From 98ee159df161c7c8806c0b0490b642738822f6a7 Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 13 Oct 2021 14:44:46 +0100 Subject: [PATCH 321/441] Use TracksInfo and selection override in users Update the UI module, the demos and most other users to make use of the new player TracksInfo and track selection override APIs. PiperOrigin-RevId: 402817857 --- .../exoplayer2/castdemo/PlayerManager.java | 55 ++-- .../exoplayer2/demo/PlayerActivity.java | 59 ++-- .../exoplayer2/ext/ima/AdTagLoader.java | 5 +- .../google/android/exoplayer2/TracksInfo.java | 11 +- .../analytics/PlaybackStatsListener.java | 21 +- .../trackselection/TrackSelectionUtil.java | 88 +++++- .../android/exoplayer2/ExoPlayerTest.java | 8 +- .../android/exoplayer2/ui/PlayerView.java | 30 +- .../ui/StyledPlayerControlView.java | 293 ++++++++---------- .../exoplayer2/ui/StyledPlayerView.java | 27 +- 10 files changed, 284 insertions(+), 313 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index e6a55b1ce5..4853229c50 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -19,7 +19,6 @@ import android.content.Context; import android.view.KeyEvent; import android.view.View; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; @@ -28,12 +27,9 @@ import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Player.TimelineChangeReason; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.ext.cast.CastPlayer; import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.MappingTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.gms.cast.framework.CastContext; @@ -58,13 +54,12 @@ import java.util.ArrayList; private final PlayerView localPlayerView; private final PlayerControlView castControlView; - private final DefaultTrackSelector trackSelector; - private final SimpleExoPlayer exoPlayer; + private final Player localPlayer; private final CastPlayer castPlayer; private final ArrayList mediaQueue; private final Listener listener; - private TrackGroupArray lastSeenTrackGroupArray; + private TracksInfo lastSeenTrackGroupInfo; private int currentItemIndex; private Player currentPlayer; @@ -89,17 +84,16 @@ import java.util.ArrayList; mediaQueue = new ArrayList<>(); currentItemIndex = C.INDEX_UNSET; - trackSelector = new DefaultTrackSelector(context); - exoPlayer = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build(); - exoPlayer.addListener(this); - localPlayerView.setPlayer(exoPlayer); + localPlayer = new ExoPlayer.Builder(context).build(); + localPlayer.addListener(this); + localPlayerView.setPlayer(localPlayer); castPlayer = new CastPlayer(castContext); castPlayer.addListener(this); castPlayer.setSessionAvailabilityListener(this); castControlView.setPlayer(castPlayer); - setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : exoPlayer); + setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : localPlayer); } // Queue manipulation methods. @@ -200,7 +194,7 @@ import java.util.ArrayList; * @return Whether the event was handled by the target view. */ public boolean dispatchKeyEvent(KeyEvent event) { - if (currentPlayer == exoPlayer) { + if (currentPlayer == localPlayer) { return localPlayerView.dispatchKeyEvent(event); } else /* currentPlayer == castPlayer */ { return castControlView.dispatchKeyEvent(event); @@ -214,7 +208,7 @@ import java.util.ArrayList; castPlayer.setSessionAvailabilityListener(null); castPlayer.release(); localPlayerView.setPlayer(null); - exoPlayer.release(); + localPlayer.release(); } // Player.Listener implementation. @@ -238,24 +232,17 @@ import java.util.ArrayList; } @Override - public void onTracksChanged( - @NonNull TrackGroupArray trackGroups, @NonNull TrackSelectionArray trackSelections) { - if (currentPlayer == exoPlayer && trackGroups != lastSeenTrackGroupArray) { - @Nullable - MappingTrackSelector.MappedTrackInfo mappedTrackInfo = - trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo != null) { - if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO) - == MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - listener.onUnsupportedTrack(C.TRACK_TYPE_VIDEO); - } - if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_AUDIO) - == MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - listener.onUnsupportedTrack(C.TRACK_TYPE_AUDIO); - } - } - lastSeenTrackGroupArray = trackGroups; + public void onTracksInfoChanged(TracksInfo tracksInfo) { + if (currentPlayer != localPlayer || tracksInfo == lastSeenTrackGroupInfo) { + return; } + if (!tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_VIDEO)) { + listener.onUnsupportedTrack(C.TRACK_TYPE_VIDEO); + } + if (!tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_AUDIO)) { + listener.onUnsupportedTrack(C.TRACK_TYPE_AUDIO); + } + lastSeenTrackGroupInfo = tracksInfo; } // CastPlayer.SessionAvailabilityListener implementation. @@ -267,7 +254,7 @@ import java.util.ArrayList; @Override public void onCastSessionUnavailable() { - setCurrentPlayer(exoPlayer); + setCurrentPlayer(localPlayer); } // Internal methods. @@ -286,7 +273,7 @@ import java.util.ArrayList; } // View management. - if (currentPlayer == exoPlayer) { + if (currentPlayer == localPlayer) { localPlayerView.setVisibility(View.VISIBLE); castControlView.hide(); } else /* currentPlayer == castPlayer */ { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index 5f5acea8ea..aaad17aaa8 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.ext.ima.ImaAdsLoader; @@ -46,11 +47,8 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryExcep import com.google.android.exoplayer2.offline.DownloadRequest; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSourceFactory; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.StyledPlayerControlView; import com.google.android.exoplayer2.ui.StyledPlayerView; import com.google.android.exoplayer2.upstream.DataSource; @@ -69,7 +67,7 @@ public class PlayerActivity extends AppCompatActivity // Saved instance state keys. - private static final String KEY_TRACK_SELECTOR_PARAMETERS = "track_selector_parameters"; + private static final String KEY_TRACK_SELECTION_PARAMETERS = "track_selection_parameters"; private static final String KEY_WINDOW = "window"; private static final String KEY_POSITION = "position"; private static final String KEY_AUTO_PLAY = "auto_play"; @@ -84,9 +82,9 @@ public class PlayerActivity extends AppCompatActivity private DataSource.Factory dataSourceFactory; private List mediaItems; private DefaultTrackSelector trackSelector; - private DefaultTrackSelector.Parameters trackSelectorParameters; + private DefaultTrackSelector.Parameters trackSelectionParameters; private DebugTextViewHelper debugViewHelper; - private TrackGroupArray lastSeenTrackGroupArray; + private TracksInfo lastSeenTracksInfo; private boolean startAutoPlay; private int startWindow; private long startPosition; @@ -114,16 +112,16 @@ public class PlayerActivity extends AppCompatActivity playerView.requestFocus(); if (savedInstanceState != null) { - trackSelectorParameters = + // Restore as DefaultTrackSelector.Parameters in case ExoPlayer specific parameters were set. + trackSelectionParameters = DefaultTrackSelector.Parameters.CREATOR.fromBundle( - savedInstanceState.getBundle(KEY_TRACK_SELECTOR_PARAMETERS)); + savedInstanceState.getBundle(KEY_TRACK_SELECTION_PARAMETERS)); startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY); startWindow = savedInstanceState.getInt(KEY_WINDOW); startPosition = savedInstanceState.getLong(KEY_POSITION); } else { - DefaultTrackSelector.ParametersBuilder builder = - new DefaultTrackSelector.ParametersBuilder(/* context= */ this); - trackSelectorParameters = builder.build(); + trackSelectionParameters = + new DefaultTrackSelector.ParametersBuilder(/* context= */ this).build(); clearStartPosition(); } } @@ -209,7 +207,7 @@ public class PlayerActivity extends AppCompatActivity super.onSaveInstanceState(outState); updateTrackSelectorParameters(); updateStartPosition(); - outState.putBundle(KEY_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters.toBundle()); + outState.putBundle(KEY_TRACK_SELECTION_PARAMETERS, trackSelectionParameters.toBundle()); outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay); outState.putInt(KEY_WINDOW, startWindow); outState.putLong(KEY_POSITION, startPosition); @@ -272,13 +270,13 @@ public class PlayerActivity extends AppCompatActivity .setAdViewProvider(playerView); trackSelector = new DefaultTrackSelector(/* context= */ this); - trackSelector.setParameters(trackSelectorParameters); - lastSeenTrackGroupArray = null; + lastSeenTracksInfo = TracksInfo.EMPTY; player = new ExoPlayer.Builder(/* context= */ this, renderersFactory) .setMediaSourceFactory(mediaSourceFactory) .setTrackSelector(trackSelector) .build(); + player.setTrackSelectionParameters(trackSelectionParameters); player.addListener(new PlayerEventListener()); player.addAnalyticsListener(new EventLogger(trackSelector)); player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true); @@ -361,7 +359,6 @@ public class PlayerActivity extends AppCompatActivity player.release(); player = null; mediaItems = Collections.emptyList(); - trackSelector = null; } if (adsLoader != null) { adsLoader.setPlayer(null); @@ -377,8 +374,11 @@ public class PlayerActivity extends AppCompatActivity } private void updateTrackSelectorParameters() { - if (trackSelector != null) { - trackSelectorParameters = trackSelector.getParameters(); + if (player != null) { + // Until the demo app is fully migrated to TrackSelectionParameters, rely on ExoPlayer to use + // DefaultTrackSelector by default. + trackSelectionParameters = + (DefaultTrackSelector.Parameters) player.getTrackSelectionParameters(); } } @@ -438,23 +438,18 @@ public class PlayerActivity extends AppCompatActivity @Override @SuppressWarnings("ReferenceEquality") - public void onTracksChanged( - @NonNull TrackGroupArray trackGroups, @NonNull TrackSelectionArray trackSelections) { + public void onTracksInfoChanged(TracksInfo tracksInfo) { updateButtonVisibility(); - if (trackGroups != lastSeenTrackGroupArray) { - MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo != null) { - if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO) - == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - showToast(R.string.error_unsupported_video); - } - if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_AUDIO) - == MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) { - showToast(R.string.error_unsupported_audio); - } - } - lastSeenTrackGroupArray = trackGroups; + if (tracksInfo == lastSeenTracksInfo) { + return; } + if (!tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_VIDEO)) { + showToast(R.string.error_unsupported_video); + } + if (!tracksInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_AUDIO)) { + showToast(R.string.error_unsupported_audio); + } + lastSeenTracksInfo = tracksInfo; } } diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java index 0e8b246100..f0c4a199e1 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java @@ -58,8 +58,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.source.ads.AdsLoader.EventListener; import com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionUtil; import com.google.android.exoplayer2.ui.AdOverlayInfo; import com.google.android.exoplayer2.ui.AdViewProvider; import com.google.android.exoplayer2.upstream.DataSpec; @@ -706,8 +704,7 @@ import java.util.Map; } // Check for a selected track using an audio renderer. - TrackSelectionArray trackSelections = player.getCurrentTrackSelections(); - return TrackSelectionUtil.hasTrackOfType(trackSelections, C.TRACK_TYPE_AUDIO) ? 100 : 0; + return player.getCurrentTracksInfo().isTypeSelected(C.TRACK_TYPE_AUDIO) ? 100 : 0; } private void handleAdEvent(AdEvent adEvent) { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java index 3f587ed8d0..8f723a1859 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/TracksInfo.java @@ -112,10 +112,13 @@ public final class TracksInfo implements Bundleable { /** * Returns if a track in a {@link TrackGroup} is selected for playback. * - *

                Multiple tracks of a track group may be selected, in which case the the active one - * (currently playing) is undefined. This is common in adaptive streaming, where multiple tracks - * of different quality are selected and the active one changes depending on the network and the - * {@link TrackSelectionParameters}. + *

                Multiple tracks of a track group may be selected. This is common in adaptive streaming, + * where multiple tracks of different quality are selected and the player switches between them + * depending on the network and the {@link TrackSelectionParameters}. + * + *

                While this class doesn't provide which selected track is currently playing, some player + * implementations have ways of getting such information. For example ExoPlayer provides this + * information in {@code ExoTrackSelection.getSelectedFormat}. * * @param trackIndex The index of the track in the {@link TrackGroup}. * @return true if the track is selected, false otherwise. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java index 35adc83bd6..343fa4ce76 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.PlaybackStats.EventTimeAndException; import com.google.android.exoplayer2.analytics.PlaybackStats.EventTimeAndFormat; import com.google.android.exoplayer2.analytics.PlaybackStats.EventTimeAndPlaybackState; @@ -34,9 +35,7 @@ import com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; -import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; import java.io.IOException; @@ -523,23 +522,11 @@ public final class PlaybackStatsListener hasFatalError = false; } if (isForeground && !isInterruptedByAd) { - boolean videoEnabled = false; - boolean audioEnabled = false; - for (TrackSelection trackSelection : player.getCurrentTrackSelections().getAll()) { - if (trackSelection != null && trackSelection.length() > 0) { - @C.TrackType - int trackType = MimeTypes.getTrackType(trackSelection.getFormat(0).sampleMimeType); - if (trackType == C.TRACK_TYPE_VIDEO) { - videoEnabled = true; - } else if (trackType == C.TRACK_TYPE_AUDIO) { - audioEnabled = true; - } - } - } - if (!videoEnabled) { + TracksInfo currentTracksInfo = player.getCurrentTracksInfo(); + if (!currentTracksInfo.isTypeSelected(C.TRACK_TYPE_VIDEO)) { maybeUpdateVideoFormat(eventTime, /* newFormat= */ null); } - if (!audioEnabled) { + if (!currentTracksInfo.isTypeSelected(C.TRACK_TYPE_AUDIO)) { maybeUpdateAudioFormat(eventTime, /* newFormat= */ null); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java index a0cc74588d..42f0ca68a0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java @@ -17,12 +17,21 @@ package com.google.android.exoplayer2.trackselection; import android.os.SystemClock; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.TracksInfo.TrackGroupInfo; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.Map; import org.checkerframework.checker.nullness.compatqual.NullableType; +import org.checkerframework.dataflow.qual.Pure; /** Track selection related utility methods. */ public final class TrackSelectionUtil { @@ -101,22 +110,6 @@ public final class TrackSelectionUtil { return builder.build(); } - /** Returns if a {@link TrackSelectionArray} has at least one track of the given type. */ - public static boolean hasTrackOfType(TrackSelectionArray trackSelections, int trackType) { - for (int i = 0; i < trackSelections.length; i++) { - @Nullable TrackSelection trackSelection = trackSelections.get(i); - if (trackSelection == null) { - continue; - } - for (int j = 0; j < trackSelection.length(); j++) { - if (MimeTypes.getTrackType(trackSelection.getFormat(j).sampleMimeType) == trackType) { - return true; - } - } - } - return false; - } - /** * Returns the {@link LoadErrorHandlingPolicy.FallbackOptions} with the tracks of the given {@link * ExoTrackSelection} and with a single location option indicating that there are no alternative @@ -141,4 +134,67 @@ public final class TrackSelectionUtil { numberOfTracks, numberOfExcludedTracks); } + + /** + * Forces tracks in a {@link TrackGroup} to be the only ones selected for a {@link C.TrackType}. + * No other tracks of that type will be selectable. If the forced tracks are not supported, then + * no tracks of that type will be selected. + * + * @param trackSelectionOverrides The current {@link TrackSelectionOverride overrides}. + * @param tracksInfo The current {@link TracksInfo}. + * @param forcedTrackGroupIndex The index of the {@link TrackGroup} in {@code tracksInfo} that + * should have its track selected. + * @param forcedTrackSelectionOverride The tracks to force selection of. + * @return The updated {@link TrackSelectionOverride overrides}. + */ + @Pure + public static ImmutableMap forceTrackSelection( + ImmutableMap trackSelectionOverrides, + TracksInfo tracksInfo, + int forcedTrackGroupIndex, + TrackSelectionOverride forcedTrackSelectionOverride) { + @C.TrackType + int trackType = tracksInfo.getTrackGroupInfos().get(forcedTrackGroupIndex).getTrackType(); + ImmutableMap.Builder overridesBuilder = + new ImmutableMap.Builder<>(); + // Maintain overrides for the other track types. + for (Map.Entry entry : trackSelectionOverrides.entrySet()) { + if (MimeTypes.getTrackType(entry.getKey().getFormat(0).sampleMimeType) != trackType) { + overridesBuilder.put(entry); + } + } + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + for (int i = 0; i < trackGroupInfos.size(); i++) { + TrackGroup trackGroup = trackGroupInfos.get(i).getTrackGroup(); + if (i == forcedTrackGroupIndex) { + overridesBuilder.put(trackGroup, forcedTrackSelectionOverride); + } else { + overridesBuilder.put(trackGroup, TrackSelectionOverride.DISABLE); + } + } + return overridesBuilder.build(); + } + + /** + * Removes all {@link TrackSelectionOverride overrides} associated with {@link TrackGroup + * TrackGroups} of type {@code trackType}. + * + * @param trackType The {@link C.TrackType} of all overrides to remove. + * @param trackSelectionOverrides The current {@link TrackSelectionOverride overrides}. + * @return The updated {@link TrackSelectionOverride overrides}. + */ + @Pure + public static ImmutableMap + clearTrackSelectionOverridesForType( + @C.TrackType int trackType, + ImmutableMap trackSelectionOverrides) { + ImmutableMap.Builder overridesBuilder = + ImmutableMap.builder(); + for (Map.Entry entry : trackSelectionOverrides.entrySet()) { + if (MimeTypes.getTrackType(entry.getKey().getFormat(0).sampleMimeType) != trackType) { + overridesBuilder.put(entry); + } + } + return overridesBuilder.build(); + } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index ea9df3399e..876835c906 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -7349,7 +7349,7 @@ public final class ExoPlayerTest { } }; AtomicReference timelineAfterError = new AtomicReference<>(); - AtomicReference trackGroupsAfterError = new AtomicReference<>(); + AtomicReference trackInfosAfterError = new AtomicReference<>(); AtomicReference trackSelectionsAfterError = new AtomicReference<>(); AtomicInteger windowIndexAfterError = new AtomicInteger(); ActionSchedule actionSchedule = @@ -7363,7 +7363,7 @@ public final class ExoPlayerTest { @Override public void onPlayerError(EventTime eventTime, PlaybackException error) { timelineAfterError.set(player.getCurrentTimeline()); - trackGroupsAfterError.set(player.getCurrentTrackGroups()); + trackInfosAfterError.set(player.getCurrentTracksInfo()); trackSelectionsAfterError.set(player.getCurrentTrackSelections()); windowIndexAfterError.set(player.getCurrentWindowIndex()); } @@ -7393,8 +7393,8 @@ public final class ExoPlayerTest { assertThat(timelineAfterError.get().getWindowCount()).isEqualTo(1); assertThat(windowIndexAfterError.get()).isEqualTo(0); - assertThat(trackGroupsAfterError.get().length).isEqualTo(1); - assertThat(trackGroupsAfterError.get().get(0).getFormat(0)) + assertThat(trackInfosAfterError.get().getTrackGroupInfos()).hasSize(1); + assertThat(trackInfosAfterError.get().getTrackGroupInfos().get(0).getTrackGroup().getFormat(0)) .isEqualTo(ExoPlayerTestRunner.AUDIO_FORMAT); assertThat(trackSelectionsAfterError.get().get(0)).isNull(); // Video renderer. assertThat(trackSelectionsAfterError.get().get(1)).isNotNull(); // Audio renderer. diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 79e56a4d3d..336a2e2f38 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -47,7 +47,6 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; @@ -57,12 +56,9 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.ResizeMode; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ErrorMessageProvider; -import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -1256,7 +1252,9 @@ public class PlayerView extends FrameLayout implements AdViewProvider { private void updateForCurrentTrackSelections(boolean isNewPlayer) { @Nullable Player player = this.player; - if (player == null || player.getCurrentTrackGroups().isEmpty()) { + if (player == null + || !player.isCommandAvailable(Player.COMMAND_GET_TRACK_INFOS) + || player.getCurrentTracksInfo().getTrackGroupInfos().isEmpty()) { if (!keepContentOnPlayerReset) { hideArtwork(); closeShutter(); @@ -1268,21 +1266,11 @@ public class PlayerView extends FrameLayout implements AdViewProvider { // Hide any video from the previous player. closeShutter(); } - - TrackSelectionArray trackSelections = player.getCurrentTrackSelections(); - for (int i = 0; i < trackSelections.length; i++) { - @Nullable TrackSelection trackSelection = trackSelections.get(i); - if (trackSelection != null) { - for (int j = 0; j < trackSelection.length(); j++) { - Format format = trackSelection.getFormat(j); - if (MimeTypes.getTrackType(format.sampleMimeType) == C.TRACK_TYPE_VIDEO) { - // Video enabled, so artwork must be hidden. If the shutter is closed, it will be opened - // in onRenderedFirstFrame(). - hideArtwork(); - return; - } - } - } + if (player.getCurrentTracksInfo().isTypeSelected(C.TRACK_TYPE_VIDEO)) { + // Video enabled, so artwork must be hidden. If the shutter is closed, it will be opened + // in onRenderedFirstFrame(). + hideArtwork(); + return; } // Video disabled so the shutter must be closed. @@ -1518,7 +1506,7 @@ public class PlayerView extends FrameLayout implements AdViewProvider { Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty()) { lastPeriodUidWithTracks = null; - } else if (!player.getCurrentTrackGroups().isEmpty()) { + } else if (!player.getCurrentTracksInfo().getTrackGroupInfos().isEmpty()) { lastPeriodUidWithTracks = timeline.getPeriod(player.getCurrentPeriodIndex(), period, /* setIds= */ true).uid; } else if (lastPeriodUidWithTracks != null) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 05360bc2a4..34e9786cfd 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -32,6 +32,8 @@ import static com.google.android.exoplayer2.Player.EVENT_SEEK_FORWARD_INCREMENT_ import static com.google.android.exoplayer2.Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_TIMELINE_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_TRACKS_CHANGED; +import static com.google.android.exoplayer2.trackselection.TrackSelectionUtil.clearTrackSelectionOverridesForType; +import static com.google.android.exoplayer2.trackselection.TrackSelectionUtil.forceTrackSelection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import android.annotation.SuppressLint; @@ -59,7 +61,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; @@ -67,24 +68,23 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; import com.google.android.exoplayer2.Player.State; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.TracksInfo.TrackGroupInfo; import com.google.android.exoplayer2.source.TrackGroup; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; -import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Formatter; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -437,9 +437,8 @@ public class StyledPlayerControlView extends FrameLayout { private boolean needToHideBars; private int settingsWindowMargin; - @Nullable private DefaultTrackSelector trackSelector; - private TrackSelectionAdapter textTrackSelectionAdapter; - private TrackSelectionAdapter audioTrackSelectionAdapter; + private TextTrackSelectionAdapter textTrackSelectionAdapter; + private AudioTrackSelectionAdapter audioTrackSelectionAdapter; // TODO(insun): Add setTrackNameProvider to use customized track name provider. private TrackNameProvider trackNameProvider; @@ -764,14 +763,6 @@ public class StyledPlayerControlView extends FrameLayout { if (player instanceof ForwardingPlayer) { player = ((ForwardingPlayer) player).getWrappedPlayer(); } - if (player instanceof ExoPlayer) { - TrackSelector trackSelector = ((ExoPlayer) player).getTrackSelector(); - if (trackSelector instanceof DefaultTrackSelector) { - this.trackSelector = (DefaultTrackSelector) trackSelector; - } - } else { - this.trackSelector = null; - } updateAll(); } @@ -818,7 +809,7 @@ public class StyledPlayerControlView extends FrameLayout { * @param listener The listener to be notified about visibility changes. */ public void addVisibilityListener(VisibilityListener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); visibilityListeners.add(listener); } @@ -1254,58 +1245,46 @@ public class StyledPlayerControlView extends FrameLayout { private void initTrackSelectionAdapter() { textTrackSelectionAdapter.clear(); audioTrackSelectionAdapter.clear(); - if (player == null || trackSelector == null) { + if (player == null + || !player.isCommandAvailable(Player.COMMAND_GET_TRACK_INFOS) + || !player.isCommandAvailable(Player.COMMAND_SET_TRACK_SELECTION_PARAMETERS)) { return; } - DefaultTrackSelector trackSelector = this.trackSelector; - @Nullable MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo == null) { + TracksInfo tracksInfo = player.getCurrentTracksInfo(); + List trackGroupInfos = tracksInfo.getTrackGroupInfos(); + if (trackGroupInfos.isEmpty()) { return; } - List textTracks = new ArrayList<>(); - List audioTracks = new ArrayList<>(); - List textRendererIndices = new ArrayList<>(); - List audioRendererIndices = new ArrayList<>(); - for (int rendererIndex = 0; - rendererIndex < mappedTrackInfo.getRendererCount(); - rendererIndex++) { - if (mappedTrackInfo.getRendererType(rendererIndex) == C.TRACK_TYPE_TEXT + List textTracks = new ArrayList<>(); + List audioTracks = new ArrayList<>(); + for (int trackGroupIndex = 0; trackGroupIndex < trackGroupInfos.size(); trackGroupIndex++) { + TrackGroupInfo trackGroupInfo = trackGroupInfos.get(trackGroupIndex); + if (!trackGroupInfo.isSupported()) { + continue; + } + if (trackGroupInfo.getTrackType() == C.TRACK_TYPE_TEXT && controlViewLayoutManager.getShowButton(subtitleButton)) { // Get TrackSelection at the corresponding renderer index. - gatherTrackInfosForAdapter(mappedTrackInfo, rendererIndex, textTracks); - textRendererIndices.add(rendererIndex); - } else if (mappedTrackInfo.getRendererType(rendererIndex) == C.TRACK_TYPE_AUDIO) { - gatherTrackInfosForAdapter(mappedTrackInfo, rendererIndex, audioTracks); - audioRendererIndices.add(rendererIndex); + gatherTrackInfosForAdapter(tracksInfo, trackGroupIndex, textTracks); + } else if (trackGroupInfo.getTrackType() == C.TRACK_TYPE_AUDIO) { + gatherTrackInfosForAdapter(tracksInfo, trackGroupIndex, audioTracks); } } - textTrackSelectionAdapter.init(textRendererIndices, textTracks, mappedTrackInfo); - audioTrackSelectionAdapter.init(audioRendererIndices, audioTracks, mappedTrackInfo); + textTrackSelectionAdapter.init(textTracks); + audioTrackSelectionAdapter.init(audioTracks); } private void gatherTrackInfosForAdapter( - MappedTrackInfo mappedTrackInfo, int rendererIndex, List tracks) { - TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex); + TracksInfo tracksInfo, int trackGroupIndex, List tracks) { - TrackSelectionArray trackSelections = checkNotNull(player).getCurrentTrackSelections(); - @Nullable TrackSelection trackSelection = trackSelections.get(rendererIndex); - - for (int groupIndex = 0; groupIndex < trackGroupArray.length; groupIndex++) { - TrackGroup trackGroup = trackGroupArray.get(groupIndex); - for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { - Format format = trackGroup.getFormat(trackIndex); - if (mappedTrackInfo.getTrackSupport(rendererIndex, groupIndex, trackIndex) - == C.FORMAT_HANDLED) { - boolean trackIsSelected = - trackSelection != null && trackSelection.indexOf(format) != C.INDEX_UNSET; - tracks.add( - new TrackInfo( - rendererIndex, - groupIndex, - trackIndex, - trackNameProvider.getTrackName(format), - trackIsSelected)); - } + TrackGroupInfo trackGroupInfo = tracksInfo.getTrackGroupInfos().get(trackGroupIndex); + TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + Format format = trackGroup.getFormat(trackIndex); + if (trackGroupInfo.isTrackSupported(trackIndex)) { + tracks.add( + new TrackInformation( + tracksInfo, trackGroupIndex, trackIndex, trackNameProvider.getTrackName(format))); } } } @@ -1988,33 +1967,36 @@ public class StyledPlayerControlView extends FrameLayout { } } - private static final class TrackInfo { + private static final class TrackInformation { - public final int rendererIndex; - public final int groupIndex; + private TracksInfo tracksInfo; + private int trackGroupIndex; + public final TrackGroupInfo trackGroupInfo; + public final TrackGroup trackGroup; public final int trackIndex; public final String trackName; - public final boolean selected; - public TrackInfo( - int rendererIndex, int groupIndex, int trackIndex, String trackName, boolean selected) { - this.rendererIndex = rendererIndex; - this.groupIndex = groupIndex; + public TrackInformation( + TracksInfo tracksInfo, int trackGroupIndex, int trackIndex, String trackName) { + this.tracksInfo = tracksInfo; + this.trackGroupIndex = trackGroupIndex; + this.trackGroupInfo = tracksInfo.getTrackGroupInfos().get(trackGroupIndex); + this.trackGroup = trackGroupInfo.getTrackGroup(); this.trackIndex = trackIndex; this.trackName = trackName; - this.selected = selected; + } + + public boolean isSelected() { + return trackGroupInfo.isTrackSelected(trackIndex); } } private final class TextTrackSelectionAdapter extends TrackSelectionAdapter { @Override - public void init( - List rendererIndices, - List trackInfos, - MappedTrackInfo mappedTrackInfo) { + public void init(List trackInformations) { boolean subtitleIsOn = false; - for (int i = 0; i < trackInfos.size(); i++) { - if (trackInfos.get(i).selected) { + for (int i = 0; i < trackInformations.size(); i++) { + if (trackInformations.get(i).isSelected()) { subtitleIsOn = true; break; } @@ -2026,9 +2008,7 @@ public class StyledPlayerControlView extends FrameLayout { subtitleButton.setContentDescription( subtitleIsOn ? subtitleOnContentDescription : subtitleOffContentDescription); } - this.rendererIndices = rendererIndices; - this.tracks = trackInfos; - this.mappedTrackInfo = mappedTrackInfo; + this.tracks = trackInformations; } @Override @@ -2037,7 +2017,7 @@ public class StyledPlayerControlView extends FrameLayout { holder.textView.setText(R.string.exo_track_selection_none); boolean isTrackSelectionOff = true; for (int i = 0; i < tracks.size(); i++) { - if (tracks.get(i).selected) { + if (tracks.get(i).isSelected()) { isTrackSelectionOff = false; break; } @@ -2045,16 +2025,18 @@ public class StyledPlayerControlView extends FrameLayout { holder.checkView.setVisibility(isTrackSelectionOff ? VISIBLE : INVISIBLE); holder.itemView.setOnClickListener( v -> { - if (trackSelector != null) { - ParametersBuilder parametersBuilder = trackSelector.getParameters().buildUpon(); - for (int i = 0; i < rendererIndices.size(); i++) { - int rendererIndex = rendererIndices.get(i); - parametersBuilder = - parametersBuilder - .clearSelectionOverrides(rendererIndex) - .setRendererDisabled(rendererIndex, true); - } - checkNotNull(trackSelector).setParameters(parametersBuilder); + if (player != null) { + TrackSelectionParameters trackSelectionParameters = + player.getTrackSelectionParameters(); + player.setTrackSelectionParameters( + trackSelectionParameters + .buildUpon() + .setDisabledTrackTypes( + new ImmutableSet.Builder<@C.TrackType Integer>() + .addAll(trackSelectionParameters.disabledTrackTypes) + .add(C.TRACK_TYPE_TEXT) + .build()) + .build()); settingsWindow.dismiss(); } }); @@ -2064,8 +2046,8 @@ public class StyledPlayerControlView extends FrameLayout { public void onBindViewHolder(SubSettingViewHolder holder, int position) { super.onBindViewHolder(holder, position); if (position > 0) { - TrackInfo track = tracks.get(position - 1); - holder.checkView.setVisibility(track.selected ? VISIBLE : INVISIBLE); + TrackInformation track = tracks.get(position - 1); + holder.checkView.setVisibility(track.isSelected() ? VISIBLE : INVISIBLE); } } @@ -2083,11 +2065,9 @@ public class StyledPlayerControlView extends FrameLayout { holder.textView.setText(R.string.exo_track_selection_auto); // hasSelectionOverride is true means there is an explicit track selection, not "Auto". boolean hasSelectionOverride = false; - DefaultTrackSelector.Parameters parameters = checkNotNull(trackSelector).getParameters(); - for (int i = 0; i < rendererIndices.size(); i++) { - int rendererIndex = rendererIndices.get(i); - TrackGroupArray trackGroups = checkNotNull(mappedTrackInfo).getTrackGroups(rendererIndex); - if (parameters.hasSelectionOverride(rendererIndex, trackGroups)) { + TrackSelectionParameters parameters = checkNotNull(player).getTrackSelectionParameters(); + for (int i = 0; i < tracks.size(); i++) { + if (parameters.trackSelectionOverrides.containsKey(tracks.get(i).trackGroup)) { hasSelectionOverride = true; break; } @@ -2095,14 +2075,20 @@ public class StyledPlayerControlView extends FrameLayout { holder.checkView.setVisibility(hasSelectionOverride ? INVISIBLE : VISIBLE); holder.itemView.setOnClickListener( v -> { - if (trackSelector != null) { - ParametersBuilder parametersBuilder = trackSelector.getParameters().buildUpon(); - for (int i = 0; i < rendererIndices.size(); i++) { - int rendererIndex = rendererIndices.get(i); - parametersBuilder = parametersBuilder.clearSelectionOverrides(rendererIndex); - } - checkNotNull(trackSelector).setParameters(parametersBuilder); + if (player == null) { + return; } + TrackSelectionParameters trackSelectionParameters = + player.getTrackSelectionParameters(); + // Remove all audio overrides. + ImmutableMap trackSelectionOverrides = + clearTrackSelectionOverridesForType( + C.TRACK_TYPE_AUDIO, trackSelectionParameters.trackSelectionOverrides); + player.setTrackSelectionParameters( + trackSelectionParameters + .buildUpon() + .setTrackSelectionOverrides(trackSelectionOverrides) + .build()); settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_auto)); @@ -2116,22 +2102,19 @@ public class StyledPlayerControlView extends FrameLayout { } @Override - public void init( - List rendererIndices, - List trackInfos, - MappedTrackInfo mappedTrackInfo) { + public void init(List trackInformations) { // Update subtext in settings menu with current audio track selection. boolean hasSelectionOverride = false; - for (int i = 0; i < rendererIndices.size(); i++) { - int rendererIndex = rendererIndices.get(i); - TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(rendererIndex); - if (trackSelector != null - && trackSelector.getParameters().hasSelectionOverride(rendererIndex, trackGroups)) { + for (int i = 0; i < trackInformations.size(); i++) { + if (checkNotNull(player) + .getTrackSelectionParameters() + .trackSelectionOverrides + .containsKey(trackInformations.get(i).trackGroup)) { hasSelectionOverride = true; break; } } - if (trackInfos.isEmpty()) { + if (trackInformations.isEmpty()) { settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_none)); @@ -2142,35 +2125,28 @@ public class StyledPlayerControlView extends FrameLayout { SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_auto)); } else { - for (int i = 0; i < trackInfos.size(); i++) { - TrackInfo track = trackInfos.get(i); - if (track.selected) { + for (int i = 0; i < trackInformations.size(); i++) { + TrackInformation track = trackInformations.get(i); + if (track.isSelected()) { settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, track.trackName); break; } } } - this.rendererIndices = rendererIndices; - this.tracks = trackInfos; - this.mappedTrackInfo = mappedTrackInfo; + this.tracks = trackInformations; } } private abstract class TrackSelectionAdapter extends RecyclerView.Adapter { - protected List rendererIndices; - protected List tracks; - protected @Nullable MappedTrackInfo mappedTrackInfo; + protected List tracks; - public TrackSelectionAdapter() { - this.rendererIndices = new ArrayList<>(); + protected TrackSelectionAdapter() { this.tracks = new ArrayList<>(); - this.mappedTrackInfo = null; } - public abstract void init( - List rendererIndices, List trackInfos, MappedTrackInfo mappedTrackInfo); + public abstract void init(List trackInformations); @Override public SubSettingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @@ -2181,52 +2157,48 @@ public class StyledPlayerControlView extends FrameLayout { return new SubSettingViewHolder(v); } - public abstract void onBindViewHolderAtZeroPosition(SubSettingViewHolder holder); + protected abstract void onBindViewHolderAtZeroPosition(SubSettingViewHolder holder); - public abstract void onTrackSelection(String subtext); + protected abstract void onTrackSelection(String subtext); @Override public void onBindViewHolder(SubSettingViewHolder holder, int position) { - if (trackSelector == null || mappedTrackInfo == null) { + if (player == null) { return; } if (position == 0) { onBindViewHolderAtZeroPosition(holder); } else { - TrackInfo track = tracks.get(position - 1); - TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(track.rendererIndex); + TrackInformation track = tracks.get(position - 1); boolean explicitlySelected = - checkNotNull(trackSelector) - .getParameters() - .hasSelectionOverride(track.rendererIndex, trackGroups) - && track.selected; + checkNotNull(player) + .getTrackSelectionParameters() + .trackSelectionOverrides + .containsKey(track.trackGroup) + && track.isSelected(); holder.textView.setText(track.trackName); holder.checkView.setVisibility(explicitlySelected ? VISIBLE : INVISIBLE); holder.itemView.setOnClickListener( v -> { - if (mappedTrackInfo != null && trackSelector != null) { - ParametersBuilder parametersBuilder = trackSelector.getParameters().buildUpon(); - for (int i = 0; i < rendererIndices.size(); i++) { - int rendererIndex = rendererIndices.get(i); - if (rendererIndex == track.rendererIndex) { - parametersBuilder = - parametersBuilder - .setSelectionOverride( - rendererIndex, - checkNotNull(mappedTrackInfo).getTrackGroups(rendererIndex), - new SelectionOverride(track.groupIndex, track.trackIndex)) - .setRendererDisabled(rendererIndex, false); - } else { - parametersBuilder = - parametersBuilder - .clearSelectionOverrides(rendererIndex) - .setRendererDisabled(rendererIndex, true); - } - } - checkNotNull(trackSelector).setParameters(parametersBuilder); - onTrackSelection(track.trackName); - settingsWindow.dismiss(); + if (player == null) { + return; } + TrackSelectionParameters trackSelectionParameters = + player.getTrackSelectionParameters(); + Map overrides = + forceTrackSelection( + trackSelectionParameters.trackSelectionOverrides, + track.tracksInfo, + track.trackGroupIndex, + new TrackSelectionOverride(ImmutableSet.of(track.trackIndex))); + checkNotNull(player) + .setTrackSelectionParameters( + trackSelectionParameters + .buildUpon() + .setTrackSelectionOverrides(overrides) + .build()); + onTrackSelection(track.trackName); + settingsWindow.dismiss(); }); } } @@ -2236,9 +2208,8 @@ public class StyledPlayerControlView extends FrameLayout { return tracks.isEmpty() ? 0 : tracks.size() + 1; } - public void clear() { + protected void clear() { tracks = Collections.emptyList(); - mappedTrackInfo = null; } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 24bf154c77..e1263622d4 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -48,7 +48,6 @@ import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; @@ -58,12 +57,9 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Period; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.ResizeMode; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ErrorMessageProvider; -import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoSize; @@ -1296,7 +1292,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { private void updateForCurrentTrackSelections(boolean isNewPlayer) { @Nullable Player player = this.player; - if (player == null || player.getCurrentTrackGroups().isEmpty()) { + if (player == null || player.getCurrentTracksInfo().getTrackGroupInfos().isEmpty()) { if (!keepContentOnPlayerReset) { hideArtwork(); closeShutter(); @@ -1309,20 +1305,11 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { closeShutter(); } - TrackSelectionArray trackSelections = player.getCurrentTrackSelections(); - for (int i = 0; i < trackSelections.length; i++) { - @Nullable TrackSelection trackSelection = trackSelections.get(i); - if (trackSelection != null) { - for (int j = 0; j < trackSelection.length(); j++) { - Format format = trackSelection.getFormat(j); - if (MimeTypes.getTrackType(format.sampleMimeType) == C.TRACK_TYPE_VIDEO) { - // Video enabled, so artwork must be hidden. If the shutter is closed, it will be opened - // in onRenderedFirstFrame(). - hideArtwork(); - return; - } - } - } + if (player.getCurrentTracksInfo().isTypeSelected(C.TRACK_TYPE_VIDEO)) { + // Video enabled, so artwork must be hidden. If the shutter is closed, it will be opened + // in onRenderedFirstFrame(). + hideArtwork(); + return; } // Video disabled so the shutter must be closed. @@ -1558,7 +1545,7 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty()) { lastPeriodUidWithTracks = null; - } else if (!player.getCurrentTrackGroups().isEmpty()) { + } else if (!player.getCurrentTracksInfo().getTrackGroupInfos().isEmpty()) { lastPeriodUidWithTracks = timeline.getPeriod(player.getCurrentPeriodIndex(), period, /* setIds= */ true).uid; } else if (lastPeriodUidWithTracks != null) { From 3b8eba2deac218b66624e4b9bb0c789c6a03489d Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 13 Oct 2021 16:58:04 +0100 Subject: [PATCH 322/441] Refactor `initTrackSelectionAdapter` As suggested in parent change, return a list of `TrackType` instead of appending to it. This has the slight disadvantage of iterating twice over the (short) list, but clarifies the code. PiperOrigin-RevId: 402844458 --- .../ui/StyledPlayerControlView.java | 57 ++++++++----------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 34e9786cfd..68e828bd2f 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -62,7 +62,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; @@ -76,6 +75,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Tra import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; @@ -1251,42 +1251,35 @@ public class StyledPlayerControlView extends FrameLayout { return; } TracksInfo tracksInfo = player.getCurrentTracksInfo(); - List trackGroupInfos = tracksInfo.getTrackGroupInfos(); - if (trackGroupInfos.isEmpty()) { - return; + audioTrackSelectionAdapter.init( + gatherSupportedTrackInfosOfType(tracksInfo, C.TRACK_TYPE_AUDIO)); + if (controlViewLayoutManager.getShowButton(subtitleButton)) { + textTrackSelectionAdapter.init( + gatherSupportedTrackInfosOfType(tracksInfo, C.TRACK_TYPE_TEXT)); + } else { + textTrackSelectionAdapter.init(ImmutableList.of()); } - List textTracks = new ArrayList<>(); - List audioTracks = new ArrayList<>(); - for (int trackGroupIndex = 0; trackGroupIndex < trackGroupInfos.size(); trackGroupIndex++) { - TrackGroupInfo trackGroupInfo = trackGroupInfos.get(trackGroupIndex); - if (!trackGroupInfo.isSupported()) { - continue; - } - if (trackGroupInfo.getTrackType() == C.TRACK_TYPE_TEXT - && controlViewLayoutManager.getShowButton(subtitleButton)) { - // Get TrackSelection at the corresponding renderer index. - gatherTrackInfosForAdapter(tracksInfo, trackGroupIndex, textTracks); - } else if (trackGroupInfo.getTrackType() == C.TRACK_TYPE_AUDIO) { - gatherTrackInfosForAdapter(tracksInfo, trackGroupIndex, audioTracks); - } - } - textTrackSelectionAdapter.init(textTracks); - audioTrackSelectionAdapter.init(audioTracks); } - private void gatherTrackInfosForAdapter( - TracksInfo tracksInfo, int trackGroupIndex, List tracks) { - - TrackGroupInfo trackGroupInfo = tracksInfo.getTrackGroupInfos().get(trackGroupIndex); - TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); - for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { - Format format = trackGroup.getFormat(trackIndex); - if (trackGroupInfo.isTrackSupported(trackIndex)) { - tracks.add( - new TrackInformation( - tracksInfo, trackGroupIndex, trackIndex, trackNameProvider.getTrackName(format))); + private ImmutableList gatherSupportedTrackInfosOfType( + TracksInfo tracksInfo, @C.TrackType int trackType) { + ImmutableList.Builder tracks = new ImmutableList.Builder<>(); + List trackGroupInfos = tracksInfo.getTrackGroupInfos(); + for (int trackGroupIndex = 0; trackGroupIndex < trackGroupInfos.size(); trackGroupIndex++) { + TrackGroupInfo trackGroupInfo = trackGroupInfos.get(trackGroupIndex); + if (trackGroupInfo.getTrackType() != trackType) { + continue; + } + TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + if (!trackGroupInfo.isTrackSupported(trackIndex)) { + continue; + } + String trackName = trackNameProvider.getTrackName(trackGroup.getFormat(trackIndex)); + tracks.add(new TrackInformation(tracksInfo, trackGroupIndex, trackIndex, trackName)); } } + return tracks.build(); } private void updateTimeline() { From 3c19850ed3c3c2cf45a21ecbb7c4761c984fa1a9 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 13 Oct 2021 17:37:08 +0100 Subject: [PATCH 323/441] Migrate library usages of SimpleExoPlayer to ExoPlayer. PiperOrigin-RevId: 402853522 --- .../exoplayer2/castdemo/MainActivity.java | 6 +- .../exoplayer2/castdemo/PlayerManager.java | 3 +- .../exoplayer2/gldemo/MainActivity.java | 5 +- .../exoplayer2/demo/PlayerActivity.java | 5 +- .../exoplayer2/surfacedemo/MainActivity.java | 5 +- docs/ad-insertion.md | 4 +- docs/analytics.md | 6 +- docs/customization.md | 24 +- docs/dash.md | 4 +- docs/debug-logging.md | 2 +- docs/downloading-media.md | 2 +- docs/hello-world.md | 22 +- docs/hls.md | 4 +- docs/listening-to-player-events.md | 10 +- docs/live-streaming.md | 4 +- docs/media-sources.md | 2 +- docs/network-stacks.md | 6 +- docs/playlists.md | 4 +- docs/progressive.md | 4 +- docs/rtsp.md | 4 +- docs/shrinking.md | 12 +- docs/smoothstreaming.md | 4 +- docs/track-selection.md | 2 +- docs/troubleshooting.md | 6 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 3 +- .../exoplayer2/ext/ima/ImaPlaybackTest.java | 6 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 3 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 3 +- .../exoplayer2/ClippedPlaybackTest.java | 4 +- .../exoplayer2/drm/DrmPlaybackTest.java | 3 +- .../android/exoplayer2/RenderersFactory.java | 4 +- .../exoplayer2/util/DebugTextViewHelper.java | 10 +- .../android/exoplayer2/ExoPlayerTest.java | 340 +++++++++--------- .../analytics/AnalyticsCollectorTest.java | 23 +- .../analytics/PlaybackStatsListenerTest.java | 4 +- .../e2etest/EndToEndGaplessTest.java | 3 +- .../exoplayer2/e2etest/FlacPlaybackTest.java | 3 +- .../exoplayer2/e2etest/FlvPlaybackTest.java | 3 +- .../exoplayer2/e2etest/MkaPlaybackTest.java | 3 +- .../exoplayer2/e2etest/MkvPlaybackTest.java | 3 +- .../exoplayer2/e2etest/Mp3PlaybackTest.java | 3 +- .../exoplayer2/e2etest/Mp4PlaybackTest.java | 3 +- .../exoplayer2/e2etest/OggPlaybackTest.java | 3 +- .../e2etest/PlaylistPlaybackTest.java | 5 +- .../e2etest/SilencePlaybackTest.java | 5 +- .../exoplayer2/e2etest/TsPlaybackTest.java | 3 +- .../exoplayer2/e2etest/Vp9PlaybackTest.java | 3 +- .../exoplayer2/e2etest/WavPlaybackTest.java | 3 +- .../ServerSideInsertedAdMediaSourceTest.java | 9 +- .../source/dash/e2etest/DashPlaybackTest.java | 5 +- .../source/rtsp/RtspPlaybackTest.java | 11 +- .../transformer/TranscodingTransformer.java | 3 +- .../exoplayer2/transformer/Transformer.java | 3 +- .../playbacktests/gts/DashTestRunner.java | 5 +- .../robolectric/TestPlayerRunHelper.java | 7 +- .../android/exoplayer2/testutil/Action.java | 109 +++--- .../exoplayer2/testutil/ActionSchedule.java | 31 +- .../exoplayer2/testutil/ExoHostedTest.java | 7 +- .../testutil/ExoPlayerTestRunner.java | 7 +- 59 files changed, 377 insertions(+), 416 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java index b2b4d49555..478f11d74f 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java @@ -37,8 +37,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.util.Assertions; @@ -48,8 +48,8 @@ import com.google.android.gms.cast.framework.CastContext; import com.google.android.gms.dynamite.DynamiteModule; /** - * An activity that plays video using {@link SimpleExoPlayer} and supports casting using ExoPlayer's - * Cast extension. + * An activity that plays video using {@link ExoPlayer} and supports casting using ExoPlayer's Cast + * extension. */ public class MainActivity extends AppCompatActivity implements OnClickListener, PlayerManager.Listener { diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 4853229c50..0c9406227d 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -25,7 +25,6 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Player.TimelineChangeReason; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.ext.cast.CastPlayer; @@ -64,7 +63,7 @@ import java.util.ArrayList; private Player currentPlayer; /** - * Creates a new manager for {@link SimpleExoPlayer} and {@link CastPlayer}. + * Creates a new manager for {@link ExoPlayer} and {@link CastPlayer}. * * @param listener A {@link Listener} for queue position changes. * @param localPlayerView The {@link PlayerView} for local playback. diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index 7488d94f98..5b513e93f5 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java @@ -27,7 +27,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; @@ -65,7 +64,7 @@ public final class MainActivity extends Activity { @Nullable private PlayerView playerView; @Nullable private VideoProcessingGLSurfaceView videoProcessingGLSurfaceView; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -173,7 +172,7 @@ public final class MainActivity extends Activity { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); + ExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setRepeatMode(Player.REPEAT_MODE_ALL); player.setMediaSource(mediaSource); player.prepare(); diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index aaad17aaa8..d0f84a401a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -37,7 +37,6 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; @@ -61,7 +60,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; -/** An activity that plays media using {@link SimpleExoPlayer}. */ +/** An activity that plays media using {@link ExoPlayer}. */ public class PlayerActivity extends AppCompatActivity implements OnClickListener, StyledPlayerControlView.VisibilityListener { @@ -75,7 +74,7 @@ public class PlayerActivity extends AppCompatActivity protected StyledPlayerView playerView; protected LinearLayout debugRootView; protected TextView debugTextView; - protected @Nullable SimpleExoPlayer player; + protected @Nullable ExoPlayer player; private boolean isShowingTrackSelectionDialog; private Button selectTracksButton; diff --git a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java index 44dd9d423b..c9abfcef14 100644 --- a/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java +++ b/demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java @@ -31,7 +31,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; @@ -67,7 +66,7 @@ public final class MainActivity extends Activity { @Nullable private SurfaceView nonFullScreenView; @Nullable private SurfaceView currentOutputView; - @Nullable private static SimpleExoPlayer player; + @Nullable private static ExoPlayer player; @Nullable private static SurfaceControl surfaceControl; @Nullable private static Surface videoSurface; @@ -217,7 +216,7 @@ public final class MainActivity extends Activity { } else { throw new IllegalStateException(); } - SimpleExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); + ExoPlayer player = new ExoPlayer.Builder(getApplicationContext()).build(); player.setMediaSource(mediaSource); player.prepare(); player.play(); diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 544488f14c..0886ca6a92 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -53,7 +53,7 @@ MediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setAdsLoaderProvider(adsLoaderProvider) .setAdViewProvider(playerView); -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); ~~~ @@ -209,7 +209,7 @@ events to an ad SDK or ad server. For example, the media stream may include timed events that need to be reported by the client (see [supported formats][] for information on what timed metadata formats are supported by ExoPlayer). Apps can listen for timed metadata events from the player, e.g., via -`SimpleExoPlayer.addMetadataOutput`. +`ExoPlayer.addMetadataOutput`. The IMA extension currently only handles client-side ad insertion. It does not provide any integration with the DAI part of the IMA SDK. diff --git a/docs/analytics.md b/docs/analytics.md index 149fc52022..f748cc1885 100644 --- a/docs/analytics.md +++ b/docs/analytics.md @@ -44,7 +44,7 @@ implementations. You can easily add your own listener and override only the methods you are interested in: ~~~ -simpleExoPlayer.addAnalyticsListener(new AnalyticsListener() { +exoPlayer.addAnalyticsListener(new AnalyticsListener() { @Override public void onPlaybackStateChanged( EventTime eventTime, @Player.State int state) { @@ -98,7 +98,7 @@ current playback session at any time using `PlaybackStatsListener.getPlaybackStats()`. ~~~ -simpleExoPlayer.addAnalyticsListener( +exoPlayer.addAnalyticsListener( new PlaybackStatsListener( /* keepHistory= */ true, (eventTime, playbackStats) -> { // Analytics data for the session started at `eventTime` is ready. @@ -246,7 +246,7 @@ class ExtendedCollector extends AnalyticsCollector { } // Usage - Setup and listener registration. -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setAnalyticsCollector(new ExtendedCollector()) .build(); player.addAnalyticsListener(new ExtendedListener() { diff --git a/docs/customization.md b/docs/customization.md index 7cf0077b5d..6be6d39e77 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -4,13 +4,13 @@ title: Customization 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 implementations `ExoPlayer` and -`SimpleExoPlayer` are designed to make few assumptions about (and hence impose -few restrictions on) the type of media being played, how and where it is stored, -and how it is rendered. Rather than implementing the loading and rendering of -media directly, `ExoPlayer` implementations delegate this work to components -that are injected when a player is created or when new media sources are passed -to the player. Components common to all `ExoPlayer` implementations are: +buffer media, play, pause and seek. The default implementation `ExoPlayer` is +designed to make few assumptions about (and hence impose few restrictions on) +the type of media being played, how and where it is stored, and how it is +rendered. Rather than implementing the loading and rendering of media directly, +`ExoPlayer` implementations delegate this work to components that are injected +when a player is created or when new media sources are passed to the player. +Components common to all `ExoPlayer` implementations are: * `MediaSource` instances that define media to be played, load the media, and from which the loaded media can be read. `MediaSource` instances are created @@ -59,7 +59,7 @@ DefaultDataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(context, httpDataSourceFactory); // Inject the DefaultDataSourceFactory when creating the player. -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); @@ -82,7 +82,7 @@ DataSource.Factory cacheDataSourceFactory = .setCache(simpleCache) .setUpstreamDataSourceFactory(httpDataSourceFactory); -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(cacheDataSourceFactory)) .build(); @@ -107,7 +107,7 @@ DataSource.Factory dataSourceFactory = () -> { return dataSource; }; -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); ~~~ @@ -157,7 +157,7 @@ LoadErrorHandlingPolicy loadErrorHandlingPolicy = } }; -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context) @@ -181,7 +181,7 @@ DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory() .setMp3ExtractorFlags(Mp3Extractor.FLAG_ENABLE_INDEX_SEEKING); -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context, extractorsFactory)) .build(); diff --git a/docs/dash.md b/docs/dash.md index 57159c0d6e..88cc667913 100644 --- a/docs/dash.md +++ b/docs/dash.md @@ -17,7 +17,7 @@ You can then create a `MediaItem` for a DASH MPD URI and pass it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. @@ -45,7 +45,7 @@ MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/debug-logging.md b/docs/debug-logging.md index 25ea13ccf5..c7d5a652ea 100644 --- a/docs/debug-logging.md +++ b/docs/debug-logging.md @@ -6,7 +6,7 @@ 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 issues. `EventLogger` implements `AnalyticsListener`, so registering an instance -with a `SimpleExoPlayer` is easy: +with an `ExoPlayer` is easy: ``` player.addAnalyticsListener(new EventLogger(trackSelector)); diff --git a/docs/downloading-media.md b/docs/downloading-media.md index d18438c77b..e724d0cd4a 100644 --- a/docs/downloading-media.md +++ b/docs/downloading-media.md @@ -322,7 +322,7 @@ DataSource.Factory cacheDataSourceFactory = .setUpstreamDataSourceFactory(httpDataSourceFactory) .setCacheWriteDataSinkFactory(null); // Disable writing. -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(cacheDataSourceFactory)) .build(); diff --git a/docs/hello-world.md b/docs/hello-world.md index d6986c52be..9ad62fb617 100644 --- a/docs/hello-world.md +++ b/docs/hello-world.md @@ -14,7 +14,7 @@ For simple use cases, getting started with `ExoPlayer` consists of implementing the following steps: 1. Add ExoPlayer as a dependency to your project. -1. Create a `SimpleExoPlayer` instance. +1. Create an `ExoPlayer` instance. 1. Attach the player to a view (for video output and user input). 1. Prepare the player with a `MediaItem` to play. 1. Release the player when done. @@ -97,7 +97,7 @@ a range of customization options. The code below is the simplest example of creating an instance. ~~~ -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); ~~~ {: .language-java} @@ -117,12 +117,12 @@ which the player must be accessed can be queried using `Player.getApplicationLooper`. If you see `IllegalStateException` being thrown with the message "Player is -accessed on the wrong thread", then some code in your app is accessing a -`SimpleExoPlayer` instance on the wrong thread (the exception's stack trace -shows you where). You can temporarily opt out from these exceptions being thrown -by calling `SimpleExoPlayer.setThrowsWhenUsingWrongThread(false)`, in which case -the issue will be logged as a warning instead. Using this opt out is not safe -and may result in unexpected or obscure errors. It will be removed in ExoPlayer +accessed on the wrong thread", then some code in your app is accessing an +`ExoPlayer` instance on the wrong thread (the exception's stack trace shows you +where). You can temporarily opt out from these exceptions being thrown by +calling `ExoPlayer.setThrowsWhenUsingWrongThread(false)`, in which case the +issue will be logged as a warning instead. Using this opt out is not safe and +may result in unexpected or obscure errors. It will be removed in ExoPlayer 2.16. {:.info} @@ -148,10 +148,10 @@ useful for audio only use cases. Use of ExoPlayer's pre-built UI components is optional. For video applications that implement their own UI, the target `SurfaceView`, `TextureView`, -`SurfaceHolder` or `Surface` can be set using `SimpleExoPlayer`'s +`SurfaceHolder` or `Surface` can be set using `ExoPlayer`'s `setVideoSurfaceView`, `setVideoTextureView`, `setVideoSurfaceHolder` and -`setVideoSurface` methods respectively. `SimpleExoPlayer`'s `addTextOutput` -method can be used to receive captions that should be rendered during playback. +`setVideoSurface` methods respectively. `ExoPlayer`'s `addTextOutput` method can +be used to receive captions that should be rendered during playback. ## Populating the playlist and preparing the player ## diff --git a/docs/hls.md b/docs/hls.md index f3bd225b09..adb750e02a 100644 --- a/docs/hls.md +++ b/docs/hls.md @@ -18,7 +18,7 @@ player. ~~~ // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)); // Prepare the player. @@ -48,7 +48,7 @@ HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(hlsUri)); // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(hlsMediaSource); // Prepare the player. diff --git a/docs/listening-to-player-events.md b/docs/listening-to-player-events.md index de23a32c2b..99af0b6678 100644 --- a/docs/listening-to-player-events.md +++ b/docs/listening-to-player-events.md @@ -180,15 +180,15 @@ together in `onEvents`. ## Using AnalyticsListener ## -When using `SimpleExoPlayer`, an `AnalyticsListener` can be registered with the -player by calling `addAnalyticsListener`. `AnalyticsListener` implementations -are able to listen to detailed events that may be useful for analytics and -logging purposes. Please refer to the [analytics page][] for more details. +When using `ExoPlayer`, an `AnalyticsListener` can be registered with the player +by calling `addAnalyticsListener`. `AnalyticsListener` implementations are able +to listen to detailed events that may be useful for analytics and logging +purposes. Please refer to the [analytics page][] for more details. ### Using EventLogger ### `EventLogger` is an `AnalyticsListener` provided directly by the library for -logging purposes. It can be added to a `SimpleExoPlayer` to enable useful +logging purposes. It can be added to an `ExoPlayer` to enable useful additional logging with a single line. ``` diff --git a/docs/live-streaming.md b/docs/live-streaming.md index 5b09d0af68..d24d0f4dd0 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -96,7 +96,7 @@ values will override parameters defined by the media. ~~~ // Global settings. -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000)) @@ -166,7 +166,7 @@ implementation, which is `DefaultLivePlaybackSpeedControl`. In both cases an instance can be set when building the player: ~~~ -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( new DefaultLivePlaybackSpeedControl.Builder() diff --git a/docs/media-sources.md b/docs/media-sources.md index c280739342..7cfde4af3b 100644 --- a/docs/media-sources.md +++ b/docs/media-sources.md @@ -37,7 +37,7 @@ MediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(cacheDataSourceFactory) .setAdsLoaderProvider(adsLoaderProvider) .setAdViewProvider(playerView); -SimpleExoPlayer player = new ExoPlayer.Builder(context) +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(mediaSourceFactory) .build(); ~~~ diff --git a/docs/network-stacks.md b/docs/network-stacks.md index b2db3a65b3..5b791bfaca 100644 --- a/docs/network-stacks.md +++ b/docs/network-stacks.md @@ -32,8 +32,8 @@ where `PreferredHttpDataSource.Factory` is the factory corresponding to your preferred network stack. The `DefaultDataSourceFactory` layer adds in support for non-http(s) sources such as local files. -The example below shows how to build a `SimpleExoPlayer` that will use -the Cronet network stack and also support playback of non-http(s) content. +The example below shows how to build an `ExoPlayer` that will use the Cronet +network stack and also support playback of non-http(s) content. ~~~ // Given a CronetEngine and Executor, build a CronetDataSource.Factory. @@ -49,7 +49,7 @@ DefaultDataSource.Factory dataSourceFactory = /* baseDataSourceFactory= */ cronetDataSourceFactory); // Inject the DefaultDataSourceFactory when creating the player. -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory)) .build(); diff --git a/docs/playlists.md b/docs/playlists.md index 85770396f0..e17e6ef452 100644 --- a/docs/playlists.md +++ b/docs/playlists.md @@ -166,9 +166,9 @@ This can be customized by providing a custom shuffle order implementation: ~~~ // Set the custom shuffle order. -simpleExoPlayer.setShuffleOrder(shuffleOrder); +exoPlayer.setShuffleOrder(shuffleOrder); // Enable shuffle mode. -simpleExoPlayer.setShuffleModeEnabled(/* shuffleModeEnabled= */ true); +exoPlayer.setShuffleModeEnabled(/* shuffleModeEnabled= */ true); ~~~ {: .language-java} diff --git a/docs/progressive.md b/docs/progressive.md index cf9e242ba1..26a8002f39 100644 --- a/docs/progressive.md +++ b/docs/progressive.md @@ -11,7 +11,7 @@ it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(progressiveUri)); // Prepare the player. @@ -31,7 +31,7 @@ DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(progressiveUri)); // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/rtsp.md b/docs/rtsp.md index 7af42ec888..9c4cd38753 100644 --- a/docs/rtsp.md +++ b/docs/rtsp.md @@ -17,7 +17,7 @@ You can then create a `MediaItem` for an RTSP URI and pass it to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(rtspUri)); // Prepare the player. @@ -43,7 +43,7 @@ MediaSource mediaSource = new RtspMediaSource.Factory() .createMediaSource(MediaItem.fromUri(rtspUri)); // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/shrinking.md b/docs/shrinking.md index 53e753dc15..5506e742c2 100644 --- a/docs/shrinking.md +++ b/docs/shrinking.md @@ -49,7 +49,7 @@ By default, the player's renderers will be created using none of them will be removed by code shrinking. If you know that your app only needs a subset of renderers, you can specify your own `RenderersFactory` instead. For example, an app that only plays audio can define a factory like -this when instantiating `SimpleExoPlayer` instances: +this when instantiating `ExoPlayer` instances: ~~~ RenderersFactory audioOnlyRenderersFactory = @@ -58,7 +58,7 @@ RenderersFactory audioOnlyRenderersFactory = new MediaCodecAudioRenderer( context, MediaCodecSelector.DEFAULT, handler, audioListener) }; -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context, audioOnlyRenderersFactory).build(); ~~~ {: .language-java} @@ -80,7 +80,7 @@ an app that only needs to play mp4 files can provide a factory like: ~~~ ExtractorsFactory mp4ExtractorFactory = () -> new Extractor[] {new Mp4Extractor()}; -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context, mp4ExtractorFactory).build(); ~~~ {: .language-java} @@ -98,18 +98,18 @@ constructor, if your app is doing one of the following: ~~~ // Only playing DASH, HLS or SmoothStreaming. -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); // Providing a customized `DefaultMediaSourceFactory` -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY) .setMediaSourceFactory( new DefaultMediaSourceFactory(context, customExtractorsFactory)) .build(); // Using a MediaSource directly. -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory( diff --git a/docs/smoothstreaming.md b/docs/smoothstreaming.md index 6039046731..94b3dce089 100644 --- a/docs/smoothstreaming.md +++ b/docs/smoothstreaming.md @@ -19,7 +19,7 @@ to the player. ~~~ // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(ssUri)); // Prepare the player. @@ -47,7 +47,7 @@ MediaSource mediaSource = new SsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(ssUri)); // Create a player instance. -SimpleExoPlayer player = new ExoPlayer.Builder(context).build(); +ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. diff --git a/docs/track-selection.md b/docs/track-selection.md index 206ccbf8fb..4dd71b5046 100644 --- a/docs/track-selection.md +++ b/docs/track-selection.md @@ -8,7 +8,7 @@ of which can be provided whenever an `ExoPlayer` is built. ~~~ DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); -SimpleExoPlayer player = +ExoPlayer player = new ExoPlayer.Builder(context) .setTrackSelector(trackSelector) .build(); diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 766f6e708a..80c922b615 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -230,7 +230,7 @@ audio when your app is in the background: from killing your process to free up resources. 1. You need to hold a [`WifiLock`][] and a [`WakeLock`][]. These ensure that the system keeps the WiFi radio and CPU awake. This can be easily done if using - [`SimpleExoPlayer`][] by calling [`setWakeMode`][], which will automatically + [`ExoPlayer`][] by calling [`setWakeMode`][], which will automatically acquire and release the required locks at the correct times. It's important that you release the locks (if not using `setWakeMode`) and stop @@ -335,8 +335,8 @@ is the official way to play YouTube videos on Android. [foreground service]: https://developer.android.com/guide/components/services.html#Foreground [`WifiLock`]: {{ site.android_sdk }}/android/net/wifi/WifiManager.WifiLock.html [`WakeLock`]: {{ site.android_sdk }}/android/os/PowerManager.WakeLock.html -[`SimpleExoPlayer`]: {{ site.exo_sdk }}/SimpleExoPlayer.html -[`setWakeMode`]: {{ site.exo_sdk }}/SimpleExoPlayer.html#setWakeMode(int) +[`ExoPlayer`]: {{ site.exo_sdk }}/ExoPlayer.html +[`setWakeMode`]: {{ site.exo_sdk }}/ExoPlayer.html#setWakeMode(int) [A note on threading]: {{ site.base_url }}/hello-world.html#a-note-on-threading [OkHttp extension]: {{ site.release_v2 }}/extensions/okhttp [CORS enabled]: https://www.w3.org/wiki/CORS_Enabled diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index f5886505a9..925e466a83 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink; @@ -96,7 +95,7 @@ public class FlacPlaybackTest { private final Uri uri; private final AudioSink audioSink; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @Nullable private PlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context, AudioSink audioSink) { diff --git a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java index d467743dfa..5c1cd37551 100644 --- a/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java +++ b/extensions/ima/src/androidTest/java/com/google/android/exoplayer2/ext/ima/ImaPlaybackTest.java @@ -25,11 +25,11 @@ import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; import com.google.android.exoplayer2.Player.TimelineChangeReason; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline.Window; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.decoder.DecoderCounters; @@ -192,7 +192,7 @@ public final class ImaPlaybackTest { private final List expectedAdIds; private final List seenAdIds; private @MonotonicNonNull ImaAdsLoader imaAdsLoader; - private @MonotonicNonNull SimpleExoPlayer player; + private @MonotonicNonNull ExoPlayer player; private ImaHostedTest(Uri contentUri, String adsResponse, AdId... expectedAdIds) { // fullPlaybackNoSeeking is false as the playback lasts longer than the content source @@ -207,7 +207,7 @@ public final class ImaPlaybackTest { } @Override - protected SimpleExoPlayer buildExoPlayer( + protected ExoPlayer buildExoPlayer( HostActivity host, Surface surface, MappingTrackSelector trackSelector) { player = super.buildExoPlayer(host, surface, trackSelector); player.addAnalyticsListener( diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index a398399068..86aa2e1f34 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; @@ -79,7 +78,7 @@ public class OpusPlaybackTest { private final Context context; private final Uri uri; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @Nullable private PlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context) { diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 544418bd51..7df4ebdb40 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -30,7 +30,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; @@ -107,7 +106,7 @@ public class VpxPlaybackTest { private final Context context; private final Uri uri; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @Nullable private PlaybackException playbackException; public TestPlaybackRunnable(Uri uri, Context context) { diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java index a8f0697167..8cbfd9d552 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/ClippedPlaybackTest.java @@ -54,7 +54,7 @@ public final class ClippedPlaybackTest { // Expect the clipping to affect both subtitles and video. .setClipEndPositionMs(1000) .build(); - AtomicReference player = new AtomicReference<>(); + AtomicReference player = new AtomicReference<>(); TextCapturingPlaybackListener textCapturer = new TextCapturingPlaybackListener(); getInstrumentation() .runOnMainSync( @@ -96,7 +96,7 @@ public final class ClippedPlaybackTest { // subtitle content (3.5s). .setClipEndPositionMs(4_000) .build()); - AtomicReference player = new AtomicReference<>(); + AtomicReference player = new AtomicReference<>(); TextCapturingPlaybackListener textCapturer = new TextCapturingPlaybackListener(); getInstrumentation() .runOnMainSync( diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java index c342e9a1a7..f2ad44440a 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/drm/DrmPlaybackTest.java @@ -24,7 +24,6 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.util.ConditionVariable; import java.util.concurrent.atomic.AtomicReference; import okhttp3.mockwebserver.MockResponse; @@ -64,7 +63,7 @@ public final class DrmPlaybackTest { .setLicenseUri(mockWebServer.url("license").toString()) .build()) .build(); - AtomicReference player = new AtomicReference<>(); + AtomicReference player = new AtomicReference<>(); ConditionVariable playbackComplete = new ConditionVariable(); AtomicReference playbackException = new AtomicReference<>(); getInstrumentation() diff --git a/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java index fba0ca247b..d012bfaaed 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/RenderersFactory.java @@ -21,11 +21,11 @@ import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.video.VideoRendererEventListener; -/** Builds {@link Renderer} instances for use by a {@link SimpleExoPlayer}. */ +/** Builds {@link Renderer} instances for use by an {@link ExoPlayer}. */ public interface RenderersFactory { /** - * Builds the {@link Renderer} instances for a {@link SimpleExoPlayer}. + * Builds the {@link Renderer} instances for an {@link ExoPlayer}. * * @param eventHandler A handler to use when invoking event listeners and outputs. * @param videoRendererEventListener An event listener for video renderers. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java index 9c11f37fb5..5eeaa060bc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java @@ -18,32 +18,32 @@ package com.google.android.exoplayer2.util; import android.annotation.SuppressLint; import android.os.Looper; import android.widget.TextView; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.decoder.DecoderCounters; import java.util.Locale; /** * A helper class for periodically updating a {@link TextView} with debug information obtained from - * a {@link SimpleExoPlayer}. + * an {@link ExoPlayer}. */ public class DebugTextViewHelper implements Player.Listener, Runnable { private static final int REFRESH_INTERVAL_MS = 1000; - private final SimpleExoPlayer player; + private final ExoPlayer player; private final TextView textView; private boolean started; /** - * @param player The {@link SimpleExoPlayer} from which debug information should be obtained. Only + * @param player The {@link ExoPlayer} from which debug information should be obtained. Only * players which are accessed on the main thread are supported ({@code * player.getApplicationLooper() == Looper.getMainLooper()}). * @param textView The {@link TextView} that should be updated to display the information. */ - public DebugTextViewHelper(SimpleExoPlayer player, TextView textView) { + public DebugTextViewHelper(ExoPlayer player, TextView textView) { Assertions.checkArgument(player.getApplicationLooper() == Looper.getMainLooper()); this.player = player; this.textView = textView; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 876835c906..cbbd860b00 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -206,7 +206,7 @@ public final class ExoPlayerTest { new MaskingMediaSource.PlaceholderTimeline(FakeMediaSource.FAKE_MEDIA_ITEM); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_UNKNOWN); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); @@ -237,7 +237,7 @@ public final class ExoPlayerTest { public void playSinglePeriodTimeline() throws Exception { Timeline timeline = new FakeTimeline(); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); @@ -272,7 +272,7 @@ public final class ExoPlayerTest { public void playMultiPeriodTimeline() throws Exception { Timeline timeline = new FakeTimeline(/* windowCount= */ 3); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -310,7 +310,7 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(new TimelineWindowDefinition(/* periodCount= */ 100, /* id= */ 0)); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -342,7 +342,7 @@ public final class ExoPlayerTest { Timeline timeline = new FakeTimeline(); final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(videoRenderer, audioRenderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -366,7 +366,7 @@ public final class ExoPlayerTest { final FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); final FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(videoRenderer, audioRenderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -404,7 +404,7 @@ public final class ExoPlayerTest { final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); Format textFormat = new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).setLanguage("en").build(); - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(audioRenderer, textRenderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -440,7 +440,7 @@ public final class ExoPlayerTest { final FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); Format textFormat = new Format.Builder().setSampleMimeType(MimeTypes.TEXT_VTT).setLanguage("en").build(); - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context) .setRenderers(videoRenderer, audioRenderer, textRenderer) .build(); @@ -531,7 +531,7 @@ public final class ExoPlayerTest { return videoRenderer.isEnded(); } }; - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(videoRenderer, audioRenderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -581,7 +581,7 @@ public final class ExoPlayerTest { }; Timeline thirdTimeline = new FakeTimeline(); MediaSource thirdSource = new FakeMediaSource(thirdTimeline, ExoPlayerTestRunner.VIDEO_FORMAT); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); Player.Listener mockPlayerListener = mock(Player.Listener.class); player.addListener(mockPlayerListener); @@ -639,7 +639,7 @@ public final class ExoPlayerTest { public void repeatModeChanges() throws Exception { Timeline timeline = new FakeTimeline(/* windowCount= */ 3); FakeRenderer renderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(renderer).build(); AnalyticsListener mockAnalyticsListener = mock(AnalyticsListener.class); player.addAnalyticsListener(mockAnalyticsListener); @@ -803,7 +803,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { try { player.seekTo(/* windowIndex= */ 100, /* positionMs= */ 0); } catch (IllegalSeekPositionException e) { @@ -1196,7 +1196,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { try { player.getClock().onThreadBlocked(); createPeriodCalledCountDownLatch.await(); @@ -1273,7 +1273,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionWhenReady.set(player.getCurrentPosition()); } }) @@ -1306,7 +1306,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[0] = player.getCurrentWindowIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); @@ -1322,7 +1322,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[2] = player.getCurrentWindowIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); @@ -1398,7 +1398,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[0] = player.getCurrentWindowIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); @@ -1414,7 +1414,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[2] = player.getCurrentWindowIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); @@ -1492,7 +1492,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[0] = player.getCurrentWindowIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); @@ -1508,7 +1508,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndex[2] = player.getCurrentWindowIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); @@ -1559,7 +1559,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndexAfterStop.set(player.getCurrentWindowIndex()); positionAfterStop.set(player.getCurrentPosition()); } @@ -1627,7 +1627,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionAfterReprepare.set(player.getCurrentPosition()); } }) @@ -1681,7 +1681,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionAfterReprepare.set(player.getCurrentPosition()); } }) @@ -1738,7 +1738,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionAfterReprepare.set(player.getCurrentPosition()); } }) @@ -1846,7 +1846,7 @@ public final class ExoPlayerTest { @Test public void seekAndReprepareAfterPlaybackError_keepsSeekPositionAndTimeline() throws Exception { - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); Player.Listener mockListener = mock(Player.Listener.class); player.addListener(mockListener); FakeMediaSource fakeMediaSource = new FakeMediaSource(); @@ -1907,7 +1907,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndexAfterAddingSources.set(player.getCurrentWindowIndex()); } }) @@ -1940,7 +1940,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position while in error state positionHolder[0] = player.getCurrentPosition(); windowIndexHolder[0] = player.getCurrentWindowIndex(); @@ -1950,7 +1950,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position while repreparing. positionHolder[1] = player.getCurrentPosition(); windowIndexHolder[1] = player.getCurrentWindowIndex(); @@ -1960,7 +1960,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position after repreparation finished. positionHolder[2] = player.getCurrentPosition(); windowIndexHolder[2] = player.getCurrentWindowIndex(); @@ -2005,7 +2005,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position while in error state positionHolder[0] = player.getCurrentPosition(); windowIndexHolder[0] = player.getCurrentWindowIndex(); @@ -2016,7 +2016,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position while in error state positionHolder[1] = player.getCurrentPosition(); windowIndexHolder[1] = player.getCurrentWindowIndex(); @@ -2026,7 +2026,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Position after prepare. positionHolder[2] = player.getCurrentPosition(); windowIndexHolder[2] = player.getCurrentWindowIndex(); @@ -2618,7 +2618,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { message.set( player.createMessage(target).setPosition(/* positionMs= */ 50).send()); } @@ -2648,7 +2648,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { message.set( player .createMessage(target) @@ -2879,7 +2879,7 @@ public final class ExoPlayerTest { return super.createPeriod(id, allocator, startPositionUs); } }; - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.setMediaSource(mediaSource); // Throw on the playback thread if the player position reaches a value that is just less than // seek position. This ensures that playback stops and the assertion on the player position @@ -2973,7 +2973,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { mediaSource.removeMediaSource(/* index= */ 0); try { // Wait until the source to be removed is released on the playback thread. So @@ -2994,7 +2994,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowCount[0] = player.getCurrentTimeline().getWindowCount(); position[0] = player.getCurrentPosition(); } @@ -3076,7 +3076,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener1); player.addListener(playerListener2); @@ -3137,7 +3137,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3176,7 +3176,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3244,7 +3244,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3375,7 +3375,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionWhenReady.set(player.getContentPosition()); } }) @@ -3419,7 +3419,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { periodIndexWhenReady.set(player.getCurrentPeriodIndex()); positionWhenReady.set(player.getContentPosition()); } @@ -3469,7 +3469,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3520,7 +3520,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3573,7 +3573,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerReference.set(player); player.addListener(playerListener); } @@ -3593,7 +3593,7 @@ public final class ExoPlayerTest { @Test public void adInMovingLiveWindow_keepsContentPosition() throws Exception { - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); AdPlaybackState adPlaybackState = FakeTimeline.createAdPlaybackState( /* adsPerAdGroup= */ 1, /* adGroupTimesUs...= */ 42_000_004_000_000L); @@ -3648,9 +3648,7 @@ public final class ExoPlayerTest { new Action("getPlaybackSpeed", /* description= */ null) { @Override protected void doActionImpl( - SimpleExoPlayer player, - DefaultTrackSelector trackSelector, - @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { maskedPlaybackSpeeds.add(player.getPlaybackParameters().speed); } }; @@ -3864,7 +3862,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); @@ -3902,7 +3900,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionMs[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); //noinspection deprecation @@ -3916,7 +3914,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[0] = player.getCurrentWindowIndex(); positionMs[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); @@ -3956,7 +3954,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionMs[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); player.setMediaSource(mediaSource, /* startPositionMs= */ 7000); @@ -3969,7 +3967,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[0] = player.getCurrentWindowIndex(); positionMs[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); @@ -4003,7 +4001,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(9000); } }, @@ -4035,7 +4033,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(9200); } }, @@ -4067,7 +4065,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(1000); } }, @@ -4094,7 +4092,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(0, 1000); } }, @@ -4123,7 +4121,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(2, 1000); } }, @@ -4157,7 +4155,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(1, 1000); } }, @@ -4193,7 +4191,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(1, 1000); } }, @@ -4228,7 +4226,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(1, 5000); } }, @@ -4261,7 +4259,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(1, 5000); } }, @@ -4297,7 +4295,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addMediaSource( /* index= */ 1, createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 0)); } @@ -4331,7 +4329,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.moveMediaItem(/* currentIndex= */ 1, /* newIndex= */ 2); } }, @@ -4365,7 +4363,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.moveMediaItem(/* currentIndex= */ 3, /* newIndex= */ 1); } }, @@ -4400,7 +4398,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.removeMediaItem(/* index= */ 0); } }, @@ -4435,7 +4433,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.removeMediaItem(/* index= */ 2); } }, @@ -4470,7 +4468,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.removeMediaItem(/* index= */ 1); } }, @@ -4504,7 +4502,7 @@ public final class ExoPlayerTest { runPositionMaskingCapturingActionSchedule( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.clearMediaItems(); } }, @@ -4544,7 +4542,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[0] = player.getCurrentWindowIndex(); positionMs[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); @@ -4555,7 +4553,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[1] = player.getCurrentWindowIndex(); positionMs[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); @@ -4651,7 +4649,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addMediaSource(/* index= */ 1, new FakeMediaSource()); windowIndex[0] = player.getCurrentWindowIndex(); isPlayingAd[0] = player.isPlayingAd(); @@ -4664,7 +4662,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[1] = player.getCurrentWindowIndex(); isPlayingAd[1] = player.isPlayingAd(); positionMs[1] = player.getCurrentPosition(); @@ -4677,7 +4675,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addMediaSource(new FakeMediaSource()); windowIndex[2] = player.getCurrentWindowIndex(); isPlayingAd[2] = player.isPlayingAd(); @@ -4752,7 +4750,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 8000); windowIndex[0] = player.getCurrentWindowIndex(); isPlayingAd[0] = player.isPlayingAd(); @@ -4765,7 +4763,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndex[1] = player.getCurrentWindowIndex(); isPlayingAd[1] = player.isPlayingAd(); positionMs[1] = player.getCurrentPosition(); @@ -4820,7 +4818,7 @@ public final class ExoPlayerTest { adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.setMediaSource(adsMediaSource); player.pause(); player.prepare(); @@ -4835,7 +4833,7 @@ public final class ExoPlayerTest { @Test public void becomingNoisyIgnoredIfBecomingNoisyHandlingIsDisabled() throws Exception { - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.play(); player.setHandleAudioBecomingNoisy(false); @@ -4849,7 +4847,7 @@ public final class ExoPlayerTest { @Test public void pausesWhenBecomingNoisyIfBecomingNoisyHandlingIsEnabled() throws Exception { - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.play(); player.setHandleAudioBecomingNoisy(true); @@ -5063,7 +5061,7 @@ public final class ExoPlayerTest { /* deferOnPrepared= */ id.adIndexInAdGroup == 1); } }; - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.setMediaSource(mediaSource); player.prepare(); player.play(); @@ -5322,7 +5320,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.setMediaSource(new FakeMediaSource(), /* startPositionMs= */ 1000); maskingPlaybackState[0] = player.getPlaybackState(); } @@ -5509,7 +5507,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); } }) @@ -5574,7 +5572,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); } @@ -5610,7 +5608,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); @@ -5626,7 +5624,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[1] = player.getCurrentWindowIndex(); currentPlaybackPositions[1] = player.getCurrentPosition(); windowCounts[1] = player.getCurrentTimeline().getWindowCount(); @@ -5681,7 +5679,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); @@ -5697,7 +5695,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[1] = player.getCurrentWindowIndex(); currentPlaybackPositions[1] = player.getCurrentPosition(); windowCounts[1] = player.getCurrentTimeline().getWindowCount(); @@ -5761,7 +5759,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionAfterSetPlayWhenReady.set(player.getCurrentPosition()); } }) @@ -5785,7 +5783,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentPositionMs[0] = player.getCurrentPosition(); bufferedPositionMs[0] = player.getBufferedPosition(); player.setPlayWhenReady(true); @@ -5822,7 +5820,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentPositionMs[0] = player.getCurrentPosition(); bufferedPositionMs[0] = player.getBufferedPosition(); player.setShuffleModeEnabled(true); @@ -5859,7 +5857,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { positionAfterSetShuffleOrder.set(player.getCurrentPosition()); } }) @@ -5882,7 +5880,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); @@ -5895,7 +5893,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -5920,7 +5918,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 1000); currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPositions[0] = player.getCurrentPosition(); @@ -5958,7 +5956,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); @@ -5971,7 +5969,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -5999,7 +5997,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); @@ -6012,7 +6010,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -6037,7 +6035,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Increase current window index. player.addMediaSource(/* index= */ 0, new FakeMediaSource()); currentWindowIndices[0] = player.getCurrentWindowIndex(); @@ -6046,7 +6044,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Current window index is unchanged. player.addMediaSource(/* index= */ 2, new FakeMediaSource()); currentWindowIndices[1] = player.getCurrentWindowIndex(); @@ -6055,7 +6053,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { MediaSource mediaSource = new FakeMediaSource(); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(mediaSource, mediaSource, mediaSource); @@ -6067,7 +6065,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(); // Current window index is unchanged when adding empty source. @@ -6103,7 +6101,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); @@ -6119,7 +6117,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); currentPositions[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); @@ -6152,7 +6150,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); @@ -6168,7 +6166,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); currentPositions[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); @@ -6198,7 +6196,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); // Increase current window index. player.addMediaSource(/* index= */ 0, new FakeMediaSource()); @@ -6209,7 +6207,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -6233,7 +6231,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with no seek. player.setMediaSource(new ConcatenatingMediaSource()); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6242,7 +6240,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an implicit seek to the current position. player.setMediaSource(new FakeMediaSource()); maskingPlaybackStates[1] = player.getPlaybackState(); @@ -6251,7 +6249,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an explicit seek. player.setMediaSource( new FakeMediaSource(), /* startPositionMs= */ C.TIME_UNSET); @@ -6261,7 +6259,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with an explicit seek. player.setMediaSource( new ConcatenatingMediaSource(), /* startPositionMs= */ C.TIME_UNSET); @@ -6301,7 +6299,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set a media item with an implicit seek to the current position which is // invalid in the new timeline. player.setMediaSource( @@ -6339,7 +6337,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with no seek. player.setMediaSource(new FakeMediaSource()); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6374,7 +6372,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set an empty media item with no seek. player.setMediaSource(new ConcatenatingMediaSource()); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6415,7 +6413,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with an implicit seek to the current position. player.setMediaSource(new ConcatenatingMediaSource()); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6425,7 +6423,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with an explicit seek. player.setMediaSource( new ConcatenatingMediaSource(), /* startPositionMs= */ C.TIME_UNSET); @@ -6436,7 +6434,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an implicit seek to the current position. player.setMediaSource(firstMediaSource); maskingPlaybackStates[2] = player.getPlaybackState(); @@ -6447,7 +6445,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an explicit seek. player.setMediaSource(secondMediaSource, /* startPositionMs= */ C.TIME_UNSET); maskingPlaybackStates[3] = player.getPlaybackState(); @@ -6496,7 +6494,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an invalid implicit seek to the current position. player.setMediaSource( new FakeMediaSource(new FakeTimeline(/* windowCount= */ 1, 1L)), @@ -6536,7 +6534,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with no seek (keep current position). player.setMediaSource(new FakeMediaSource(), /* resetPosition= */ false); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6576,7 +6574,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set an empty media item with no seek. player.setMediaSource(new ConcatenatingMediaSource()); maskingPlaybackStates[0] = player.getPlaybackState(); @@ -6616,7 +6614,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with an implicit seek to current position. player.setMediaSource( new ConcatenatingMediaSource(), /* resetPosition= */ false); @@ -6630,7 +6628,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set empty media item with an explicit seek. player.setMediaSource( new ConcatenatingMediaSource(), /* startPositionMs= */ C.TIME_UNSET); @@ -6644,7 +6642,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an explicit seek. player.setMediaSource(secondMediaSource, /* startPositionMs= */ C.TIME_UNSET); // Expect masking state is buffering, @@ -6657,7 +6655,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Set media item with an implicit seek to the current position. player.setMediaSource(secondMediaSource, /* resetPosition= */ false); // Expect masking state is buffering, @@ -6729,7 +6727,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // An implicit, invalid seek picking up the position set by the initial seek. player.setMediaSource(firstMediaSource, /* resetPosition= */ false); // Expect masking state is ended, @@ -6778,7 +6776,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addMediaSource(/* index= */ 0, new FakeMediaSource()); positions[0] = player.getCurrentPosition(); positions[1] = player.getBufferedPosition(); @@ -6814,7 +6812,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); // If the timeline is empty masking variables are used. currentPositions[0] = player.getCurrentPosition(); @@ -6837,7 +6835,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[4] = player.getCurrentWindowIndex(); // Finally original playbackInfo coming from EPII is used. currentPositions[2] = player.getCurrentPosition(); @@ -6875,7 +6873,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); player.addMediaSource(new FakeMediaSource()); currentWindowIndices[1] = player.getCurrentWindowIndex(); @@ -6886,7 +6884,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -6917,7 +6915,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move the current item down in the playlist. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 2, /* newIndex= */ 1); currentWindowIndices[0] = player.getCurrentWindowIndex(); @@ -6926,7 +6924,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move the current item up in the playlist. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 3, /* newIndex= */ 0); currentWindowIndices[1] = player.getCurrentWindowIndex(); @@ -6936,7 +6934,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move items from before to behind the current item. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 2, /* newIndex= */ 1); currentWindowIndices[2] = player.getCurrentWindowIndex(); @@ -6945,7 +6943,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move items from behind to before the current item. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 3, /* newIndex= */ 0); currentWindowIndices[3] = player.getCurrentWindowIndex(); @@ -6954,7 +6952,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move items from before to before the current item. // No change in currentWindowIndex. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 1, /* newIndex= */ 1); @@ -6965,7 +6963,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Move items from behind to behind the current item. // No change in currentWindowIndex. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 2, /* newIndex= */ 2); @@ -6992,7 +6990,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Increase current window index. currentWindowIndices[0] = player.getCurrentWindowIndex(); player.moveMediaItem(/* currentIndex= */ 0, /* newIndex= */ 1); @@ -7004,7 +7002,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[2] = player.getCurrentWindowIndex(); } }) @@ -7028,7 +7026,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Decrease current window index. currentWindowIndices[0] = player.getCurrentWindowIndex(); player.removeMediaItem(/* index= */ 0); @@ -7058,7 +7056,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Remove the current item. currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPositions[0] = player.getCurrentPosition(); @@ -7110,7 +7108,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Expect the current window index to be 2 after seek. currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPositions[0] = player.getCurrentPosition(); @@ -7129,7 +7127,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Expects the current window index still on 0. currentWindowIndices[2] = player.getCurrentWindowIndex(); // Insert an item at begin when the playlist is not empty. @@ -7146,7 +7144,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[4] = player.getCurrentWindowIndex(); // Implicit seek to the current window index, which is out of bounds in new // timeline. @@ -7161,7 +7159,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[6] = player.getCurrentWindowIndex(); // Explicit seek to (0, C.TIME_UNSET). Player transitions to BUFFERING. player.setMediaSource(fourthMediaSource, /* startPositionMs= */ 5000); @@ -7175,7 +7173,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Check whether actual window index is equal masking index from above. currentWindowIndices[8] = player.getCurrentWindowIndex(); } @@ -7253,7 +7251,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); @@ -7294,7 +7292,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { currentWindowIndices[0] = player.getCurrentWindowIndex(); currentStates[0] = player.getPlaybackState(); player.clearMediaItems(); @@ -7306,7 +7304,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { // Transitions to ended when prepared with zero media items. currentStates[2] = player.getPlaybackState(); } @@ -7357,7 +7355,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addAnalyticsListener( new AnalyticsListener() { @Override @@ -7412,7 +7410,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.seekTo(player.getCurrentPosition()); } }) @@ -7421,7 +7419,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { windowIndexAfterFinalEndedState.set(player.getCurrentWindowIndex()); } }) @@ -7456,7 +7454,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playbackStateAfterPause.set(player.getPlaybackState()); windowIndexAfterPause.set(player.getCurrentWindowIndex()); positionAfterPause.set(player.getContentPosition()); @@ -7495,7 +7493,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playbackStateAfterPause.set(player.getPlaybackState()); windowIndexAfterPause.set(player.getCurrentWindowIndex()); positionAfterPause.set(player.getContentPosition()); @@ -7747,7 +7745,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addListener(playerListener1); player.addListener(playerListener2); } @@ -7915,7 +7913,7 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playerHolder[0] = player; } }) @@ -8993,7 +8991,7 @@ public final class ExoPlayerTest { @Test public void enableOffloadSchedulingWhileIdle_isToggled_isReported() throws Exception { - SimpleExoPlayer player = new TestExoPlayerBuilder(context).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.experimentalSetOffloadSchedulingEnabled(true); assertThat(runUntilReceiveOffloadSchedulingEnabledNewState(player)).isTrue(); @@ -9005,7 +9003,7 @@ public final class ExoPlayerTest { @Test public void enableOffloadSchedulingWhilePlaying_isToggled_isReported() throws Exception { FakeSleepRenderer sleepRenderer = new FakeSleepRenderer(C.TRACK_TYPE_AUDIO).sleepOnNextRender(); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); Timeline timeline = new FakeTimeline(); player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); player.prepare(); @@ -9022,7 +9020,7 @@ public final class ExoPlayerTest { public void enableOffloadSchedulingWhileSleepingForOffload_isDisabled_isReported() throws Exception { FakeSleepRenderer sleepRenderer = new FakeSleepRenderer(C.TRACK_TYPE_AUDIO).sleepOnNextRender(); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); Timeline timeline = new FakeTimeline(); player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); player.experimentalSetOffloadSchedulingEnabled(true); @@ -9038,7 +9036,7 @@ public final class ExoPlayerTest { @Test public void enableOffloadScheduling_isEnable_playerSleeps() throws Exception { FakeSleepRenderer sleepRenderer = new FakeSleepRenderer(C.TRACK_TYPE_AUDIO); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); Timeline timeline = new FakeTimeline(); player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); player.experimentalSetOffloadSchedulingEnabled(true); @@ -9056,7 +9054,7 @@ public final class ExoPlayerTest { experimentalEnableOffloadSchedulingWhileSleepingForOffload_isDisabled_renderingResumes() throws Exception { FakeSleepRenderer sleepRenderer = new FakeSleepRenderer(C.TRACK_TYPE_AUDIO).sleepOnNextRender(); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); Timeline timeline = new FakeTimeline(); player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); player.experimentalSetOffloadSchedulingEnabled(true); @@ -9074,7 +9072,7 @@ public final class ExoPlayerTest { @Test public void wakeupListenerWhileSleepingForOffload_isWokenUp_renderingResumes() throws Exception { FakeSleepRenderer sleepRenderer = new FakeSleepRenderer(C.TRACK_TYPE_AUDIO).sleepOnNextRender(); - SimpleExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); + ExoPlayer player = new TestExoPlayerBuilder(context).setRenderers(sleepRenderer).build(); Timeline timeline = new FakeTimeline(); player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.AUDIO_FORMAT)); player.experimentalSetOffloadSchedulingEnabled(true); @@ -11119,7 +11117,7 @@ public final class ExoPlayerTest { public void newServerSideInsertedAdAtPlaybackPosition_keepsRenderersEnabled() throws Exception { // Injecting renderer to count number of renderer resets. AtomicReference videoRenderer = new AtomicReference<>(); - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(context) .setRenderersFactory( (handler, videoListener, audioListener, textOutput, metadataOutput) -> { @@ -11192,14 +11190,14 @@ public final class ExoPlayerTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.setVideoSurface(surface1); } }) .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.setVideoSurface(surface2); } }); @@ -11330,7 +11328,7 @@ public final class ExoPlayerTest { } @Override - public void handleMessage(SimpleExoPlayer player, int messageType, @Nullable Object message) { + public void handleMessage(ExoPlayer player, int messageType, @Nullable Object message) { windowIndex = player.getCurrentWindowIndex(); positionMs = player.getCurrentPosition(); messageCount++; @@ -11344,7 +11342,7 @@ public final class ExoPlayerTest { @Nullable public Timeline timeline; @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playWhenReady = player.getPlayWhenReady(); playbackState = player.getPlaybackState(); timeline = player.getCurrentTimeline(); @@ -11379,7 +11377,7 @@ public final class ExoPlayerTest { } @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { playbackStates[index] = player.getPlaybackState(); timelineWindowCount[index] = player.getCurrentTimeline().getWindowCount(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 58432dd227..b1cdc07945 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -81,7 +81,6 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline.Window; import com.google.android.exoplayer2.TracksInfo; @@ -1048,7 +1047,7 @@ public final class AnalyticsCollectorTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.addListener( new Player.Listener() { @Override @@ -1422,7 +1421,7 @@ public final class AnalyticsCollectorTest { .executeRunnable( new PlayerRunnable() { @Override - public void run(SimpleExoPlayer player) { + public void run(ExoPlayer player) { player.getAnalyticsCollector().notifySeekStarted(); } }) @@ -1653,7 +1652,7 @@ public final class AnalyticsCollectorTest { @Test public void onEvents_isReportedWithCorrectEventTimes() throws Exception { - SimpleExoPlayer player = + ExoPlayer player = new TestExoPlayerBuilder(ApplicationProvider.getApplicationContext()).build(); Surface surface = new Surface(new SurfaceTexture(/* texName= */ 0)); player.setVideoSurface(surface); @@ -1987,7 +1986,7 @@ public final class AnalyticsCollectorTest { public void release_withCallbacksArrivingAfterRelease_onPlayerReleasedForwardedLast() throws Exception { FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 0, /* isAutoAdvancing= */ true); - SimpleExoPlayer simpleExoPlayer = + ExoPlayer exoPlayer = new TestExoPlayerBuilder(ApplicationProvider.getApplicationContext()) .setClock(fakeClock) .build(); @@ -2001,16 +2000,16 @@ public final class AnalyticsCollectorTest { fakeClock.advanceTime(1); } }); - simpleExoPlayer.addAnalyticsListener(analyticsListener); + exoPlayer.addAnalyticsListener(analyticsListener); // Prepare with media to ensure video renderer is enabled. - simpleExoPlayer.setMediaSource( + exoPlayer.setMediaSource( new FakeMediaSource(new FakeTimeline(), ExoPlayerTestRunner.VIDEO_FORMAT)); - simpleExoPlayer.prepare(); - TestPlayerRunHelper.runUntilPlaybackState(simpleExoPlayer, Player.STATE_READY); + exoPlayer.prepare(); + TestPlayerRunHelper.runUntilPlaybackState(exoPlayer, Player.STATE_READY); // Release and add delay on releasing thread to verify timestamps of events. - simpleExoPlayer.release(); + exoPlayer.release(); long releaseTimeMs = fakeClock.currentTimeMillis(); fakeClock.advanceTime(1); ShadowLooper.idleMainLooper(); @@ -2024,11 +2023,11 @@ public final class AnalyticsCollectorTest { inOrder.verify(analyticsListener).onVideoDisabled(videoDisabledEventTime.capture(), any()); inOrder .verify(analyticsListener) - .onEvents(same(simpleExoPlayer), argThat(events -> events.contains(EVENT_VIDEO_DISABLED))); + .onEvents(same(exoPlayer), argThat(events -> events.contains(EVENT_VIDEO_DISABLED))); inOrder.verify(analyticsListener).onPlayerReleased(releasedEventTime.capture()); inOrder .verify(analyticsListener) - .onEvents(same(simpleExoPlayer), argThat(events -> events.contains(EVENT_PLAYER_RELEASED))); + .onEvents(same(exoPlayer), argThat(events -> events.contains(EVENT_PLAYER_RELEASED))); // Verify order of timestamps of these events. // This verification is needed as a regression test against [internal ref: b/195396384]. The diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/PlaybackStatsListenerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/PlaybackStatsListenerTest.java index 668ed5f556..2fe9a13d88 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/PlaybackStatsListenerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/PlaybackStatsListenerTest.java @@ -27,10 +27,10 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.testutil.FakeMediaSource; @@ -49,7 +49,7 @@ import org.robolectric.shadows.ShadowLooper; @RunWith(AndroidJUnit4.class) public final class PlaybackStatsListenerTest { - private SimpleExoPlayer player; + private ExoPlayer player; @Before public void setUp() { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java index 3e2422f064..cd760c692b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/EndToEndGaplessTest.java @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.robolectric.RandomizedMp3Decoder; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -87,7 +86,7 @@ public class EndToEndGaplessTest { @Test public void testPlayback_twoIdenticalMp3Files() throws Exception { - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java index 779199c7a7..8f22e5663b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlacPlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -64,7 +63,7 @@ public class FlacPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java index 51e9051b60..5290620c10 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/FlvPlaybackTest.java @@ -22,7 +22,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -55,7 +54,7 @@ public final class FlvPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java index a3e2c1c32e..f18a0e54f6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkaPlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -57,7 +56,7 @@ public final class MkaPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java index b5d242f52e..c719cdfa00 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/MkvPlaybackTest.java @@ -23,7 +23,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -63,7 +62,7 @@ public final class MkvPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java index 53a2d62de7..3c4c8a6153 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp3PlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -60,7 +59,7 @@ public final class Mp3PlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java index ccb6ca9961..b6d6ca5640 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Mp4PlaybackTest.java @@ -22,7 +22,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -77,7 +76,7 @@ public class Mp4PlaybackTest { public void test() throws Exception { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java index 3966dd59ca..4d69302e1a 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/OggPlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -58,7 +57,7 @@ public final class OggPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java index a5ecc58580..0691e422c6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/PlaylistPlaybackTest.java @@ -21,7 +21,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -45,7 +44,7 @@ public final class PlaylistPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -67,7 +66,7 @@ public final class PlaylistPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java index 7acd02fc66..4db242db09 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/SilencePlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -45,7 +44,7 @@ public final class SilencePlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -66,7 +65,7 @@ public final class SilencePlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java index fc741e0710..50fbbe9cf8 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/TsPlaybackTest.java @@ -22,7 +22,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -81,7 +80,7 @@ public class TsPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java index 01f12d272d..abe1320325 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/Vp9PlaybackTest.java @@ -22,7 +22,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -59,7 +58,7 @@ public final class Vp9PlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java index 451a9d9f8b..eccd89f285 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/e2etest/WavPlaybackTest.java @@ -20,7 +20,6 @@ import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -52,7 +51,7 @@ public final class WavPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java index d93f802190..6b1f858f96 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdMediaSourceTest.java @@ -38,7 +38,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.robolectric.PlaybackOutput; @@ -143,7 +142,7 @@ public final class ServerSideInsertedAdMediaSourceTest { public void playbackWithPredefinedAds_playsSuccessfulWithoutRendererResets() throws Exception { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -202,7 +201,7 @@ public final class ServerSideInsertedAdMediaSourceTest { public void playbackWithNewlyInsertedAds_playsSuccessfulWithoutRendererResets() throws Exception { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -262,7 +261,7 @@ public final class ServerSideInsertedAdMediaSourceTest { throws Exception { Context context = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory renderersFactory = new CapturingRenderersFactory(context); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(context, renderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -319,7 +318,7 @@ public final class ServerSideInsertedAdMediaSourceTest { @Test public void playbackWithSeek_isHandledCorrectly() throws Exception { Context context = ApplicationProvider.getApplicationContext(); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(context).setClock(new FakeClock(/* isAutoAdvancing= */ true)).build(); player.setVideoSurface(new Surface(new SurfaceTexture(/* texName= */ 1))); diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java index a6f7cf5aec..bca3e3362d 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/e2etest/DashPlaybackTest.java @@ -25,7 +25,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; import com.google.android.exoplayer2.robolectric.TestPlayerRunHelper; @@ -54,7 +53,7 @@ public final class DashPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); @@ -81,7 +80,7 @@ public final class DashPlaybackTest { Context applicationContext = ApplicationProvider.getApplicationContext(); CapturingRenderersFactory capturingRenderersFactory = new CapturingRenderersFactory(applicationContext); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .build(); diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java index 4fd7361444..c82f68c0a3 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java @@ -30,7 +30,6 @@ import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Listener; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.robolectric.PlaybackOutput; import com.google.android.exoplayer2.robolectric.RobolectricUtil; import com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig; @@ -103,8 +102,7 @@ public final class RtspPlaybackTest { fakeRtpDataChannel); try (RtspServer rtspServer = new RtspServer(responseProvider)) { - SimpleExoPlayer player = - createSimpleExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory); + ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory); PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory); player.prepare(); @@ -126,8 +124,7 @@ public final class RtspPlaybackTest { new RtspServer( new ResponseProvider( clock, ImmutableList.of(mp4aLatmRtpPacketStreamDump), fakeRtpDataChannel))) { - SimpleExoPlayer player = - createSimpleExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory); + ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory); AtomicReference playbackError = new AtomicReference<>(); player.prepare(); @@ -148,9 +145,9 @@ public final class RtspPlaybackTest { } } - private SimpleExoPlayer createSimpleExoPlayer( + private ExoPlayer createExoPlayer( int serverRtspPortNumber, RtpDataChannel.Factory rtpDataChannelFactory) { - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(applicationContext, capturingRenderersFactory) .setClock(clock) .build(); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index c768ad9476..02db36c6ad 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -44,7 +44,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsListener; @@ -366,7 +365,7 @@ public final class TranscodingTransformer { private TranscodingTransformer.Listener listener; @Nullable private MuxerWrapper muxerWrapper; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @ProgressState private int progressState; private TranscodingTransformer( diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 370ff1e167..f300f66aa3 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -44,7 +44,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsListener; @@ -363,7 +362,7 @@ public final class Transformer { private Transformer.Listener listener; @Nullable private MuxerWrapper muxerWrapper; - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; @ProgressState private int progressState; private Transformer( diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java index e0ae2074e2..d653c92ffb 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.RendererCapabilities; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager; @@ -312,9 +311,9 @@ import java.util.List; } @Override - protected SimpleExoPlayer buildExoPlayer( + protected ExoPlayer buildExoPlayer( HostActivity host, Surface surface, MappingTrackSelector trackSelector) { - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(host, new DebugRenderersFactory(host)) .setTrackSelector(trackSelector) .build(); diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java index c31a310de0..efcb290579 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java @@ -23,7 +23,6 @@ import android.os.Looper; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.Util; @@ -33,8 +32,8 @@ import java.util.concurrent.atomic.AtomicReference; import org.checkerframework.checker.nullness.compatqual.NullableType; /** - * Helper methods to block the calling thread until the provided {@link SimpleExoPlayer} instance - * reaches a particular state. + * Helper methods to block the calling thread until the provided {@link ExoPlayer} instance reaches + * a particular state. */ public class TestPlayerRunHelper { @@ -260,7 +259,7 @@ public class TestPlayerRunHelper { * @throws TimeoutException If the {@link RobolectricUtil#DEFAULT_TIMEOUT_MS default timeout} is * exceeded. */ - public static void runUntilRenderedFirstFrame(SimpleExoPlayer player) throws TimeoutException { + public static void runUntilRenderedFirstFrame(ExoPlayer player) throws TimeoutException { verifyMainTestThread(player); AtomicBoolean receivedCallback = new AtomicBoolean(false); Player.Listener listener = 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 81f9b57c1e..43d5162bd3 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 @@ -26,7 +26,6 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.PlayerMessage.Target; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.source.MediaSource; @@ -72,7 +71,7 @@ public abstract class Action { * null} if there's no next action. */ public final void doActionAndScheduleNext( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -84,7 +83,7 @@ public abstract class Action { } /** - * Called by {@link #doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, + * Called by {@link #doActionAndScheduleNext(ExoPlayer, DefaultTrackSelector, Surface, * HandlerWrapper, ActionNode)} to perform the action and to schedule the next action node. * * @param player The player to which the action should be applied. @@ -96,7 +95,7 @@ public abstract class Action { * null} if there's no next action. */ protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -108,7 +107,7 @@ public abstract class Action { } /** - * Called by {@link #doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + * Called by {@link #doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, * HandlerWrapper, ActionNode)} to perform the action. * * @param player The player to which the action should be applied. @@ -117,7 +116,7 @@ public abstract class Action { * needed. */ protected abstract void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface); + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface); /** Calls {@link Player#seekTo(long)} or {@link Player#seekTo(int, long)}. */ public static final class Seek extends Action { @@ -157,7 +156,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { try { if (windowIndex == null) { player.seekTo(positionMs); @@ -172,7 +171,7 @@ public abstract class Action { } } - /** Calls {@link SimpleExoPlayer#setMediaSources(List, int, long)}. */ + /** Calls {@link ExoPlayer#setMediaSources(List, int, long)}. */ public static final class SetMediaItems extends Action { private final int windowIndex; @@ -195,12 +194,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setMediaSources(Arrays.asList(mediaSources), windowIndex, positionMs); } } - /** Calls {@link SimpleExoPlayer#addMediaSources(List)}. */ + /** Calls {@link ExoPlayer#addMediaSources(List)}. */ public static final class AddMediaItems extends Action { private final MediaSource[] mediaSources; @@ -216,12 +215,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.addMediaSources(Arrays.asList(mediaSources)); } } - /** Calls {@link SimpleExoPlayer#setMediaSources(List, boolean)}. */ + /** Calls {@link ExoPlayer#setMediaSources(List, boolean)}. */ public static final class SetMediaItemsResetPosition extends Action { private final boolean resetPosition; @@ -241,12 +240,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setMediaSources(Arrays.asList(mediaSources), resetPosition); } } - /** Calls {@link SimpleExoPlayer#moveMediaItem(int, int)}. */ + /** Calls {@link ExoPlayer#moveMediaItem(int, int)}. */ public static class MoveMediaItem extends Action { private final int currentIndex; @@ -265,12 +264,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.moveMediaItem(currentIndex, newIndex); } } - /** Calls {@link SimpleExoPlayer#removeMediaItem(int)}. */ + /** Calls {@link ExoPlayer#removeMediaItem(int)}. */ public static class RemoveMediaItem extends Action { private final int index; @@ -286,12 +285,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.removeMediaItem(index); } } - /** Calls {@link SimpleExoPlayer#removeMediaItems(int, int)}. */ + /** Calls {@link ExoPlayer#removeMediaItems(int, int)}. */ public static class RemoveMediaItems extends Action { private final int fromIndex; @@ -310,12 +309,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.removeMediaItems(fromIndex, toIndex); } } - /** Calls {@link SimpleExoPlayer#clearMediaItems()}}. */ + /** Calls {@link ExoPlayer#clearMediaItems()}}. */ public static class ClearMediaItems extends Action { /** @param tag A tag to use for logging. */ @@ -325,7 +324,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.clearMediaItems(); } } @@ -360,7 +359,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { if (reset == null) { player.stop(); } else { @@ -385,7 +384,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setPlayWhenReady(playWhenReady); } } @@ -412,13 +411,13 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { trackSelector.setParameters( trackSelector.buildUponParameters().setRendererDisabled(rendererIndex, disabled)); } } - /** Calls {@link SimpleExoPlayer#clearVideoSurface()}. */ + /** Calls {@link ExoPlayer#clearVideoSurface()}. */ public static final class ClearVideoSurface extends Action { /** @param tag A tag to use for logging. */ @@ -428,12 +427,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.clearVideoSurface(); } } - /** Calls {@link SimpleExoPlayer#setVideoSurface(Surface)}. */ + /** Calls {@link ExoPlayer#setVideoSurface(Surface)}. */ public static final class SetVideoSurface extends Action { /** @param tag A tag to use for logging. */ @@ -443,12 +442,12 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setVideoSurface(Assertions.checkNotNull(surface)); } } - /** Calls {@link SimpleExoPlayer#setAudioAttributes(AudioAttributes, boolean)}. */ + /** Calls {@link ExoPlayer#setAudioAttributes(AudioAttributes, boolean)}. */ public static final class SetAudioAttributes extends Action { private final AudioAttributes audioAttributes; @@ -468,7 +467,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setAudioAttributes(audioAttributes, handleAudioFocus); } } @@ -482,7 +481,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.prepare(); } } @@ -503,7 +502,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setRepeatMode(repeatMode); } } @@ -524,7 +523,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setShuffleOrder(shuffleOrder); } } @@ -545,7 +544,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setShuffleModeEnabled(shuffleModeEnabled); } } @@ -591,9 +590,7 @@ public abstract class Action { @Override protected void doActionImpl( - final SimpleExoPlayer player, - DefaultTrackSelector trackSelector, - @Nullable Surface surface) { + final ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { if (target instanceof PlayerTarget) { ((PlayerTarget) target).setPlayer(player); } @@ -627,7 +624,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player.setPlaybackParameters(playbackParameters); } } @@ -648,7 +645,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { player .createMessage( (messageType, payload) -> { @@ -680,7 +677,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -724,7 +721,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -768,7 +765,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -798,7 +795,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -816,7 +813,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -839,7 +836,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -863,7 +860,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -890,7 +887,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -914,7 +911,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -940,7 +937,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -964,7 +961,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -980,7 +977,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -1004,7 +1001,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -1030,7 +1027,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -1045,7 +1042,7 @@ public abstract class Action { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -1065,7 +1062,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } @@ -1083,7 +1080,7 @@ public abstract class Action { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { if (runnable instanceof PlayerRunnable) { ((PlayerRunnable) runnable).setPlayer(player); } 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 a93d23ab95..4590d5fd6b 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 @@ -20,12 +20,12 @@ import android.view.Surface; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.Renderer; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.source.MediaSource; @@ -91,7 +91,7 @@ public final class ActionSchedule { * notification is needed. */ /* package */ void start( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper mainHandler, @@ -601,7 +601,7 @@ public final class ActionSchedule { void onMessageArrived(); } - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; private boolean hasArrived; @Nullable private Callback callback; @@ -613,8 +613,7 @@ public final class ActionSchedule { } /** Handles the message send to the component and additionally provides access to the player. */ - public abstract void handleMessage( - SimpleExoPlayer player, int messageType, @Nullable Object message); + public abstract void handleMessage(ExoPlayer player, int messageType, @Nullable Object message); @Override public final void handleMessage( @@ -626,8 +625,8 @@ public final class ActionSchedule { } } - /** Sets the player to be passed to {@link #handleMessage(SimpleExoPlayer, int, Object)}. */ - /* package */ void setPlayer(SimpleExoPlayer player) { + /** Sets the player to be passed to {@link #handleMessage(ExoPlayer, int, Object)}. */ + /* package */ void setPlayer(ExoPlayer player) { this.player = player; } } @@ -638,18 +637,18 @@ public final class ActionSchedule { */ public abstract static class PlayerRunnable implements Runnable { - @Nullable private SimpleExoPlayer player; + @Nullable private ExoPlayer player; /** Executes Runnable with reference to player. */ - public abstract void run(SimpleExoPlayer player); + public abstract void run(ExoPlayer player); @Override public final void run() { run(Assertions.checkStateNotNull(player)); } - /** Sets the player to be passed to {@link #run(SimpleExoPlayer)} . */ - /* package */ void setPlayer(SimpleExoPlayer player) { + /** Sets the player to be passed to {@link #run(ExoPlayer)} . */ + /* package */ void setPlayer(ExoPlayer player) { this.player = player; } } @@ -663,7 +662,7 @@ public final class ActionSchedule { @Nullable private ActionNode next; - private @MonotonicNonNull SimpleExoPlayer player; + private @MonotonicNonNull ExoPlayer player; private @MonotonicNonNull DefaultTrackSelector trackSelector; @Nullable private Surface surface; private @MonotonicNonNull HandlerWrapper mainHandler; @@ -707,7 +706,7 @@ public final class ActionSchedule { * @param mainHandler A handler associated with the main thread of the host activity. */ public void schedule( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper mainHandler) { @@ -754,7 +753,7 @@ public final class ActionSchedule { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Do nothing. } } @@ -774,7 +773,7 @@ public final class ActionSchedule { @Override protected void doActionAndScheduleNextImpl( - SimpleExoPlayer player, + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface, HandlerWrapper handler, @@ -788,7 +787,7 @@ public final class ActionSchedule { @Override protected void doActionImpl( - SimpleExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { + ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { // Not triggered. } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index 97004ddacb..e432b918cb 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -27,7 +27,6 @@ import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.decoder.DecoderCounters; @@ -66,7 +65,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { private final ConditionVariable testFinished; @Nullable private ActionSchedule pendingSchedule; - private @MonotonicNonNull SimpleExoPlayer player; + private @MonotonicNonNull ExoPlayer player; private @MonotonicNonNull HandlerWrapper actionHandler; private @MonotonicNonNull DefaultTrackSelector trackSelector; private @MonotonicNonNull Surface surface; @@ -242,12 +241,12 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { return new DefaultTrackSelector(host); } - protected SimpleExoPlayer buildExoPlayer( + protected ExoPlayer buildExoPlayer( HostActivity host, Surface surface, MappingTrackSelector trackSelector) { DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(host); renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); renderersFactory.setAllowedVideoJoiningTimeMs(/* allowedVideoJoiningTimeMs= */ 0); - SimpleExoPlayer player = + ExoPlayer player = new ExoPlayer.Builder(host, renderersFactory).setTrackSelector(trackSelector).build(); player.setVideoSurface(surface); return player; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index 4096548a5c..6df171442d 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -34,7 +34,6 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.source.MediaSource; @@ -71,7 +70,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul .build(); /** - * Builder to set-up a {@link ExoPlayerTestRunner}. Default fake implementations will be used for + * Builder to set-up an {@link ExoPlayerTestRunner}. Default fake implementations will be used for * unset test properties. */ public static final class Builder { @@ -267,7 +266,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul /** * Sets an {@link ActionSchedule} to be run by the test runner. The first action will be - * executed immediately before {@link SimpleExoPlayer#prepare()}. + * executed immediately before {@link ExoPlayer#prepare()}. * * @param actionSchedule An {@link ActionSchedule} to be used by the test runner. * @return This builder. @@ -379,7 +378,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul private final ArrayList playbackStates; private final boolean pauseAtEndOfMediaItems; - private SimpleExoPlayer player; + private ExoPlayer player; private Exception exception; private boolean playerWasPrepared; From 23fc1f4384ffdd34be57cc414b8d5198dc7854b1 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 13 Oct 2021 18:43:57 +0100 Subject: [PATCH 324/441] Migrate usages of SimpleExoPlayer to ExoPlayer SimpleExoPlayer is being deprecated in favour of ExoPlayer. PiperOrigin-RevId: 402869414 --- .../exoplayer2/ext/media2/PlayerTestRule.java | 5 +- .../media2/SessionPlayerConnectorTest.java | 50 +++++++++---------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java index 0dc6b89238..b009580206 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/PlayerTestRule.java @@ -22,7 +22,6 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.platform.app.InstrumentationRegistry; import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; @@ -49,7 +48,7 @@ import org.junit.rules.ExternalResource; private ExecutorService executor; private SessionPlayerConnector sessionPlayerConnector; - private SimpleExoPlayer exoPlayer; + private ExoPlayer exoPlayer; @Nullable private DataSourceInstrumentation dataSourceInstrumentation; @Override @@ -111,7 +110,7 @@ import org.junit.rules.ExternalResource; return sessionPlayerConnector; } - public SimpleExoPlayer getSimpleExoPlayer() { + public ExoPlayer getExoPlayer() { return exoPlayer; } diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java index 5e78ba99a2..fa857f0806 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java @@ -47,7 +47,6 @@ import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.ext.media2.test.R; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import com.google.android.exoplayer2.util.Util; @@ -167,20 +166,19 @@ public class SessionPlayerConnectorTest { return false; } }; - SimpleExoPlayer simpleExoPlayer = null; + ExoPlayer exoPlayer = null; SessionPlayerConnector playerConnector = null; try { - simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); - playerConnector = - new SessionPlayerConnector(simpleExoPlayer, new DefaultMediaItemConverter()); + exoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + playerConnector = new SessionPlayerConnector(exoPlayer, new DefaultMediaItemConverter()); playerConnector.setControlDispatcher(controlDispatcher); assertPlayerResult(playerConnector.play(), RESULT_INFO_SKIPPED); } finally { if (playerConnector != null) { playerConnector.close(); } - if (simpleExoPlayer != null) { - simpleExoPlayer.release(); + if (exoPlayer != null) { + exoPlayer.release(); } } } @@ -195,9 +193,9 @@ public class SessionPlayerConnectorTest { Player forwardingPlayer = null; SessionPlayerConnector playerConnector = null; try { - Player simpleExoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); + Player exoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); forwardingPlayer = - new ForwardingPlayer(simpleExoPlayer) { + new ForwardingPlayer(exoPlayer) { @Override public boolean isCommandAvailable(int command) { if (command == COMMAND_PLAY_PAUSE) { @@ -457,13 +455,12 @@ public class SessionPlayerConnectorTest { public void seekTo_whenUnderlyingPlayerAlsoSeeks_throwsNoException() throws Exception { TestUtils.loadResource(R.raw.video_big_buck_bunny, sessionPlayerConnector); assertPlayerResultSuccess(sessionPlayerConnector.prepare()); - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); List> futures = new ArrayList<>(); for (int i = 0; i < 10; i++) { futures.add(sessionPlayerConnector.seekTo(4123)); - InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> simpleExoPlayer.seekTo(1243)); + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> exoPlayer.seekTo(1243)); } for (ListenableFuture future : futures) { @@ -477,7 +474,7 @@ public class SessionPlayerConnectorTest { public void seekTo_byUnderlyingPlayer_notifiesOnSeekCompleted() throws Exception { TestUtils.loadResource(R.raw.video_big_buck_bunny, sessionPlayerConnector); assertPlayerResultSuccess(sessionPlayerConnector.prepare()); - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); long testSeekPosition = 1023; AtomicLong seekPosition = new AtomicLong(); CountDownLatch onSeekCompletedLatch = new CountDownLatch(1); @@ -494,7 +491,7 @@ public class SessionPlayerConnectorTest { }); InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> simpleExoPlayer.seekTo(testSeekPosition)); + .runOnMainSync(() -> exoPlayer.seekTo(testSeekPosition)); assertThat(onSeekCompletedLatch.await(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); assertThat(seekPosition.get()).isEqualTo(testSeekPosition); } @@ -837,7 +834,7 @@ public class SessionPlayerConnectorTest { } }); InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> playerTestRule.getSimpleExoPlayer().setMediaItems(exoMediaItems)); + .runOnMainSync(() -> playerTestRule.getExoPlayer().setMediaItems(exoMediaItems)); assertThat(onPlaylistChangedLatch.await(PLAYLIST_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); } @@ -870,7 +867,7 @@ public class SessionPlayerConnectorTest { sessionPlayerConnector.prepare(); sessionPlayerConnector.setPlaylist(playlistToSessionPlayer, /* metadata= */ null); InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> playerTestRule.getSimpleExoPlayer().setMediaItems(exoMediaItems)); + .runOnMainSync(() -> playerTestRule.getExoPlayer().setMediaItems(exoMediaItems)); assertThat(onPlaylistChangedLatch.await(PLAYLIST_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); } @@ -1055,7 +1052,7 @@ public class SessionPlayerConnectorTest { @LargeTest public void play_byUnderlyingPlayer_notifiesOnPlayerStateChanges() throws Exception { TestUtils.loadResource(R.raw.audio, sessionPlayerConnector); - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); CountDownLatch onPlayingLatch = new CountDownLatch(1); sessionPlayerConnector.registerPlayerCallback( @@ -1071,7 +1068,7 @@ public class SessionPlayerConnectorTest { assertPlayerResultSuccess(sessionPlayerConnector.prepare()); InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> simpleExoPlayer.setPlayWhenReady(true)); + .runOnMainSync(() -> exoPlayer.setPlayWhenReady(true)); assertThat(onPlayingLatch.await(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); } @@ -1090,7 +1087,7 @@ public class SessionPlayerConnectorTest { @LargeTest public void pause_byUnderlyingPlayer_notifiesOnPlayerStateChanges() throws Exception { TestUtils.loadResource(R.raw.audio, sessionPlayerConnector); - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); assertPlayerResultSuccess(sessionPlayerConnector.prepare()); @@ -1107,7 +1104,7 @@ public class SessionPlayerConnectorTest { }); assertPlayerResultSuccess(sessionPlayerConnector.play()); InstrumentationRegistry.getInstrumentation() - .runOnMainSync(() -> simpleExoPlayer.setPlayWhenReady(false)); + .runOnMainSync(() -> exoPlayer.setPlayWhenReady(false)); assertThat(onPausedLatch.await(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); } @@ -1116,7 +1113,7 @@ public class SessionPlayerConnectorTest { @LargeTest public void pause_byUnderlyingPlayerInListener_changesToPlayerStatePaused() throws Exception { TestUtils.loadResource(R.raw.audio, sessionPlayerConnector); - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); CountDownLatch playerStateChangesLatch = new CountDownLatch(3); CopyOnWriteArrayList playerStateChanges = new CopyOnWriteArrayList<>(); @@ -1134,12 +1131,12 @@ public class SessionPlayerConnectorTest { InstrumentationRegistry.getInstrumentation() .runOnMainSync( () -> - simpleExoPlayer.addListener( + exoPlayer.addListener( new Player.Listener() { @Override public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { if (playWhenReady) { - simpleExoPlayer.setPlayWhenReady(false); + exoPlayer.setPlayWhenReady(false); } } })); @@ -1292,11 +1289,10 @@ public class SessionPlayerConnectorTest { InstrumentationRegistry.getInstrumentation() .runOnMainSync( () -> { - SimpleExoPlayer simpleExoPlayer = playerTestRule.getSimpleExoPlayer(); - simpleExoPlayer.setMediaItems(exoMediaItems); + ExoPlayer exoPlayer = playerTestRule.getExoPlayer(); + exoPlayer.setMediaItems(exoMediaItems); - try (SessionPlayerConnector sessionPlayer = - new SessionPlayerConnector(simpleExoPlayer)) { + try (SessionPlayerConnector sessionPlayer = new SessionPlayerConnector(exoPlayer)) { List playlist = sessionPlayer.getPlaylist(); playlistFromSessionPlayer.set(playlist); } From 5fe3ec59cac74a9ef88a9f60c55f5c56e7110986 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 14 Oct 2021 09:30:47 +0100 Subject: [PATCH 325/441] Deprecate SimpleExoPlayer in favour of ExoPlayer PiperOrigin-RevId: 403028279 --- .../java/com/google/android/exoplayer2/SimpleExoPlayer.java | 6 ++---- .../com/google/android/exoplayer2/SimpleExoPlayerTest.java | 1 + .../android/exoplayer2/testutil/TestExoPlayerBuilder.java | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 11f09cf9c4..c39a2e7ab0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -88,10 +88,8 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeoutException; -/** - * An {@link ExoPlayer} implementation that uses default {@link Renderer} components. Instances can - * be obtained from {@link ExoPlayer.Builder}. - */ +/** @deprecated Use {@link ExoPlayer} instead. */ +@Deprecated public class SimpleExoPlayer extends BasePlayer implements ExoPlayer, ExoPlayer.AudioComponent, diff --git a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java index 15bd503925..ff1c0d6418 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java @@ -44,6 +44,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLooper; /** Unit test for {@link SimpleExoPlayer}. */ +@SuppressWarnings("deprecation") // Testing deprecated type. @RunWith(AndroidJUnit4.class) public class SimpleExoPlayerTest { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index c7089dcc9d..a7a8235b7e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -37,6 +37,7 @@ import com.google.android.exoplayer2.util.Clock; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** A builder of {@link SimpleExoPlayer} instances for testing. */ +@SuppressWarnings("deprecation") // Returning deprecated type for backwards compatibility. public class TestExoPlayerBuilder { private final Context context; From a168c8c928f45ff250be590b7db7a221daa5e802 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 14 Oct 2021 09:31:13 +0100 Subject: [PATCH 326/441] Use SimpleExoPlayer.Builder where necessary An upcoming change will modify ExoPlayer.Builder#build() to return ExoPlayer, so any places that explicitly need a SimpleExoPlayer instance should be using SimpleExoPlayer.Builder. PiperOrigin-RevId: 403028312 --- .../android/exoplayer2/SimpleExoPlayerTest.java | 12 ++++++------ .../exoplayer2/testutil/TestExoPlayerBuilder.java | 11 +++-------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java index ff1c0d6418..3570066c68 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/SimpleExoPlayerTest.java @@ -53,7 +53,7 @@ public class SimpleExoPlayerTest { public void builder_inBackgroundThread_doesNotThrow() throws Exception { Thread builderThread = new Thread( - () -> new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); + () -> new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build()); AtomicReference builderThrow = new AtomicReference<>(); builderThread.setUncaughtExceptionHandler((thread, throwable) -> builderThrow.set(throwable)); @@ -66,7 +66,7 @@ public class SimpleExoPlayerTest { @Test public void onPlaylistMetadataChanged_calledWhenPlaylistMetadataSet() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener playerListener = mock(Player.Listener.class); player.addListener(playerListener); AnalyticsListener analyticsListener = mock(AnalyticsListener.class); @@ -82,7 +82,7 @@ public class SimpleExoPlayerTest { @Test public void release_triggersAllPendingEventsInAnalyticsListeners() throws Exception { SimpleExoPlayer player = - new ExoPlayer.Builder( + new SimpleExoPlayer.Builder( ApplicationProvider.getApplicationContext(), (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) @@ -108,7 +108,7 @@ public class SimpleExoPlayerTest { public void releaseAfterRendererEvents_triggersPendingVideoEventsInListener() throws Exception { Surface surface = new Surface(new SurfaceTexture(/* texName= */ 0)); SimpleExoPlayer player = - new ExoPlayer.Builder( + new SimpleExoPlayer.Builder( ApplicationProvider.getApplicationContext(), (handler, videoListener, audioListener, textOutput, metadataOutput) -> new Renderer[] {new FakeVideoRenderer(handler, videoListener)}) @@ -134,7 +134,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingVolumeEventInListener() throws Exception { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); @@ -148,7 +148,7 @@ public class SimpleExoPlayerTest { @Test public void releaseAfterVolumeChanges_triggerPendingDeviceVolumeEventsInListener() { SimpleExoPlayer player = - new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); + new SimpleExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(); Player.Listener listener = mock(Player.Listener.class); player.addListener(listener); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java index a7a8235b7e..9a668f0186 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.java @@ -22,7 +22,6 @@ import android.os.Looper; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.LoadControl; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; @@ -274,11 +273,7 @@ public class TestExoPlayerBuilder { return seekForwardIncrementMs; } - /** - * Builds an {@link SimpleExoPlayer} using the provided values or their defaults. - * - * @return The built {@link ExoPlayerTestRunner}. - */ + /** Builds an {@link SimpleExoPlayer} using the provided values or their defaults. */ public SimpleExoPlayer build() { Assertions.checkNotNull( looper, "TestExoPlayer builder run on a thread without Looper and no Looper specified."); @@ -300,8 +295,8 @@ public class TestExoPlayerBuilder { }; } - ExoPlayer.Builder builder = - new ExoPlayer.Builder(context, playerRenderersFactory) + SimpleExoPlayer.Builder builder = + new SimpleExoPlayer.Builder(context, playerRenderersFactory) .setTrackSelector(trackSelector) .setLoadControl(loadControl) .setBandwidthMeter(bandwidthMeter) From 8827ccb568192a3e56e4c5706d84dcd2ffe2efd0 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 14 Oct 2021 11:38:53 +0100 Subject: [PATCH 327/441] Upgrade to WorkManager release compatible with Android 12 Issue #9181 #minor-release PiperOrigin-RevId: 403049218 --- RELEASENOTES.md | 5 +++++ extensions/workmanager/build.gradle | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 81e25f90eb..6e5f508aba 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,6 +36,11 @@ calls from the player to `Surface.setFrameRate`. This is useful for applications wanting to call `Surface.setFrameRate` directly from application code with Android 12's `Surface.CHANGE_FRAME_RATE_ALWAYS`. + * Upgrade the WorkManager extension to depend on + `androidx.work:work-runtime:2.7.0`. Earlier versions of `work-runtime` + are not compatible with apps targeting Android 12, and will crash with + an `IllegalArgumentException` when creating `PendingIntent`s + ([#9181](https://github.com/google/ExoPlayer/issues/9181)). * UI: * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with diff --git a/extensions/workmanager/build.gradle b/extensions/workmanager/build.gradle index 02a1055d87..ba2de98729 100644 --- a/extensions/workmanager/build.gradle +++ b/extensions/workmanager/build.gradle @@ -17,7 +17,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { implementation project(modulePrefix + 'library-core') - implementation 'androidx.work:work-runtime:2.5.0' + implementation 'androidx.work:work-runtime:2.7.0' compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion } From 1607043643634fa711242f8e3e64324e7c9a8f85 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 14 Oct 2021 11:39:15 +0100 Subject: [PATCH 328/441] Rename Player.PositionInfo#windowIndex to mediaItemIndex Also fix a typo where windowIndex was being passed to Objects.hashCode twice. The old field is left deprecated for backwards compatibility. Usages will be migrated in an upcoming change. PiperOrigin-RevId: 403049260 --- .../com/google/android/exoplayer2/Player.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index dbad56dad1..b2b80d0d81 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -473,8 +473,10 @@ public interface Player { * The UID of the window, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final Object windowUid; - /** The window index. */ - public final int windowIndex; + /** @deprecated Use {@link #mediaItemIndex} instead. */ + @Deprecated public final int windowIndex; + /** The media item index. */ + public final int mediaItemIndex; /** The media item, or {@code null} if the timeline is {@link Timeline#isEmpty() empty}. */ @Nullable public final MediaItem mediaItem; /** @@ -509,7 +511,7 @@ public interface Player { @Deprecated public PositionInfo( @Nullable Object windowUid, - int windowIndex, + int mediaItemIndex, @Nullable Object periodUid, int periodIndex, long positionMs, @@ -518,7 +520,7 @@ public interface Player { int adIndexInAdGroup) { this( windowUid, - windowIndex, + mediaItemIndex, MediaItem.EMPTY, periodUid, periodIndex, @@ -531,7 +533,7 @@ public interface Player { /** Creates an instance. */ public PositionInfo( @Nullable Object windowUid, - int windowIndex, + int mediaItemIndex, @Nullable MediaItem mediaItem, @Nullable Object periodUid, int periodIndex, @@ -540,7 +542,8 @@ public interface Player { int adGroupIndex, int adIndexInAdGroup) { this.windowUid = windowUid; - this.windowIndex = windowIndex; + this.windowIndex = mediaItemIndex; + this.mediaItemIndex = mediaItemIndex; this.mediaItem = mediaItem; this.periodUid = periodUid; this.periodIndex = periodIndex; @@ -559,7 +562,7 @@ public interface Player { return false; } PositionInfo that = (PositionInfo) o; - return windowIndex == that.windowIndex + return mediaItemIndex == that.mediaItemIndex && periodIndex == that.periodIndex && positionMs == that.positionMs && contentPositionMs == that.contentPositionMs @@ -574,11 +577,10 @@ public interface Player { public int hashCode() { return Objects.hashCode( windowUid, - windowIndex, + mediaItemIndex, mediaItem, periodUid, periodIndex, - windowIndex, positionMs, contentPositionMs, adGroupIndex, @@ -589,7 +591,7 @@ public interface Player { @Documented @Retention(RetentionPolicy.SOURCE) @IntDef({ - FIELD_WINDOW_INDEX, + FIELD_MEDIA_ITEM_INDEX, FIELD_MEDIA_ITEM, FIELD_PERIOD_INDEX, FIELD_POSITION_MS, @@ -599,7 +601,7 @@ public interface Player { }) private @interface FieldNumber {} - private static final int FIELD_WINDOW_INDEX = 0; + private static final int FIELD_MEDIA_ITEM_INDEX = 0; private static final int FIELD_MEDIA_ITEM = 1; private static final int FIELD_PERIOD_INDEX = 2; private static final int FIELD_POSITION_MS = 3; @@ -616,7 +618,7 @@ public interface Player { @Override public Bundle toBundle() { Bundle bundle = new Bundle(); - bundle.putInt(keyForField(FIELD_WINDOW_INDEX), windowIndex); + bundle.putInt(keyForField(FIELD_MEDIA_ITEM_INDEX), mediaItemIndex); bundle.putBundle(keyForField(FIELD_MEDIA_ITEM), BundleableUtil.toNullableBundle(mediaItem)); bundle.putInt(keyForField(FIELD_PERIOD_INDEX), periodIndex); bundle.putLong(keyForField(FIELD_POSITION_MS), positionMs); @@ -630,8 +632,8 @@ public interface Player { public static final Creator CREATOR = PositionInfo::fromBundle; private static PositionInfo fromBundle(Bundle bundle) { - int windowIndex = - bundle.getInt(keyForField(FIELD_WINDOW_INDEX), /* defaultValue= */ C.INDEX_UNSET); + int mediaItemIndex = + bundle.getInt(keyForField(FIELD_MEDIA_ITEM_INDEX), /* defaultValue= */ C.INDEX_UNSET); @Nullable MediaItem mediaItem = BundleableUtil.fromNullableBundle( @@ -648,7 +650,7 @@ public interface Player { bundle.getInt(keyForField(FIELD_AD_INDEX_IN_AD_GROUP), /* defaultValue= */ C.INDEX_UNSET); return new PositionInfo( /* windowUid= */ null, - windowIndex, + mediaItemIndex, mediaItem, /* periodUid= */ null, periodIndex, From fb1cba3c92f55b3f7122c10c3303a7ee13455020 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 14 Oct 2021 13:44:58 +0100 Subject: [PATCH 329/441] Fix missing imports and package-info.java PiperOrigin-RevId: 403071721 --- .../android/exoplayer2/upstream/crypto/AesCipherDataSink.java | 2 ++ .../exoplayer2/upstream/crypto/AesCipherDataSource.java | 3 +++ .../android/exoplayer2/upstream/crypto/package-info.java | 0 3 files changed, 5 insertions(+) rename google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java => library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java index 1966f76a83..4e5b9f2b8e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java @@ -19,6 +19,8 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import static java.lang.Math.min; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.upstream.DataSink; +import com.google.android.exoplayer2.upstream.DataSpec; import java.io.IOException; import javax.crypto.Cipher; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java index 633b54fb20..98ec914fa0 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java @@ -21,6 +21,9 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSpec; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java similarity index 100% rename from google3/third_party/java_src/android_libs/media/github/package-info-exoplayer-upstream-crypto.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java From 746ad2e6aa13aa2007336755fa6ceba316576c93 Mon Sep 17 00:00:00 2001 From: kimvde Date: Thu, 14 Oct 2021 16:36:45 +0100 Subject: [PATCH 330/441] Remove deprecated ControlDispatcher from API surface PiperOrigin-RevId: 403101980 --- RELEASENOTES.md | 6 ++ .../ext/leanback/LeanbackPlayerAdapter.java | 12 --- .../media2/SessionPlayerConnectorTest.java | 33 -------- .../exoplayer2/ext/media2/PlayerWrapper.java | 11 --- .../ext/media2/SessionPlayerConnector.java | 12 --- .../mediasession/MediaSessionConnector.java | 76 ++++--------------- .../RepeatModeActionProvider.java | 9 +-- .../ext/mediasession/TimelineQueueEditor.java | 7 +- .../mediasession/TimelineQueueNavigator.java | 20 ++--- .../exoplayer2/ui/PlayerControlView.java | 15 ---- .../ui/PlayerNotificationManager.java | 16 ---- .../android/exoplayer2/ui/PlayerView.java | 13 ---- .../ui/StyledPlayerControlView.java | 13 ---- .../exoplayer2/ui/StyledPlayerView.java | 13 ---- 14 files changed, 29 insertions(+), 227 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c43ef9fa5d..46570d7581 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -107,6 +107,12 @@ `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to structured metadata, or access the raw static metadata directly from the `TrackSelection#getFormat()`. + * Remove `setControlDispatcher` from `PlayerWrapper`, + `SessionPlayerConnector`, `MediaSessionConnector`, `PlayerControlView`, + `PlayerNotificationManager`, `PlayerView`, `StyledPlayerControlView`, + `StyledPlayerView` and `LeanbackPlayerAdapter`. Operations can be + customized by using a `ForwardingPlayer`, or when configuring the player + (for example by using `ExoPlayer.Builder.setSeekBackIncrementMs`). ### 2.15.1 (2021-09-20) diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index d704a93c62..cd8172887e 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DiscontinuityReason; @@ -76,17 +75,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab controlDispatcher = new DefaultControlDispatcher(); } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also - * customize some operations when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(@Nullable ControlDispatcher controlDispatcher) { - this.controlDispatcher = - controlDispatcher == null ? new DefaultControlDispatcher() : controlDispatcher; - } - /** * Sets the optional {@link ErrorMessageProvider}. * diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java index fa857f0806..755d62fc84 100644 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java +++ b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnectorTest.java @@ -42,8 +42,6 @@ import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; @@ -152,37 +150,6 @@ public class SessionPlayerConnectorTest { .isTrue(); } - @Test - @LargeTest - public void play_withCustomControlDispatcher_isSkipped() throws Exception { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - ControlDispatcher controlDispatcher = - new DefaultControlDispatcher() { - @Override - public boolean dispatchSetPlayWhenReady(Player player, boolean playWhenReady) { - return false; - } - }; - ExoPlayer exoPlayer = null; - SessionPlayerConnector playerConnector = null; - try { - exoPlayer = new ExoPlayer.Builder(context).setLooper(Looper.myLooper()).build(); - playerConnector = new SessionPlayerConnector(exoPlayer, new DefaultMediaItemConverter()); - playerConnector.setControlDispatcher(controlDispatcher); - assertPlayerResult(playerConnector.play(), RESULT_INFO_SKIPPED); - } finally { - if (playerConnector != null) { - playerConnector.close(); - } - if (exoPlayer != null) { - exoPlayer.release(); - } - } - } - @Test @LargeTest public void play_withForwardingPlayer_isSkipped() throws Exception { diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java index d89be811c6..944f18abcc 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java @@ -35,7 +35,6 @@ import androidx.media2.common.SessionPlayer; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; @@ -163,16 +162,6 @@ import java.util.List; } } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also - * customize some operations when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - this.controlDispatcher = controlDispatcher; - } - public boolean setMediaItem(androidx.media2.common.MediaItem media2MediaItem) { return setPlaylist(Collections.singletonList(media2MediaItem), /* metadata= */ null); } diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java index b26ecf1193..cde7424461 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java @@ -29,9 +29,7 @@ import androidx.media2.common.FileMediaItem; import androidx.media2.common.MediaItem; import androidx.media2.common.MediaMetadata; import androidx.media2.common.SessionPlayer; -import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; @@ -113,16 +111,6 @@ public final class SessionPlayerConnector extends SessionPlayer { playerCommandQueue = new PlayerCommandQueue(this.player, taskHandler); } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to the constructor instead. You can also - * customize some operations when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - player.setControlDispatcher(controlDispatcher); - } - @Override public ListenableFuture play() { return playerCommandQueue.addCommand( diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 317599f618..22e2e7ad3e 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -48,7 +48,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -173,21 +172,13 @@ public final class MediaSessionConnector { * receiver may handle the command, but is not required to do so. * * @param player The player connected to the media session. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param command The command name. * @param extras Optional parameters for the command, may be null. * @param cb A result receiver to which a result may be sent by the command, may be null. * @return Whether the receiver handled the command. */ boolean onCommand( - Player player, - @Deprecated ControlDispatcher controlDispatcher, - String command, - @Nullable Bundle extras, - @Nullable ResultReceiver cb); + Player player, String command, @Nullable Bundle extras, @Nullable ResultReceiver cb); } /** Interface to which playback preparation and play actions are delegated. */ @@ -296,32 +287,20 @@ public final class MediaSessionConnector { * See {@link MediaSessionCompat.Callback#onSkipToPrevious()}. * * @param player The player connected to the media session. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ - void onSkipToPrevious(Player player, @Deprecated ControlDispatcher controlDispatcher); + void onSkipToPrevious(Player player); /** * See {@link MediaSessionCompat.Callback#onSkipToQueueItem(long)}. * * @param player The player connected to the media session. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ - void onSkipToQueueItem(Player player, @Deprecated ControlDispatcher controlDispatcher, long id); + void onSkipToQueueItem(Player player, long id); /** * See {@link MediaSessionCompat.Callback#onSkipToNext()}. * * @param player The player connected to the media session. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). */ - void onSkipToNext(Player player, @Deprecated ControlDispatcher controlDispatcher); + void onSkipToNext(Player player); } /** Handles media session queue edits. */ @@ -374,15 +353,10 @@ public final class MediaSessionConnector { * See {@link MediaSessionCompat.Callback#onMediaButtonEvent(Intent)}. * * @param player The {@link Player}. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param mediaButtonEvent The {@link Intent}. * @return True if the event was handled, false otherwise. */ - boolean onMediaButtonEvent( - Player player, @Deprecated ControlDispatcher controlDispatcher, Intent mediaButtonEvent); + boolean onMediaButtonEvent(Player player, Intent mediaButtonEvent); } /** @@ -394,18 +368,10 @@ public final class MediaSessionConnector { * Called when a custom action provided by this provider is sent to the media session. * * @param player The player connected to the media session. - * @param controlDispatcher This parameter is deprecated. Use {@code player} instead. Operations - * can be customized by passing a {@link ForwardingPlayer} to {@link #setPlayer(Player)}, or - * when configuring the player (for example by using {@code - * ExoPlayer.Builder#setSeekBackIncrementMs(long)}). * @param action The name of the action which was sent by a media controller. * @param extras Optional extras sent by a media controller, may be null. */ - void onCustomAction( - Player player, - @Deprecated ControlDispatcher controlDispatcher, - String action, - @Nullable Bundle extras); + void onCustomAction(Player player, String action, @Nullable Bundle extras); /** * Returns a {@link PlaybackStateCompat.CustomAction} which will be published to the media @@ -559,19 +525,6 @@ public final class MediaSessionConnector { } } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@code ExoPlayer.Builder#setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - if (this.controlDispatcher != controlDispatcher) { - this.controlDispatcher = controlDispatcher; - invalidateMediaSessionPlaybackState(); - } - } - /** * Sets the {@link MediaButtonEventHandler}. Pass {@code null} if the media button event should be * handled by {@link MediaSessionCompat.Callback#onMediaButtonEvent(Intent)}. @@ -1317,28 +1270,28 @@ public final class MediaSessionConnector { @Override public void onSkipToNext() { if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SKIP_TO_NEXT)) { - queueNavigator.onSkipToNext(player, controlDispatcher); + queueNavigator.onSkipToNext(player); } } @Override public void onSkipToPrevious() { if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)) { - queueNavigator.onSkipToPrevious(player, controlDispatcher); + queueNavigator.onSkipToPrevious(player); } } @Override public void onSkipToQueueItem(long id) { if (canDispatchToQueueNavigator(PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM)) { - queueNavigator.onSkipToQueueItem(player, controlDispatcher, id); + queueNavigator.onSkipToQueueItem(player, id); } } @Override public void onCustomAction(String action, @Nullable Bundle extras) { if (player != null && customActionMap.containsKey(action)) { - customActionMap.get(action).onCustomAction(player, controlDispatcher, action, extras); + customActionMap.get(action).onCustomAction(player, action, extras); invalidateMediaSessionPlaybackState(); } } @@ -1347,14 +1300,12 @@ public final class MediaSessionConnector { public void onCommand(String command, @Nullable Bundle extras, @Nullable ResultReceiver cb) { if (player != null) { for (int i = 0; i < commandReceivers.size(); i++) { - if (commandReceivers.get(i).onCommand(player, controlDispatcher, command, extras, cb)) { + if (commandReceivers.get(i).onCommand(player, command, extras, cb)) { return; } } for (int i = 0; i < customCommandReceivers.size(); i++) { - if (customCommandReceivers - .get(i) - .onCommand(player, controlDispatcher, command, extras, cb)) { + if (customCommandReceivers.get(i).onCommand(player, command, extras, cb)) { return; } } @@ -1456,8 +1407,7 @@ public final class MediaSessionConnector { public boolean onMediaButtonEvent(Intent mediaButtonEvent) { boolean isHandled = canDispatchMediaButtonEvent() - && mediaButtonEventHandler.onMediaButtonEvent( - player, controlDispatcher, mediaButtonEvent); + && mediaButtonEventHandler.onMediaButtonEvent(player, mediaButtonEvent); return isHandled || super.onMediaButtonEvent(mediaButtonEvent); } } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java index 99c85b2353..e72f93e800 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.java @@ -19,7 +19,6 @@ import android.content.Context; import android.os.Bundle; import android.support.v4.media.session.PlaybackStateCompat; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.RepeatModeUtil; @@ -64,15 +63,11 @@ public final class RepeatModeActionProvider implements MediaSessionConnector.Cus } @Override - public void onCustomAction( - Player player, - @Deprecated ControlDispatcher controlDispatcher, - String action, - @Nullable Bundle extras) { + public void onCustomAction(Player player, String action, @Nullable Bundle extras) { int mode = player.getRepeatMode(); int proposedMode = RepeatModeUtil.getNextRepeatMode(mode, repeatToggleModes); if (mode != proposedMode) { - controlDispatcher.dispatchSetRepeatMode(player, proposedMode); + player.setRepeatMode(proposedMode); } } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java index f6af25d188..887acea798 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.java @@ -22,7 +22,6 @@ import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaSessionCompat; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.Util; @@ -178,11 +177,7 @@ public final class TimelineQueueEditor @Override public boolean onCommand( - Player player, - @Deprecated ControlDispatcher controlDispatcher, - String command, - @Nullable Bundle extras, - @Nullable ResultReceiver cb) { + Player player, String command, @Nullable Bundle extras, @Nullable ResultReceiver cb) { if (!COMMAND_MOVE_QUEUE_ITEM.equals(command) || extras == null) { return false; } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java index cb8927a2b5..90db27e458 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java @@ -27,7 +27,6 @@ import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.util.Assertions; @@ -144,37 +143,32 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu } @Override - public void onSkipToPrevious(Player player, @Deprecated ControlDispatcher controlDispatcher) { - controlDispatcher.dispatchPrevious(player); + public void onSkipToPrevious(Player player) { + player.seekToPrevious(); } @Override - public void onSkipToQueueItem( - Player player, @Deprecated ControlDispatcher controlDispatcher, long id) { + public void onSkipToQueueItem(Player player, long id) { Timeline timeline = player.getCurrentTimeline(); if (timeline.isEmpty() || player.isPlayingAd()) { return; } int windowIndex = (int) id; if (0 <= windowIndex && windowIndex < timeline.getWindowCount()) { - controlDispatcher.dispatchSeekTo(player, windowIndex, C.TIME_UNSET); + player.seekToDefaultPosition(windowIndex); } } @Override - public void onSkipToNext(Player player, @Deprecated ControlDispatcher controlDispatcher) { - controlDispatcher.dispatchNext(player); + public void onSkipToNext(Player player) { + player.seekToNext(); } // CommandReceiver implementation. @Override public boolean onCommand( - Player player, - @Deprecated ControlDispatcher controlDispatcher, - String command, - @Nullable Bundle extras, - @Nullable ResultReceiver cb) { + Player player, String command, @Nullable Bundle extras, @Nullable ResultReceiver cb) { return false; } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 7d352c0046..2c970ec4e8 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -52,9 +52,7 @@ import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; import com.google.android.exoplayer2.Player.State; @@ -611,19 +609,6 @@ public class PlayerControlView extends FrameLayout { this.progressUpdateListener = listener; } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - if (this.controlDispatcher != controlDispatcher) { - this.controlDispatcher = controlDispatcher; - updateNavigation(); - } - } - /** * Sets whether the rewind button is shown. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index a7c29321be..145c4b4952 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -54,7 +54,6 @@ import androidx.media.app.NotificationCompat.MediaStyle; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ControlDispatcher; import com.google.android.exoplayer2.DefaultControlDispatcher; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.NotificationUtil; import com.google.android.exoplayer2.util.Util; @@ -816,21 +815,6 @@ public class PlayerNotificationManager { } } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}), or configure whether the rewind - * and fast forward actions should be used with {{@link #setUseRewindAction(boolean)}} and - * {@link #setUseFastForwardAction(boolean)}. - */ - @Deprecated - public final void setControlDispatcher(ControlDispatcher controlDispatcher) { - if (this.controlDispatcher != controlDispatcher) { - this.controlDispatcher = controlDispatcher; - invalidate(); - } - } - /** * Sets whether the next action should be used. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 336a2e2f38..4836774bb2 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -46,8 +46,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -927,17 +925,6 @@ public class PlayerView extends FrameLayout implements AdViewProvider { } } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - Assertions.checkStateNotNull(controller); - controller.setControlDispatcher(controlDispatcher); - } - /** * Sets whether the rewind button is shown. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 68e828bd2f..2348a52165 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -831,19 +831,6 @@ public class StyledPlayerControlView extends FrameLayout { this.progressUpdateListener = listener; } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - if (this.controlDispatcher != controlDispatcher) { - this.controlDispatcher = controlDispatcher; - updateNavigation(); - } - } - /** * Sets whether the rewind button is shown. * diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index e1263622d4..4434aef516 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -47,8 +47,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -944,17 +942,6 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { controller.setOnFullScreenModeChangedListener(listener); } - /** - * @deprecated Use a {@link ForwardingPlayer} and pass it to {@link #setPlayer(Player)} instead. - * You can also customize some operations when configuring the player (for example by using - * {@code ExoPlayer.Builder.setSeekBackIncrementMs(long)}). - */ - @Deprecated - public void setControlDispatcher(ControlDispatcher controlDispatcher) { - Assertions.checkStateNotNull(controller); - controller.setControlDispatcher(controlDispatcher); - } - /** * Sets whether the rewind button is shown. * From 21cfd62cfdaf873dd3db65c33dea8e9db39feb6c Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 14 Oct 2021 17:03:28 +0100 Subject: [PATCH 331/441] Update ExoPlayer.Builder#build() to return ExoPlayer (instead of SEP) Users who need a (deprecated) SimpleExoPlayer instance should use (the also deprecated) SimpleExoPlayer.Builder. PiperOrigin-RevId: 403108197 --- .../main/java/com/google/android/exoplayer2/ExoPlayer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index ed6d1b5278..184c1de246 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -352,7 +352,7 @@ public interface ExoPlayer extends Player { } /** - * A builder for {@link SimpleExoPlayer} instances. + * A builder for {@link ExoPlayer} instances. * *

                See {@link #Builder(Context)} for the list of default values. */ @@ -818,11 +818,11 @@ public interface ExoPlayer extends Player { } /** - * Builds a {@link SimpleExoPlayer} instance. + * Builds an {@link ExoPlayer} instance. * * @throws IllegalStateException If this method has already been called. */ - public SimpleExoPlayer build() { + public ExoPlayer build() { return wrappedBuilder.build(); } } From b2bf9f4d0fe64ce4a63a2df1fafc91b84991e55a Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 14 Oct 2021 17:28:51 +0100 Subject: [PATCH 332/441] Fix missing import PiperOrigin-RevId: 403113286 --- .../android/exoplayer2/extractor/TrueHdSampleRechunker.java | 2 +- .../google/android/exoplayer2/extractor/mp4/AtomParsers.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrueHdSampleRechunker.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrueHdSampleRechunker.java index 6bae591956..f11f237165 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrueHdSampleRechunker.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrueHdSampleRechunker.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.google.android.exoplayer2.extractor; import static com.google.android.exoplayer2.util.Assertions.checkState; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.audio.Ac3Util; import java.io.IOException; /** diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index ee8719fe5c..b43eddf300 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -1327,8 +1327,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; parent.skipBytes(6); // sampleSize, compressionId, packetSize. sampleRate = parent.readUnsignedFixedPoint1616(); - parent.skipBytes(-4); // The sample rate has been redefined as a 32-bit value for Dolby TrueHD (MLP) streams. + parent.setPosition(parent.getPosition() - 4); sampleRateMlp = parent.readInt(); if (quickTimeSoundDescriptionVersion == 1) { From 6ef82e4423f0385c90a627e79a0e9342a5e8313b Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 15 Oct 2021 00:55:34 +0100 Subject: [PATCH 333/441] Move upstream components to common Common houses DataSource as an interface for reading data, but most of the concrete implementations are in ExoPlayer. This means that in practice, if an app wants to use a module that reads using DataSource (e.g. extractor), they may be forced to depend on ExoPlayer as well to get a concrete implementation (e.g. FileDataSource). This change moves the DataSource implementations into common to resolve this. PiperOrigin-RevId: 403222081 --- library/common/build.gradle | 22 +++++++++++- library/common/proguard-rules.txt | 11 ++++++ .../src/androidTest/AndroidManifest.xml | 35 +++++++++++++++++++ .../ContentDataSourceContractTest.java | 0 .../upstream/ContentDataSourceTest.java | 0 .../RawResourceDataSourceContractTest.java | 2 +- .../src/androidTest/res/raw/resource1 | 0 .../src/androidTest/res/raw/resource2 | 0 .../exoplayer2/upstream/AssetDataSource.java | 0 .../upstream/ByteArrayDataSink.java | 0 .../upstream/ByteArrayDataSource.java | 0 .../upstream/ContentDataSource.java | 0 .../upstream/DataSchemeDataSource.java | 0 .../upstream/DataSourceInputStream.java | 0 .../upstream/DefaultDataSource.java | 0 .../upstream/DefaultDataSourceFactory.java | 0 .../exoplayer2/upstream/DummyDataSource.java | 0 .../exoplayer2/upstream/FileDataSource.java | 0 .../upstream/PriorityDataSource.java | 0 .../upstream/PriorityDataSourceFactory.java | 0 .../upstream/RawResourceDataSource.java | 0 .../upstream/ResolvingDataSource.java | 0 .../exoplayer2/upstream/StatsDataSource.java | 0 .../exoplayer2/upstream/TeeDataSource.java | 0 .../exoplayer2/upstream/UdpDataSource.java | 0 .../upstream/AssetDataSourceContractTest.java | 0 .../upstream/AssetDataSourceTest.java | 0 .../ByteArrayDataSourceContractTest.java | 0 .../upstream/ByteArrayDataSourceTest.java | 0 .../DataSchemeDataSourceContractTest.java | 0 .../upstream/DataSchemeDataSourceTest.java | 0 .../upstream/DataSourceInputStreamTest.java | 0 .../upstream/FileDataSourceContractTest.java | 0 .../ResolvingDataSourceContractTest.java | 0 .../upstream/UdpDataSourceContractTest.java | 0 library/core/proguard-rules.txt | 11 ------ .../core/src/androidTest/AndroidManifest.xml | 6 +--- 37 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 library/common/src/androidTest/AndroidManifest.xml rename library/{core => common}/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java (100%) rename library/{core => common}/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java (100%) rename library/{core => common}/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java (98%) rename library/{core => common}/src/androidTest/res/raw/resource1 (100%) rename library/{core => common}/src/androidTest/res/raw/resource2 (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java (100%) diff --git a/library/common/build.gradle b/library/common/build.gradle index d4aa1615f8..b8080fba63 100644 --- a/library/common/build.gradle +++ b/library/common/build.gradle @@ -13,7 +13,21 @@ // limitations under the License. apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" -android.buildTypes.debug.testCoverageEnabled true +android { + defaultConfig { + multiDexEnabled true + } + + buildTypes { + debug { + testCoverageEnabled = true + } + } + + sourceSets { + androidTest.assets.srcDir '../../testdata/src/test/assets/' + } +} dependencies { api ('com.google.guava:guava:' + guavaVersion) { @@ -31,6 +45,12 @@ dependencies { compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion + androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion + androidTestImplementation 'com.linkedin.dexmaker:dexmaker:' + dexmakerVersion + androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion + androidTestImplementation(project(modulePrefix + 'testutils')) { + exclude module: modulePrefix.substring(1) + 'library-core' + } testImplementation 'org.mockito:mockito-core:' + mockitoVersion testImplementation 'androidx.test:core:' + androidxTestCoreVersion testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion diff --git a/library/common/proguard-rules.txt b/library/common/proguard-rules.txt index 2eb313c45d..557df0f374 100644 --- a/library/common/proguard-rules.txt +++ b/library/common/proguard-rules.txt @@ -1,5 +1,16 @@ # Proguard rules specific to the common module. +# Constant folding for resource integers may mean that a resource passed to this method appears to be unused. Keep the method to prevent this from happening. +-keepclassmembers class com.google.android.exoplayer2.upstream.RawResourceDataSource { + public static android.net.Uri buildRawResourceUri(int); +} + +# Constructors accessed via reflection in DefaultDataSource +-dontnote com.google.android.exoplayer2.ext.rtmp.RtmpDataSource +-keepclassmembers class com.google.android.exoplayer2.ext.rtmp.RtmpDataSource { + (); +} + # Don't warn about checkerframework and Kotlin annotations -dontwarn org.checkerframework.** -dontwarn kotlin.annotations.jvm.** diff --git a/library/common/src/androidTest/AndroidManifest.xml b/library/common/src/androidTest/AndroidManifest.xml new file mode 100644 index 0000000000..15db6a41e0 --- /dev/null +++ b/library/common/src/androidTest/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java b/library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java similarity index 100% rename from library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java rename to library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java b/library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java similarity index 100% rename from library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java rename to library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java b/library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java similarity index 98% rename from library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java rename to library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java index d55e162a49..db0a58c086 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java +++ b/library/common/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java @@ -19,7 +19,7 @@ import android.content.res.Resources; import android.net.Uri; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.core.test.R; +import com.google.android.exoplayer2.common.test.R; import com.google.android.exoplayer2.testutil.DataSourceContractTest; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; diff --git a/library/core/src/androidTest/res/raw/resource1 b/library/common/src/androidTest/res/raw/resource1 similarity index 100% rename from library/core/src/androidTest/res/raw/resource1 rename to library/common/src/androidTest/res/raw/resource1 diff --git a/library/core/src/androidTest/res/raw/resource2 b/library/common/src/androidTest/res/raw/resource2 similarity index 100% rename from library/core/src/androidTest/res/raw/resource2 rename to library/common/src/androidTest/res/raw/resource2 diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java diff --git a/library/core/proguard-rules.txt b/library/core/proguard-rules.txt index 90f9d11130..fc6787e09d 100644 --- a/library/core/proguard-rules.txt +++ b/library/core/proguard-rules.txt @@ -1,10 +1,5 @@ # Proguard rules specific to the core module. -# Constant folding for resource integers may mean that a resource passed to this method appears to be unused. Keep the method to prevent this from happening. --keepclassmembers class com.google.android.exoplayer2.upstream.RawResourceDataSource { - public static android.net.Uri buildRawResourceUri(int); -} - # Constructors accessed via reflection in DefaultRenderersFactory -dontnote com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer -keepclassmembers class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer { @@ -31,12 +26,6 @@ (android.os.Handler, com.google.android.exoplayer2.audio.AudioRendererEventListener, com.google.android.exoplayer2.audio.AudioSink); } -# Constructors accessed via reflection in DefaultDataSource --dontnote com.google.android.exoplayer2.ext.rtmp.RtmpDataSource --keepclassmembers class com.google.android.exoplayer2.ext.rtmp.RtmpDataSource { - (); -} - # Constructors accessed via reflection in DefaultDownloaderFactory -dontnote com.google.android.exoplayer2.source.dash.offline.DashDownloader -keepclassmembers class com.google.android.exoplayer2.source.dash.offline.DashDownloader { diff --git a/library/core/src/androidTest/AndroidManifest.xml b/library/core/src/androidTest/AndroidManifest.xml index 6ccd2b3429..ea61783474 100644 --- a/library/core/src/androidTest/AndroidManifest.xml +++ b/library/core/src/androidTest/AndroidManifest.xml @@ -25,11 +25,7 @@ - - + android:usesCleartextTraffic="true"/> Date: Fri, 15 Oct 2021 02:44:43 +0100 Subject: [PATCH 334/441] Update androidx.media version to 1.4.3 It fixes the issue that the library injects an intent query element to app's AndroidManifest.xml by updating the dependency on androidx.media. Please refer to the release note of androidx.media 1.4.3 for details. https://developer.android.com/jetpack/androidx/releases/media#media-1.4.3 Issue: #9480 #minor-release PiperOrigin-RevId: 403243445 --- constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.gradle b/constants.gradle index ac96ab3f3f..400eba8c9f 100644 --- a/constants.gradle +++ b/constants.gradle @@ -40,7 +40,7 @@ project.ext { androidxCollectionVersion = '1.1.0' androidxCoreVersion = '1.6.0' androidxFuturesVersion = '1.1.0' - androidxMediaVersion = '1.4.2' + androidxMediaVersion = '1.4.3' androidxMedia2Version = '1.1.3' androidxMultidexVersion = '2.0.1' androidxRecyclerViewVersion = '1.2.1' From 5ef00f0e96b21a96ca2c46c6672848b5741a758e Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 15 Oct 2021 11:08:08 +0100 Subject: [PATCH 335/441] Remove deprecated ControlDispatcher The possibilities to set a ControlDispatcher have been removed in so that the ControlDispatcher is always a DefaultControlDispatcher. PiperOrigin-RevId: 403327092 --- RELEASENOTES.md | 10 +- .../ext/leanback/LeanbackPlayerAdapter.java | 18 +- .../exoplayer2/ext/media2/PlayerWrapper.java | 73 ++++---- .../mediasession/MediaSessionConnector.java | 33 ++-- .../android/exoplayer2/ControlDispatcher.java | 125 -------------- .../exoplayer2/DefaultControlDispatcher.java | 158 ------------------ .../exoplayer2/ui/PlayerControlView.java | 49 +++--- .../ui/PlayerNotificationManager.java | 28 ++-- .../ui/StyledPlayerControlView.java | 60 +++---- 9 files changed, 121 insertions(+), 433 deletions(-) delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/ControlDispatcher.java delete mode 100644 library/common/src/main/java/com/google/android/exoplayer2/DefaultControlDispatcher.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 46570d7581..23086c71ba 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -107,12 +107,10 @@ `Player.EVENT_MEDIA_METADATA_CHANGED` for convenient access to structured metadata, or access the raw static metadata directly from the `TrackSelection#getFormat()`. - * Remove `setControlDispatcher` from `PlayerWrapper`, - `SessionPlayerConnector`, `MediaSessionConnector`, `PlayerControlView`, - `PlayerNotificationManager`, `PlayerView`, `StyledPlayerControlView`, - `StyledPlayerView` and `LeanbackPlayerAdapter`. Operations can be - customized by using a `ForwardingPlayer`, or when configuring the player - (for example by using `ExoPlayer.Builder.setSeekBackIncrementMs`). + * Remove `ControlDispatcher` and `DefaultControlDispatcher`. Operations + can be customized by using a `ForwardingPlayer`, or when configuring the + player (for example by using + `ExoPlayer.Builder.setSeekBackIncrementMs`). ### 2.15.1 (2021-09-20) diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index cd8172887e..a914869f8f 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -26,8 +26,6 @@ import androidx.leanback.media.PlaybackGlueHost; import androidx.leanback.media.PlayerAdapter; import androidx.leanback.media.SurfaceHolderGlueHost; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -51,7 +49,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab private final PlayerListener playerListener; private final int updatePeriodMs; - private ControlDispatcher controlDispatcher; @Nullable private ErrorMessageProvider errorMessageProvider; @Nullable private SurfaceHolderGlueHost surfaceHolderGlueHost; private boolean hasSurface; @@ -72,7 +69,6 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab this.updatePeriodMs = updatePeriodMs; handler = Util.createHandlerForCurrentOrMainLooper(); playerListener = new PlayerListener(); - controlDispatcher = new DefaultControlDispatcher(); } /** @@ -143,27 +139,27 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab @Override public void play() { if (player.getPlaybackState() == Player.STATE_IDLE) { - controlDispatcher.dispatchPrepare(player); + player.prepare(); } else if (player.getPlaybackState() == Player.STATE_ENDED) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + player.seekToDefaultPosition(player.getCurrentWindowIndex()); } - if (player.isCommandAvailable(Player.COMMAND_PLAY_PAUSE) - && controlDispatcher.dispatchSetPlayWhenReady(player, true)) { + if (player.isCommandAvailable(Player.COMMAND_PLAY_PAUSE)) { + player.play(); getCallback().onPlayStateChanged(this); } } @Override public void pause() { - if (player.isCommandAvailable(Player.COMMAND_PLAY_PAUSE) - && controlDispatcher.dispatchSetPlayWhenReady(player, false)) { + if (player.isCommandAvailable(Player.COMMAND_PLAY_PAUSE)) { + player.pause(); getCallback().onPlayStateChanged(this); } } @Override public void seekTo(long positionMs) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), positionMs); + player.seekTo(player.getCurrentMediaItemIndex(), positionMs); } @Override diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java index 944f18abcc..7891bc47f3 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java @@ -33,8 +33,6 @@ import androidx.media2.common.CallbackMediaItem; import androidx.media2.common.MediaMetadata; import androidx.media2.common.SessionPlayer; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; @@ -123,7 +121,6 @@ import java.util.List; private final List media2Playlist; private final List exoPlayerPlaylist; - private ControlDispatcher controlDispatcher; private int sessionPlayerState; private boolean prepared; @Nullable private androidx.media2.common.MediaItem bufferingItem; @@ -142,7 +139,6 @@ import java.util.List; this.player = player; this.mediaItemConverter = mediaItemConverter; - controlDispatcher = new DefaultControlDispatcher(); componentListener = new ComponentListener(); player.addListener(componentListener); @@ -235,13 +231,19 @@ import java.util.List; } public boolean skipToPreviousPlaylistItem() { - return player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS) - && controlDispatcher.dispatchPrevious(player); + if (!player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)) { + return false; + } + player.seekToPrevious(); + return true; } public boolean skipToNextPlaylistItem() { - return player.isCommandAvailable(COMMAND_SEEK_TO_NEXT) - && controlDispatcher.dispatchNext(player); + if (!player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)) { + return false; + } + player.seekToNext(); + return true; } public boolean skipToPlaylistItem(@IntRange(from = 0) int index) { @@ -252,11 +254,11 @@ import java.util.List; // but RESULT_ERROR_INVALID_STATE with IllegalStateException is expected here. Assertions.checkState(0 <= index && index < timeline.getWindowCount()); int windowIndex = player.getCurrentWindowIndex(); - if (windowIndex != index) { - return player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM) - && controlDispatcher.dispatchSeekTo(player, index, C.TIME_UNSET); + if (windowIndex == index || !player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)) { + return false; } - return false; + player.seekToDefaultPosition(index); + return true; } public boolean updatePlaylistMetadata(@Nullable MediaMetadata metadata) { @@ -265,15 +267,19 @@ import java.util.List; } public boolean setRepeatMode(int repeatMode) { - return player.isCommandAvailable(COMMAND_SET_REPEAT_MODE) - && controlDispatcher.dispatchSetRepeatMode( - player, Utils.getExoPlayerRepeatMode(repeatMode)); + if (!player.isCommandAvailable(COMMAND_SET_REPEAT_MODE)) { + return false; + } + player.setRepeatMode(Utils.getExoPlayerRepeatMode(repeatMode)); + return true; } public boolean setShuffleMode(int shuffleMode) { - return player.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE) - && controlDispatcher.dispatchSetShuffleModeEnabled( - player, Utils.getExoPlayerShuffleMode(shuffleMode)); + if (!player.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE)) { + return false; + } + player.setShuffleModeEnabled(Utils.getExoPlayerShuffleMode(shuffleMode)); + return true; } @Nullable @@ -322,36 +328,38 @@ import java.util.List; public boolean play() { if (player.getPlaybackState() == Player.STATE_ENDED) { - boolean seekHandled = - player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) - && controlDispatcher.dispatchSeekTo( - player, player.getCurrentWindowIndex(), /* positionMs= */ 0); - if (!seekHandled) { + if (!player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)) { return false; } + player.seekTo(player.getCurrentWindowIndex(), /* positionMs= */ 0); } boolean playWhenReady = player.getPlayWhenReady(); int suppressReason = player.getPlaybackSuppressionReason(); - if (playWhenReady && suppressReason == Player.PLAYBACK_SUPPRESSION_REASON_NONE) { + if ((playWhenReady && suppressReason == Player.PLAYBACK_SUPPRESSION_REASON_NONE) + || !player.isCommandAvailable(COMMAND_PLAY_PAUSE)) { return false; } - return player.isCommandAvailable(COMMAND_PLAY_PAUSE) - && controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ true); + player.play(); + return true; } public boolean pause() { boolean playWhenReady = player.getPlayWhenReady(); int suppressReason = player.getPlaybackSuppressionReason(); - if (!playWhenReady && suppressReason == Player.PLAYBACK_SUPPRESSION_REASON_NONE) { + if ((!playWhenReady && suppressReason == Player.PLAYBACK_SUPPRESSION_REASON_NONE) + || !player.isCommandAvailable(COMMAND_PLAY_PAUSE)) { return false; } - return player.isCommandAvailable(COMMAND_PLAY_PAUSE) - && controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ false); + player.pause(); + return true; } public boolean seekTo(long position) { - return player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) - && controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), position); + if (!player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)) { + return false; + } + player.seekTo(player.getCurrentWindowIndex(), position); + return true; } public long getCurrentPosition() { @@ -471,7 +479,8 @@ import java.util.List; } public void reset() { - controlDispatcher.dispatchStop(player, /* reset= */ true); + player.stop(); + player.clearMediaItems(); prepared = false; bufferingItem = null; } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 22e2e7ad3e..b823d0f90f 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -45,8 +45,6 @@ import android.view.KeyEvent; import androidx.annotation.LongDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; @@ -450,7 +448,6 @@ public final class MediaSessionConnector { private final ArrayList commandReceivers; private final ArrayList customCommandReceivers; - private ControlDispatcher controlDispatcher; private CustomActionProvider[] customActionProviders; private Map customActionMap; @Nullable private MediaMetadataProvider mediaMetadataProvider; @@ -480,7 +477,6 @@ public final class MediaSessionConnector { componentListener = new ComponentListener(); commandReceivers = new ArrayList<>(); customCommandReceivers = new ArrayList<>(); - controlDispatcher = new DefaultControlDispatcher(); customActionProviders = new CustomActionProvider[0]; customActionMap = Collections.emptyMap(); mediaMetadataProvider = @@ -885,10 +881,8 @@ public final class MediaSessionConnector { private long buildPlaybackActions(Player player) { boolean enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); - boolean enableRewind = - player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); - boolean enableFastForward = - player.isCommandAvailable(COMMAND_SEEK_FORWARD) && controlDispatcher.isFastForwardEnabled(); + boolean enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK); + boolean enableFastForward = player.isCommandAvailable(COMMAND_SEEK_FORWARD); boolean enableSetRating = false; boolean enableSetCaptioningEnabled = false; @@ -976,7 +970,7 @@ public final class MediaSessionConnector { } private void seekTo(Player player, int windowIndex, long positionMs) { - controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); + player.seekTo(windowIndex, positionMs); } private static int getMediaSessionPlaybackState( @@ -1173,20 +1167,19 @@ public final class MediaSessionConnector { if (playbackPreparer != null) { playbackPreparer.onPrepare(/* playWhenReady= */ true); } else { - controlDispatcher.dispatchPrepare(player); + player.prepare(); } } else if (player.getPlaybackState() == Player.STATE_ENDED) { seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } - controlDispatcher.dispatchSetPlayWhenReady( - Assertions.checkNotNull(player), /* playWhenReady= */ true); + Assertions.checkNotNull(player).play(); } } @Override public void onPause() { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_PAUSE)) { - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ false); + player.pause(); } } @@ -1200,21 +1193,22 @@ public final class MediaSessionConnector { @Override public void onFastForward() { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_FAST_FORWARD)) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } } @Override public void onRewind() { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_REWIND)) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } } @Override public void onStop() { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_STOP)) { - controlDispatcher.dispatchStop(player, /* reset= */ true); + player.stop(); + player.clearMediaItems(); } } @@ -1233,7 +1227,7 @@ public final class MediaSessionConnector { shuffleModeEnabled = false; break; } - controlDispatcher.dispatchSetShuffleModeEnabled(player, shuffleModeEnabled); + player.setShuffleModeEnabled(shuffleModeEnabled); } } @@ -1255,15 +1249,14 @@ public final class MediaSessionConnector { repeatMode = Player.REPEAT_MODE_OFF; break; } - controlDispatcher.dispatchSetRepeatMode(player, repeatMode); + player.setRepeatMode(repeatMode); } } @Override public void onSetPlaybackSpeed(float speed) { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_SET_PLAYBACK_SPEED) && speed > 0) { - controlDispatcher.dispatchSetPlaybackParameters( - player, player.getPlaybackParameters().withSpeed(speed)); + player.setPlaybackParameters(player.getPlaybackParameters().withSpeed(speed)); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ControlDispatcher.java b/library/common/src/main/java/com/google/android/exoplayer2/ControlDispatcher.java deleted file mode 100644 index a24131e956..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/ControlDispatcher.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2; - -import com.google.android.exoplayer2.Player.RepeatMode; - -/** @deprecated Use a {@link ForwardingPlayer} or configure the player to customize operations. */ -@Deprecated -public interface ControlDispatcher { - - /** - * Dispatches a {@link Player#prepare()} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchPrepare(Player player); - - /** - * Dispatches a {@link Player#setPlayWhenReady(boolean)} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param playWhenReady Whether playback should proceed when ready. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchSetPlayWhenReady(Player player, boolean playWhenReady); - - /** - * Dispatches a {@link Player#seekTo(int, long)} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param windowIndex The index of the window. - * @param positionMs The seek position in the specified window, or {@link C#TIME_UNSET} to seek to - * the window's default position. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchSeekTo(Player player, int windowIndex, long positionMs); - - /** - * Dispatches a {@link Player#seekToPreviousWindow()} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchPrevious(Player player); - - /** - * Dispatches a {@link Player#seekToNextWindow()} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchNext(Player player); - - /** - * Dispatches a rewind operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchRewind(Player player); - - /** - * Dispatches a fast forward operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchFastForward(Player player); - - /** - * Dispatches a {@link Player#setRepeatMode(int)} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param repeatMode The repeat mode. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchSetRepeatMode(Player player, @RepeatMode int repeatMode); - - /** - * Dispatches a {@link Player#setShuffleModeEnabled(boolean)} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param shuffleModeEnabled Whether shuffling is enabled. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchSetShuffleModeEnabled(Player player, boolean shuffleModeEnabled); - - /** - * Dispatches a {@link Player#stop()} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param reset Whether the player should be reset. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchStop(Player player, boolean reset); - - /** - * Dispatches a {@link Player#setPlaybackParameters(PlaybackParameters)} operation. - * - * @param player The {@link Player} to which the operation should be dispatched. - * @param playbackParameters The playback parameters. - * @return True if the operation was dispatched. False if suppressed. - */ - boolean dispatchSetPlaybackParameters(Player player, PlaybackParameters playbackParameters); - - /** Returns {@code true} if rewind is enabled, {@code false} otherwise. */ - boolean isRewindEnabled(); - - /** Returns {@code true} if fast forward is enabled, {@code false} otherwise. */ - boolean isFastForwardEnabled(); -} diff --git a/library/common/src/main/java/com/google/android/exoplayer2/DefaultControlDispatcher.java b/library/common/src/main/java/com/google/android/exoplayer2/DefaultControlDispatcher.java deleted file mode 100644 index b20daebefb..0000000000 --- a/library/common/src/main/java/com/google/android/exoplayer2/DefaultControlDispatcher.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2; - -import static java.lang.Math.max; -import static java.lang.Math.min; - -/** @deprecated Use a {@link ForwardingPlayer} or configure the player to customize operations. */ -@Deprecated -public class DefaultControlDispatcher implements ControlDispatcher { - - private final long rewindIncrementMs; - private final long fastForwardIncrementMs; - private final boolean rewindAndFastForwardIncrementsSet; - - /** Creates an instance. */ - public DefaultControlDispatcher() { - fastForwardIncrementMs = C.TIME_UNSET; - rewindIncrementMs = C.TIME_UNSET; - rewindAndFastForwardIncrementsSet = false; - } - - /** - * Creates an instance with the given increments. - * - * @param fastForwardIncrementMs The fast forward increment in milliseconds. A non-positive value - * disables the fast forward operation. - * @param rewindIncrementMs The rewind increment in milliseconds. A non-positive value disables - * the rewind operation. - */ - public DefaultControlDispatcher(long fastForwardIncrementMs, long rewindIncrementMs) { - this.fastForwardIncrementMs = fastForwardIncrementMs; - this.rewindIncrementMs = rewindIncrementMs; - rewindAndFastForwardIncrementsSet = true; - } - - @Override - public boolean dispatchPrepare(Player player) { - player.prepare(); - return true; - } - - @Override - public boolean dispatchSetPlayWhenReady(Player player, boolean playWhenReady) { - player.setPlayWhenReady(playWhenReady); - return true; - } - - @Override - public boolean dispatchSeekTo(Player player, int windowIndex, long positionMs) { - player.seekTo(windowIndex, positionMs); - return true; - } - - @Override - public boolean dispatchPrevious(Player player) { - player.seekToPrevious(); - return true; - } - - @Override - public boolean dispatchNext(Player player) { - player.seekToNext(); - return true; - } - - @Override - public boolean dispatchRewind(Player player) { - if (!rewindAndFastForwardIncrementsSet) { - player.seekBack(); - } else if (isRewindEnabled() && player.isCurrentWindowSeekable()) { - seekToOffset(player, -rewindIncrementMs); - } - return true; - } - - @Override - public boolean dispatchFastForward(Player player) { - if (!rewindAndFastForwardIncrementsSet) { - player.seekForward(); - } else if (isFastForwardEnabled() && player.isCurrentWindowSeekable()) { - seekToOffset(player, fastForwardIncrementMs); - } - return true; - } - - @Override - public boolean dispatchSetRepeatMode(Player player, @Player.RepeatMode int repeatMode) { - player.setRepeatMode(repeatMode); - return true; - } - - @Override - public boolean dispatchSetShuffleModeEnabled(Player player, boolean shuffleModeEnabled) { - player.setShuffleModeEnabled(shuffleModeEnabled); - return true; - } - - @Override - public boolean dispatchStop(Player player, boolean reset) { - player.stop(reset); - return true; - } - - @Override - public boolean dispatchSetPlaybackParameters( - Player player, PlaybackParameters playbackParameters) { - player.setPlaybackParameters(playbackParameters); - return true; - } - - @Override - public boolean isRewindEnabled() { - return !rewindAndFastForwardIncrementsSet || rewindIncrementMs > 0; - } - - @Override - public boolean isFastForwardEnabled() { - return !rewindAndFastForwardIncrementsSet || fastForwardIncrementMs > 0; - } - - /** Returns the rewind increment in milliseconds. */ - public long getRewindIncrementMs(Player player) { - return rewindAndFastForwardIncrementsSet ? rewindIncrementMs : player.getSeekBackIncrement(); - } - - /** Returns the fast forward increment in milliseconds. */ - public long getFastForwardIncrementMs(Player player) { - return rewindAndFastForwardIncrementsSet - ? fastForwardIncrementMs - : player.getSeekForwardIncrement(); - } - - // Internal methods. - - private static void seekToOffset(Player player, long offsetMs) { - long positionMs = player.getCurrentPosition() + offsetMs; - long durationMs = player.getDuration(); - if (durationMs != C.TIME_UNSET) { - positionMs = min(positionMs, durationMs); - } - positionMs = max(positionMs, 0); - player.seekTo(positionMs); - } -} diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 2c970ec4e8..824b44e1f3 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -50,8 +50,6 @@ import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.Events; @@ -321,7 +319,6 @@ public class PlayerControlView extends FrameLayout { private final String shuffleOffContentDescription; @Nullable private Player player; - private ControlDispatcher controlDispatcher; @Nullable private ProgressUpdateListener progressUpdateListener; private boolean isAttachedToWindow; @@ -418,7 +415,6 @@ public class PlayerControlView extends FrameLayout { extraAdGroupTimesMs = new long[0]; extraPlayedAdGroups = new boolean[0]; componentListener = new ComponentListener(); - controlDispatcher = new DefaultControlDispatcher(); updateProgressAction = this::updateProgress; hideAction = this::hide; @@ -695,13 +691,13 @@ public class PlayerControlView extends FrameLayout { @Player.RepeatMode int currentMode = player.getRepeatMode(); if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE && currentMode != Player.REPEAT_MODE_OFF) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_OFF); + player.setRepeatMode(Player.REPEAT_MODE_OFF); } else if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE && currentMode == Player.REPEAT_MODE_ALL) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_ONE); + player.setRepeatMode(Player.REPEAT_MODE_ONE); } else if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL && currentMode == Player.REPEAT_MODE_ONE) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_ALL); + player.setRepeatMode(Player.REPEAT_MODE_ALL); } } updateRepeatModeButton(); @@ -867,11 +863,8 @@ public class PlayerControlView extends FrameLayout { if (player != null) { enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); enablePrevious = player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS); - enableRewind = - player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); - enableFastForward = - player.isCommandAvailable(COMMAND_SEEK_FORWARD) - && controlDispatcher.isFastForwardEnabled(); + enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK); + enableFastForward = player.isCommandAvailable(COMMAND_SEEK_FORWARD); enableNext = player.isCommandAvailable(COMMAND_SEEK_TO_NEXT); } @@ -1123,8 +1116,8 @@ public class PlayerControlView extends FrameLayout { updateProgress(); } - private boolean seekTo(Player player, int windowIndex, long positionMs) { - return controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); + private void seekTo(Player player, int windowIndex, long positionMs) { + player.seekTo(windowIndex, positionMs); } @Override @@ -1183,10 +1176,10 @@ public class PlayerControlView extends FrameLayout { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { if (player.getPlaybackState() != Player.STATE_ENDED) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } } else if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } else if (event.getRepeatCount() == 0) { switch (keyCode) { case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: @@ -1200,10 +1193,10 @@ public class PlayerControlView extends FrameLayout { dispatchPause(player); break; case KeyEvent.KEYCODE_MEDIA_NEXT: - controlDispatcher.dispatchNext(player); + player.seekToNext(); break; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - controlDispatcher.dispatchPrevious(player); + player.seekToPrevious(); break; default: break; @@ -1233,15 +1226,15 @@ public class PlayerControlView extends FrameLayout { private void dispatchPlay(Player player) { @State int state = player.getPlaybackState(); if (state == Player.STATE_IDLE) { - controlDispatcher.dispatchPrepare(player); + player.prepare(); } else if (state == Player.STATE_ENDED) { seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ true); + player.play(); } private void dispatchPause(Player player) { - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ false); + player.pause(); } @SuppressLint("InlinedApi") @@ -1343,24 +1336,24 @@ public class PlayerControlView extends FrameLayout { return; } if (nextButton == view) { - controlDispatcher.dispatchNext(player); + player.seekToNext(); } else if (previousButton == view) { - controlDispatcher.dispatchPrevious(player); + player.seekToPrevious(); } else if (fastForwardButton == view) { if (player.getPlaybackState() != Player.STATE_ENDED) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } } else if (rewindButton == view) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } else if (playButton == view) { dispatchPlay(player); } else if (pauseButton == view) { dispatchPause(player); } else if (repeatToggleButton == view) { - controlDispatcher.dispatchSetRepeatMode( - player, RepeatModeUtil.getNextRepeatMode(player.getRepeatMode(), repeatToggleModes)); + player.setRepeatMode( + RepeatModeUtil.getNextRepeatMode(player.getRepeatMode(), repeatToggleModes)); } else if (shuffleButton == view) { - controlDispatcher.dispatchSetShuffleModeEnabled(player, !player.getShuffleModeEnabled()); + player.setShuffleModeEnabled(!player.getShuffleModeEnabled()); } } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 145c4b4952..26075126d0 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -52,8 +52,6 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.media.app.NotificationCompat.MediaStyle; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.util.NotificationUtil; import com.google.android.exoplayer2.util.Util; @@ -682,7 +680,6 @@ public class PlayerNotificationManager { @Nullable private NotificationCompat.Builder builder; @Nullable private List builderActions; @Nullable private Player player; - private ControlDispatcher controlDispatcher; private boolean isNotificationStarted; private int currentNotificationTag; @Nullable private MediaSessionCompat.Token mediaSessionToken; @@ -731,7 +728,6 @@ public class PlayerNotificationManager { this.customActionReceiver = customActionReceiver; this.smallIconResourceId = smallIconResourceId; this.groupKey = groupKey; - controlDispatcher = new DefaultControlDispatcher(); instanceId = instanceIdCounter++; // This fails the nullness checker because handleMessage() is 'called' while `this` is still // @UnderInitialization. No tasks are scheduled on mainHandler before the constructor completes, @@ -1308,10 +1304,8 @@ public class PlayerNotificationManager { */ protected List getActions(Player player) { boolean enablePrevious = player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS); - boolean enableRewind = - player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); - boolean enableFastForward = - player.isCommandAvailable(COMMAND_SEEK_FORWARD) && controlDispatcher.isFastForwardEnabled(); + boolean enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK); + boolean enableFastForward = player.isCommandAvailable(COMMAND_SEEK_FORWARD); boolean enableNext = player.isCommandAvailable(COMMAND_SEEK_TO_NEXT); List stringActions = new ArrayList<>(); @@ -1535,23 +1529,23 @@ public class PlayerNotificationManager { String action = intent.getAction(); if (ACTION_PLAY.equals(action)) { if (player.getPlaybackState() == Player.STATE_IDLE) { - controlDispatcher.dispatchPrepare(player); + player.prepare(); } else if (player.getPlaybackState() == Player.STATE_ENDED) { - controlDispatcher.dispatchSeekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + player.seekToDefaultPosition(player.getCurrentWindowIndex()); } - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ true); + player.play(); } else if (ACTION_PAUSE.equals(action)) { - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ false); + player.pause(); } else if (ACTION_PREVIOUS.equals(action)) { - controlDispatcher.dispatchPrevious(player); + player.seekToPrevious(); } else if (ACTION_REWIND.equals(action)) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } else if (ACTION_FAST_FORWARD.equals(action)) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } else if (ACTION_NEXT.equals(action)) { - controlDispatcher.dispatchNext(player); + player.seekToNext(); } else if (ACTION_STOP.equals(action)) { - controlDispatcher.dispatchStop(player, /* reset= */ true); + player.stop(/* reset= */ true); } else if (ACTION_DISMISS.equals(action)) { stopNotification(/* dismissedByUser= */ true); } else if (action != null diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 2348a52165..95dee700e5 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -59,8 +59,6 @@ import androidx.core.content.res.ResourcesCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ControlDispatcher; -import com.google.android.exoplayer2.DefaultControlDispatcher; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.Player; @@ -409,7 +407,6 @@ public class StyledPlayerControlView extends FrameLayout { private final String fullScreenEnterContentDescription; @Nullable private Player player; - private ControlDispatcher controlDispatcher; @Nullable private ProgressUpdateListener progressUpdateListener; @Nullable private OnFullScreenModeChangedListener onFullScreenModeChangedListener; @@ -543,7 +540,6 @@ public class StyledPlayerControlView extends FrameLayout { playedAdGroups = new boolean[0]; extraAdGroupTimesMs = new long[0]; extraPlayedAdGroups = new boolean[0]; - controlDispatcher = new DefaultControlDispatcher(); updateProgressAction = this::updateProgress; durationView = findViewById(R.id.exo_duration); @@ -916,13 +912,13 @@ public class StyledPlayerControlView extends FrameLayout { @Player.RepeatMode int currentMode = player.getRepeatMode(); if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_NONE && currentMode != Player.REPEAT_MODE_OFF) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_OFF); + player.setRepeatMode(Player.REPEAT_MODE_OFF); } else if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE && currentMode == Player.REPEAT_MODE_ALL) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_ONE); + player.setRepeatMode(Player.REPEAT_MODE_ONE); } else if (repeatToggleModes == RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL && currentMode == Player.REPEAT_MODE_ONE) { - controlDispatcher.dispatchSetRepeatMode(player, Player.REPEAT_MODE_ALL); + player.setRepeatMode(Player.REPEAT_MODE_ALL); } } controlViewLayoutManager.setShowButton( @@ -1106,11 +1102,8 @@ public class StyledPlayerControlView extends FrameLayout { if (player != null) { enableSeeking = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM); enablePrevious = player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS); - enableRewind = - player.isCommandAvailable(COMMAND_SEEK_BACK) && controlDispatcher.isRewindEnabled(); - enableFastForward = - player.isCommandAvailable(COMMAND_SEEK_FORWARD) - && controlDispatcher.isFastForwardEnabled(); + enableRewind = player.isCommandAvailable(COMMAND_SEEK_BACK); + enableFastForward = player.isCommandAvailable(COMMAND_SEEK_FORWARD); enableNext = player.isCommandAvailable(COMMAND_SEEK_TO_NEXT); } @@ -1132,9 +1125,7 @@ public class StyledPlayerControlView extends FrameLayout { private void updateRewindButton() { long rewindMs = - controlDispatcher instanceof DefaultControlDispatcher && player != null - ? ((DefaultControlDispatcher) controlDispatcher).getRewindIncrementMs(player) - : C.DEFAULT_SEEK_BACK_INCREMENT_MS; + player != null ? player.getSeekBackIncrement() : C.DEFAULT_SEEK_BACK_INCREMENT_MS; int rewindSec = (int) (rewindMs / 1_000); if (rewindButtonTextView != null) { rewindButtonTextView.setText(String.valueOf(rewindSec)); @@ -1148,9 +1139,7 @@ public class StyledPlayerControlView extends FrameLayout { private void updateFastForwardButton() { long fastForwardMs = - controlDispatcher instanceof DefaultControlDispatcher && player != null - ? ((DefaultControlDispatcher) controlDispatcher).getFastForwardIncrementMs(player) - : C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; + player != null ? player.getSeekForwardIncrement() : C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; int fastForwardSec = (int) (fastForwardMs / 1_000); if (fastForwardButtonTextView != null) { fastForwardButtonTextView.setText(String.valueOf(fastForwardSec)); @@ -1429,8 +1418,7 @@ public class StyledPlayerControlView extends FrameLayout { if (player == null) { return; } - controlDispatcher.dispatchSetPlaybackParameters( - player, player.getPlaybackParameters().withSpeed(speed)); + player.setPlaybackParameters(player.getPlaybackParameters().withSpeed(speed)); } /* package */ void requestPlayPauseFocus() { @@ -1472,8 +1460,8 @@ public class StyledPlayerControlView extends FrameLayout { updateProgress(); } - private boolean seekTo(Player player, int windowIndex, long positionMs) { - return controlDispatcher.dispatchSeekTo(player, windowIndex, positionMs); + private void seekTo(Player player, int windowIndex, long positionMs) { + player.seekTo(windowIndex, positionMs); } private void onFullScreenButtonClicked(View v) { @@ -1554,10 +1542,10 @@ public class StyledPlayerControlView extends FrameLayout { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { if (player.getPlaybackState() != Player.STATE_ENDED) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } } else if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } else if (event.getRepeatCount() == 0) { switch (keyCode) { case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: @@ -1571,10 +1559,10 @@ public class StyledPlayerControlView extends FrameLayout { dispatchPause(player); break; case KeyEvent.KEYCODE_MEDIA_NEXT: - controlDispatcher.dispatchNext(player); + player.seekToNext(); break; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - controlDispatcher.dispatchPrevious(player); + player.seekToPrevious(); break; default: break; @@ -1633,15 +1621,15 @@ public class StyledPlayerControlView extends FrameLayout { private void dispatchPlay(Player player) { @State int state = player.getPlaybackState(); if (state == Player.STATE_IDLE) { - controlDispatcher.dispatchPrepare(player); + player.prepare(); } else if (state == Player.STATE_ENDED) { seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); } - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ true); + player.play(); } private void dispatchPause(Player player) { - controlDispatcher.dispatchSetPlayWhenReady(player, /* playWhenReady= */ false); + player.pause(); } @SuppressLint("InlinedApi") @@ -1784,22 +1772,22 @@ public class StyledPlayerControlView extends FrameLayout { } controlViewLayoutManager.resetHideCallbacks(); if (nextButton == view) { - controlDispatcher.dispatchNext(player); + player.seekToNext(); } else if (previousButton == view) { - controlDispatcher.dispatchPrevious(player); + player.seekToPrevious(); } else if (fastForwardButton == view) { if (player.getPlaybackState() != Player.STATE_ENDED) { - controlDispatcher.dispatchFastForward(player); + player.seekForward(); } } else if (rewindButton == view) { - controlDispatcher.dispatchRewind(player); + player.seekBack(); } else if (playPauseButton == view) { dispatchPlayPause(player); } else if (repeatToggleButton == view) { - controlDispatcher.dispatchSetRepeatMode( - player, RepeatModeUtil.getNextRepeatMode(player.getRepeatMode(), repeatToggleModes)); + player.setRepeatMode( + RepeatModeUtil.getNextRepeatMode(player.getRepeatMode(), repeatToggleModes)); } else if (shuffleButton == view) { - controlDispatcher.dispatchSetShuffleModeEnabled(player, !player.getShuffleModeEnabled()); + player.setShuffleModeEnabled(!player.getShuffleModeEnabled()); } else if (settingsButton == view) { controlViewLayoutManager.removeHideCallbacks(); displaySettingsWindow(settingsAdapter); From 61c8f8c27e3e2095005d0136b3c27aef77b886d0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 15 Oct 2021 12:24:22 +0100 Subject: [PATCH 336/441] Rename DrmConfiguration.sessionForClearTypes to forcedSessionTrackTypes The previous name is quite easy to misread because it sounds like it splits up like "(session) for (clear types)" when it's meant to be "(session for clear) (types)". The old field is left deprecated for backwards compatibility. The DrmConfiguration.Builder methods are directly renamed without deprecation because they're not yet present in a released version of the library. PiperOrigin-RevId: 403338799 --- .../android/exoplayer2/demo/IntentUtil.java | 2 +- .../demo/SampleChooserActivity.java | 2 +- .../google/android/exoplayer2/MediaItem.java | 54 ++++++++++--------- .../android/exoplayer2/MediaItemTest.java | 20 +++++-- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 71ad113ff9..d2726720d9 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -177,7 +177,7 @@ public class IntentUtil { intent.getBooleanExtra( DRM_FORCE_DEFAULT_LICENSE_URI_EXTRA + extrasKeySuffix, false)) .setLicenseRequestHeaders(headers) - .setSessionForClearPeriods( + .forceSessionsForAudioAndVideoTracks( intent.getBooleanExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, false)) .build()); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 585c6cdf1b..1a00670a39 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -445,7 +445,7 @@ public class SampleChooserActivity extends AppCompatActivity new MediaItem.DrmConfiguration.Builder(drmUuid) .setLicenseUri(drmLicenseUri) .setLicenseRequestHeaders(drmLicenseRequestHeaders) - .setSessionForClearPeriods(drmSessionForClearContent) + .forceSessionsForAudioAndVideoTracks(drmSessionForClearContent) .setMultiSession(drmMultiSession) .setForceDefaultLicenseUri(drmForceDefaultLicenseUri) .build()); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 8360f69c79..aaefa282ee 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -298,22 +298,22 @@ public final class MediaItem implements Bundleable { /** * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link - * DrmConfiguration.Builder#setSessionForClearPeriods(boolean)} instead. + * DrmConfiguration.Builder#forceSessionsForAudioAndVideoTracks(boolean)} instead. */ @Deprecated public Builder setDrmSessionForClearPeriods(boolean sessionForClearPeriods) { - drmConfiguration.setSessionForClearPeriods(sessionForClearPeriods); + drmConfiguration.forceSessionsForAudioAndVideoTracks(sessionForClearPeriods); return this; } /** * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link - * DrmConfiguration.Builder#setSessionForClearTypes(List)} instead. + * DrmConfiguration.Builder#setForcedSessionTrackTypes(List)} instead. */ @Deprecated public Builder setDrmSessionForClearTypes( @Nullable List<@C.TrackType Integer> sessionForClearTypes) { - drmConfiguration.setSessionForClearTypes(sessionForClearTypes); + drmConfiguration.setForcedSessionTrackTypes(sessionForClearTypes); return this; } @@ -532,7 +532,7 @@ public final class MediaItem implements Bundleable { private boolean multiSession; private boolean playClearContentWithoutKey; private boolean forceDefaultLicenseUri; - private ImmutableList<@C.TrackType Integer> sessionForClearTypes; + private ImmutableList<@C.TrackType Integer> forcedSessionTrackTypes; @Nullable private byte[] keySetId; /** @@ -543,7 +543,7 @@ public final class MediaItem implements Bundleable { public Builder(UUID scheme) { this.scheme = scheme; this.licenseRequestHeaders = ImmutableMap.of(); - this.sessionForClearTypes = ImmutableList.of(); + this.forcedSessionTrackTypes = ImmutableList.of(); } /** @@ -553,7 +553,7 @@ public final class MediaItem implements Bundleable { @Deprecated private Builder() { this.licenseRequestHeaders = ImmutableMap.of(); - this.sessionForClearTypes = ImmutableList.of(); + this.forcedSessionTrackTypes = ImmutableList.of(); } private Builder(DrmConfiguration drmConfiguration) { @@ -563,7 +563,7 @@ public final class MediaItem implements Bundleable { this.multiSession = drmConfiguration.multiSession; this.playClearContentWithoutKey = drmConfiguration.playClearContentWithoutKey; this.forceDefaultLicenseUri = drmConfiguration.forceDefaultLicenseUri; - this.sessionForClearTypes = drmConfiguration.sessionForClearTypes; + this.forcedSessionTrackTypes = drmConfiguration.forcedSessionTrackTypes; this.keySetId = drmConfiguration.keySetId; } @@ -633,11 +633,12 @@ public final class MediaItem implements Bundleable { * C#TRACK_TYPE_VIDEO} and {@link C#TRACK_TYPE_AUDIO}. * *

                This method overrides what has been set by previously calling {@link - * #setSessionForClearTypes(List)}. + * #setForcedSessionTrackTypes(List)}. */ - public Builder setSessionForClearPeriods(boolean sessionForClearPeriods) { - this.setSessionForClearTypes( - sessionForClearPeriods + public Builder forceSessionsForAudioAndVideoTracks( + boolean useClearSessionsForAudioAndVideoTracks) { + this.setForcedSessionTrackTypes( + useClearSessionsForAudioAndVideoTracks ? ImmutableList.of(C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_AUDIO) : ImmutableList.of()); return this; @@ -648,18 +649,18 @@ public final class MediaItem implements Bundleable { * when the tracks are in the clear. * *

                For the common case of using a DRM session for {@link C#TRACK_TYPE_VIDEO} and {@link - * C#TRACK_TYPE_AUDIO}, {@link #setSessionForClearPeriods(boolean)} can be used. + * C#TRACK_TYPE_AUDIO}, {@link #forceSessionsForAudioAndVideoTracks(boolean)} can be used. * *

                This method overrides what has been set by previously calling {@link - * #setSessionForClearPeriods(boolean)}. + * #forceSessionsForAudioAndVideoTracks(boolean)}. * *

                {@code null} or an empty {@link List} can be used for a reset. */ - public Builder setSessionForClearTypes( - @Nullable List<@C.TrackType Integer> sessionForClearTypes) { - this.sessionForClearTypes = - sessionForClearTypes != null - ? ImmutableList.copyOf(sessionForClearTypes) + public Builder setForcedSessionTrackTypes( + @Nullable List<@C.TrackType Integer> forcedSessionTrackTypes) { + this.forcedSessionTrackTypes = + forcedSessionTrackTypes != null + ? ImmutableList.copyOf(forcedSessionTrackTypes) : ImmutableList.of(); return this; } @@ -715,8 +716,12 @@ public final class MediaItem implements Bundleable { */ public final boolean forceDefaultLicenseUri; - /** The types of clear tracks for which to use a DRM session. */ - public final ImmutableList<@C.TrackType Integer> sessionForClearTypes; + /** @deprecated Use {@link #forcedSessionTrackTypes}. */ + @Deprecated public final ImmutableList<@C.TrackType Integer> sessionForClearTypes; + /** + * The types of tracks for which to always use a DRM session even if the content is unencrypted. + */ + public final ImmutableList<@C.TrackType Integer> forcedSessionTrackTypes; @Nullable private final byte[] keySetId; @@ -731,7 +736,8 @@ public final class MediaItem implements Bundleable { this.multiSession = builder.multiSession; this.forceDefaultLicenseUri = builder.forceDefaultLicenseUri; this.playClearContentWithoutKey = builder.playClearContentWithoutKey; - this.sessionForClearTypes = builder.sessionForClearTypes; + this.sessionForClearTypes = builder.forcedSessionTrackTypes; + this.forcedSessionTrackTypes = builder.forcedSessionTrackTypes; this.keySetId = builder.keySetId != null ? Arrays.copyOf(builder.keySetId, builder.keySetId.length) @@ -765,7 +771,7 @@ public final class MediaItem implements Bundleable { && multiSession == other.multiSession && forceDefaultLicenseUri == other.forceDefaultLicenseUri && playClearContentWithoutKey == other.playClearContentWithoutKey - && sessionForClearTypes.equals(other.sessionForClearTypes) + && forcedSessionTrackTypes.equals(other.forcedSessionTrackTypes) && Arrays.equals(keySetId, other.keySetId); } @@ -777,7 +783,7 @@ public final class MediaItem implements Bundleable { result = 31 * result + (multiSession ? 1 : 0); result = 31 * result + (forceDefaultLicenseUri ? 1 : 0); result = 31 * result + (playClearContentWithoutKey ? 1 : 0); - result = 31 * result + sessionForClearTypes.hashCode(); + result = 31 * result + forcedSessionTrackTypes.hashCode(); result = 31 * result + Arrays.hashCode(keySetId); return result; } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java index f1b85057ea..3cca972822 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java @@ -118,6 +118,8 @@ public class MediaItemTest { assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue(); assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO); + assertThat(mediaItem.localConfiguration.drmConfiguration.forcedSessionTrackTypes) + .containsExactly(C.TRACK_TYPE_AUDIO); assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId); } @@ -152,6 +154,7 @@ public class MediaItemTest { assertThat(mediaItem.localConfiguration.drmConfiguration.forceDefaultLicenseUri).isFalse(); assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isFalse(); assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes).isEmpty(); + assertThat(mediaItem.localConfiguration.drmConfiguration.forcedSessionTrackTypes).isEmpty(); assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isNull(); } @@ -172,7 +175,7 @@ public class MediaItemTest { .setMultiSession(true) .setForceDefaultLicenseUri(true) .setPlayClearContentWithoutKey(true) - .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .setForcedSessionTrackTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) .setKeySetId(keySetId) .build()) .build(); @@ -190,11 +193,13 @@ public class MediaItemTest { assertThat(mediaItem.localConfiguration.drmConfiguration.playClearContentWithoutKey).isTrue(); assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO); + assertThat(mediaItem.localConfiguration.drmConfiguration.forcedSessionTrackTypes) + .containsExactly(C.TRACK_TYPE_AUDIO); assertThat(mediaItem.localConfiguration.drmConfiguration.getKeySetId()).isEqualTo(keySetId); } @Test - @SuppressWarnings("deprecation") // Testing deprecated methods + @SuppressWarnings("deprecation") // Testing deprecated methods and field public void builderSetDrmSessionForClearPeriods_setsAudioAndVideoTracks() { Uri licenseUri = Uri.parse(URI_STRING); MediaItem mediaItem = @@ -208,20 +213,25 @@ public class MediaItemTest { assertThat(mediaItem.localConfiguration.drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); + assertThat(mediaItem.localConfiguration.drmConfiguration.forcedSessionTrackTypes) + .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); } @Test + @SuppressWarnings("deprecation") // Testing deprecated field public void drmConfigurationBuilderSetSessionForClearPeriods_overridesSetSessionForClearTypes() { Uri licenseUri = Uri.parse(URI_STRING); MediaItem.DrmConfiguration drmConfiguration = new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) - .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) - .setSessionForClearPeriods(true) + .setForcedSessionTrackTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .forceSessionsForAudioAndVideoTracks(true) .build(); assertThat(drmConfiguration.sessionForClearTypes) .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); + assertThat(drmConfiguration.forcedSessionTrackTypes) + .containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO); } @Test @@ -628,7 +638,7 @@ public class MediaItemTest { .setMultiSession(true) .setForceDefaultLicenseUri(true) .setPlayClearContentWithoutKey(true) - .setSessionForClearTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) + .setForcedSessionTrackTypes(ImmutableList.of(C.TRACK_TYPE_AUDIO)) .setKeySetId(new byte[] {1, 2, 3}) .build()) .setMediaId("mediaId") From 18b1f3d62419ea7ee888ed2e44aa43576b6e9e57 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 15 Oct 2021 12:52:12 +0100 Subject: [PATCH 337/441] Migrate usages of DrmConfiguration.sessionForClearTypes to new field The new forcedSessionTrackTypes field was introduced in . These usages are migrated in a follow-up change to add confidence that the deprecated field continued to work correctly. PiperOrigin-RevId: 403342893 --- .../google/android/exoplayer2/demo/IntentUtil.java | 11 ++++++----- .../drm/DefaultDrmSessionManagerProvider.java | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index d2726720d9..d3579c8c35 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -226,13 +226,14 @@ public class IntentUtil { } intent.putExtra(DRM_KEY_REQUEST_PROPERTIES_EXTRA + extrasKeySuffix, drmKeyRequestProperties); - List<@C.TrackType Integer> drmSessionForClearTypes = drmConfiguration.sessionForClearTypes; - if (!drmSessionForClearTypes.isEmpty()) { + List<@C.TrackType Integer> forcedDrmSessionTrackTypes = + drmConfiguration.forcedSessionTrackTypes; + if (!forcedDrmSessionTrackTypes.isEmpty()) { // Only video and audio together are supported. Assertions.checkState( - drmSessionForClearTypes.size() == 2 - && drmSessionForClearTypes.contains(C.TRACK_TYPE_VIDEO) - && drmSessionForClearTypes.contains(C.TRACK_TYPE_AUDIO)); + forcedDrmSessionTrackTypes.size() == 2 + && forcedDrmSessionTrackTypes.contains(C.TRACK_TYPE_VIDEO) + && forcedDrmSessionTrackTypes.contains(C.TRACK_TYPE_AUDIO)); intent.putExtra(DRM_SESSION_FOR_CLEAR_CONTENT + extrasKeySuffix, true); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java index 6976934337..c56817430f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerProvider.java @@ -110,7 +110,8 @@ public final class DefaultDrmSessionManagerProvider implements DrmSessionManager drmConfiguration.scheme, FrameworkMediaDrm.DEFAULT_PROVIDER) .setMultiSession(drmConfiguration.multiSession) .setPlayClearSamplesWithoutKeys(drmConfiguration.playClearContentWithoutKey) - .setUseDrmSessionsForClearContent(Ints.toArray(drmConfiguration.sessionForClearTypes)) + .setUseDrmSessionsForClearContent( + Ints.toArray(drmConfiguration.forcedSessionTrackTypes)) .build(httpDrmCallback); drmSessionManager.setMode(MODE_PLAYBACK, drmConfiguration.getKeySetId()); return drmSessionManager; From 48518cf94d123a070ce2093a5356510cc6adf71f Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 15 Oct 2021 15:25:04 +0100 Subject: [PATCH 338/441] Add @RequiresApi to releaseDummySurface dummySurface.release requires API 17. PiperOrigin-RevId: 403368448 --- .../google/android/exoplayer2/video/MediaCodecVideoRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index fefa2067cf..de6215e0b5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -1173,6 +1173,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { && (!codecInfo.secure || DummySurface.isSecureSupported(context)); } + @RequiresApi(17) private void releaseDummySurface() { if (surface == dummySurface) { surface = null; From 707968f7e6bb6e6c23f9309dc9889fe3e18fc775 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 15 Oct 2021 16:08:00 +0100 Subject: [PATCH 339/441] Migrate usages of PositionInfo#windowIndex to mediaItemIndex PiperOrigin-RevId: 403376452 --- .../exoplayer2/ext/cast/CastPlayer.java | 2 +- .../android/exoplayer2/util/EventLogger.java | 8 +- .../android/exoplayer2/ExoPlayerTest.java | 144 +++++++++--------- 3 files changed, 77 insertions(+), 77 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 5e0f497e0c..25e792f16b 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -463,7 +463,7 @@ public final class CastPlayer extends BasePlayer { listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK); listener.onPositionDiscontinuity(oldPosition, newPosition, DISCONTINUITY_REASON_SEEK); }); - if (oldPosition.windowIndex != newPosition.windowIndex) { + if (oldPosition.mediaItemIndex != newPosition.mediaItemIndex) { // TODO(internal b/182261884): queue `onMediaItemTransition` event when the media item is // repeated. MediaItem mediaItem = getCurrentTimeline().getWindow(windowIndex, window).mediaItem; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 8352c3aca8..16801c6bab 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -151,8 +151,8 @@ public class EventLogger implements AnalyticsListener { .append("reason=") .append(getDiscontinuityReasonString(reason)) .append(", PositionInfo:old [") - .append("window=") - .append(oldPosition.windowIndex) + .append("mediaItem=") + .append(oldPosition.mediaItemIndex) .append(", period=") .append(oldPosition.periodIndex) .append(", pos=") @@ -168,8 +168,8 @@ public class EventLogger implements AnalyticsListener { } builder .append("], PositionInfo:new [") - .append("window=") - .append(newPosition.windowIndex) + .append("mediaItem=") + .append(newPosition.mediaItemIndex) .append(", period=") .append(newPosition.periodIndex) .append(", pos=") diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index cbbd860b00..bde93310f1 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -9774,7 +9774,7 @@ public final class ExoPlayerTest { Player.PositionInfo newPositionInfo = newPosition.getValue(); assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); - assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); + assertThat(oldPositionInfo.mediaItemIndex).isEqualTo(newPositionInfo.mediaItemIndex); assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); @@ -9796,7 +9796,7 @@ public final class ExoPlayerTest { newPositionInfo = newPosition.getValue(); assertThat(oldPositionInfo.periodUid).isEqualTo(newPositionInfo.periodUid); assertThat(oldPositionInfo.periodIndex).isEqualTo(newPositionInfo.periodIndex); - assertThat(oldPositionInfo.windowIndex).isEqualTo(newPositionInfo.windowIndex); + assertThat(oldPositionInfo.mediaItemIndex).isEqualTo(newPositionInfo.mediaItemIndex); assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(1); assertThat(oldPositionInfo.windowUid).isEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(10_000); @@ -9816,13 +9816,13 @@ public final class ExoPlayerTest { eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); oldPositionInfo = oldPosition.getValue(); newPositionInfo = newPosition.getValue(); - assertThat(oldPositionInfo.windowIndex).isEqualTo(1); + assertThat(oldPositionInfo.mediaItemIndex).isEqualTo(1); assertThat(oldPositionInfo.mediaItem.localConfiguration.tag).isEqualTo(2); assertThat(oldPositionInfo.windowUid).isNotEqualTo(newPositionInfo.windowUid); assertThat(oldPositionInfo.positionMs).isEqualTo(20_000); assertThat(oldPositionInfo.contentPositionMs).isEqualTo(20_000); assertThat(newPositionInfo.positionMs).isEqualTo(0); - assertThat(newPositionInfo.windowIndex).isEqualTo(0); + assertThat(newPositionInfo.mediaItemIndex).isEqualTo(0); inOrder .verify(listener) .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); @@ -9887,91 +9887,91 @@ public final class ExoPlayerTest { // starts with ad to ad transition List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).positionMs).isEqualTo(5000); assertThat(oldPositions.get(0).contentPositionMs).isEqualTo(0); assertThat(oldPositions.get(0).adGroupIndex).isEqualTo(0); assertThat(oldPositions.get(0).adIndexInAdGroup).isEqualTo(0); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); assertThat(newPositions.get(0).adGroupIndex).isEqualTo(0); assertThat(newPositions.get(0).adIndexInAdGroup).isEqualTo(1); // ad to content transition - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).positionMs).isEqualTo(5000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(0); assertThat(oldPositions.get(1).adGroupIndex).isEqualTo(0); assertThat(oldPositions.get(1).adIndexInAdGroup).isEqualTo(1); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(0); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(0); assertThat(newPositions.get(1).adGroupIndex).isEqualTo(-1); assertThat(newPositions.get(1).adIndexInAdGroup).isEqualTo(-1); // second add group (mid-roll) - assertThat(oldPositions.get(2).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(2).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(2).positionMs).isEqualTo(7000); assertThat(oldPositions.get(2).contentPositionMs).isEqualTo(7000); assertThat(oldPositions.get(2).adGroupIndex).isEqualTo(-1); assertThat(oldPositions.get(2).adIndexInAdGroup).isEqualTo(-1); - assertThat(newPositions.get(2).windowIndex).isEqualTo(0); + assertThat(newPositions.get(2).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(2).positionMs).isEqualTo(0); assertThat(newPositions.get(2).contentPositionMs).isEqualTo(7000); assertThat(newPositions.get(2).adGroupIndex).isEqualTo(1); assertThat(newPositions.get(2).adIndexInAdGroup).isEqualTo(0); // ad to ad transition - assertThat(oldPositions.get(3).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(3).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(3).positionMs).isEqualTo(5000); assertThat(oldPositions.get(3).contentPositionMs).isEqualTo(7000); assertThat(oldPositions.get(3).adGroupIndex).isEqualTo(1); assertThat(oldPositions.get(3).adIndexInAdGroup).isEqualTo(0); - assertThat(newPositions.get(3).windowIndex).isEqualTo(0); + assertThat(newPositions.get(3).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(3).positionMs).isEqualTo(0); assertThat(newPositions.get(3).contentPositionMs).isEqualTo(7000); assertThat(newPositions.get(3).adGroupIndex).isEqualTo(1); assertThat(newPositions.get(3).adIndexInAdGroup).isEqualTo(1); // ad to content transition - assertThat(oldPositions.get(4).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(4).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(4).positionMs).isEqualTo(5000); assertThat(oldPositions.get(4).contentPositionMs).isEqualTo(7000); assertThat(oldPositions.get(4).adGroupIndex).isEqualTo(1); assertThat(oldPositions.get(4).adIndexInAdGroup).isEqualTo(1); - assertThat(newPositions.get(4).windowIndex).isEqualTo(0); + assertThat(newPositions.get(4).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(4).positionMs).isEqualTo(7000); assertThat(newPositions.get(4).contentPositionMs).isEqualTo(7000); assertThat(newPositions.get(4).adGroupIndex).isEqualTo(-1); assertThat(newPositions.get(4).adIndexInAdGroup).isEqualTo(-1); // third add group (post-roll) - assertThat(oldPositions.get(5).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(5).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(5).positionMs).isEqualTo(10000); assertThat(oldPositions.get(5).contentPositionMs).isEqualTo(10000); assertThat(oldPositions.get(5).adGroupIndex).isEqualTo(-1); assertThat(oldPositions.get(5).adIndexInAdGroup).isEqualTo(-1); - assertThat(newPositions.get(5).windowIndex).isEqualTo(0); + assertThat(newPositions.get(5).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(5).positionMs).isEqualTo(0); assertThat(newPositions.get(5).contentPositionMs).isEqualTo(10000); assertThat(newPositions.get(5).adGroupIndex).isEqualTo(2); assertThat(newPositions.get(5).adIndexInAdGroup).isEqualTo(0); // ad to ad transition - assertThat(oldPositions.get(6).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(6).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(6).positionMs).isEqualTo(5000); assertThat(oldPositions.get(6).contentPositionMs).isEqualTo(10000); assertThat(oldPositions.get(6).adGroupIndex).isEqualTo(2); assertThat(oldPositions.get(6).adIndexInAdGroup).isEqualTo(0); - assertThat(newPositions.get(6).windowIndex).isEqualTo(0); + assertThat(newPositions.get(6).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(6).positionMs).isEqualTo(0); assertThat(newPositions.get(6).contentPositionMs).isEqualTo(10000); assertThat(newPositions.get(6).adGroupIndex).isEqualTo(2); assertThat(newPositions.get(6).adIndexInAdGroup).isEqualTo(1); // post roll ad to end of content transition - assertThat(oldPositions.get(7).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(7).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(7).positionMs).isEqualTo(5000); assertThat(oldPositions.get(7).contentPositionMs).isEqualTo(10000); assertThat(oldPositions.get(7).adGroupIndex).isEqualTo(2); assertThat(oldPositions.get(7).adIndexInAdGroup).isEqualTo(1); - assertThat(newPositions.get(7).windowIndex).isEqualTo(0); + assertThat(newPositions.get(7).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(7).positionMs).isEqualTo(9999); assertThat(newPositions.get(7).contentPositionMs).isEqualTo(9999); assertThat(newPositions.get(7).adGroupIndex).isEqualTo(-1); @@ -10032,34 +10032,34 @@ public final class ExoPlayerTest { List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); // SEEK behind mid roll - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(980L, 1_000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(980L, 1_000L)); assertThat(oldPositions.get(0).adGroupIndex).isEqualTo(-1); assertThat(oldPositions.get(0).adIndexInAdGroup).isEqualTo(-1); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(8_000); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(8_000); assertThat(newPositions.get(0).adGroupIndex).isEqualTo(-1); assertThat(newPositions.get(0).adIndexInAdGroup).isEqualTo(-1); // SEEK_ADJUSTMENT back to ad - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).positionMs).isEqualTo(8_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(8_000); assertThat(oldPositions.get(1).adGroupIndex).isEqualTo(-1); assertThat(oldPositions.get(1).adIndexInAdGroup).isEqualTo(-1); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(0); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(8000); assertThat(newPositions.get(1).adGroupIndex).isEqualTo(0); assertThat(newPositions.get(1).adIndexInAdGroup).isEqualTo(0); // AUTO_TRANSITION back to content - assertThat(oldPositions.get(2).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(2).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(2).positionMs).isEqualTo(5_000); assertThat(oldPositions.get(2).contentPositionMs).isEqualTo(8_000); assertThat(oldPositions.get(2).adGroupIndex).isEqualTo(0); assertThat(oldPositions.get(2).adIndexInAdGroup).isEqualTo(0); - assertThat(newPositions.get(2).windowIndex).isEqualTo(0); + assertThat(newPositions.get(2).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(2).positionMs).isEqualTo(8_000); assertThat(newPositions.get(2).contentPositionMs).isEqualTo(8_000); assertThat(newPositions.get(2).adGroupIndex).isEqualTo(-1); @@ -10138,7 +10138,7 @@ public final class ExoPlayerTest { .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); assertThat(oldPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(0, window).uid); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(0); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(0); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPosition.getValue().positionMs).isEqualTo(10_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(10_000); @@ -10146,7 +10146,7 @@ public final class ExoPlayerTest { assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); - assertThat(newPosition.getValue().windowIndex).isEqualTo(1); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(1); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); @@ -10166,13 +10166,13 @@ public final class ExoPlayerTest { .isEqualTo(player.getCurrentTimeline().getWindow(1, window).uid); assertThat(newPosition.getValue().windowUid) .isEqualTo(player.getCurrentTimeline().getWindow(2, window).uid); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(1); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(1); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(oldPosition.getValue().positionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(15_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); - assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); @@ -10186,14 +10186,14 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); - assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(20_000); @@ -10208,14 +10208,14 @@ public final class ExoPlayerTest { newPosition.capture(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); - assertThat(newPosition.getValue().windowIndex).isEqualTo(2); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(newPosition.getValue().positionMs).isEqualTo(19_999); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(19_999); @@ -10233,14 +10233,14 @@ public final class ExoPlayerTest { .verify(listener) .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(2); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(2); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-2"); assertThat(oldPosition.getValue().positionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(-1); assertThat(newPosition.getValue().windowUid).isNotEqualTo(oldPosition.getValue().windowUid); - assertThat(newPosition.getValue().windowIndex).isEqualTo(3); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(3); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); @@ -10255,14 +10255,14 @@ public final class ExoPlayerTest { newPosition.capture(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); assertThat(oldPosition.getValue().windowUid).isEqualTo(lastNewWindowUid); - assertThat(oldPosition.getValue().windowIndex).isEqualTo(3); + assertThat(oldPosition.getValue().mediaItemIndex).isEqualTo(3); assertThat(oldPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(oldPosition.getValue().positionMs).isEqualTo(5_000); assertThat(oldPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(oldPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(oldPosition.getValue().adIndexInAdGroup).isEqualTo(0); assertThat(newPosition.getValue().windowUid).isEqualTo(oldPosition.getValue().windowUid); - assertThat(newPosition.getValue().windowIndex).isEqualTo(3); + assertThat(newPosition.getValue().mediaItemIndex).isEqualTo(3); assertThat(newPosition.getValue().mediaItem.localConfiguration.tag).isEqualTo("id-3"); assertThat(newPosition.getValue().positionMs).isEqualTo(0); assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); @@ -10323,10 +10323,10 @@ public final class ExoPlayerTest { .onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); player.release(); @@ -10462,17 +10462,17 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_REMOVE)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).positionMs).isIn(Range.closed(1980L, 2000L)); assertThat(oldPositions.get(1).contentPositionMs).isIn(Range.closed(1980L, 2000L)); assertThat(newPositions.get(1).windowUid).isNull(); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(0); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(0); player.release(); @@ -10536,16 +10536,16 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_REMOVE)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(1); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(1).positionMs).isEqualTo(0); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(0); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(0); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(0); player.release(); @@ -10618,16 +10618,16 @@ public final class ExoPlayerTest { // inOrder.verify(listener, never()).onPositionDiscontinuity(any(), any(), anyInt()); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(1234); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(1234); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).positionMs).isEqualTo(1234); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(1234); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(1234); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1234); player.release(); @@ -10724,20 +10724,20 @@ public final class ExoPlayerTest { List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); assertThat(oldPositions.get(0).windowUid).isEqualTo(newPositions.get(0).windowUid); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(newPositions.get(0).positionMs).isEqualTo(7_000); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).windowUid).isNotEqualTo(newPositions.get(1).windowUid); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).mediaItem.localConfiguration.tag).isEqualTo("id-0"); assertThat(oldPositions.get(1).positionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(7_000); - assertThat(newPositions.get(1).windowIndex).isEqualTo(1); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(1).mediaItem.localConfiguration.tag).isEqualTo("id-1"); assertThat(newPositions.get(1).positionMs).isEqualTo(1_000); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1_000); @@ -10767,32 +10767,32 @@ public final class ExoPlayerTest { List newPositions = newPosition.getAllValues(); // a seek from initial state to masked seek position assertThat(oldPositions.get(0).windowUid).isNull(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).mediaItem).isNull(); assertThat(oldPositions.get(0).positionMs).isEqualTo(0); assertThat(oldPositions.get(0).contentPositionMs).isEqualTo(0); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).windowUid).isNull(); assertThat(newPositions.get(0).positionMs).isEqualTo(7_000); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(7_000); // a seek from masked seek position to another masked position across windows assertThat(oldPositions.get(1).windowUid).isNull(); - assertThat(oldPositions.get(1).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(1).mediaItem).isNull(); assertThat(oldPositions.get(1).positionMs).isEqualTo(7_000); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(7_000); assertThat(newPositions.get(1).windowUid).isNull(); - assertThat(newPositions.get(1).windowIndex).isEqualTo(1); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(1).positionMs).isEqualTo(1_000); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1_000); // a seek from masked seek position to another masked position within window assertThat(oldPositions.get(2).windowUid).isNull(); - assertThat(oldPositions.get(2).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(2).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(2).mediaItem).isNull(); assertThat(oldPositions.get(2).positionMs).isEqualTo(1_000); assertThat(oldPositions.get(2).contentPositionMs).isEqualTo(1_000); assertThat(newPositions.get(2).windowUid).isNull(); - assertThat(newPositions.get(2).windowIndex).isEqualTo(1); + assertThat(newPositions.get(2).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(2).positionMs).isEqualTo(5_000); assertThat(newPositions.get(2).contentPositionMs).isEqualTo(5_000); player.release(); @@ -10827,7 +10827,7 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_SEEK)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).positionMs) .isIn( Range.closed( @@ -10836,7 +10836,7 @@ public final class ExoPlayerTest { .isIn( Range.closed( 2 * C.DEFAULT_SEEK_BACK_INCREMENT_MS - 20, 2 * C.DEFAULT_SEEK_BACK_INCREMENT_MS)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs) .isIn( Range.closed(C.DEFAULT_SEEK_BACK_INCREMENT_MS - 20, C.DEFAULT_SEEK_BACK_INCREMENT_MS)); @@ -10896,10 +10896,10 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_SEEK)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).positionMs).isEqualTo(0); assertThat(oldPositions.get(0).contentPositionMs).isEqualTo(0); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).positionMs).isEqualTo(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS); assertThat(newPositions.get(0).contentPositionMs) .isEqualTo(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS); @@ -11039,12 +11039,12 @@ public final class ExoPlayerTest { oldPosition.capture(), newPosition.capture(), eq(Player.DISCONTINUITY_REASON_REMOVE)); List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); - assertThat(oldPositions.get(0).windowIndex).isEqualTo(0); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(oldPositions.get(0).mediaItem.localConfiguration.tag).isEqualTo(123); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(4980L, 5000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(4980L, 5000L)); assertThat(newPositions.get(0).windowUid).isNull(); - assertThat(newPositions.get(0).windowIndex).isEqualTo(0); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(0).mediaItem).isNull(); assertThat(newPositions.get(0).positionMs).isEqualTo(0); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(0); @@ -11097,17 +11097,17 @@ public final class ExoPlayerTest { List oldPositions = oldPosition.getAllValues(); List newPositions = newPosition.getAllValues(); // First seek - assertThat(oldPositions.get(0).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(0).positionMs).isIn(Range.closed(1980L, 2000L)); assertThat(oldPositions.get(0).contentPositionMs).isIn(Range.closed(1980L, 2000L)); - assertThat(newPositions.get(0).windowIndex).isEqualTo(1); + assertThat(newPositions.get(0).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(0).positionMs).isEqualTo(2122); assertThat(newPositions.get(0).contentPositionMs).isEqualTo(2122); // Second seek. - assertThat(oldPositions.get(1).windowIndex).isEqualTo(1); + assertThat(oldPositions.get(1).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(1).positionMs).isEqualTo(2122); assertThat(oldPositions.get(1).contentPositionMs).isEqualTo(2122); - assertThat(newPositions.get(1).windowIndex).isEqualTo(0); + assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(0); assertThat(newPositions.get(1).positionMs).isEqualTo(2222); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(2222); player.release(); From 8fd1381a84470813827a83921cf3dd2b8603ecb0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 15 Oct 2021 18:23:55 +0100 Subject: [PATCH 340/441] Update two MediaItem.DrmConfiguration setters to reject null Builder setters should only accept null when the underlying property can be null. In this case null is directly converted to an empty map/list. PiperOrigin-RevId: 403406626 --- .../google/android/exoplayer2/MediaItem.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index aaefa282ee..7b4ed43d38 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -247,12 +247,15 @@ public final class MediaItem implements Bundleable { /** * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link - * DrmConfiguration.Builder#setLicenseRequestHeaders(Map)} instead. + * DrmConfiguration.Builder#setLicenseRequestHeaders(Map)} instead. Note that {@link + * DrmConfiguration.Builder#setLicenseRequestHeaders(Map)} doesn't accept null, use an empty + * map to clear the headers. */ @Deprecated public Builder setDrmLicenseRequestHeaders( @Nullable Map licenseRequestHeaders) { - drmConfiguration.setLicenseRequestHeaders(licenseRequestHeaders); + drmConfiguration.setLicenseRequestHeaders( + licenseRequestHeaders != null ? licenseRequestHeaders : ImmutableMap.of()); return this; } @@ -308,12 +311,15 @@ public final class MediaItem implements Bundleable { /** * @deprecated Use {@link #setDrmConfiguration(DrmConfiguration)} and {@link - * DrmConfiguration.Builder#setForcedSessionTrackTypes(List)} instead. + * DrmConfiguration.Builder#setForcedSessionTrackTypes(List)} instead. Note that {@link + * DrmConfiguration.Builder#setForcedSessionTrackTypes(List)} doesn't accept null, use an + * empty list to clear the contents. */ @Deprecated public Builder setDrmSessionForClearTypes( @Nullable List<@C.TrackType Integer> sessionForClearTypes) { - drmConfiguration.setForcedSessionTrackTypes(sessionForClearTypes); + drmConfiguration.setForcedSessionTrackTypes( + sessionForClearTypes != null ? sessionForClearTypes : ImmutableList.of()); return this; } @@ -596,11 +602,8 @@ public final class MediaItem implements Bundleable { } /** Sets the optional request headers attached to DRM license requests. */ - public Builder setLicenseRequestHeaders(@Nullable Map licenseRequestHeaders) { - this.licenseRequestHeaders = - licenseRequestHeaders != null - ? ImmutableMap.copyOf(licenseRequestHeaders) - : ImmutableMap.of(); + public Builder setLicenseRequestHeaders(Map licenseRequestHeaders) { + this.licenseRequestHeaders = ImmutableMap.copyOf(licenseRequestHeaders); return this; } @@ -653,15 +656,10 @@ public final class MediaItem implements Bundleable { * *

                This method overrides what has been set by previously calling {@link * #forceSessionsForAudioAndVideoTracks(boolean)}. - * - *

                {@code null} or an empty {@link List} can be used for a reset. */ public Builder setForcedSessionTrackTypes( - @Nullable List<@C.TrackType Integer> forcedSessionTrackTypes) { - this.forcedSessionTrackTypes = - forcedSessionTrackTypes != null - ? ImmutableList.copyOf(forcedSessionTrackTypes) - : ImmutableList.of(); + List<@C.TrackType Integer> forcedSessionTrackTypes) { + this.forcedSessionTrackTypes = ImmutableList.copyOf(forcedSessionTrackTypes); return this; } From 18cf01cda62cbb81a1a6f52c7f77afc1a5395b47 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 11:31:06 +0100 Subject: [PATCH 341/441] Move DataSource utils into a DataSourceUtil class PiperOrigin-RevId: 403910535 --- .../demo/SampleChooserActivity.java | 3 +- .../android/exoplayer2/ext/ima/ImaUtil.java | 3 +- .../exoplayer2/upstream/DataSourceUtil.java | 90 +++++++++++++++++++ .../google/android/exoplayer2/util/Util.java | 64 ------------- .../upstream/DataSchemeDataSourceTest.java | 4 +- .../source/ProgressiveMediaPeriod.java | 3 +- .../source/SingleSampleMediaPeriod.java | 4 +- .../source/chunk/ContainerMediaChunk.java | 4 +- .../exoplayer2/source/chunk/DataChunk.java | 3 +- .../source/chunk/InitializationChunk.java | 4 +- .../source/chunk/SingleSampleMediaChunk.java | 4 +- .../upstream/cache/CacheWriter.java | 8 +- .../upstream/cache/CacheDataSourceTest.java | 17 ++-- .../extractor/ts/PsExtractorSeekTest.java | 10 +-- .../extractor/ts/TsExtractorSeekTest.java | 4 +- .../exoplayer2/source/hls/HlsMediaChunk.java | 4 +- .../source/rtsp/RtpDataLoadable.java | 3 +- .../UdpDataSourceRtpDataChannelFactory.java | 6 +- .../exoplayer2/testutil/CacheAsserts.java | 3 +- .../testutil/DataSourceContractTest.java | 31 ++++--- .../android/exoplayer2/testutil/TestUtil.java | 7 +- 21 files changed, 159 insertions(+), 120 deletions(-) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 1a00670a39..ec5d82ac1a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -50,6 +50,7 @@ import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.offline.DownloadService; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSourceInputStream; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; @@ -284,7 +285,7 @@ public class SampleChooserActivity extends AppCompatActivity Log.e(TAG, "Error loading sample list: " + uri, e); sawError = true; } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } return result; diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java index 377a9c4db8..13952abd72 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java @@ -38,6 +38,7 @@ import com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ui.AdOverlayInfo; import com.google.android.exoplayer2.upstream.DataSchemeDataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -190,7 +191,7 @@ import java.util.Set; DataSchemeDataSource dataSchemeDataSource = new DataSchemeDataSource(); try { dataSchemeDataSource.open(adTagDataSpec); - request.setAdsResponse(Util.fromUtf8Bytes(Util.readToEnd(dataSchemeDataSource))); + request.setAdsResponse(Util.fromUtf8Bytes(DataSourceUtil.readToEnd(dataSchemeDataSource))); } finally { dataSchemeDataSource.close(); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java new file mode 100644 index 0000000000..b0a31d9b7b --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.upstream; + +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; +import java.io.IOException; +import java.util.Arrays; + +/** Utility methods for {@link DataSource}. */ +public final class DataSourceUtil { + + private DataSourceUtil() {} + + /** + * Reads data from the specified opened {@link DataSource} until it ends, and returns a byte array + * containing the read data. + * + * @param dataSource The source from which to read. + * @return The concatenation of all read data. + * @throws IOException If an error occurs reading from the source. + */ + public static byte[] readToEnd(DataSource dataSource) throws IOException { + byte[] data = new byte[1024]; + int position = 0; + int bytesRead = 0; + while (bytesRead != C.RESULT_END_OF_INPUT) { + if (position == data.length) { + data = Arrays.copyOf(data, data.length * 2); + } + bytesRead = dataSource.read(data, position, data.length - position); + if (bytesRead != C.RESULT_END_OF_INPUT) { + position += bytesRead; + } + } + return Arrays.copyOf(data, position); + } + + /** + * Reads {@code length} bytes from the specified opened {@link DataSource}, and returns a byte + * array containing the read data. + * + * @param dataSource The source from which 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 + * could be read. + */ + public static byte[] readExactly(DataSource dataSource, int length) throws IOException { + byte[] data = new byte[length]; + int position = 0; + while (position < length) { + int bytesRead = dataSource.read(data, position, data.length - position); + if (bytesRead == C.RESULT_END_OF_INPUT) { + throw new IllegalStateException( + "Not enough data could be read: " + position + " < " + length); + } + position += bytesRead; + } + return data; + } + + /** + * Closes a {@link DataSource}, suppressing any {@link IOException} that may occur. + * + * @param dataSource The {@link DataSource} to close. + */ + public static void closeQuietly(@Nullable DataSource dataSource) { + try { + if (dataSource != null) { + dataSource.close(); + } + } catch (IOException e) { + // Ignore. + } + } +} 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 27a0d93670..9cf935d56f 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 @@ -63,7 +63,6 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.PlaybackException; -import com.google.android.exoplayer2.upstream.DataSource; import com.google.common.base.Ascii; import com.google.common.base.Charsets; import java.io.ByteArrayOutputStream; @@ -539,69 +538,6 @@ public final class Util { return Executors.newSingleThreadExecutor(runnable -> new Thread(runnable, threadName)); } - /** - * Reads data from the specified opened {@link DataSource} until it ends, and returns a byte array - * containing the read data. - * - * @param dataSource The source from which to read. - * @return The concatenation of all read data. - * @throws IOException If an error occurs reading from the source. - */ - public static byte[] readToEnd(DataSource dataSource) throws IOException { - byte[] data = new byte[1024]; - int position = 0; - int bytesRead = 0; - while (bytesRead != C.RESULT_END_OF_INPUT) { - if (position == data.length) { - data = Arrays.copyOf(data, data.length * 2); - } - bytesRead = dataSource.read(data, position, data.length - position); - if (bytesRead != C.RESULT_END_OF_INPUT) { - position += bytesRead; - } - } - return Arrays.copyOf(data, position); - } - - /** - * Reads {@code length} bytes from the specified opened {@link DataSource}, and returns a byte - * array containing the read data. - * - * @param dataSource The source from which 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 - * could be read. - */ - public static byte[] readExactly(DataSource dataSource, int length) throws IOException { - byte[] data = new byte[length]; - int position = 0; - while (position < length) { - int bytesRead = dataSource.read(data, position, data.length - position); - if (bytesRead == C.RESULT_END_OF_INPUT) { - throw new IllegalStateException( - "Not enough data could be read: " + position + " < " + length); - } - position += bytesRead; - } - return data; - } - - /** - * Closes a {@link DataSource}, suppressing any {@link IOException} that may occur. - * - * @param dataSource The {@link DataSource} to close. - */ - public static void closeQuietly(@Nullable DataSource dataSource) { - try { - if (dataSource != null) { - dataSource.close(); - } - } catch (IOException e) { - // Ignore. - } - } - /** * Closes a {@link Closeable}, suppressing any {@link IOException} that may occur. Both {@link * java.io.OutputStream} and {@link InputStream} are {@code Closeable}. diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java index 297ae69e0b..dfdd64f0d1 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java @@ -139,7 +139,7 @@ public final class DataSchemeDataSourceTest { String data = "Some Data!<>:\"/\\|?*%"; schemeDataDataSource.open(new DataSpec(Util.getDataUriForString("text/plain", data))); - assertThat(Util.fromUtf8Bytes(Util.readToEnd(schemeDataDataSource))).isEqualTo(data); + assertThat(Util.fromUtf8Bytes(DataSourceUtil.readToEnd(schemeDataDataSource))).isEqualTo(data); } private static DataSpec buildDataSpec(String uriString) { @@ -163,7 +163,7 @@ public final class DataSchemeDataSourceTest { try { long length = dataSource.open(dataSpec); assertThat(length).isEqualTo(expectedData.length); - byte[] readData = Util.readToEnd(dataSource); + byte[] readData = DataSourceUtil.readToEnd(dataSource); assertThat(readData).isEqualTo(expectedData); } finally { dataSource.close(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index 654b2212ec..c30476405d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -44,6 +44,7 @@ import com.google.android.exoplayer2.source.SampleStream.ReadFlags; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; @@ -1056,7 +1057,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } else if (progressiveMediaExtractor.getCurrentInputPosition() != C.POSITION_UNSET) { positionHolder.position = progressiveMediaExtractor.getCurrentInputPosition(); } - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java index 314946f90a..a018f94de2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java @@ -24,6 +24,7 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; @@ -35,7 +36,6 @@ import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -445,7 +445,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; result = dataSource.read(sampleData, sampleSize, sampleData.length - sampleSize); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java index 776b1803c8..154cccb786 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java @@ -23,8 +23,8 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; /** A {@link BaseMediaChunk} that uses an {@link Extractor} to decode sample data. */ @@ -129,7 +129,7 @@ public class ContainerMediaChunk extends BaseMediaChunk { nextLoadPosition = input.getPosition() - dataSpec.position; } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } loadCompleted = !loadCanceled; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java index a9b989c858..7b106c0423 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java @@ -20,6 +20,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.DataType; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -101,7 +102,7 @@ public abstract class DataChunk extends Chunk { consume(data, limit); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java index 2b4ba05e36..a1c3cfea78 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java @@ -23,8 +23,8 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -104,7 +104,7 @@ public final class InitializationChunk extends Chunk { nextLoadPosition = input.getPosition() - dataSpec.position; } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java index 8781577ab8..4fdce6377b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java @@ -22,8 +22,8 @@ import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; /** A {@link BaseMediaChunk} for chunks consisting of a single raw sample. */ @@ -110,7 +110,7 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { int sampleSize = (int) nextLoadPosition; trackOutput.sampleMetadata(startTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null); } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } loadCompleted = true; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java index 7e9b3794b9..5fa6638981 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java @@ -18,10 +18,10 @@ package com.google.android.exoplayer2.upstream.cache; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.util.PriorityTaskManager.PriorityTooLowException; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.io.InterruptedIOException; @@ -158,7 +158,7 @@ public final class CacheWriter { resolvedLength = dataSource.open(boundedDataSpec); isDataSourceOpen = true; } catch (IOException e) { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } @@ -171,7 +171,7 @@ public final class CacheWriter { try { resolvedLength = dataSource.open(unboundedDataSpec); } catch (IOException e) { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); throw e; } } @@ -194,7 +194,7 @@ public final class CacheWriter { onRequestEndPosition(position + totalBytesRead); } } catch (IOException e) { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); throw e; } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java index eefc4eb8c4..481c50664e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java @@ -29,6 +29,7 @@ import com.google.android.exoplayer2.testutil.CacheAsserts; import com.google.android.exoplayer2.testutil.FakeDataSet.FakeData; import com.google.android.exoplayer2.testutil.FakeDataSource; import com.google.android.exoplayer2.testutil.TestUtil; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.FileDataSource; import com.google.android.exoplayer2.util.Util; @@ -325,7 +326,7 @@ public final class CacheDataSourceTest { CacheDataSource cacheDataSource = new CacheDataSource(cache, upstream, 0); cacheDataSource.open(unboundedDataSpec); - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); assertThat(upstream.getAndClearOpenedDataSpecs()).hasLength(1); @@ -342,7 +343,7 @@ public final class CacheDataSourceTest { cache, upstream, CacheDataSource.FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS); cacheDataSource.open(unboundedDataSpec); - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); assertThat(cache.getKeys()).isEmpty(); @@ -391,7 +392,7 @@ public final class CacheDataSourceTest { cacheWriter.cache(); // Read the rest of the data. - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); } @@ -440,7 +441,7 @@ public final class CacheDataSourceTest { cacheWriter.cache(); // Read the rest of the data. - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); } @@ -469,14 +470,14 @@ public final class CacheDataSourceTest { // Open source and read some data from upstream as the data hasn't cached yet. cacheDataSource.open(unboundedDataSpec); - Util.readExactly(cacheDataSource, 100); + DataSourceUtil.readExactly(cacheDataSource, 100); // Delete cached data. cache.removeResource(cacheDataSource.getCacheKeyFactory().buildCacheKey(unboundedDataSpec)); assertCacheEmpty(cache); // Read the rest of the data. - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); } @@ -506,7 +507,7 @@ public final class CacheDataSourceTest { cacheDataSource.open(unboundedDataSpec); // Read the first half from upstream as it hasn't cached yet. - Util.readExactly(cacheDataSource, halfDataLength); + DataSourceUtil.readExactly(cacheDataSource, halfDataLength); // Delete the cached latter half. NavigableSet cachedSpans = cache.getCachedSpans(defaultCacheKey); @@ -517,7 +518,7 @@ public final class CacheDataSourceTest { } // Read the rest of the data. - Util.readToEnd(cacheDataSource); + DataSourceUtil.readToEnd(cacheDataSource); cacheDataSource.close(); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java index bd02ae9711..dea5d20ad9 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/PsExtractorSeekTest.java @@ -31,9 +31,9 @@ import com.google.android.exoplayer2.testutil.FakeExtractorInput; import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.Arrays; import java.util.Random; @@ -198,7 +198,7 @@ public final class PsExtractorSeekTest { private long readInputLength() throws IOException { DataSpec dataSpec = new DataSpec(Uri.parse("asset:///" + PS_FILE_PATH)); long totalInputLength = dataSource.open(dataSpec); - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); return totalInputLength; } @@ -229,7 +229,7 @@ public final class PsExtractorSeekTest { extractorReadResult = psExtractor.read(extractorInput, positionHolder); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (extractorReadResult == Extractor.RESULT_SEEK) { @@ -257,7 +257,7 @@ public final class PsExtractorSeekTest { readResult = extractor.read(input, positionHolder); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (readResult == Extractor.RESULT_SEEK) { @@ -283,7 +283,7 @@ public final class PsExtractorSeekTest { readResult = extractor.read(input, positionHolder); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (readResult == Extractor.RESULT_SEEK) { input = getExtractorInputFromPosition(positionHolder.position); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java index 32143c22ae..b014100577 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/TsExtractorSeekTest.java @@ -27,8 +27,8 @@ import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.testutil.FakeExtractorOutput; import com.google.android.exoplayer2.testutil.FakeTrackOutput; import com.google.android.exoplayer2.testutil.TestUtil; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.Arrays; import java.util.Random; @@ -221,7 +221,7 @@ public final class TsExtractorSeekTest { readResult = extractor.read(input, positionHolder); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (readResult == Extractor.RESULT_SEEK) { input = diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index d074d269b6..31a0a5096e 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -30,12 +30,12 @@ import com.google.android.exoplayer2.metadata.id3.PrivFrame; import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.TimestampAdjuster; import com.google.android.exoplayer2.util.UriUtil; -import com.google.android.exoplayer2.util.Util; import com.google.common.base.Ascii; import com.google.common.collect.ImmutableList; import java.io.EOFException; @@ -472,7 +472,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; nextLoadPosition = (int) (input.getPosition() - dataSpec.position); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } } diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtpDataLoadable.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtpDataLoadable.java index 8f171ef44e..b42a938205 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtpDataLoadable.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtpDataLoadable.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -162,7 +163,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } } finally { - Util.closeQuietly(dataChannel); + DataSourceUtil.closeQuietly(dataChannel); } } diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/UdpDataSourceRtpDataChannelFactory.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/UdpDataSourceRtpDataChannelFactory.java index b59753ea12..b4c0b4c5ed 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/UdpDataSourceRtpDataChannelFactory.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/UdpDataSourceRtpDataChannelFactory.java @@ -15,7 +15,7 @@ */ package com.google.android.exoplayer2.source.rtsp; -import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import java.io.IOException; /** Factory for {@link UdpDataSourceRtpDataChannel}. */ @@ -60,8 +60,8 @@ import java.io.IOException; return secondChannel; } } catch (IOException e) { - Util.closeQuietly(firstChannel); - Util.closeQuietly(secondChannel); + DataSourceUtil.closeQuietly(firstChannel); + DataSourceUtil.closeQuietly(secondChannel); throw e; } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CacheAsserts.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CacheAsserts.java index 65cc7dc8e7..f0df5f1c0c 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CacheAsserts.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CacheAsserts.java @@ -22,6 +22,7 @@ import android.net.Uri; import com.google.android.exoplayer2.testutil.FakeDataSet.FakeData; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSourceInputStream; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DummyDataSource; import com.google.android.exoplayer2.upstream.cache.Cache; @@ -130,7 +131,7 @@ public final class CacheAsserts { byte[] bytes; try { dataSource.open(dataSpec); - bytes = Util.readToEnd(dataSource); + bytes = DataSourceUtil.readToEnd(dataSource); } catch (IOException e) { throw new IOException("Opening/reading cache failed: " + dataSpec, e); } finally { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java index 12117e121b..b119512840 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/DataSourceContractTest.java @@ -34,6 +34,7 @@ import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSourceException; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; @@ -119,8 +120,8 @@ public abstract class DataSourceContractTest { long length = dataSource.open(new DataSpec(resource.getUri())); byte[] data = unboundedReadsAreIndefinite() - ? Util.readExactly(dataSource, resource.getExpectedBytes().length) - : Util.readToEnd(dataSource); + ? DataSourceUtil.readExactly(dataSource, resource.getExpectedBytes().length) + : DataSourceUtil.readToEnd(dataSource); if (length != C.LENGTH_UNSET) { assertThat(length).isEqualTo(resource.getExpectedBytes().length); @@ -148,8 +149,8 @@ public abstract class DataSourceContractTest { new DataSpec.Builder().setUri(resource.getUri()).setPosition(3).build()); byte[] data = unboundedReadsAreIndefinite() - ? Util.readExactly(dataSource, resource.getExpectedBytes().length - 3) - : Util.readToEnd(dataSource); + ? DataSourceUtil.readExactly(dataSource, resource.getExpectedBytes().length - 3) + : DataSourceUtil.readToEnd(dataSource); if (length != C.LENGTH_UNSET) { assertThat(length).isEqualTo(resource.getExpectedBytes().length - 3); @@ -176,7 +177,7 @@ public abstract class DataSourceContractTest { try { long length = dataSource.open(new DataSpec.Builder().setUri(resource.getUri()).setLength(4).build()); - byte[] data = Util.readToEnd(dataSource); + byte[] data = DataSourceUtil.readToEnd(dataSource); assertThat(length).isEqualTo(4); byte[] expectedData = Arrays.copyOf(resource.getExpectedBytes(), 4); @@ -205,7 +206,7 @@ public abstract class DataSourceContractTest { .setPosition(2) .setLength(2) .build()); - byte[] data = Util.readToEnd(dataSource); + byte[] data = DataSourceUtil.readToEnd(dataSource); assertThat(length).isEqualTo(2); byte[] expectedData = Arrays.copyOfRange(resource.getExpectedBytes(), 2, 4); @@ -232,7 +233,9 @@ public abstract class DataSourceContractTest { try { long length = dataSource.open(dataSpec); byte[] data = - unboundedReadsAreIndefinite() ? Util.EMPTY_BYTE_ARRAY : Util.readToEnd(dataSource); + unboundedReadsAreIndefinite() + ? Util.EMPTY_BYTE_ARRAY + : DataSourceUtil.readToEnd(dataSource); // The DataSource.open() contract requires the returned length to equal the length in the // DataSpec if set. This is true even though the DataSource implementation may know that @@ -267,7 +270,9 @@ public abstract class DataSourceContractTest { try { long length = dataSource.open(dataSpec); byte[] data = - unboundedReadsAreIndefinite() ? Util.EMPTY_BYTE_ARRAY : Util.readToEnd(dataSource); + unboundedReadsAreIndefinite() + ? Util.EMPTY_BYTE_ARRAY + : DataSourceUtil.readToEnd(dataSource); // The DataSource.open() contract requires the returned length to equal the length in the // DataSpec if set. This is true even though the DataSource implementation may know that @@ -321,7 +326,7 @@ public abstract class DataSourceContractTest { .build(); try { long length = dataSource.open(dataSpec); - byte[] data = Util.readExactly(dataSource, /* length= */ 1); + byte[] data = DataSourceUtil.readExactly(dataSource, /* length= */ 1); // TODO: Decide what the allowed behavior should be for the next read, and assert it. // The DataSource.open() contract requires the returned length to equal the length in the @@ -361,8 +366,8 @@ public abstract class DataSourceContractTest { .build()); byte[] data = unboundedReadsAreIndefinite() - ? Util.readExactly(dataSource, resource.getExpectedBytes().length) - : Util.readToEnd(dataSource); + ? DataSourceUtil.readExactly(dataSource, resource.getExpectedBytes().length) + : DataSourceUtil.readToEnd(dataSource); if (length != C.LENGTH_UNSET) { assertThat(length).isEqualTo(resource.getExpectedBytes().length); @@ -423,9 +428,9 @@ public abstract class DataSourceContractTest { inOrder.verifyNoMoreInteractions(); if (unboundedReadsAreIndefinite()) { - Util.readExactly(dataSource, resource.getExpectedBytes().length); + DataSourceUtil.readExactly(dataSource, resource.getExpectedBytes().length); } else { - Util.readToEnd(dataSource); + DataSourceUtil.readToEnd(dataSource); } // Verify sufficient onBytesTransferred() callbacks have been triggered before closing the // DataSource. diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java index 462ccc5e6d..6db68eb6c3 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.metadata.MetadataInputBuffer; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSourceUtil; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; @@ -218,7 +219,7 @@ public class TestUtil { try { long length = dataSource.open(dataSpec); assertThat(length).isEqualTo(expectKnownLength ? expectedData.length : C.LENGTH_UNSET); - byte[] readData = Util.readToEnd(dataSource); + byte[] readData = DataSourceUtil.readToEnd(dataSource); assertThat(readData).isEqualTo(expectedData); } finally { dataSource.close(); @@ -325,7 +326,7 @@ public class TestUtil { } } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (readResult == Extractor.RESULT_SEEK) { @@ -413,7 +414,7 @@ public class TestUtil { extractorReadResult = extractor.read(extractorInput, positionHolder); } } finally { - Util.closeQuietly(dataSource); + DataSourceUtil.closeQuietly(dataSource); } if (extractorReadResult == Extractor.RESULT_SEEK) { From a4c100582396dcd1d782f9614d8a88525223cb58 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 12:00:16 +0100 Subject: [PATCH 342/441] Move CachedRegionTracker to upstream root PiperOrigin-RevId: 403914807 --- RELEASENOTES.md | 2 ++ .../{cache => }/CachedRegionTracker.java | 4 +++- .../{cache => }/CachedRegionTrackerTest.java | 18 ++++++++---------- 3 files changed, 13 insertions(+), 11 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/upstream/{cache => }/CachedRegionTracker.java (97%) rename library/core/src/test/java/com/google/android/exoplayer2/upstream/{cache => }/CachedRegionTrackerTest.java (88%) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 23086c71ba..078f53df86 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -14,6 +14,8 @@ `com.google.android.exoplayer2.DeviceInfo`. * Move `com.google.android.exoplayer2.drm.DecryptionException` to `com.google.android.exoplayer2.decoder.CryptoException`. + * Move `com.google.android.exoplayer2.upstream.cache.CachedRegionTracker` + to `com.google.android.exoplayer2.upstream.CachedRegionTracker`. * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTracker.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/CachedRegionTracker.java similarity index 97% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTracker.java rename to library/core/src/main/java/com/google/android/exoplayer2/upstream/CachedRegionTracker.java index 3306b032ef..047287b98e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTracker.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/CachedRegionTracker.java @@ -13,10 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.cache; +package com.google.android.exoplayer2.upstream; import androidx.annotation.Nullable; import com.google.android.exoplayer2.extractor.ChunkIndex; +import com.google.android.exoplayer2.upstream.cache.Cache; +import com.google.android.exoplayer2.upstream.cache.CacheSpan; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; import java.util.Arrays; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/upstream/CachedRegionTrackerTest.java similarity index 88% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java rename to library/core/src/test/java/com/google/android/exoplayer2/upstream/CachedRegionTrackerTest.java index a866f20366..9b768cfc0d 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedRegionTrackerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/upstream/CachedRegionTrackerTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.cache; +package com.google.android.exoplayer2.upstream; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -23,7 +23,8 @@ import static org.mockito.Mockito.when; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.extractor.ChunkIndex; -import com.google.android.exoplayer2.testutil.TestUtil; +import com.google.android.exoplayer2.upstream.cache.Cache; +import com.google.android.exoplayer2.upstream.cache.CacheSpan; import com.google.android.exoplayer2.util.Util; import java.io.File; import java.io.FileOutputStream; @@ -56,7 +57,6 @@ public final class CachedRegionTrackerTest { @Mock private Cache cache; private CachedRegionTracker tracker; - private CachedContentIndex index; private File cacheDir; @Before @@ -66,7 +66,6 @@ public final class CachedRegionTrackerTest { tracker = new CachedRegionTracker(cache, CACHE_KEY, CHUNK_INDEX); cacheDir = Util.createTempDirectory(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); - index = new CachedContentIndex(TestUtil.getInMemoryDatabaseProvider()); } @After @@ -128,14 +127,13 @@ public final class CachedRegionTrackerTest { } private CacheSpan newCacheSpan(int position, int length) throws IOException { - int id = index.assignIdForKey(CACHE_KEY); - File cacheFile = createCacheSpanFile(cacheDir, id, position, length, 0); - return SimpleCacheSpan.createCacheEntry(cacheFile, length, index); + File cacheFile = createCacheSpanFile(cacheDir, position, length); + return new CacheSpan(CACHE_KEY, position, length, /* lastTouchTimestamp= */ 0, cacheFile); } - public static File createCacheSpanFile( - File cacheDir, int id, long offset, int length, long lastTouchTimestamp) throws IOException { - File cacheFile = SimpleCacheSpan.getCacheFile(cacheDir, id, offset, lastTouchTimestamp); + public static File createCacheSpanFile(File cacheDir, long position, int length) + throws IOException { + File cacheFile = new File(cacheDir, "test." + position); createTestFile(cacheFile, length); return cacheFile; } From a242aa221e418db259fa7fd28b75540fbbe9a6e8 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 13:21:01 +0100 Subject: [PATCH 343/441] Move DataReader to common PiperOrigin-RevId: 403928449 --- .../upstream => androidx/media3/common}/DataReader.java | 3 +-- .../com/google/android/exoplayer2/upstream/DataSource.java | 1 + .../android/exoplayer2/source/BundledExtractorsAdapter.java | 2 +- .../android/exoplayer2/source/MediaParserExtractorAdapter.java | 2 +- .../android/exoplayer2/source/ProgressiveMediaExtractor.java | 2 +- .../com/google/android/exoplayer2/source/SampleDataQueue.java | 2 +- .../java/com/google/android/exoplayer2/source/SampleQueue.java | 2 +- .../android/exoplayer2/source/chunk/BundledChunkExtractor.java | 2 +- .../exoplayer2/source/mediaparser/InputReaderAdapterV30.java | 2 +- .../source/mediaparser/OutputConsumerAdapterV30.java | 2 +- .../android/exoplayer2/source/dash/PlayerEmsgHandler.java | 2 +- .../android/exoplayer2/extractor/DefaultExtractorInput.java | 2 +- .../google/android/exoplayer2/extractor/DummyTrackOutput.java | 2 +- .../google/android/exoplayer2/extractor/ExtractorInput.java | 2 +- .../com/google/android/exoplayer2/extractor/TrackOutput.java | 2 +- .../android/exoplayer2/source/hls/HlsSampleStreamWrapper.java | 2 +- .../google/android/exoplayer2/testutil/FakeTrackOutput.java | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) rename library/common/src/main/java/{com/google/android/exoplayer2/upstream => androidx/media3/common}/DataReader.java (95%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java b/library/common/src/main/java/androidx/media3/common/DataReader.java similarity index 95% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java rename to library/common/src/main/java/androidx/media3/common/DataReader.java index 4b96a3ddfb..f26d6436cc 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java +++ b/library/common/src/main/java/androidx/media3/common/DataReader.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream; +package androidx.media3.common; -import com.google.android.exoplayer2.C; import java.io.IOException; /** Reads bytes from a data stream. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java index c6ac0a261a..44aa9f15f4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.upstream; import android.net.Uri; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import java.io.IOException; import java.util.Collections; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java index edb16e53d6..cc2b87eb10 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source; import android.net.Uri; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.Extractor; @@ -25,7 +26,6 @@ import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java index 10fd2cdeba..c9adc29977 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java @@ -25,13 +25,13 @@ import android.media.MediaParser.SeekPoint; import android.net.Uri; import android.util.Pair; import androidx.annotation.RequiresApi; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30; import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30; -import com.google.android.exoplayer2.upstream.DataReader; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java index ed4f6ac604..fd2f0e16fa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java @@ -16,11 +16,11 @@ package com.google.android.exoplayer2.source; import android.net.Uri; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; -import com.google.android.exoplayer2.upstream.DataReader; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java index cbc8358a2f..3d6e1d4bf2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source; import static java.lang.Math.min; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; @@ -26,7 +27,6 @@ import com.google.android.exoplayer2.extractor.TrackOutput.CryptoData; import com.google.android.exoplayer2.source.SampleQueue.SampleExtrasHolder; import com.google.android.exoplayer2.upstream.Allocation; import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index 4207fcfbae..a9a67de013 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -27,6 +27,7 @@ import androidx.annotation.CallSuper; import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -40,7 +41,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.source.SampleStream.ReadFlags; import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java index e2e3ae0914..84f3ad7c91 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java @@ -19,6 +19,7 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.util.SparseArray; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.ChunkIndex; @@ -32,7 +33,6 @@ import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor; import com.google.android.exoplayer2.extractor.rawcc.RawCcExtractor; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java index 3a55645e96..7273767164 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java @@ -19,8 +19,8 @@ import android.annotation.SuppressLint; import android.media.MediaParser; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Util; import java.io.IOException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java index 233eded306..9c1de5b919 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java @@ -40,6 +40,7 @@ import android.media.MediaParser.TrackData; import android.util.Pair; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.SelectionFlags; import com.google.android.exoplayer2.Format; @@ -52,7 +53,6 @@ import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.SeekPoint; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput.CryptoData; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java index f368bdc071..a69a16d830 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java @@ -20,6 +20,7 @@ import static com.google.android.exoplayer2.util.Util.parseXsDateTime; import android.os.Handler; import android.os.Message; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -33,7 +34,6 @@ import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.IOException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java index b54131ce55..3e2f4443cc 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java @@ -17,9 +17,9 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.min; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java index 94c4a9af94..852344cccd 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java @@ -18,9 +18,9 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.min; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.EOFException; import java.io.IOException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java index 3dc9e0b15b..825ba32ce3 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java @@ -15,8 +15,8 @@ */ package com.google.android.exoplayer2.extractor; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.upstream.DataReader; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java index 1a58d232f0..0136af5cd5 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java @@ -17,9 +17,9 @@ package com.google.android.exoplayer2.extractor; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.EOFException; import java.io.IOException; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index ca72c5516d..f830258624 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -26,6 +26,7 @@ import android.os.Handler; import android.os.Looper; import android.util.SparseIntArray; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -58,7 +59,6 @@ import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.Allocator; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java index 7d31eb82a3..0d16fa5005 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java @@ -18,11 +18,11 @@ package com.google.android.exoplayer2.testutil; import static com.google.common.truth.Truth.assertThat; import androidx.annotation.Nullable; +import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.testutil.Dumper.Dumpable; -import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; From bcaadf434f9824433135e6ba693670a482a2d098 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 18 Oct 2021 14:35:34 +0100 Subject: [PATCH 344/441] Remove checkState calls from DefaultDrmSession#acquire() and release() Issue: #9392 reports occasional IllegalStateExceptions from release() in crashlytics,`with no way to reproduce locally. It seems likely there is a bug somewhere in DRM handling, and ideally we would find that and fix it. However we haven't been able to find the problem, and in the meantime these exceptions cause the entire app to crash. Although this is arguably useful from a debugging perspective, it's obviously a poor experience for developers and users, since all we're actually trying to do is release the session, so maybe we shouldn't strictly care that it's already released? This change replaces the exception with an error log, which might be a useful debugging hint if we see other DRM unexpected behaviour due to references to released sessions being held for too long. PiperOrigin-RevId: 403942546 --- RELEASENOTES.md | 4 ++++ .../android/exoplayer2/drm/DefaultDrmSession.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 078f53df86..2ace17dc48 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -28,6 +28,10 @@ * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` ([#9476](https://github.com/google/ExoPlayer/issues/9476)). +* DRM: + * Log an error (instead of throwing `IllegalStateException`) when calling + `DefaultDrmSession#release()` on a fully released session + ([#9392](https://github.com/google/ExoPlayer/issues/9392)). * Android 12 compatibility: * Keep `DownloadService` started and in the foreground whilst waiting for requirements to be met on Android 12. This is necessary due to new diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index 5e5bce8340..fff8ab9e7b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -296,7 +296,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { - checkState(referenceCount >= 0); + if (referenceCount < 0) { + Log.e(TAG, "Session reference count less than zero: " + referenceCount); + referenceCount = 0; + } if (eventDispatcher != null) { eventDispatchers.add(eventDispatcher); } @@ -320,7 +323,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override public void release(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { - checkState(referenceCount > 0); + if (referenceCount <= 0) { + Log.e(TAG, "release() called on a session that's already fully released."); + return; + } if (--referenceCount == 0) { // Assigning null to various non-null variables for clean-up. state = STATE_RELEASED; From 80286b42d6e04e667784d42869de0a9c25727829 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 14:48:28 +0100 Subject: [PATCH 345/441] Move metadata classes that don't need to live in common. PiperOrigin-RevId: 403945085 --- .../com/google/android/exoplayer2/metadata/MetadataDecoder.java | 0 .../google/android/exoplayer2/metadata/MetadataInputBuffer.java | 0 .../google/android/exoplayer2/metadata/SimpleMetadataDecoder.java | 0 .../java/com/google/android/exoplayer2/metadata/package-info.java | 0 .../android/exoplayer2/metadata/SimpleMetadataDecoderTest.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/metadata/package-info.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoderTest.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/MetadataDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/MetadataInputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/package-info.java b/library/extractor/src/main/java/com/google/android/exoplayer2/metadata/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/metadata/package-info.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/metadata/package-info.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoderTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoderTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/metadata/SimpleMetadataDecoderTest.java From dd23cb13da5f454c9de0523b57ae89212382dee8 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 16:20:00 +0100 Subject: [PATCH 346/441] Fix moving of DataReader PiperOrigin-RevId: 403965543 --- .../google/android/exoplayer2/upstream}/DataReader.java | 3 ++- .../com/google/android/exoplayer2/upstream/DataSource.java | 1 - .../android/exoplayer2/source/BundledExtractorsAdapter.java | 2 +- .../android/exoplayer2/source/MediaParserExtractorAdapter.java | 2 +- .../android/exoplayer2/source/ProgressiveMediaExtractor.java | 2 +- .../com/google/android/exoplayer2/source/SampleDataQueue.java | 2 +- .../java/com/google/android/exoplayer2/source/SampleQueue.java | 2 +- .../android/exoplayer2/source/chunk/BundledChunkExtractor.java | 2 +- .../exoplayer2/source/mediaparser/InputReaderAdapterV30.java | 2 +- .../source/mediaparser/OutputConsumerAdapterV30.java | 2 +- .../android/exoplayer2/source/dash/PlayerEmsgHandler.java | 2 +- .../android/exoplayer2/extractor/DefaultExtractorInput.java | 2 +- .../google/android/exoplayer2/extractor/DummyTrackOutput.java | 2 +- .../google/android/exoplayer2/extractor/ExtractorInput.java | 2 +- .../com/google/android/exoplayer2/extractor/TrackOutput.java | 2 +- .../android/exoplayer2/source/hls/HlsSampleStreamWrapper.java | 2 +- .../google/android/exoplayer2/testutil/FakeTrackOutput.java | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) rename library/common/src/main/java/{androidx/media3/common => com/google/android/exoplayer2/upstream}/DataReader.java (95%) diff --git a/library/common/src/main/java/androidx/media3/common/DataReader.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java similarity index 95% rename from library/common/src/main/java/androidx/media3/common/DataReader.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java index f26d6436cc..4b96a3ddfb 100644 --- a/library/common/src/main/java/androidx/media3/common/DataReader.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataReader.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package androidx.media3.common; +package com.google.android.exoplayer2.upstream; +import com.google.android.exoplayer2.C; import java.io.IOException; /** Reads bytes from a data stream. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java index 44aa9f15f4..c6ac0a261a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.upstream; import android.net.Uri; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import java.io.IOException; import java.util.Collections; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java index cc2b87eb10..edb16e53d6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/BundledExtractorsAdapter.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.source; import android.net.Uri; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.Extractor; @@ -26,6 +25,7 @@ import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java index c9adc29977..10fd2cdeba 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaParserExtractorAdapter.java @@ -25,13 +25,13 @@ import android.media.MediaParser.SeekPoint; import android.net.Uri; import android.util.Pair; import androidx.annotation.RequiresApi; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30; import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30; +import com.google.android.exoplayer2.upstream.DataReader; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java index fd2f0e16fa..ed4f6ac604 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaExtractor.java @@ -16,11 +16,11 @@ package com.google.android.exoplayer2.source; import android.net.Uri; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.PositionHolder; +import com.google.android.exoplayer2.upstream.DataReader; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java index 3d6e1d4bf2..cbc8358a2f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleDataQueue.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source; import static java.lang.Math.min; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; @@ -27,6 +26,7 @@ import com.google.android.exoplayer2.extractor.TrackOutput.CryptoData; import com.google.android.exoplayer2.source.SampleQueue.SampleExtrasHolder; import com.google.android.exoplayer2.upstream.Allocation; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java index a9a67de013..4207fcfbae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java @@ -27,7 +27,6 @@ import androidx.annotation.CallSuper; import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -41,6 +40,7 @@ import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.source.SampleStream.ReadFlags; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java index 84f3ad7c91..e2e3ae0914 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/BundledChunkExtractor.java @@ -19,7 +19,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.util.SparseArray; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.ChunkIndex; @@ -33,6 +32,7 @@ import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor; import com.google.android.exoplayer2.extractor.rawcc.RawCcExtractor; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java index 7273767164..3a55645e96 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/InputReaderAdapterV30.java @@ -19,8 +19,8 @@ import android.annotation.SuppressLint; import android.media.MediaParser; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Util; import java.io.IOException; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java index 9c1de5b919..233eded306 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java @@ -40,7 +40,6 @@ import android.media.MediaParser.TrackData; import android.util.Pair; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C.SelectionFlags; import com.google.android.exoplayer2.Format; @@ -53,6 +52,7 @@ import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.SeekPoint; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput.CryptoData; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java index a69a16d830..f368bdc071 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/PlayerEmsgHandler.java @@ -20,7 +20,6 @@ import static com.google.android.exoplayer2.util.Util.parseXsDateTime; import android.os.Handler; import android.os.Message; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -34,6 +33,7 @@ import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.IOException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java index 3e2f4443cc..b54131ce55 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorInput.java @@ -17,9 +17,9 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.min; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.EOFException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java index 852344cccd..94c4a9af94 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DummyTrackOutput.java @@ -18,9 +18,9 @@ package com.google.android.exoplayer2.extractor; import static java.lang.Math.min; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.EOFException; import java.io.IOException; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java index 825ba32ce3..3dc9e0b15b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ExtractorInput.java @@ -15,8 +15,8 @@ */ package com.google.android.exoplayer2.extractor; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.upstream.DataReader; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java index 0136af5cd5..1a58d232f0 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/TrackOutput.java @@ -17,9 +17,9 @@ package com.google.android.exoplayer2.extractor; import androidx.annotation.IntDef; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.ParsableByteArray; import java.io.EOFException; import java.io.IOException; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index f830258624..ca72c5516d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -26,7 +26,6 @@ import android.os.Handler; import android.os.Looper; import android.util.SparseIntArray; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; @@ -59,6 +58,7 @@ import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java index 0d16fa5005..7d31eb82a3 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackOutput.java @@ -18,11 +18,11 @@ package com.google.android.exoplayer2.testutil; import static com.google.common.truth.Truth.assertThat; import androidx.annotation.Nullable; -import androidx.media3.common.DataReader; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.testutil.Dumper.Dumpable; +import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; From 422e68b48dc4e3fafe635239b1aa989d97f22ba9 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 18 Oct 2021 16:55:00 +0100 Subject: [PATCH 347/441] Demo: Fix NPE in SampleChooserActivity This prevents the demo app loading media.exolist.json. The exception was introduced by https://github.com/google/ExoPlayer/commit/8fd1381a84470813827a83921cf3dd2b8603ecb0 PiperOrigin-RevId: 403973062 --- .../google/android/exoplayer2/demo/SampleChooserActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index ec5d82ac1a..70a215ee8f 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -348,7 +348,7 @@ public class SampleChooserActivity extends AppCompatActivity String subtitleLanguage = null; UUID drmUuid = null; String drmLicenseUri = null; - ImmutableMap drmLicenseRequestHeaders = null; + ImmutableMap drmLicenseRequestHeaders = ImmutableMap.of(); boolean drmSessionForClearContent = false; boolean drmMultiSession = false; boolean drmForceDefaultLicenseUri = false; @@ -453,7 +453,7 @@ public class SampleChooserActivity extends AppCompatActivity } else { checkState(drmLicenseUri == null, "drm_uuid is required if drm_license_uri is set."); checkState( - drmLicenseRequestHeaders == null, + drmLicenseRequestHeaders.isEmpty(), "drm_uuid is required if drm_key_request_properties is set."); checkState( !drmSessionForClearContent, From 218e0bf885981b7d19ab2c4bb66033e5a3b384f3 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 18 Oct 2021 16:57:15 +0100 Subject: [PATCH 348/441] Demo: Fix NPE when restoring DRM info of a downloaded item DrmConfiguration.Builder#setLicenseRequestHeaders now rejects null, since https://github.com/google/ExoPlayer/commit/8fd1381a84470813827a83921cf3dd2b8603ecb0 This private method isn't needed at all, it's extracting the headers from the item that the DrmConfiguration.Builder is already based on. PiperOrigin-RevId: 403973523 --- .../android/exoplayer2/demo/PlayerActivity.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index d0f84a401a..b5a1eefdfd 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -58,7 +58,6 @@ import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; /** An activity that plays media using {@link ExoPlayer}. */ public class PlayerActivity extends AppCompatActivity @@ -503,11 +502,7 @@ public class PlayerActivity extends AppCompatActivity MediaItem.DrmConfiguration drmConfiguration = item.localConfiguration.drmConfiguration; if (drmConfiguration != null) { builder.setDrmConfiguration( - drmConfiguration - .buildUpon() - .setKeySetId(downloadRequest.keySetId) - .setLicenseRequestHeaders(getDrmRequestHeaders(item)) - .build()); + drmConfiguration.buildUpon().setKeySetId(downloadRequest.keySetId).build()); } mediaItems.add(builder.build()); @@ -517,10 +512,4 @@ public class PlayerActivity extends AppCompatActivity } return mediaItems; } - - @Nullable - private static Map getDrmRequestHeaders(MediaItem item) { - MediaItem.DrmConfiguration drmConfiguration = item.localConfiguration.drmConfiguration; - return drmConfiguration != null ? drmConfiguration.licenseRequestHeaders : null; - } } From 4aeec5301946176d55c7e0b0be7cf526edd93a03 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 19:07:40 +0100 Subject: [PATCH 349/441] Copybara config cleanup PiperOrigin-RevId: 404007749 --- .../com/google/android/exoplayer2/metadata/MetadataOutput.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java index d203ffd801..0eb64d75c0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataOutput.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.metadata; + /** Receives metadata output. */ public interface MetadataOutput { From d601875452345f1ae860796f54fa5abf22316b9e Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 22:22:37 +0100 Subject: [PATCH 350/441] Rename releaseArtifact to releaseArtifactId PiperOrigin-RevId: 404059404 --- extensions/cast/build.gradle | 2 +- extensions/cronet/build.gradle | 2 +- extensions/ima/build.gradle | 2 +- extensions/leanback/build.gradle | 2 +- extensions/okhttp/build.gradle | 2 +- extensions/rtmp/build.gradle | 2 +- extensions/workmanager/build.gradle | 2 +- library/common/build.gradle | 2 +- library/core/build.gradle | 2 +- library/dash/build.gradle | 2 +- library/extractor/build.gradle | 2 +- library/hls/build.gradle | 2 +- library/rtsp/build.gradle | 2 +- library/smoothstreaming/build.gradle | 2 +- library/transformer/build.gradle | 2 +- library/ui/build.gradle | 2 +- publish.gradle | 4 ++-- robolectricutils/build.gradle | 2 +- testutils/build.gradle | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/extensions/cast/build.gradle b/extensions/cast/build.gradle index 49077b8580..aed8038cbb 100644 --- a/extensions/cast/build.gradle +++ b/extensions/cast/build.gradle @@ -30,7 +30,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-cast' + releaseArtifactId = 'extension-cast' releaseDescription = 'Cast extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/cronet/build.gradle b/extensions/cronet/build.gradle index 9a11adbd15..b79a5d2fbb 100644 --- a/extensions/cronet/build.gradle +++ b/extensions/cronet/build.gradle @@ -44,7 +44,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-cronet' + releaseArtifactId = 'extension-cronet' releaseDescription = 'Cronet extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/ima/build.gradle b/extensions/ima/build.gradle index 7cbcb0b485..26e87025e1 100644 --- a/extensions/ima/build.gradle +++ b/extensions/ima/build.gradle @@ -45,7 +45,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-ima' + releaseArtifactId = 'extension-ima' releaseDescription = 'Interactive Media Ads extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/leanback/build.gradle b/extensions/leanback/build.gradle index a09e6d2f7c..3a1a3fb78c 100644 --- a/extensions/leanback/build.gradle +++ b/extensions/leanback/build.gradle @@ -28,7 +28,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-leanback' + releaseArtifactId = 'extension-leanback' releaseDescription = 'Leanback extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/okhttp/build.gradle b/extensions/okhttp/build.gradle index 96424b4380..a8c3c622d2 100644 --- a/extensions/okhttp/build.gradle +++ b/extensions/okhttp/build.gradle @@ -32,7 +32,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-okhttp' + releaseArtifactId = 'extension-okhttp' releaseDescription = 'OkHttp extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/rtmp/build.gradle b/extensions/rtmp/build.gradle index 7a37396568..7b1e9d244c 100644 --- a/extensions/rtmp/build.gradle +++ b/extensions/rtmp/build.gradle @@ -29,7 +29,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-rtmp' + releaseArtifactId = 'extension-rtmp' releaseDescription = 'RTMP extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/workmanager/build.gradle b/extensions/workmanager/build.gradle index ba2de98729..1327cab7fe 100644 --- a/extensions/workmanager/build.gradle +++ b/extensions/workmanager/build.gradle @@ -27,7 +27,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-workmanager' + releaseArtifactId = 'extension-workmanager' releaseDescription = 'WorkManager extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/library/common/build.gradle b/library/common/build.gradle index b8080fba63..1a3217fabe 100644 --- a/library/common/build.gradle +++ b/library/common/build.gradle @@ -68,7 +68,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-common' + releaseArtifactId = 'exoplayer-common' releaseDescription = 'The ExoPlayer library common module.' } apply from: '../../publish.gradle' diff --git a/library/core/build.gradle b/library/core/build.gradle index bebd62beb9..6b8b86c067 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -61,7 +61,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-core' + releaseArtifactId = 'exoplayer-core' releaseDescription = 'The ExoPlayer library core module.' } apply from: '../../publish.gradle' diff --git a/library/dash/build.gradle b/library/dash/build.gradle index dd1a939fb7..0452e03633 100644 --- a/library/dash/build.gradle +++ b/library/dash/build.gradle @@ -40,7 +40,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-dash' + releaseArtifactId = 'exoplayer-dash' releaseDescription = 'The ExoPlayer library DASH module.' } apply from: '../../publish.gradle' diff --git a/library/extractor/build.gradle b/library/extractor/build.gradle index e7f20051cd..a82da78c2d 100644 --- a/library/extractor/build.gradle +++ b/library/extractor/build.gradle @@ -41,7 +41,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-extractor' + releaseArtifactId = 'exoplayer-extractor' releaseDescription = 'The ExoPlayer library extractor module.' } apply from: '../../publish.gradle' diff --git a/library/hls/build.gradle b/library/hls/build.gradle index 6c94d1d444..25a2f42808 100644 --- a/library/hls/build.gradle +++ b/library/hls/build.gradle @@ -42,7 +42,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-hls' + releaseArtifactId = 'exoplayer-hls' releaseDescription = 'The ExoPlayer library HLS module.' } apply from: '../../publish.gradle' diff --git a/library/rtsp/build.gradle b/library/rtsp/build.gradle index c97391a858..a919018bb9 100644 --- a/library/rtsp/build.gradle +++ b/library/rtsp/build.gradle @@ -43,7 +43,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-rtsp' + releaseArtifactId = 'exoplayer-rtsp' releaseDescription = 'The ExoPlayer library RTSP module.' } apply from: '../../publish.gradle' diff --git a/library/smoothstreaming/build.gradle b/library/smoothstreaming/build.gradle index 34fa62e096..116b43e7cb 100644 --- a/library/smoothstreaming/build.gradle +++ b/library/smoothstreaming/build.gradle @@ -39,7 +39,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-smoothstreaming' + releaseArtifactId = 'exoplayer-smoothstreaming' releaseDescription = 'The ExoPlayer library SmoothStreaming module.' } apply from: '../../publish.gradle' diff --git a/library/transformer/build.gradle b/library/transformer/build.gradle index 6870c9f577..32fa7695d5 100644 --- a/library/transformer/build.gradle +++ b/library/transformer/build.gradle @@ -41,7 +41,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-transformer' + releaseArtifactId = 'exoplayer-transformer' releaseDescription = 'The ExoPlayer library transformer module.' } apply from: '../../publish.gradle' diff --git a/library/ui/build.gradle b/library/ui/build.gradle index 81e1e5e126..18f4128148 100644 --- a/library/ui/build.gradle +++ b/library/ui/build.gradle @@ -32,7 +32,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-ui' + releaseArtifactId = 'exoplayer-ui' releaseDescription = 'The ExoPlayer library UI module.' } apply from: '../../publish.gradle' diff --git a/publish.gradle b/publish.gradle index 8ef54cf4e4..693a6856a3 100644 --- a/publish.gradle +++ b/publish.gradle @@ -25,10 +25,10 @@ afterEvaluate { from components.release artifact androidSourcesJar groupId = 'com.google.android.exoplayer' - artifactId = releaseArtifact + artifactId = releaseArtifactId version releaseVersion pom { - name = releaseArtifact + name = releaseArtifactId description = releaseDescription licenses { license { diff --git a/robolectricutils/build.gradle b/robolectricutils/build.gradle index f5a86822b7..9b4e6ad93b 100644 --- a/robolectricutils/build.gradle +++ b/robolectricutils/build.gradle @@ -29,7 +29,7 @@ ext { apply from: '../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-robolectricutils' + releaseArtifactId = 'exoplayer-robolectricutils' releaseDescription = 'Robolectric utils for ExoPlayer.' } apply from: '../publish.gradle' diff --git a/testutils/build.gradle b/testutils/build.gradle index 67dde583d3..11a8d1b76e 100644 --- a/testutils/build.gradle +++ b/testutils/build.gradle @@ -35,7 +35,7 @@ ext { apply from: '../javadoc_library.gradle' ext { - releaseArtifact = 'exoplayer-testutils' + releaseArtifactId = 'exoplayer-testutils' releaseDescription = 'Test utils for ExoPlayer.' } apply from: '../publish.gradle' From 2ef2206041a17ed55d345a1aa322956d4e2bc691 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 18 Oct 2021 23:38:02 +0100 Subject: [PATCH 351/441] Move text classes that don't need to live in common. PiperOrigin-RevId: 404079772 --- .../com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java | 0 .../main/java/com/google/android/exoplayer2/text/Subtitle.java | 0 .../java/com/google/android/exoplayer2/text/SubtitleDecoder.java | 0 .../google/android/exoplayer2/text/SubtitleDecoderException.java | 0 .../com/google/android/exoplayer2/text/SubtitleInputBuffer.java | 0 .../com/google/android/exoplayer2/text/SubtitleOutputBuffer.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/Subtitle.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SimpleSubtitleDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/Subtitle.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/Subtitle.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/Subtitle.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/Subtitle.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleDecoderException.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleInputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java From b3a1dcfee9e8687c13539f757b81dc217b8494fd Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 19 Oct 2021 14:04:12 +0100 Subject: [PATCH 352/441] Fix remaining releaseArtifactId renames PiperOrigin-RevId: 404236349 --- extensions/media2/build.gradle | 2 +- extensions/mediasession/build.gradle | 2 +- library/all/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/media2/build.gradle b/extensions/media2/build.gradle index da70210bd6..dc10ef6170 100644 --- a/extensions/media2/build.gradle +++ b/extensions/media2/build.gradle @@ -35,7 +35,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-media2' + releaseArtifactId = 'extension-media2' releaseDescription = 'Media2 extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/extensions/mediasession/build.gradle b/extensions/mediasession/build.gradle index 9b812911ab..056526e8a1 100644 --- a/extensions/mediasession/build.gradle +++ b/extensions/mediasession/build.gradle @@ -26,7 +26,7 @@ ext { apply from: '../../javadoc_library.gradle' ext { - releaseArtifact = 'extension-mediasession' + releaseArtifactId = 'extension-mediasession' releaseDescription = 'Media session extension for ExoPlayer.' } apply from: '../../publish.gradle' diff --git a/library/all/build.gradle b/library/all/build.gradle index 56414c14bf..4ec8373e2f 100644 --- a/library/all/build.gradle +++ b/library/all/build.gradle @@ -24,7 +24,7 @@ dependencies { } ext { - releaseArtifact = 'exoplayer' + releaseArtifactId = 'exoplayer' releaseDescription = 'The ExoPlayer library (all modules).' } apply from: '../../publish.gradle' From 1f63aea585dfe3de7497d413ce9bf100d85f4df4 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 19 Oct 2021 14:07:05 +0100 Subject: [PATCH 353/441] Upgrade test to new version of cronet-embedded PiperOrigin-RevId: 404236978 --- extensions/cronet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/cronet/build.gradle b/extensions/cronet/build.gradle index b79a5d2fbb..5b806f6f38 100644 --- a/extensions/cronet/build.gradle +++ b/extensions/cronet/build.gradle @@ -31,7 +31,7 @@ dependencies { androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion // Instrumentation tests assume that an app-packaged version of cronet is // available. - androidTestImplementation 'org.chromium.net:cronet-embedded:76.3809.111' + androidTestImplementation 'org.chromium.net:cronet-embedded:94.4606.61' androidTestImplementation project(modulePrefix + 'testutils') testImplementation project(modulePrefix + 'testutils') testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion From ea2013948ac165abde90ddda7583f1813b8c30f8 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 19 Oct 2021 17:06:17 +0100 Subject: [PATCH 354/441] Finalize text package PiperOrigin-RevId: 404277755 --- .../main/java/com/google/android/exoplayer2/text/CueDecoder.java | 0 .../main/java/com/google/android/exoplayer2/text/CueEncoder.java | 0 .../com/google/android/exoplayer2/text/CueSerializationTest.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/CueDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/text/CueEncoder.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/text/CueSerializationTest.java From 0555ae0a92d544de710dc3ad7aea284a6a32c8ef Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 19 Oct 2021 19:20:57 +0100 Subject: [PATCH 355/441] Move translated strings for download notification to lib-exoplayer PiperOrigin-RevId: 404316538 --- library/core/build.gradle | 1 + .../android/exoplayer2/offline/Download.java | 8 ++--- .../exoplayer2/offline/DownloadRequest.java | 2 +- .../ui/DownloadNotificationHelper.java | 1 + .../core/src/main/res/values-af/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-am/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ar/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-az/strings.xml | 26 ++++++++++++++ .../src/main/res/values-b+sr+Latn/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-be/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-bg/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-bn/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-bs/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ca/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-cs/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-da/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-de/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-el/strings.xml | 26 ++++++++++++++ .../src/main/res/values-en-rAU/strings.xml | 26 ++++++++++++++ .../src/main/res/values-en-rGB/strings.xml | 26 ++++++++++++++ .../src/main/res/values-en-rIN/strings.xml | 26 ++++++++++++++ .../src/main/res/values-es-rUS/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-es/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-et/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-eu/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-fa/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-fi/strings.xml | 26 ++++++++++++++ .../src/main/res/values-fr-rCA/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-fr/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-gl/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-gu/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-hi/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-hr/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-hu/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-hy/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-in/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-is/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-it/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-iw/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ja/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ka/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-kk/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-km/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-kn/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ko/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ky/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-lo/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-lt/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-lv/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-mk/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ml/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-mn/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-mr/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ms/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-my/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-nb/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ne/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-nl/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-pa/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-pl/strings.xml | 26 ++++++++++++++ .../src/main/res/values-pt-rPT/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-pt/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ro/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ru/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-si/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sk/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sl/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sq/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sr/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sv/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-sw/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ta/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-te/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-th/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-tl/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-tr/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-uk/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-ur/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-uz/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-vi/strings.xml | 26 ++++++++++++++ .../src/main/res/values-zh-rCN/strings.xml | 26 ++++++++++++++ .../src/main/res/values-zh-rHK/strings.xml | 26 ++++++++++++++ .../src/main/res/values-zh-rTW/strings.xml | 26 ++++++++++++++ .../core/src/main/res/values-zu/strings.xml | 26 ++++++++++++++ library/core/src/main/res/values/strings.xml | 35 +++++++++++++++++++ library/ui/src/main/res/values-af/strings.xml | 9 ----- library/ui/src/main/res/values-am/strings.xml | 9 ----- library/ui/src/main/res/values-ar/strings.xml | 9 ----- library/ui/src/main/res/values-az/strings.xml | 9 ----- .../src/main/res/values-b+sr+Latn/strings.xml | 9 ----- library/ui/src/main/res/values-be/strings.xml | 9 ----- library/ui/src/main/res/values-bg/strings.xml | 9 ----- library/ui/src/main/res/values-bn/strings.xml | 9 ----- library/ui/src/main/res/values-bs/strings.xml | 9 ----- library/ui/src/main/res/values-ca/strings.xml | 9 ----- library/ui/src/main/res/values-cs/strings.xml | 9 ----- library/ui/src/main/res/values-da/strings.xml | 9 ----- library/ui/src/main/res/values-de/strings.xml | 9 ----- library/ui/src/main/res/values-el/strings.xml | 9 ----- .../ui/src/main/res/values-en-rAU/strings.xml | 9 ----- .../ui/src/main/res/values-en-rGB/strings.xml | 9 ----- .../ui/src/main/res/values-en-rIN/strings.xml | 9 ----- .../ui/src/main/res/values-es-rUS/strings.xml | 9 ----- library/ui/src/main/res/values-es/strings.xml | 9 ----- library/ui/src/main/res/values-et/strings.xml | 9 ----- library/ui/src/main/res/values-eu/strings.xml | 9 ----- library/ui/src/main/res/values-fa/strings.xml | 9 ----- library/ui/src/main/res/values-fi/strings.xml | 9 ----- .../ui/src/main/res/values-fr-rCA/strings.xml | 9 ----- library/ui/src/main/res/values-fr/strings.xml | 9 ----- library/ui/src/main/res/values-gl/strings.xml | 9 ----- library/ui/src/main/res/values-gu/strings.xml | 9 ----- library/ui/src/main/res/values-hi/strings.xml | 9 ----- library/ui/src/main/res/values-hr/strings.xml | 9 ----- library/ui/src/main/res/values-hu/strings.xml | 9 ----- library/ui/src/main/res/values-hy/strings.xml | 9 ----- library/ui/src/main/res/values-in/strings.xml | 9 ----- library/ui/src/main/res/values-is/strings.xml | 9 ----- library/ui/src/main/res/values-it/strings.xml | 9 ----- library/ui/src/main/res/values-iw/strings.xml | 9 ----- library/ui/src/main/res/values-ja/strings.xml | 9 ----- library/ui/src/main/res/values-ka/strings.xml | 9 ----- library/ui/src/main/res/values-kk/strings.xml | 9 ----- library/ui/src/main/res/values-km/strings.xml | 9 ----- library/ui/src/main/res/values-kn/strings.xml | 9 ----- library/ui/src/main/res/values-ko/strings.xml | 9 ----- library/ui/src/main/res/values-ky/strings.xml | 9 ----- library/ui/src/main/res/values-lo/strings.xml | 9 ----- library/ui/src/main/res/values-lt/strings.xml | 9 ----- library/ui/src/main/res/values-lv/strings.xml | 9 ----- library/ui/src/main/res/values-mk/strings.xml | 9 ----- library/ui/src/main/res/values-ml/strings.xml | 9 ----- library/ui/src/main/res/values-mn/strings.xml | 9 ----- library/ui/src/main/res/values-mr/strings.xml | 9 ----- library/ui/src/main/res/values-ms/strings.xml | 9 ----- library/ui/src/main/res/values-my/strings.xml | 9 ----- library/ui/src/main/res/values-nb/strings.xml | 9 ----- library/ui/src/main/res/values-ne/strings.xml | 9 ----- library/ui/src/main/res/values-nl/strings.xml | 9 ----- library/ui/src/main/res/values-pa/strings.xml | 9 ----- library/ui/src/main/res/values-pl/strings.xml | 9 ----- .../ui/src/main/res/values-pt-rPT/strings.xml | 9 ----- library/ui/src/main/res/values-pt/strings.xml | 9 ----- library/ui/src/main/res/values-ro/strings.xml | 9 ----- library/ui/src/main/res/values-ru/strings.xml | 9 ----- library/ui/src/main/res/values-si/strings.xml | 9 ----- library/ui/src/main/res/values-sk/strings.xml | 9 ----- library/ui/src/main/res/values-sl/strings.xml | 9 ----- library/ui/src/main/res/values-sq/strings.xml | 9 ----- library/ui/src/main/res/values-sr/strings.xml | 9 ----- library/ui/src/main/res/values-sv/strings.xml | 9 ----- library/ui/src/main/res/values-sw/strings.xml | 9 ----- library/ui/src/main/res/values-ta/strings.xml | 9 ----- library/ui/src/main/res/values-te/strings.xml | 9 ----- library/ui/src/main/res/values-th/strings.xml | 9 ----- library/ui/src/main/res/values-tl/strings.xml | 9 ----- library/ui/src/main/res/values-tr/strings.xml | 9 ----- library/ui/src/main/res/values-uk/strings.xml | 9 ----- library/ui/src/main/res/values-ur/strings.xml | 9 ----- library/ui/src/main/res/values-uz/strings.xml | 9 ----- library/ui/src/main/res/values-vi/strings.xml | 9 ----- .../ui/src/main/res/values-zh-rCN/strings.xml | 9 ----- .../ui/src/main/res/values-zh-rHK/strings.xml | 9 ----- .../ui/src/main/res/values-zh-rTW/strings.xml | 9 ----- library/ui/src/main/res/values-zu/strings.xml | 9 ----- library/ui/src/main/res/values/strings.xml | 19 ---------- 166 files changed, 2122 insertions(+), 744 deletions(-) rename library/{ui => core}/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java (99%) create mode 100644 library/core/src/main/res/values-af/strings.xml create mode 100644 library/core/src/main/res/values-am/strings.xml create mode 100644 library/core/src/main/res/values-ar/strings.xml create mode 100644 library/core/src/main/res/values-az/strings.xml create mode 100644 library/core/src/main/res/values-b+sr+Latn/strings.xml create mode 100644 library/core/src/main/res/values-be/strings.xml create mode 100644 library/core/src/main/res/values-bg/strings.xml create mode 100644 library/core/src/main/res/values-bn/strings.xml create mode 100644 library/core/src/main/res/values-bs/strings.xml create mode 100644 library/core/src/main/res/values-ca/strings.xml create mode 100644 library/core/src/main/res/values-cs/strings.xml create mode 100644 library/core/src/main/res/values-da/strings.xml create mode 100644 library/core/src/main/res/values-de/strings.xml create mode 100644 library/core/src/main/res/values-el/strings.xml create mode 100644 library/core/src/main/res/values-en-rAU/strings.xml create mode 100644 library/core/src/main/res/values-en-rGB/strings.xml create mode 100644 library/core/src/main/res/values-en-rIN/strings.xml create mode 100644 library/core/src/main/res/values-es-rUS/strings.xml create mode 100644 library/core/src/main/res/values-es/strings.xml create mode 100644 library/core/src/main/res/values-et/strings.xml create mode 100644 library/core/src/main/res/values-eu/strings.xml create mode 100644 library/core/src/main/res/values-fa/strings.xml create mode 100644 library/core/src/main/res/values-fi/strings.xml create mode 100644 library/core/src/main/res/values-fr-rCA/strings.xml create mode 100644 library/core/src/main/res/values-fr/strings.xml create mode 100644 library/core/src/main/res/values-gl/strings.xml create mode 100644 library/core/src/main/res/values-gu/strings.xml create mode 100644 library/core/src/main/res/values-hi/strings.xml create mode 100644 library/core/src/main/res/values-hr/strings.xml create mode 100644 library/core/src/main/res/values-hu/strings.xml create mode 100644 library/core/src/main/res/values-hy/strings.xml create mode 100644 library/core/src/main/res/values-in/strings.xml create mode 100644 library/core/src/main/res/values-is/strings.xml create mode 100644 library/core/src/main/res/values-it/strings.xml create mode 100644 library/core/src/main/res/values-iw/strings.xml create mode 100644 library/core/src/main/res/values-ja/strings.xml create mode 100644 library/core/src/main/res/values-ka/strings.xml create mode 100644 library/core/src/main/res/values-kk/strings.xml create mode 100644 library/core/src/main/res/values-km/strings.xml create mode 100644 library/core/src/main/res/values-kn/strings.xml create mode 100644 library/core/src/main/res/values-ko/strings.xml create mode 100644 library/core/src/main/res/values-ky/strings.xml create mode 100644 library/core/src/main/res/values-lo/strings.xml create mode 100644 library/core/src/main/res/values-lt/strings.xml create mode 100644 library/core/src/main/res/values-lv/strings.xml create mode 100644 library/core/src/main/res/values-mk/strings.xml create mode 100644 library/core/src/main/res/values-ml/strings.xml create mode 100644 library/core/src/main/res/values-mn/strings.xml create mode 100644 library/core/src/main/res/values-mr/strings.xml create mode 100644 library/core/src/main/res/values-ms/strings.xml create mode 100644 library/core/src/main/res/values-my/strings.xml create mode 100644 library/core/src/main/res/values-nb/strings.xml create mode 100644 library/core/src/main/res/values-ne/strings.xml create mode 100644 library/core/src/main/res/values-nl/strings.xml create mode 100644 library/core/src/main/res/values-pa/strings.xml create mode 100644 library/core/src/main/res/values-pl/strings.xml create mode 100644 library/core/src/main/res/values-pt-rPT/strings.xml create mode 100644 library/core/src/main/res/values-pt/strings.xml create mode 100644 library/core/src/main/res/values-ro/strings.xml create mode 100644 library/core/src/main/res/values-ru/strings.xml create mode 100644 library/core/src/main/res/values-si/strings.xml create mode 100644 library/core/src/main/res/values-sk/strings.xml create mode 100644 library/core/src/main/res/values-sl/strings.xml create mode 100644 library/core/src/main/res/values-sq/strings.xml create mode 100644 library/core/src/main/res/values-sr/strings.xml create mode 100644 library/core/src/main/res/values-sv/strings.xml create mode 100644 library/core/src/main/res/values-sw/strings.xml create mode 100644 library/core/src/main/res/values-ta/strings.xml create mode 100644 library/core/src/main/res/values-te/strings.xml create mode 100644 library/core/src/main/res/values-th/strings.xml create mode 100644 library/core/src/main/res/values-tl/strings.xml create mode 100644 library/core/src/main/res/values-tr/strings.xml create mode 100644 library/core/src/main/res/values-uk/strings.xml create mode 100644 library/core/src/main/res/values-ur/strings.xml create mode 100644 library/core/src/main/res/values-uz/strings.xml create mode 100644 library/core/src/main/res/values-vi/strings.xml create mode 100644 library/core/src/main/res/values-zh-rCN/strings.xml create mode 100644 library/core/src/main/res/values-zh-rHK/strings.xml create mode 100644 library/core/src/main/res/values-zh-rTW/strings.xml create mode 100644 library/core/src/main/res/values-zu/strings.xml create mode 100644 library/core/src/main/res/values/strings.xml diff --git a/library/core/build.gradle b/library/core/build.gradle index 6b8b86c067..4aa74cc439 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -38,6 +38,7 @@ dependencies { api project(modulePrefix + 'library-common') api project(modulePrefix + 'library-extractor') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion + implementation 'androidx.core:core:' + androidxCoreVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java index da46120b29..35cc68f6f4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/Download.java @@ -44,13 +44,13 @@ public final class Download { public @interface State {} // Important: These constants are persisted into DownloadIndex. Do not change them. /** - * The download is waiting to be started. A download may be queued because the {@link + * The download is waiting to be started. A download may be queued because the {@code * DownloadManager} * *

                  - *
                • Is {@link DownloadManager#getDownloadsPaused() paused} - *
                • Has {@link DownloadManager#getRequirements() Requirements} that are not met - *
                • Has already started {@link DownloadManager#getMaxParallelDownloads() + *
                • Is {@code DownloadManager#getDownloadsPaused() paused} + *
                • Has {@code DownloadManager#getRequirements() Requirements} that are not met + *
                • Has already started {@code DownloadManager#getMaxParallelDownloads() * maxParallelDownloads} *
                */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java index e6b16f70cc..a9e3bd4e2e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadRequest.java @@ -102,7 +102,7 @@ public final class DownloadRequest implements Parcelable { public final Uri uri; /** * The MIME type of this content. Used as a hint to infer the content's type (DASH, HLS, - * SmoothStreaming). If null, a {@link DownloadService} will infer the content type from the + * SmoothStreaming). If null, a {@code DownloadService} will infer the content type from the * {@link #uri}. */ @Nullable public final String mimeType; diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java similarity index 99% rename from library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java rename to library/core/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java index fa7244b250..9790baf33a 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java @@ -23,6 +23,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.core.R; import com.google.android.exoplayer2.offline.Download; import com.google.android.exoplayer2.scheduler.Requirements; import java.util.List; diff --git a/library/core/src/main/res/values-af/strings.xml b/library/core/src/main/res/values-af/strings.xml new file mode 100644 index 0000000000..c1a57f9246 --- /dev/null +++ b/library/core/src/main/res/values-af/strings.xml @@ -0,0 +1,26 @@ + + + + Aflaai + Aflaaie + Laai tans af + Aflaai is voltooi + Kon nie aflaai nie + Verwyder tans aflaaie + Aflaaie is onderbreek + Aflaaie wag tans vir netwerk + Aflaaie wag tans vir wi-fi + diff --git a/library/core/src/main/res/values-am/strings.xml b/library/core/src/main/res/values-am/strings.xml new file mode 100644 index 0000000000..a16ac064b3 --- /dev/null +++ b/library/core/src/main/res/values-am/strings.xml @@ -0,0 +1,26 @@ + + + + አውርድ + የወረዱ + በማውረድ ላይ + ማውረድ ተጠናቋል + ማውረድ አልተሳካም + ውርዶችን በማስወገድ ላይ + ውርዶች ባሉበት ቆመዋል + አውታረ መረቦችን በመጠባበቅ ላይ ያሉ ውርዶች + WiFiን በመጠባበቅ ላይ ያሉ ውርዶች + diff --git a/library/core/src/main/res/values-ar/strings.xml b/library/core/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000000..6b03d0fdd6 --- /dev/null +++ b/library/core/src/main/res/values-ar/strings.xml @@ -0,0 +1,26 @@ + + + + تنزيل + عمليات التنزيل + جارٍ التنزيل. + اكتمل التنزيل + تعذّر التنزيل + تجري إزالة المحتوى الذي تم تنزيله + تمّ إيقاف عمليات التنزيل مؤقتًا. + عمليات التنزيل في انتظار الاتصال بالشبكة + عمليات التنزيل في انتظار اتصال Wi-Fi. + diff --git a/library/core/src/main/res/values-az/strings.xml b/library/core/src/main/res/values-az/strings.xml new file mode 100644 index 0000000000..1193607b28 --- /dev/null +++ b/library/core/src/main/res/values-az/strings.xml @@ -0,0 +1,26 @@ + + + + Endirin + Endirmələr + Endirilir + Endirmə tamamlandı + Endirmə alınmadı + Endirilənlər silinir + Endirmə durdurulub + Endirmələr şəbəkəni gözləyir + Endirmələr WiFi şəbəkəsini gözləyir + diff --git a/library/core/src/main/res/values-b+sr+Latn/strings.xml b/library/core/src/main/res/values-b+sr+Latn/strings.xml new file mode 100644 index 0000000000..49d5ff23c4 --- /dev/null +++ b/library/core/src/main/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,26 @@ + + + + Preuzmi + Preuzimanja + Preuzima se + Preuzimanje je završeno + Preuzimanje nije uspelo + Preuzimanja se uklanjaju + Preuzimanja su pauzirana + Preuzimanja čekaju na mrežu + Preuzimanja čekaju na WiFi + diff --git a/library/core/src/main/res/values-be/strings.xml b/library/core/src/main/res/values-be/strings.xml new file mode 100644 index 0000000000..54b219e042 --- /dev/null +++ b/library/core/src/main/res/values-be/strings.xml @@ -0,0 +1,26 @@ + + + + Спампаваць + Спампоўкі + Спампоўваецца + Спампоўка завершана + Збой спампоўкі + Выдаленне спамповак + Спампоўкі прыпынены + Спампоўкі чакаюць падключэння да сеткі + Спампоўкі чакаюць падключэння да Wi-Fi + diff --git a/library/core/src/main/res/values-bg/strings.xml b/library/core/src/main/res/values-bg/strings.xml new file mode 100644 index 0000000000..420fa00b97 --- /dev/null +++ b/library/core/src/main/res/values-bg/strings.xml @@ -0,0 +1,26 @@ + + + + Изтегляне + Изтегляния + Изтегля се + Изтеглянето завърши + Изтеглянето не бе успешно + Изтеглянията се премахват + Изтеглянията са на пауза + Изтеглянията чакат връзка с интернет + Изтеглянията чакат връзка с Wi-Fi + diff --git a/library/core/src/main/res/values-bn/strings.xml b/library/core/src/main/res/values-bn/strings.xml new file mode 100644 index 0000000000..c4a6c3686e --- /dev/null +++ b/library/core/src/main/res/values-bn/strings.xml @@ -0,0 +1,26 @@ + + + + ডাউনলোড করুন + ডাউনলোড + ডাউনলোড হচ্ছে + ডাউনলোড হয়ে গেছে + ডাউনলোড করা যায়নি + ডাউনলোড করা কন্টেন্ট সরিয়ে দেওয়া হচ্ছে + ডাউনলোড পজ করা আছে + ডাউনলোড চালু করার জন্য নেটওয়ার্কের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে + ডাউনলোড চালু করার জন্য ওয়াই-ফাইয়ের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে + diff --git a/library/core/src/main/res/values-bs/strings.xml b/library/core/src/main/res/values-bs/strings.xml new file mode 100644 index 0000000000..5ca81f2780 --- /dev/null +++ b/library/core/src/main/res/values-bs/strings.xml @@ -0,0 +1,26 @@ + + + + Preuzmi + Preuzimanja + Preuzimanje + Preuzimanje je završeno + Preuzimanje nije uspjelo + Uklanjanje preuzimanja + Preuzimanja su pauzirana + Preuzimanja čekaju povezivanje s mrežom + Preuzimanja čekaju WiFi + diff --git a/library/core/src/main/res/values-ca/strings.xml b/library/core/src/main/res/values-ca/strings.xml new file mode 100644 index 0000000000..6c80546d7b --- /dev/null +++ b/library/core/src/main/res/values-ca/strings.xml @@ -0,0 +1,26 @@ + + + + Baixa + Baixades + S\'està baixant + S\'ha completat la baixada + No s\'ha pogut baixar + S\'estan suprimint les baixades + Les baixades estan en pausa + Les baixades estan esperant una xarxa + Les baixades estan esperant una Wi‑Fi + diff --git a/library/core/src/main/res/values-cs/strings.xml b/library/core/src/main/res/values-cs/strings.xml new file mode 100644 index 0000000000..f916f076e3 --- /dev/null +++ b/library/core/src/main/res/values-cs/strings.xml @@ -0,0 +1,26 @@ + + + + Stáhnout + Stahování + Stahování + Stahování bylo dokončeno + Stažení se nezdařilo + Odstraňování staženého obsahu + Stahování pozastaveno + Stahování čeká na síť + Stahování čeká na WiFi + diff --git a/library/core/src/main/res/values-da/strings.xml b/library/core/src/main/res/values-da/strings.xml new file mode 100644 index 0000000000..dca960dbd4 --- /dev/null +++ b/library/core/src/main/res/values-da/strings.xml @@ -0,0 +1,26 @@ + + + + Download + Downloads + Downloader + Downloaden er udført + Download mislykkedes + Fjerner downloads + Downloads er sat på pause + Downloads venter på netværksforbindelse + Downloads venter på Wi-Fi-netværk + diff --git a/library/core/src/main/res/values-de/strings.xml b/library/core/src/main/res/values-de/strings.xml new file mode 100644 index 0000000000..92904131e1 --- /dev/null +++ b/library/core/src/main/res/values-de/strings.xml @@ -0,0 +1,26 @@ + + + + Herunterladen + Downloads + Wird heruntergeladen + Download abgeschlossen + Download fehlgeschlagen + Downloads werden entfernt + Downloads pausiert + Auf Netzwerkverbindung wird gewartet + Auf WLAN-Verbindung wird gewartet + diff --git a/library/core/src/main/res/values-el/strings.xml b/library/core/src/main/res/values-el/strings.xml new file mode 100644 index 0000000000..e079173d12 --- /dev/null +++ b/library/core/src/main/res/values-el/strings.xml @@ -0,0 +1,26 @@ + + + + Λήψη + Λήψεις + Λήψη + Η λήψη ολοκληρώθηκε + Η λήψη απέτυχε + Κατάργηση λήψεων + Οι λήψεις τέθηκαν σε παύση. + Οι λήψεις είναι σε αναμονή για δίκτυο. + Οι λήψεις είναι σε αναμονή για Wi-Fi. + diff --git a/library/core/src/main/res/values-en-rAU/strings.xml b/library/core/src/main/res/values-en-rAU/strings.xml new file mode 100644 index 0000000000..27fb6389f8 --- /dev/null +++ b/library/core/src/main/res/values-en-rAU/strings.xml @@ -0,0 +1,26 @@ + + + + Download + Downloads + Downloading + Download completed + Download failed + Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi + diff --git a/library/core/src/main/res/values-en-rGB/strings.xml b/library/core/src/main/res/values-en-rGB/strings.xml new file mode 100644 index 0000000000..27fb6389f8 --- /dev/null +++ b/library/core/src/main/res/values-en-rGB/strings.xml @@ -0,0 +1,26 @@ + + + + Download + Downloads + Downloading + Download completed + Download failed + Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi + diff --git a/library/core/src/main/res/values-en-rIN/strings.xml b/library/core/src/main/res/values-en-rIN/strings.xml new file mode 100644 index 0000000000..27fb6389f8 --- /dev/null +++ b/library/core/src/main/res/values-en-rIN/strings.xml @@ -0,0 +1,26 @@ + + + + Download + Downloads + Downloading + Download completed + Download failed + Removing downloads + Downloads paused + Downloads waiting for network + Downloads waiting for Wi-Fi + diff --git a/library/core/src/main/res/values-es-rUS/strings.xml b/library/core/src/main/res/values-es-rUS/strings.xml new file mode 100644 index 0000000000..45b331f477 --- /dev/null +++ b/library/core/src/main/res/values-es-rUS/strings.xml @@ -0,0 +1,26 @@ + + + + Descargar + Descargas + Descargando + Se completó la descarga + No se pudo descargar + Quitando descargas + Se pausaron las descargas + Esperando red para descargas + Esperando Wi-Fi para descargas + diff --git a/library/core/src/main/res/values-es/strings.xml b/library/core/src/main/res/values-es/strings.xml new file mode 100644 index 0000000000..6d13c5fd21 --- /dev/null +++ b/library/core/src/main/res/values-es/strings.xml @@ -0,0 +1,26 @@ + + + + Descargar + Descargas + Descargando + Descarga de archivos completado + No se ha podido descargar + Quitando descargas + Descargas pausadas + Descargas en espera de red + Descargas en espera de Wi-Fi + diff --git a/library/core/src/main/res/values-et/strings.xml b/library/core/src/main/res/values-et/strings.xml new file mode 100644 index 0000000000..67df50e267 --- /dev/null +++ b/library/core/src/main/res/values-et/strings.xml @@ -0,0 +1,26 @@ + + + + Allalaadimine + Allalaadimised + Allalaadimine + Allalaadimine lõpetati + Allalaadimine ebaõnnestus + Allalaadimiste eemaldamine + Allalaadimised peatati + Allalaadimised on võrgu ootel + Allalaadimised on WiFi-võrgu ootel + diff --git a/library/core/src/main/res/values-eu/strings.xml b/library/core/src/main/res/values-eu/strings.xml new file mode 100644 index 0000000000..e2e0ca7b9e --- /dev/null +++ b/library/core/src/main/res/values-eu/strings.xml @@ -0,0 +1,26 @@ + + + + Deskargak + Deskargak + Deskargatzen + Osatu da deskarga + Ezin izan da deskargatu + Deskargak kentzen + Deskargak pausatuta daude + Deskargak sare mugikorrera konektatzeko zain daude + Deskargak wifira konektatzeko zain daude + diff --git a/library/core/src/main/res/values-fa/strings.xml b/library/core/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000000..ad7b14e934 --- /dev/null +++ b/library/core/src/main/res/values-fa/strings.xml @@ -0,0 +1,26 @@ + + + + بارگیری + بارگیری‌ها + درحال بارگیری + بارگیری کامل شد + بارگیری نشد + حذف بارگیری‌ها + بارگیری‌ها موقتاً متوقف شد + بارگیری‌ها درانتظار شبکه است + بارگیری‌ها در انتظار Wi-Fi است + diff --git a/library/core/src/main/res/values-fi/strings.xml b/library/core/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000000..6fbdf45fac --- /dev/null +++ b/library/core/src/main/res/values-fi/strings.xml @@ -0,0 +1,26 @@ + + + + Lataa + Lataukset + Ladataan + Lataus valmis + Lataus epäonnistui + Poistetaan latauksia + Lataukset keskeytetty + Lataukse odottavat verkkoyhteyttä + Lataukset odottavat Wi-Fi-yhteyttä + diff --git a/library/core/src/main/res/values-fr-rCA/strings.xml b/library/core/src/main/res/values-fr-rCA/strings.xml new file mode 100644 index 0000000000..9610fd2e14 --- /dev/null +++ b/library/core/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,26 @@ + + + + Télécharger + Téléchargements + Téléchargement en cours… + Téléchargement terminé + Échec du téléchargement + Suppression des téléchargements en cours… + Téléchargements interrompus + Téléchargements en attente du réseau + Téléchargements en attente du Wi-Fi + diff --git a/library/core/src/main/res/values-fr/strings.xml b/library/core/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000000..22f0299976 --- /dev/null +++ b/library/core/src/main/res/values-fr/strings.xml @@ -0,0 +1,26 @@ + + + + Télécharger + Téléchargements + Téléchargement… + Téléchargement terminé + Échec du téléchargement + Suppression des téléchargements… + Téléchargements mis en pause + Téléchargements en attente de réseau + Téléchargements en attente de Wi-Fi + diff --git a/library/core/src/main/res/values-gl/strings.xml b/library/core/src/main/res/values-gl/strings.xml new file mode 100644 index 0000000000..6764ddb4d3 --- /dev/null +++ b/library/core/src/main/res/values-gl/strings.xml @@ -0,0 +1,26 @@ + + + + Descargar + Descargas + Descargando + Completouse a descarga + Produciuse un erro na descarga + Quitando descargas + As descargas están en pausa + As descargas están agardando pola rede + As descargas están agardando pola wifi + diff --git a/library/core/src/main/res/values-gu/strings.xml b/library/core/src/main/res/values-gu/strings.xml new file mode 100644 index 0000000000..27821e2299 --- /dev/null +++ b/library/core/src/main/res/values-gu/strings.xml @@ -0,0 +1,26 @@ + + + + ડાઉનલોડ કરો + ડાઉનલોડ + ડાઉનલોડ કરી રહ્યાં છીએ + ડાઉનલોડ પૂર્ણ થયું + ડાઉનલોડ નિષ્ફળ થયું + ડાઉનલોડ કાઢી નાખી રહ્યાં છીએ + ડાઉનલોડ થોભાવ્યા છે + ડાઉનલોડ થવા નેટવર્કની રાહ જોવાઈ રહી છે + ડાઉનલોડ થવા વાઇ-ફાઇની રાહ જોવાઈ રહી છે + diff --git a/library/core/src/main/res/values-hi/strings.xml b/library/core/src/main/res/values-hi/strings.xml new file mode 100644 index 0000000000..d839e3f3fa --- /dev/null +++ b/library/core/src/main/res/values-hi/strings.xml @@ -0,0 +1,26 @@ + + + + डाउनलोड करें + डाउनलोड की गई मीडिया फ़ाइलें + डाउनलोड हो रहा है + डाउनलोड पूरा हुआ + डाउनलोड नहीं हो सका + डाउनलोड की गई फ़ाइलें हटाई जा रही हैं + डाउनलोड रोका गया है + डाउनलोड शुरू करने के लिए, इंटरनेट से कनेक्ट होने का इंतज़ार है + डाउनलोड शुरू करने के लिए, वाई-फ़ाई से कनेक्ट होने का इंतज़ार है + diff --git a/library/core/src/main/res/values-hr/strings.xml b/library/core/src/main/res/values-hr/strings.xml new file mode 100644 index 0000000000..031e629fd8 --- /dev/null +++ b/library/core/src/main/res/values-hr/strings.xml @@ -0,0 +1,26 @@ + + + + Preuzmi + Preuzimanja + Preuzimanje + Preuzimanje je dovršeno + Preuzimanje nije uspjelo + Uklanjanje preuzimanja + Preuzimanja su pauzirana + Preuzimanja čekaju mrežu + Preuzimanja čekaju Wi-Fi + diff --git a/library/core/src/main/res/values-hu/strings.xml b/library/core/src/main/res/values-hu/strings.xml new file mode 100644 index 0000000000..e511a69594 --- /dev/null +++ b/library/core/src/main/res/values-hu/strings.xml @@ -0,0 +1,26 @@ + + + + Letöltés + Letöltések + Letöltés folyamatban + A letöltés befejeződött + Nem sikerült a letöltés + Letöltések törlése folyamatban + Letöltések szüneteltetve + A letöltések hálózatra várakoznak + A letöltések Wi-Fi-re várakoznak + diff --git a/library/core/src/main/res/values-hy/strings.xml b/library/core/src/main/res/values-hy/strings.xml new file mode 100644 index 0000000000..61d61e8704 --- /dev/null +++ b/library/core/src/main/res/values-hy/strings.xml @@ -0,0 +1,26 @@ + + + + Ներբեռնել + Ներբեռնումներ + Ներբեռնում + Ներբեռնումն ավարտվեց + Չհաջողվեց ներբեռնել + Ներբեռնումները հեռացվում են + Ներբեռնումները դադարեցված են + Ցանցի որոնում + Wi-Fi ցանցի որոնում + diff --git a/library/core/src/main/res/values-in/strings.xml b/library/core/src/main/res/values-in/strings.xml new file mode 100644 index 0000000000..ce650eb479 --- /dev/null +++ b/library/core/src/main/res/values-in/strings.xml @@ -0,0 +1,26 @@ + + + + Download + Download + Mendownload + Download selesai + Download gagal + Menghapus download + Download dijeda + Download menunggu konektivitas jaringan + Download menunggu konektivitas Wi-Fi + diff --git a/library/core/src/main/res/values-is/strings.xml b/library/core/src/main/res/values-is/strings.xml new file mode 100644 index 0000000000..713dbc50b8 --- /dev/null +++ b/library/core/src/main/res/values-is/strings.xml @@ -0,0 +1,26 @@ + + + + Sækja + Niðurhal + Sækir + Niðurhali lokið + Niðurhal mistókst + Fjarlægir niðurhal + Niðurhöl í bið + Niðurhöl bíða eftir netkerfi + Niðurhöl bíða eftir WiFi + diff --git a/library/core/src/main/res/values-it/strings.xml b/library/core/src/main/res/values-it/strings.xml new file mode 100644 index 0000000000..709bb8e5b4 --- /dev/null +++ b/library/core/src/main/res/values-it/strings.xml @@ -0,0 +1,26 @@ + + + + Scarica + Download + Download in corso… + Download completato + Download non riuscito + Rimozione dei download… + Download in pausa + Download in attesa di rete + Download in attesa di Wi-Fi + diff --git a/library/core/src/main/res/values-iw/strings.xml b/library/core/src/main/res/values-iw/strings.xml new file mode 100644 index 0000000000..dadb93b016 --- /dev/null +++ b/library/core/src/main/res/values-iw/strings.xml @@ -0,0 +1,26 @@ + + + + הורדה + הורדות + ההורדה מתבצעת + ההורדה הושלמה + ההורדה לא הושלמה + מסיר הורדות + ההורדות הושהו + ההורדות בהמתנה לרשת + ההורדות בהמתנה ל-Wi-Fi + diff --git a/library/core/src/main/res/values-ja/strings.xml b/library/core/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000000..b4df8db16c --- /dev/null +++ b/library/core/src/main/res/values-ja/strings.xml @@ -0,0 +1,26 @@ + + + + ダウンロード + ダウンロード + ダウンロードしています + ダウンロードが完了しました + ダウンロードに失敗しました + ダウンロードを削除しています + ダウンロード一時停止 + ダウンロード停止: ネットワーク接続中 + ダウンロード停止: Wi-Fi 接続中 + diff --git a/library/core/src/main/res/values-ka/strings.xml b/library/core/src/main/res/values-ka/strings.xml new file mode 100644 index 0000000000..34fa93ac36 --- /dev/null +++ b/library/core/src/main/res/values-ka/strings.xml @@ -0,0 +1,26 @@ + + + + ჩამოტვირთვა + ჩამოტვირთვები + მიმდინარეობს ჩამოტვირთვა + ჩამოტვირთვა დასრულდა + ჩამოტვირთვა ვერ მოხერხდა + მიმდინარეობს ჩამოტვირთვების ამოშლა + ჩამოტვირთვები დაპაუზებულია + ჩამოტვირთვები ქსელს ელოდება + ჩამოტვირთვები Wi-Fi-ს ელოდება + diff --git a/library/core/src/main/res/values-kk/strings.xml b/library/core/src/main/res/values-kk/strings.xml new file mode 100644 index 0000000000..a0e7f49af1 --- /dev/null +++ b/library/core/src/main/res/values-kk/strings.xml @@ -0,0 +1,26 @@ + + + + Жүктеп алу + Жүктеп алынғандар + Жүктеп алынуда + Жүктеп алынды + Жүктеп алынбады + Жүктеп алынғандар өшірілуде + Жүктеп алу процестері уақытша тоқтады. + Жүктеп алу үшін желіге қосылу керек. + Жүктеп алу үшін Wi-Fi-ға қосылу керек. + diff --git a/library/core/src/main/res/values-km/strings.xml b/library/core/src/main/res/values-km/strings.xml new file mode 100644 index 0000000000..d284e7b78a --- /dev/null +++ b/library/core/src/main/res/values-km/strings.xml @@ -0,0 +1,26 @@ + + + + ទាញយក + ទាញយក + កំពុង​ទាញ​យក + បាន​បញ្ចប់​ការទាញយក + មិន​អាច​ទាញយក​បាន​ទេ + កំពុង​លុប​ការទាញយក + ការទាញយក​ត្រូវបានផ្អាក + ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់បណ្ដាញ + ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់ Wi-Fi + diff --git a/library/core/src/main/res/values-kn/strings.xml b/library/core/src/main/res/values-kn/strings.xml new file mode 100644 index 0000000000..c311225089 --- /dev/null +++ b/library/core/src/main/res/values-kn/strings.xml @@ -0,0 +1,26 @@ + + + + ಡೌನ್‌ಲೋಡ್‌ + ಡೌನ್‌ಲೋಡ್‌ಗಳು + ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ + ಡೌನ್‌ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ + ಡೌನ್‌ಲೋಡ್‌ ವಿಫಲಗೊಂಡಿದೆ + ಡೌನ್ಲೋಡ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳು ನೆಟ್‌ವರ್ಕ್‌ಗಾಗಿ ಕಾಯುತ್ತಿವೆ + ಡೌನ್‌ಲೋಡ್‌ಗಳು Wi-Fi ಗಾಗಿ ಕಾಯುತ್ತಿವೆ + diff --git a/library/core/src/main/res/values-ko/strings.xml b/library/core/src/main/res/values-ko/strings.xml new file mode 100644 index 0000000000..3bbdd2cb6c --- /dev/null +++ b/library/core/src/main/res/values-ko/strings.xml @@ -0,0 +1,26 @@ + + + + 다운로드 + 다운로드 + 다운로드 중 + 다운로드 완료 + 다운로드 실패 + 다운로드 항목 삭제 중 + 다운로드 일시중지됨 + 다운로드를 위해 네트워크 연결 대기 중 + 다운로드를 위해 Wi-Fi 연결 대기 중 + diff --git a/library/core/src/main/res/values-ky/strings.xml b/library/core/src/main/res/values-ky/strings.xml new file mode 100644 index 0000000000..8cf2921bc3 --- /dev/null +++ b/library/core/src/main/res/values-ky/strings.xml @@ -0,0 +1,26 @@ + + + + Жүктөп алуу + Жүктөлүп алынгандар + Жүктөлүп алынууда + Жүктөп алуу аяктады + Жүктөлүп алынбай калды + Жүктөлүп алынгандар өчүрүлүүдө + Жүктөп алуу тындырылды + Тармакка туташуу күтүлүүдө + WiFi\'га туташуу күтүлүүдө + diff --git a/library/core/src/main/res/values-lo/strings.xml b/library/core/src/main/res/values-lo/strings.xml new file mode 100644 index 0000000000..0b7f314f91 --- /dev/null +++ b/library/core/src/main/res/values-lo/strings.xml @@ -0,0 +1,26 @@ + + + + ດາວໂຫລດ + ດາວໂຫລດ + ກຳລັງດາວໂຫລດ + ດາວໂຫລດສຳເລັດແລ້ວ + ດາວໂຫຼດບໍ່ສຳເລັດ + ກຳລັງລຶບການດາວໂຫລດອອກ + ຢຸດດາວໂຫຼດຊົ່ວຄາວແລ້ວ + ການດາວໂຫຼດກຳລັງລໍຖ້າເຄືອຂ່າຍຢູ່ + ການດາວໂຫຼດກຳລັງລໍຖ້າ WiFi ຢູ່ + diff --git a/library/core/src/main/res/values-lt/strings.xml b/library/core/src/main/res/values-lt/strings.xml new file mode 100644 index 0000000000..afc749c88a --- /dev/null +++ b/library/core/src/main/res/values-lt/strings.xml @@ -0,0 +1,26 @@ + + + + Atsisiųsti + Atsisiuntimai + Atsisiunčiama + Atsisiuntimo procesas baigtas + Nepavyko atsisiųsti + Pašalinami atsisiuntimai + Atsisiuntimai pristabdyti + Norint tęsti atsis., laukiama tinklo + Norint tęsti atsis., laukiama „Wi-Fi“ + diff --git a/library/core/src/main/res/values-lv/strings.xml b/library/core/src/main/res/values-lv/strings.xml new file mode 100644 index 0000000000..1899c273e4 --- /dev/null +++ b/library/core/src/main/res/values-lv/strings.xml @@ -0,0 +1,26 @@ + + + + Lejupielādēt + Lejupielādes + Notiek lejupielāde + Lejupielāde ir pabeigta + Lejupielāde neizdevās + Notiek lejupielāžu noņemšana + Lejupielādes ir pārtrauktas. + Lejupielādes gaida savienojumu ar tīklu. + Lejupielādes gaida savienojumu ar Wi-Fi. + diff --git a/library/core/src/main/res/values-mk/strings.xml b/library/core/src/main/res/values-mk/strings.xml new file mode 100644 index 0000000000..58a1de488a --- /dev/null +++ b/library/core/src/main/res/values-mk/strings.xml @@ -0,0 +1,26 @@ + + + + Преземи + Преземања + Се презема + Преземањето заврши + Неуспешно преземање + Се отстрануваат преземањата + Преземањата се паузирани + Се чека мрежа за преземањата + Се чека WiFi за преземањата + diff --git a/library/core/src/main/res/values-ml/strings.xml b/library/core/src/main/res/values-ml/strings.xml new file mode 100644 index 0000000000..5c75164da8 --- /dev/null +++ b/library/core/src/main/res/values-ml/strings.xml @@ -0,0 +1,26 @@ + + + + ഡൗൺലോഡ് + ഡൗൺലോഡുകൾ + ഡൗൺലോഡ് ചെയ്യുന്നു + ഡൗൺലോഡ് പൂർത്തിയായി + ഡൗൺലോഡ് പരാജയപ്പെട്ടു + ഡൗൺലോഡുകൾ നീക്കം ചെയ്യുന്നു + ഡൗൺലോഡുകൾ താൽക്കാലികമായി നിർത്തി + ഡൗൺലോഡുകൾ നെറ്റ്‌വർക്കിന് കാത്തിരിക്കുന്നു + ഡൗൺലോഡുകൾ വൈഫൈയ്ക്കായി കാത്തിരിക്കുന്നു + diff --git a/library/core/src/main/res/values-mn/strings.xml b/library/core/src/main/res/values-mn/strings.xml new file mode 100644 index 0000000000..6e7aac5dc9 --- /dev/null +++ b/library/core/src/main/res/values-mn/strings.xml @@ -0,0 +1,26 @@ + + + + Татах + Татaлт + Татаж байна + Татаж дууссан + Татаж чадсангүй + Татаж авсан файлыг хасаж байна + Таталтуудыг түр зогсоосон + Таталтууд сүлжээг хүлээж байна + Таталтууд Wi-Fi-г хүлээж байна + diff --git a/library/core/src/main/res/values-mr/strings.xml b/library/core/src/main/res/values-mr/strings.xml new file mode 100644 index 0000000000..0d98194d6a --- /dev/null +++ b/library/core/src/main/res/values-mr/strings.xml @@ -0,0 +1,26 @@ + + + + डाउनलोड करा + डाउनलोड + डाउनलोड होत आहे + डाउनलोड पूर्ण झाले + डाउनलोड अयशस्वी झाले + डाउनलोड काढून टाकत आहे + डाउनलोड थांबवले + डाउनलोड नेटवर्कची प्रतीक्षा करत आहेत + डाउनलोड वायफाय ची प्रतीक्षा करत आहेत + diff --git a/library/core/src/main/res/values-ms/strings.xml b/library/core/src/main/res/values-ms/strings.xml new file mode 100644 index 0000000000..f4d08d49d3 --- /dev/null +++ b/library/core/src/main/res/values-ms/strings.xml @@ -0,0 +1,26 @@ + + + + Muat turun + Muat turun + Memuat turun + Muat turun selesai + Muat turun gagal + Mengalih keluar muat turun + Muat turun dijeda + Muat turun menunggu rangkaian + Muat turun menunggu Wi-Fi + diff --git a/library/core/src/main/res/values-my/strings.xml b/library/core/src/main/res/values-my/strings.xml new file mode 100644 index 0000000000..9e308724ad --- /dev/null +++ b/library/core/src/main/res/values-my/strings.xml @@ -0,0 +1,26 @@ + + + + ဒေါင်းလုဒ် လုပ်ရန် + ဒေါင်းလုဒ်များ + ဒေါင်းလုဒ်လုပ်နေသည် + ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ + ဒေါင်းလုဒ်လုပ်၍ မရပါ + ဒေါင်းလုဒ်များ ဖယ်ရှားနေသည် + ဒေါင်းလုဒ်များ ခဏရပ်ထားသည် + ဒေါင်းလုဒ်များက အင်တာနက်ရရန် စောင့်နေသည် + ဒေါင်းလုဒ်များက WiFi ရရန် စောင့်နေသည် + diff --git a/library/core/src/main/res/values-nb/strings.xml b/library/core/src/main/res/values-nb/strings.xml new file mode 100644 index 0000000000..5d5b46b28c --- /dev/null +++ b/library/core/src/main/res/values-nb/strings.xml @@ -0,0 +1,26 @@ + + + + Last ned + Nedlastinger + Laster ned + Nedlastingen er fullført + Nedlastingen mislyktes + Fjerner nedlastinger + Nedlastinger er satt på pause + Nedlastinger venter på nettverket + Nedlastinger venter på Wi-FI-tilkobling + diff --git a/library/core/src/main/res/values-ne/strings.xml b/library/core/src/main/res/values-ne/strings.xml new file mode 100644 index 0000000000..deff7e8e41 --- /dev/null +++ b/library/core/src/main/res/values-ne/strings.xml @@ -0,0 +1,26 @@ + + + + डाउनलोड गर्नुहोस् + डाउनलोडहरू + डाउनलोड गरिँदै छ + डाउनलोड सम्पन्न भयो + डाउनलोड गर्न सकिएन + डाउनलोडहरू हटाउँदै + डाउनलोड गर्ने कार्य पज गरियो + इन्टरनेटमा कनेक्ट भएपछि डाउनलोड गरिने छ + WiFi मा कनेक्ट भएपछि डाउनलोड गरिने छ + diff --git a/library/core/src/main/res/values-nl/strings.xml b/library/core/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000000..589296d9a6 --- /dev/null +++ b/library/core/src/main/res/values-nl/strings.xml @@ -0,0 +1,26 @@ + + + + Downloaden + Downloads + Downloaden + Downloaden voltooid + Downloaden mislukt + Downloads verwijderen + Downloads gepauzeerd + Downloads wachten op netwerk + Downloads wachten op wifi + diff --git a/library/core/src/main/res/values-pa/strings.xml b/library/core/src/main/res/values-pa/strings.xml new file mode 100644 index 0000000000..86236f9e03 --- /dev/null +++ b/library/core/src/main/res/values-pa/strings.xml @@ -0,0 +1,26 @@ + + + + ਡਾਊਨਲੋਡ ਕਰੋ + ਡਾਊਨਲੋਡ + ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ + ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ + ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ + ਡਾਊਨਲੋਡ ਕੀਤੀ ਸਮੱਗਰੀ ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ + ਡਾਊਨਲੋਡ ਰੁਕ ਗਏ ਹਨ + ਡਾਊਨਲੋਡਾਂ ਲਈ ਨੈੱਟਵਰਕ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ + ਡਾਊਨਲੋਡਾਂ ਲਈ ਵਾਈ-ਫਾਈ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ + diff --git a/library/core/src/main/res/values-pl/strings.xml b/library/core/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000000..63fc39fac7 --- /dev/null +++ b/library/core/src/main/res/values-pl/strings.xml @@ -0,0 +1,26 @@ + + + + Pobierz + Pobieranie + Pobieram + Zakończono pobieranie + Nie udało się pobrać + Usuwam pobrane + Wstrzymano pobieranie + Pobierane pliki oczekują na sieć + Pobierane pliki oczekują na Wi-Fi + diff --git a/library/core/src/main/res/values-pt-rPT/strings.xml b/library/core/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000000..6c9f639ec9 --- /dev/null +++ b/library/core/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,26 @@ + + + + Transferir + Transferências + A transferir… + Transferência concluída + Falha na transferência + A remover as transferências… + Transferências colocadas em pausa + Transferências a aguardar uma rede + Transferências a aguardar Wi-Fi + diff --git a/library/core/src/main/res/values-pt/strings.xml b/library/core/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000000..c38d90d176 --- /dev/null +++ b/library/core/src/main/res/values-pt/strings.xml @@ -0,0 +1,26 @@ + + + + Fazer o download + Downloads + Fazendo o download + Download concluído + Falha no download + Removendo downloads + Downloads pausados + Downloads aguardando uma conexão de rede + Downloads aguardando uma rede Wi-Fi + diff --git a/library/core/src/main/res/values-ro/strings.xml b/library/core/src/main/res/values-ro/strings.xml new file mode 100644 index 0000000000..a4a7afa1a6 --- /dev/null +++ b/library/core/src/main/res/values-ro/strings.xml @@ -0,0 +1,26 @@ + + + + Descărcați + Descărcări + Se descarcă + Descărcarea a fost finalizată + Descărcarea nu a reușit + Se elimină descărcările + Descărcările au fost întrerupte + Descărcările așteaptă rețeaua + Descărcările așteaptă rețeaua Wi-Fi + diff --git a/library/core/src/main/res/values-ru/strings.xml b/library/core/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000000..b989fd3bc1 --- /dev/null +++ b/library/core/src/main/res/values-ru/strings.xml @@ -0,0 +1,26 @@ + + + + Скачать + Скачивания + Скачивание… + Скачивание завершено + Ошибка скачивания + Удаление скачанных файлов… + Скачивание приостановлено + Ожидание подключения к сети + Ожидание подключения к Wi-Fi + diff --git a/library/core/src/main/res/values-si/strings.xml b/library/core/src/main/res/values-si/strings.xml new file mode 100644 index 0000000000..36b652c2cc --- /dev/null +++ b/library/core/src/main/res/values-si/strings.xml @@ -0,0 +1,26 @@ + + + + බාගන්න + බාගැනීම් + බාගනිමින් + බාගැනීම සම්පූර්ණ කරන ලදී + බාගැනීම අසමත් විය + බාගැනීම් ඉවත් කිරීම + බාගැනීම් විරාම කර ඇත + ජාලය සඳහා බාගැනීම් රැඳී සිටී + WiFi සඳහා බාගැනීම් රැඳී සිටී + diff --git a/library/core/src/main/res/values-sk/strings.xml b/library/core/src/main/res/values-sk/strings.xml new file mode 100644 index 0000000000..fec40af4e2 --- /dev/null +++ b/library/core/src/main/res/values-sk/strings.xml @@ -0,0 +1,26 @@ + + + + Stiahnuť + Stiahnuté + Sťahuje sa + Sťahovanie bolo dokončené + Nepodarilo sa stiahnuť + Odstraňuje sa stiahnutý obsah + Sťahovanie je pozastavené + Sťahovanie čaká na sieť + Sťahovanie čaká na Wi‑Fi + diff --git a/library/core/src/main/res/values-sl/strings.xml b/library/core/src/main/res/values-sl/strings.xml new file mode 100644 index 0000000000..025ba4a0e6 --- /dev/null +++ b/library/core/src/main/res/values-sl/strings.xml @@ -0,0 +1,26 @@ + + + + Prenos + Prenosi + Prenašanje + Prenos je končan + Prenos ni uspel + Odstranjevanje prenosov + Prenosi so začasno zaustavljeni. + Prenosi čakajo na povezavo z omrežjem. + Prenosi čakajo na povezavo Wi-Fi. + diff --git a/library/core/src/main/res/values-sq/strings.xml b/library/core/src/main/res/values-sq/strings.xml new file mode 100644 index 0000000000..836ff91e41 --- /dev/null +++ b/library/core/src/main/res/values-sq/strings.xml @@ -0,0 +1,26 @@ + + + + Shkarko + Shkarkimet + Po shkarkohet + Shkarkimi përfundoi + Shkarkimi dështoi + Shkarkimet po hiqen + Shkarkimet u vendosën në pauzë + Shkarkimet në pritje të rrjetit + Shkarkimet në pritje të WiFi + diff --git a/library/core/src/main/res/values-sr/strings.xml b/library/core/src/main/res/values-sr/strings.xml new file mode 100644 index 0000000000..aad2287353 --- /dev/null +++ b/library/core/src/main/res/values-sr/strings.xml @@ -0,0 +1,26 @@ + + + + Преузми + Преузимања + Преузима се + Преузимање је завршено + Преузимање није успело + Преузимања се уклањају + Преузимања су паузирана + Преузимања чекају на мрежу + Преузимања чекају на WiFi + diff --git a/library/core/src/main/res/values-sv/strings.xml b/library/core/src/main/res/values-sv/strings.xml new file mode 100644 index 0000000000..34ea63ab33 --- /dev/null +++ b/library/core/src/main/res/values-sv/strings.xml @@ -0,0 +1,26 @@ + + + + Ladda ned + Nedladdningar + Laddar ned + Nedladdningen är klar + Nedladdningen misslyckades + Nedladdningar tas bort + Nedladdningar har pausats + Nedladdningar väntar på nätverket + Nedladdningar väntar på wifi + diff --git a/library/core/src/main/res/values-sw/strings.xml b/library/core/src/main/res/values-sw/strings.xml new file mode 100644 index 0000000000..f2ea0ebb2f --- /dev/null +++ b/library/core/src/main/res/values-sw/strings.xml @@ -0,0 +1,26 @@ + + + + Pakua + Vipakuliwa + Inapakua + Imepakuliwa + Imeshindwa kupakua + Inaondoa vipakuliwa + Imesimamisha shughuli ya kupakua + Upakuaji unasubiri mtandao + Upakuaji unasubiri Wi-Fi + diff --git a/library/core/src/main/res/values-ta/strings.xml b/library/core/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000000..b9dd46a955 --- /dev/null +++ b/library/core/src/main/res/values-ta/strings.xml @@ -0,0 +1,26 @@ + + + + பதிவிறக்கும் பட்டன் + பதிவிறக்கங்கள் + பதிவிறக்குகிறது + பதிவிறக்கப்பட்டது + பதிவிறக்க முடியவில்லை + பதிவிறக்கங்கள் அகற்றப்படுகின்றன + பதிவிறக்கங்கள் இடைநிறுத்தப்பட்டன + நெட்வொர்க்கிற்காகக் காத்திருக்கின்றன + Wi-Fiகாகக் காத்திருக்கின்றன + diff --git a/library/core/src/main/res/values-te/strings.xml b/library/core/src/main/res/values-te/strings.xml new file mode 100644 index 0000000000..fe1f48a955 --- /dev/null +++ b/library/core/src/main/res/values-te/strings.xml @@ -0,0 +1,26 @@ + + + + డౌన్‌లోడ్ చేయి + డౌన్‌లోడ్‌లు + డౌన్‌లోడ్ చేస్తోంది + డౌన్‌లోడ్ పూర్తయింది + డౌన్‌లోడ్ విఫలమైంది + డౌన్‌లోడ్‌లను తీసివేస్తోంది + డౌన్‌లోడ్‌లు పాజ్ చేయబడ్డాయి + డౌన్‌లోడ్స్ నెట్‌వర్క్ కోసం చూస్తున్నాయి + డౌన్‌లోడ్‌లు WiFi కోసం చూస్తున్నాయి + diff --git a/library/core/src/main/res/values-th/strings.xml b/library/core/src/main/res/values-th/strings.xml new file mode 100644 index 0000000000..c888cd3b72 --- /dev/null +++ b/library/core/src/main/res/values-th/strings.xml @@ -0,0 +1,26 @@ + + + + ดาวน์โหลด + ดาวน์โหลด + กำลังดาวน์โหลด + การดาวน์โหลดเสร็จสมบูรณ์ + การดาวน์โหลดล้มเหลว + กำลังนำรายการที่ดาวน์โหลดออก + การดาวน์โหลดหยุดชั่วคราว + กำลังรอเครือข่ายเพื่อดาวน์โหลด + กำลังรอ Wi-Fi เพื่อดาวน์โหลด + diff --git a/library/core/src/main/res/values-tl/strings.xml b/library/core/src/main/res/values-tl/strings.xml new file mode 100644 index 0000000000..3b04a687a5 --- /dev/null +++ b/library/core/src/main/res/values-tl/strings.xml @@ -0,0 +1,26 @@ + + + + I-download + Mga Download + Nagda-download + Tapos na ang pag-download + Hindi na-download + Inaalis ang mga na-download + Na-pause ang mga pag-download + Naghihintay ng network ang pag-download + Naghihintay ng WiFi ang mga pag-download + diff --git a/library/core/src/main/res/values-tr/strings.xml b/library/core/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000000..2b9252ec7c --- /dev/null +++ b/library/core/src/main/res/values-tr/strings.xml @@ -0,0 +1,26 @@ + + + + İndir + İndirilenler + İndiriliyor + İndirme işlemi tamamlandı + İndirilemedi + İndirilenler kaldırılıyor + İndirmeler duraklatıldı + İndirmeler için ağ bekleniyor + İndirmeler için kablosuz ağ bekleniyor + diff --git a/library/core/src/main/res/values-uk/strings.xml b/library/core/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000000..7fbb8955de --- /dev/null +++ b/library/core/src/main/res/values-uk/strings.xml @@ -0,0 +1,26 @@ + + + + Завантажити + Завантаження + Завантажується + Завантаження завершено + Не вдалося завантажити + Завантаження видаляються + Завантаження призупинено + Очікується підключення до мережі + Очікується підключення до Wi-Fi + diff --git a/library/core/src/main/res/values-ur/strings.xml b/library/core/src/main/res/values-ur/strings.xml new file mode 100644 index 0000000000..966f406273 --- /dev/null +++ b/library/core/src/main/res/values-ur/strings.xml @@ -0,0 +1,26 @@ + + + + ڈاؤن لوڈ کریں + ڈاؤن لوڈز + ڈاؤن لوڈ ہو رہا ہے + ڈاؤن لوڈ مکمل ہو گیا + ڈاؤن لوڈ ناکام ہو گیا + ڈاؤن لوڈز کو ہٹایا جا رہا ہے + ڈاؤن لوڈز موقوف ہو گئے + ڈاؤن لوڈز نیٹ ورک کے منتظر ہیں + ڈاؤن لوڈز WiFi کے منتظر ہیں + diff --git a/library/core/src/main/res/values-uz/strings.xml b/library/core/src/main/res/values-uz/strings.xml new file mode 100644 index 0000000000..85aaf73a8c --- /dev/null +++ b/library/core/src/main/res/values-uz/strings.xml @@ -0,0 +1,26 @@ + + + + Yuklab olish + Yuklanmalar + Yuklab olinmoqda + Yuklab olindi + Yuklab olinmadi + Yuklanmalar olib tashlanmoqda + Yuklanmalar pauzada + Yuklanmalar internetga ulanishni kutmoqda + Yuklanmalar Wi-Fi aloqasini kutmoqda + diff --git a/library/core/src/main/res/values-vi/strings.xml b/library/core/src/main/res/values-vi/strings.xml new file mode 100644 index 0000000000..1e97ed5e5d --- /dev/null +++ b/library/core/src/main/res/values-vi/strings.xml @@ -0,0 +1,26 @@ + + + + Tải xuống + Tài nguyên đã tải xuống + Đang tải xuống + Đã hoàn tất tải xuống + Không tải xuống được + Đang xóa các mục đã tải xuống + Đã tạm dừng tải xuống + Đang chờ có mạng để tải xuống + Đang chờ có Wi-Fi để tải xuống + diff --git a/library/core/src/main/res/values-zh-rCN/strings.xml b/library/core/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000..1d24d8cab3 --- /dev/null +++ b/library/core/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,26 @@ + + + + 下载 + 下载内容 + 正在下载 + 下载完毕 + 下载失败 + 正在移除下载内容 + 下载已暂停 + 正在等待连接到网络以进行下载 + 正在等待连接到 WLAN 网络以进行下载 + diff --git a/library/core/src/main/res/values-zh-rHK/strings.xml b/library/core/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 0000000000..1b4279329f --- /dev/null +++ b/library/core/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,26 @@ + + + + 下載 + 下載內容 + 正在下載 + 下載完畢 + 下載失敗 + 正在移除下載內容 + 已暫停下載 + 正在等待網絡連線以下載檔案 + 正在等待 Wi-Fi 連線以下載檔案 + diff --git a/library/core/src/main/res/values-zh-rTW/strings.xml b/library/core/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000..f696d26abf --- /dev/null +++ b/library/core/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,26 @@ + + + + 下載 + 下載 + 下載中 + 下載完成 + 無法下載 + 正在移除下載內容 + 已暫停下載 + 系統會等到連上網路後再開始下載 + 系統會等到連上 Wi-Fi 後再開始下載 + diff --git a/library/core/src/main/res/values-zu/strings.xml b/library/core/src/main/res/values-zu/strings.xml new file mode 100644 index 0000000000..f1d3047458 --- /dev/null +++ b/library/core/src/main/res/values-zu/strings.xml @@ -0,0 +1,26 @@ + + + + Landa + Ukulandwa + Iyalanda + Ukulanda kuqedile + Ukulanda kuhlulekile + Kususwa okulandiwe + Okulandwayo kumiswe isikhashana + Ukulanda kulinde inethiwekhi + Ukulanda kulinde i-WiFi + diff --git a/library/core/src/main/res/values/strings.xml b/library/core/src/main/res/values/strings.xml new file mode 100644 index 0000000000..c7c9b2118e --- /dev/null +++ b/library/core/src/main/res/values/strings.xml @@ -0,0 +1,35 @@ + + + + + Download + + Downloads + + Downloading + + Download completed + + Download failed + + Removing downloads + + Downloads paused + + Downloads waiting for network + + Downloads waiting for WiFi + diff --git a/library/ui/src/main/res/values-af/strings.xml b/library/ui/src/main/res/values-af/strings.xml index a9f2a33964..17b324a53e 100644 --- a/library/ui/src/main/res/values-af/strings.xml +++ b/library/ui/src/main/res/values-af/strings.xml @@ -47,15 +47,6 @@ Aktiveer onderskrifte Spoed Normaal - Aflaai - Aflaaie - Laai tans af - Aflaai is voltooi - Kon nie aflaai nie - Verwyder tans aflaaie - Aflaaie is onderbreek - Aflaaie wag tans vir netwerk - Aflaaie wag tans vir wi-fi Video Oudio Teks diff --git a/library/ui/src/main/res/values-am/strings.xml b/library/ui/src/main/res/values-am/strings.xml index 8b3b27f71b..ee748779f6 100644 --- a/library/ui/src/main/res/values-am/strings.xml +++ b/library/ui/src/main/res/values-am/strings.xml @@ -47,15 +47,6 @@ የግርጌ ጽሑፎችን አንቃ ፍጥነት መደበኛ - አውርድ - የወረዱ - በማውረድ ላይ - ማውረድ ተጠናቋል - ማውረድ አልተሳካም - ውርዶችን በማስወገድ ላይ - ውርዶች ባሉበት ቆመዋል - አውታረ መረቦችን በመጠባበቅ ላይ ያሉ ውርዶች - WiFiን በመጠባበቅ ላይ ያሉ ውርዶች ቪዲዮ ኦዲዮ ጽሑፍ diff --git a/library/ui/src/main/res/values-ar/strings.xml b/library/ui/src/main/res/values-ar/strings.xml index cc59c357d4..0674a817fd 100644 --- a/library/ui/src/main/res/values-ar/strings.xml +++ b/library/ui/src/main/res/values-ar/strings.xml @@ -55,15 +55,6 @@ تفعيل الترجمة السرعة عادية - تنزيل - عمليات التنزيل - جارٍ التنزيل. - اكتمل التنزيل - تعذّر التنزيل - تجري إزالة المحتوى الذي تم تنزيله - تمّ إيقاف عمليات التنزيل مؤقتًا. - عمليات التنزيل في انتظار الاتصال بالشبكة - عمليات التنزيل في انتظار اتصال Wi-Fi. فيديو صوت نص diff --git a/library/ui/src/main/res/values-az/strings.xml b/library/ui/src/main/res/values-az/strings.xml index 3a522a8340..a5c778230f 100644 --- a/library/ui/src/main/res/values-az/strings.xml +++ b/library/ui/src/main/res/values-az/strings.xml @@ -47,15 +47,6 @@ Subtitrləri aktiv edin Sürət Normal - Endirin - Endirmələr - Endirilir - Endirmə tamamlandı - Endirmə alınmadı - Endirilənlər silinir - Endirmə durdurulub - Endirmələr şəbəkəni gözləyir - Endirmələr WiFi şəbəkəsini gözləyir Video Audio Mətn diff --git a/library/ui/src/main/res/values-b+sr+Latn/strings.xml b/library/ui/src/main/res/values-b+sr+Latn/strings.xml index b8f81f233f..84862309a4 100644 --- a/library/ui/src/main/res/values-b+sr+Latn/strings.xml +++ b/library/ui/src/main/res/values-b+sr+Latn/strings.xml @@ -49,15 +49,6 @@ Omogući titlove Brzina Uobičajena - Preuzmi - Preuzimanja - Preuzima se - Preuzimanje je završeno - Preuzimanje nije uspelo - Preuzimanja se uklanjaju - Preuzimanja su pauzirana - Preuzimanja čekaju na mrežu - Preuzimanja čekaju na WiFi Video Audio Tekst diff --git a/library/ui/src/main/res/values-be/strings.xml b/library/ui/src/main/res/values-be/strings.xml index d78f354d48..61e530aec3 100644 --- a/library/ui/src/main/res/values-be/strings.xml +++ b/library/ui/src/main/res/values-be/strings.xml @@ -51,15 +51,6 @@ Уключыць субцітры Хуткасць Звычайная - Спампаваць - Спампоўкі - Спампоўваецца - Спампоўка завершана - Збой спампоўкі - Выдаленне спамповак - Спампоўкі прыпынены - Спампоўкі чакаюць падключэння да сеткі - Спампоўкі чакаюць падключэння да Wi-Fi Відэа Аўдыя Тэкст diff --git a/library/ui/src/main/res/values-bg/strings.xml b/library/ui/src/main/res/values-bg/strings.xml index 41dbe5098a..79eb9aa9f9 100644 --- a/library/ui/src/main/res/values-bg/strings.xml +++ b/library/ui/src/main/res/values-bg/strings.xml @@ -47,15 +47,6 @@ Активиране на субтитрите Скорост Нормално - Изтегляне - Изтегляния - Изтегля се - Изтеглянето завърши - Изтеглянето не бе успешно - Изтеглянията се премахват - Изтеглянията са на пауза - Изтеглянията чакат връзка с интернет - Изтеглянията чакат връзка с Wi-Fi Видеозапис Аудиозапис Текст diff --git a/library/ui/src/main/res/values-bn/strings.xml b/library/ui/src/main/res/values-bn/strings.xml index ad7125a456..f5bb60110b 100644 --- a/library/ui/src/main/res/values-bn/strings.xml +++ b/library/ui/src/main/res/values-bn/strings.xml @@ -47,15 +47,6 @@ সাবটাইটেল চালু করুন স্পিড সাধারণ - ডাউনলোড করুন - ডাউনলোড - ডাউনলোড হচ্ছে - ডাউনলোড হয়ে গেছে - ডাউনলোড করা যায়নি - ডাউনলোড করা কন্টেন্ট সরিয়ে দেওয়া হচ্ছে - ডাউনলোড পজ করা আছে - ডাউনলোড চালু করার জন্য নেটওয়ার্কের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে - ডাউনলোড চালু করার জন্য ওয়াই-ফাইয়ের সাথে কানেক্ট হওয়ার অপেক্ষা করা হচ্ছে ভিডিও অডিও টেক্সট diff --git a/library/ui/src/main/res/values-bs/strings.xml b/library/ui/src/main/res/values-bs/strings.xml index 375096ee94..eba7f1aa87 100644 --- a/library/ui/src/main/res/values-bs/strings.xml +++ b/library/ui/src/main/res/values-bs/strings.xml @@ -49,15 +49,6 @@ Omogućavanje titlova Brzina Normalno - Preuzmi - Preuzimanja - Preuzimanje - Preuzimanje je završeno - Preuzimanje nije uspjelo - Uklanjanje preuzimanja - Preuzimanja su pauzirana - Preuzimanja čekaju povezivanje s mrežom - Preuzimanja čekaju WiFi Videozapis Zvuk Tekst diff --git a/library/ui/src/main/res/values-ca/strings.xml b/library/ui/src/main/res/values-ca/strings.xml index c6dcdb2c3f..5e045349a3 100644 --- a/library/ui/src/main/res/values-ca/strings.xml +++ b/library/ui/src/main/res/values-ca/strings.xml @@ -47,15 +47,6 @@ Activa els subtítols Velocitat Normal - Baixa - Baixades - S\'està baixant - S\'ha completat la baixada - No s\'ha pogut baixar - S\'estan suprimint les baixades - Les baixades estan en pausa - Les baixades estan esperant una xarxa - Les baixades estan esperant una Wi‑Fi Vídeo Àudio Text diff --git a/library/ui/src/main/res/values-cs/strings.xml b/library/ui/src/main/res/values-cs/strings.xml index ad401cb20d..a8e57eeb13 100644 --- a/library/ui/src/main/res/values-cs/strings.xml +++ b/library/ui/src/main/res/values-cs/strings.xml @@ -51,15 +51,6 @@ Zapnout titulky Rychlost Normální - Stáhnout - Stahování - Stahování - Stahování bylo dokončeno - Stažení se nezdařilo - Odstraňování staženého obsahu - Stahování pozastaveno - Stahování čeká na síť - Stahování čeká na WiFi Videa Zvuk Text diff --git a/library/ui/src/main/res/values-da/strings.xml b/library/ui/src/main/res/values-da/strings.xml index 28fd9d82d0..f0e7214b97 100644 --- a/library/ui/src/main/res/values-da/strings.xml +++ b/library/ui/src/main/res/values-da/strings.xml @@ -47,15 +47,6 @@ Aktivér undertekster Hastighed Normal - Download - Downloads - Downloader - Downloaden er udført - Download mislykkedes - Fjerner downloads - Downloads er sat på pause - Downloads venter på netværksforbindelse - Downloads venter på Wi-Fi-netværk Video Lyd Undertekst diff --git a/library/ui/src/main/res/values-de/strings.xml b/library/ui/src/main/res/values-de/strings.xml index 16b186cc33..42b74bbab9 100644 --- a/library/ui/src/main/res/values-de/strings.xml +++ b/library/ui/src/main/res/values-de/strings.xml @@ -47,15 +47,6 @@ Untertitel aktivieren Geschwindigkeit Normal - Herunterladen - Downloads - Wird heruntergeladen - Download abgeschlossen - Download fehlgeschlagen - Downloads werden entfernt - Downloads pausiert - Auf Netzwerkverbindung wird gewartet - Auf WLAN-Verbindung wird gewartet Video Audio Text diff --git a/library/ui/src/main/res/values-el/strings.xml b/library/ui/src/main/res/values-el/strings.xml index 4ad8c12dac..43037e7ce4 100644 --- a/library/ui/src/main/res/values-el/strings.xml +++ b/library/ui/src/main/res/values-el/strings.xml @@ -47,15 +47,6 @@ Ενεργοποίηση υπότιτλων Ταχύτητα Κανονική - Λήψη - Λήψεις - Λήψη - Η λήψη ολοκληρώθηκε - Η λήψη απέτυχε - Κατάργηση λήψεων - Οι λήψεις τέθηκαν σε παύση. - Οι λήψεις είναι σε αναμονή για δίκτυο. - Οι λήψεις είναι σε αναμονή για Wi-Fi. Βίντεο Ήχος Κείμενο diff --git a/library/ui/src/main/res/values-en-rAU/strings.xml b/library/ui/src/main/res/values-en-rAU/strings.xml index dd8348dd78..4a33eb5ba7 100644 --- a/library/ui/src/main/res/values-en-rAU/strings.xml +++ b/library/ui/src/main/res/values-en-rAU/strings.xml @@ -47,15 +47,6 @@ Enable subtitles Speed Normal - Download - Downloads - Downloading - Download completed - Download failed - Removing downloads - Downloads paused - Downloads waiting for network - Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-en-rGB/strings.xml b/library/ui/src/main/res/values-en-rGB/strings.xml index dd8348dd78..4a33eb5ba7 100644 --- a/library/ui/src/main/res/values-en-rGB/strings.xml +++ b/library/ui/src/main/res/values-en-rGB/strings.xml @@ -47,15 +47,6 @@ Enable subtitles Speed Normal - Download - Downloads - Downloading - Download completed - Download failed - Removing downloads - Downloads paused - Downloads waiting for network - Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-en-rIN/strings.xml b/library/ui/src/main/res/values-en-rIN/strings.xml index dd8348dd78..4a33eb5ba7 100644 --- a/library/ui/src/main/res/values-en-rIN/strings.xml +++ b/library/ui/src/main/res/values-en-rIN/strings.xml @@ -47,15 +47,6 @@ Enable subtitles Speed Normal - Download - Downloads - Downloading - Download completed - Download failed - Removing downloads - Downloads paused - Downloads waiting for network - Downloads waiting for Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-es-rUS/strings.xml b/library/ui/src/main/res/values-es-rUS/strings.xml index 50f88383f1..b4c770bd66 100644 --- a/library/ui/src/main/res/values-es-rUS/strings.xml +++ b/library/ui/src/main/res/values-es-rUS/strings.xml @@ -47,15 +47,6 @@ Habilitar subtítulos Velocidad Normal - Descargar - Descargas - Descargando - Se completó la descarga - No se pudo descargar - Quitando descargas - Se pausaron las descargas - Esperando red para descargas - Esperando Wi-Fi para descargas Video Audio Texto diff --git a/library/ui/src/main/res/values-es/strings.xml b/library/ui/src/main/res/values-es/strings.xml index 854d2c4f00..e50a26c941 100644 --- a/library/ui/src/main/res/values-es/strings.xml +++ b/library/ui/src/main/res/values-es/strings.xml @@ -47,15 +47,6 @@ Habilitar subtítulos Velocidad Normal - Descargar - Descargas - Descargando - Descarga de archivos completado - No se ha podido descargar - Quitando descargas - Descargas pausadas - Descargas en espera de red - Descargas en espera de Wi-Fi Vídeo Audio Texto diff --git a/library/ui/src/main/res/values-et/strings.xml b/library/ui/src/main/res/values-et/strings.xml index ccba8656a6..e4e627b9d8 100644 --- a/library/ui/src/main/res/values-et/strings.xml +++ b/library/ui/src/main/res/values-et/strings.xml @@ -47,15 +47,6 @@ Luba subtiitrid Kiirus Tavaline - Allalaadimine - Allalaadimised - Allalaadimine - Allalaadimine lõpetati - Allalaadimine ebaõnnestus - Allalaadimiste eemaldamine - Allalaadimised peatati - Allalaadimised on võrgu ootel - Allalaadimised on WiFi-võrgu ootel Video Heli Tekst diff --git a/library/ui/src/main/res/values-eu/strings.xml b/library/ui/src/main/res/values-eu/strings.xml index c50426aa25..d79641124c 100644 --- a/library/ui/src/main/res/values-eu/strings.xml +++ b/library/ui/src/main/res/values-eu/strings.xml @@ -47,15 +47,6 @@ Gaitu azpitituluak Abiadura Normala - Deskargak - Deskargak - Deskargatzen - Osatu da deskarga - Ezin izan da deskargatu - Deskargak kentzen - Deskargak pausatuta daude - Deskargak sare mugikorrera konektatzeko zain daude - Deskargak wifira konektatzeko zain daude Bideoa Audioa Testua diff --git a/library/ui/src/main/res/values-fa/strings.xml b/library/ui/src/main/res/values-fa/strings.xml index 61df23a4ea..a1d0a26901 100644 --- a/library/ui/src/main/res/values-fa/strings.xml +++ b/library/ui/src/main/res/values-fa/strings.xml @@ -47,15 +47,6 @@ فعال کردن زیرنویس سرعت عادی - بارگیری - بارگیری‌ها - درحال بارگیری - بارگیری کامل شد - بارگیری نشد - حذف بارگیری‌ها - بارگیری‌ها موقتاً متوقف شد - بارگیری‌ها درانتظار شبکه است - بارگیری‌ها در انتظار Wi-Fi است ویدیو صوتی نوشتار diff --git a/library/ui/src/main/res/values-fi/strings.xml b/library/ui/src/main/res/values-fi/strings.xml index 0b8041bdd1..4970206f6d 100644 --- a/library/ui/src/main/res/values-fi/strings.xml +++ b/library/ui/src/main/res/values-fi/strings.xml @@ -47,15 +47,6 @@ Ota tekstitykset käyttöön Nopeus Normaali - Lataa - Lataukset - Ladataan - Lataus valmis - Lataus epäonnistui - Poistetaan latauksia - Lataukset keskeytetty - Lataukse odottavat verkkoyhteyttä - Lataukset odottavat Wi-Fi-yhteyttä Video Ääni Teksti diff --git a/library/ui/src/main/res/values-fr-rCA/strings.xml b/library/ui/src/main/res/values-fr-rCA/strings.xml index eb7f45b27a..d73fc24685 100644 --- a/library/ui/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui/src/main/res/values-fr-rCA/strings.xml @@ -47,15 +47,6 @@ Activer les sous-titres Vitesse Normale - Télécharger - Téléchargements - Téléchargement en cours… - Téléchargement terminé - Échec du téléchargement - Suppression des téléchargements en cours… - Téléchargements interrompus - Téléchargements en attente du réseau - Téléchargements en attente du Wi-Fi Vidéo Audio Texte diff --git a/library/ui/src/main/res/values-fr/strings.xml b/library/ui/src/main/res/values-fr/strings.xml index 74efce5af8..e279a2099d 100644 --- a/library/ui/src/main/res/values-fr/strings.xml +++ b/library/ui/src/main/res/values-fr/strings.xml @@ -47,15 +47,6 @@ Activer les sous-titres Vitesse Normale - Télécharger - Téléchargements - Téléchargement… - Téléchargement terminé - Échec du téléchargement - Suppression des téléchargements… - Téléchargements mis en pause - Téléchargements en attente de réseau - Téléchargements en attente de Wi-Fi Vidéo Audio Texte diff --git a/library/ui/src/main/res/values-gl/strings.xml b/library/ui/src/main/res/values-gl/strings.xml index b960bc2bd0..58ce87afff 100644 --- a/library/ui/src/main/res/values-gl/strings.xml +++ b/library/ui/src/main/res/values-gl/strings.xml @@ -47,15 +47,6 @@ Activa os subtítulos Velocidade Normal - Descargar - Descargas - Descargando - Completouse a descarga - Produciuse un erro na descarga - Quitando descargas - As descargas están en pausa - As descargas están agardando pola rede - As descargas están agardando pola wifi Vídeo Audio Texto diff --git a/library/ui/src/main/res/values-gu/strings.xml b/library/ui/src/main/res/values-gu/strings.xml index 6587ecd67d..14c3efa66e 100644 --- a/library/ui/src/main/res/values-gu/strings.xml +++ b/library/ui/src/main/res/values-gu/strings.xml @@ -47,15 +47,6 @@ સબટાઇટલ ચાલુ કરો ઝડપ સામાન્ય - ડાઉનલોડ કરો - ડાઉનલોડ - ડાઉનલોડ કરી રહ્યાં છીએ - ડાઉનલોડ પૂર્ણ થયું - ડાઉનલોડ નિષ્ફળ થયું - ડાઉનલોડ કાઢી નાખી રહ્યાં છીએ - ડાઉનલોડ થોભાવ્યા છે - ડાઉનલોડ થવા નેટવર્કની રાહ જોવાઈ રહી છે - ડાઉનલોડ થવા વાઇ-ફાઇની રાહ જોવાઈ રહી છે વીડિયો ઑડિયો ટેક્સ્ટ diff --git a/library/ui/src/main/res/values-hi/strings.xml b/library/ui/src/main/res/values-hi/strings.xml index 85b5cc63cd..fa68022b2b 100644 --- a/library/ui/src/main/res/values-hi/strings.xml +++ b/library/ui/src/main/res/values-hi/strings.xml @@ -47,15 +47,6 @@ सबटाइटल चालू करें रफ़्तार सामान्य - डाउनलोड करें - डाउनलोड की गई मीडिया फ़ाइलें - डाउनलोड हो रहा है - डाउनलोड पूरा हुआ - डाउनलोड नहीं हो सका - डाउनलोड की गई फ़ाइलें हटाई जा रही हैं - डाउनलोड रोका गया है - डाउनलोड शुरू करने के लिए, इंटरनेट से कनेक्ट होने का इंतज़ार है - डाउनलोड शुरू करने के लिए, वाई-फ़ाई से कनेक्ट होने का इंतज़ार है वीडियो ऑडियो लेख diff --git a/library/ui/src/main/res/values-hr/strings.xml b/library/ui/src/main/res/values-hr/strings.xml index a9672aef78..f608b300d7 100644 --- a/library/ui/src/main/res/values-hr/strings.xml +++ b/library/ui/src/main/res/values-hr/strings.xml @@ -49,15 +49,6 @@ Omogući titlove Brzina Obično - Preuzmi - Preuzimanja - Preuzimanje - Preuzimanje je dovršeno - Preuzimanje nije uspjelo - Uklanjanje preuzimanja - Preuzimanja su pauzirana - Preuzimanja čekaju mrežu - Preuzimanja čekaju Wi-Fi Videozapis Audiozapis Tekst diff --git a/library/ui/src/main/res/values-hu/strings.xml b/library/ui/src/main/res/values-hu/strings.xml index 2daf10a7e6..d34010dea4 100644 --- a/library/ui/src/main/res/values-hu/strings.xml +++ b/library/ui/src/main/res/values-hu/strings.xml @@ -47,15 +47,6 @@ Feliratok bekapcsolása Sebesség Normál - Letöltés - Letöltések - Letöltés folyamatban - A letöltés befejeződött - Nem sikerült a letöltés - Letöltések törlése folyamatban - Letöltések szüneteltetve - A letöltések hálózatra várakoznak - A letöltések Wi-Fi-re várakoznak Videó Hang Szöveg diff --git a/library/ui/src/main/res/values-hy/strings.xml b/library/ui/src/main/res/values-hy/strings.xml index 5f83e8949e..8c96cfdb9f 100644 --- a/library/ui/src/main/res/values-hy/strings.xml +++ b/library/ui/src/main/res/values-hy/strings.xml @@ -47,15 +47,6 @@ Միացնել ենթագրերը Արագություն Սովորական - Ներբեռնել - Ներբեռնումներ - Ներբեռնում - Ներբեռնումն ավարտվեց - Չհաջողվեց ներբեռնել - Ներբեռնումները հեռացվում են - Ներբեռնումները դադարեցված են - Ցանցի որոնում - Wi-Fi ցանցի որոնում Տեսանյութ Աուդիո Տեքստ diff --git a/library/ui/src/main/res/values-in/strings.xml b/library/ui/src/main/res/values-in/strings.xml index ea7d0f5437..5a1dd6674e 100644 --- a/library/ui/src/main/res/values-in/strings.xml +++ b/library/ui/src/main/res/values-in/strings.xml @@ -47,15 +47,6 @@ Aktifkan subtitel Kecepatan Normal - Download - Download - Mendownload - Download selesai - Download gagal - Menghapus download - Download dijeda - Download menunggu konektivitas jaringan - Download menunggu konektivitas Wi-Fi Video Audio Teks diff --git a/library/ui/src/main/res/values-is/strings.xml b/library/ui/src/main/res/values-is/strings.xml index d64c4dc491..f4e09eab56 100644 --- a/library/ui/src/main/res/values-is/strings.xml +++ b/library/ui/src/main/res/values-is/strings.xml @@ -47,15 +47,6 @@ Kveikja á skjátexta Hraði Venjulegur - Sækja - Niðurhal - Sækir - Niðurhali lokið - Niðurhal mistókst - Fjarlægir niðurhal - Niðurhöl í bið - Niðurhöl bíða eftir netkerfi - Niðurhöl bíða eftir WiFi Myndskeið Hljóð Texti diff --git a/library/ui/src/main/res/values-it/strings.xml b/library/ui/src/main/res/values-it/strings.xml index a7ffec9d4f..e863214012 100644 --- a/library/ui/src/main/res/values-it/strings.xml +++ b/library/ui/src/main/res/values-it/strings.xml @@ -47,15 +47,6 @@ Attiva i sottotitoli Velocità Normale - Scarica - Download - Download in corso… - Download completato - Download non riuscito - Rimozione dei download… - Download in pausa - Download in attesa di rete - Download in attesa di Wi-Fi Video Audio Testo diff --git a/library/ui/src/main/res/values-iw/strings.xml b/library/ui/src/main/res/values-iw/strings.xml index 6c040273b0..19fd41813b 100644 --- a/library/ui/src/main/res/values-iw/strings.xml +++ b/library/ui/src/main/res/values-iw/strings.xml @@ -51,15 +51,6 @@ הפעלת כתוביות מהירות רגילה - הורדה - הורדות - ההורדה מתבצעת - ההורדה הושלמה - ההורדה לא הושלמה - מסיר הורדות - ההורדות הושהו - ההורדות בהמתנה לרשת - ההורדות בהמתנה ל-Wi-Fi סרטון אודיו טקסט diff --git a/library/ui/src/main/res/values-ja/strings.xml b/library/ui/src/main/res/values-ja/strings.xml index 1360c0497e..c17ecf89a0 100644 --- a/library/ui/src/main/res/values-ja/strings.xml +++ b/library/ui/src/main/res/values-ja/strings.xml @@ -47,15 +47,6 @@ 字幕の有効化 速度 標準 - ダウンロード - ダウンロード - ダウンロードしています - ダウンロードが完了しました - ダウンロードに失敗しました - ダウンロードを削除しています - ダウンロード一時停止 - ダウンロード停止: ネットワーク接続中 - ダウンロード停止: Wi-Fi 接続中 動画 音声 文字 diff --git a/library/ui/src/main/res/values-ka/strings.xml b/library/ui/src/main/res/values-ka/strings.xml index 1e6dd476ea..5f808f33a5 100644 --- a/library/ui/src/main/res/values-ka/strings.xml +++ b/library/ui/src/main/res/values-ka/strings.xml @@ -47,15 +47,6 @@ სუბტიტრების ჩართვა სიჩქარე ჩვეულებრივი - ჩამოტვირთვა - ჩამოტვირთვები - მიმდინარეობს ჩამოტვირთვა - ჩამოტვირთვა დასრულდა - ჩამოტვირთვა ვერ მოხერხდა - მიმდინარეობს ჩამოტვირთვების ამოშლა - ჩამოტვირთვები დაპაუზებულია - ჩამოტვირთვები ქსელს ელოდება - ჩამოტვირთვები Wi-Fi-ს ელოდება ვიდეო აუდიო ტექსტი diff --git a/library/ui/src/main/res/values-kk/strings.xml b/library/ui/src/main/res/values-kk/strings.xml index 6a690eeea8..7c5ac35e35 100644 --- a/library/ui/src/main/res/values-kk/strings.xml +++ b/library/ui/src/main/res/values-kk/strings.xml @@ -47,15 +47,6 @@ Субтитрді қосу Жылдамдық Қалыпты - Жүктеп алу - Жүктеп алынғандар - Жүктеп алынуда - Жүктеп алынды - Жүктеп алынбады - Жүктеп алынғандар өшірілуде - Жүктеп алу процестері уақытша тоқтады. - Жүктеп алу үшін желіге қосылу керек. - Жүктеп алу үшін Wi-Fi-ға қосылу керек. Бейне Aудиомазмұн Мәтін diff --git a/library/ui/src/main/res/values-km/strings.xml b/library/ui/src/main/res/values-km/strings.xml index 7065540d5a..e7e2531638 100644 --- a/library/ui/src/main/res/values-km/strings.xml +++ b/library/ui/src/main/res/values-km/strings.xml @@ -47,15 +47,6 @@ បើកអក្សររត់ ល្បឿន ធម្មតា - ទាញយក - ទាញយក - កំពុង​ទាញ​យក - បាន​បញ្ចប់​ការទាញយក - មិន​អាច​ទាញយក​បាន​ទេ - កំពុង​លុប​ការទាញយក - ការទាញយក​ត្រូវបានផ្អាក - ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់បណ្ដាញ - ការទាញយក​កំពុងរង់ចាំ​ការតភ្ជាប់ Wi-Fi វីដេអូ សំឡេង អក្សរ diff --git a/library/ui/src/main/res/values-kn/strings.xml b/library/ui/src/main/res/values-kn/strings.xml index ac4b2674e6..efb2632dae 100644 --- a/library/ui/src/main/res/values-kn/strings.xml +++ b/library/ui/src/main/res/values-kn/strings.xml @@ -47,15 +47,6 @@ ಸಬ್‌ಟೈಟಲ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ವೇಗ ಸಾಮಾನ್ಯ - ಡೌನ್‌ಲೋಡ್‌ - ಡೌನ್‌ಲೋಡ್‌ಗಳು - ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ - ಡೌನ್‌ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ - ಡೌನ್‌ಲೋಡ್‌ ವಿಫಲಗೊಂಡಿದೆ - ಡೌನ್ಲೋಡ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ - ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ - ಡೌನ್‌ಲೋಡ್‌ಗಳು ನೆಟ್‌ವರ್ಕ್‌ಗಾಗಿ ಕಾಯುತ್ತಿವೆ - ಡೌನ್‌ಲೋಡ್‌ಗಳು Wi-Fi ಗಾಗಿ ಕಾಯುತ್ತಿವೆ ವೀಡಿಯೊ ಆಡಿಯೊ ಪಠ್ಯ diff --git a/library/ui/src/main/res/values-ko/strings.xml b/library/ui/src/main/res/values-ko/strings.xml index 6696bfcb30..10919b8ee5 100644 --- a/library/ui/src/main/res/values-ko/strings.xml +++ b/library/ui/src/main/res/values-ko/strings.xml @@ -47,15 +47,6 @@ 자막 사용 설정 속도 일반 - 다운로드 - 다운로드 - 다운로드 중 - 다운로드 완료 - 다운로드 실패 - 다운로드 항목 삭제 중 - 다운로드 일시중지됨 - 다운로드를 위해 네트워크 연결 대기 중 - 다운로드를 위해 Wi-Fi 연결 대기 중 동영상 오디오 텍스트 diff --git a/library/ui/src/main/res/values-ky/strings.xml b/library/ui/src/main/res/values-ky/strings.xml index 73d4fcb286..e61beffe15 100644 --- a/library/ui/src/main/res/values-ky/strings.xml +++ b/library/ui/src/main/res/values-ky/strings.xml @@ -47,15 +47,6 @@ Коштомо жазууларды иштетүү Ылдамдык Орточо - Жүктөп алуу - Жүктөлүп алынгандар - Жүктөлүп алынууда - Жүктөп алуу аяктады - Жүктөлүп алынбай калды - Жүктөлүп алынгандар өчүрүлүүдө - Жүктөп алуу тындырылды - Тармакка туташуу күтүлүүдө - WiFi\'га туташуу күтүлүүдө Видео Аудио Текст diff --git a/library/ui/src/main/res/values-lo/strings.xml b/library/ui/src/main/res/values-lo/strings.xml index b416862c7e..23e17a9458 100644 --- a/library/ui/src/main/res/values-lo/strings.xml +++ b/library/ui/src/main/res/values-lo/strings.xml @@ -47,15 +47,6 @@ ເປີດການນຳໃຊ້ຄຳແປ ຄວາມໄວ ທົ່ວໄປ - ດາວໂຫລດ - ດາວໂຫລດ - ກຳລັງດາວໂຫລດ - ດາວໂຫລດສຳເລັດແລ້ວ - ດາວໂຫຼດບໍ່ສຳເລັດ - ກຳລັງລຶບການດາວໂຫລດອອກ - ຢຸດດາວໂຫຼດຊົ່ວຄາວແລ້ວ - ການດາວໂຫຼດກຳລັງລໍຖ້າເຄືອຂ່າຍຢູ່ - ການດາວໂຫຼດກຳລັງລໍຖ້າ WiFi ຢູ່ ວິດີໂອ ສຽງ ຂໍ້ຄວາມ diff --git a/library/ui/src/main/res/values-lt/strings.xml b/library/ui/src/main/res/values-lt/strings.xml index 54a5cb42a6..29d2921932 100644 --- a/library/ui/src/main/res/values-lt/strings.xml +++ b/library/ui/src/main/res/values-lt/strings.xml @@ -51,15 +51,6 @@ Įgalinti subtitrus Sparta Įprasta - Atsisiųsti - Atsisiuntimai - Atsisiunčiama - Atsisiuntimo procesas baigtas - Nepavyko atsisiųsti - Pašalinami atsisiuntimai - Atsisiuntimai pristabdyti - Norint tęsti atsis., laukiama tinklo - Norint tęsti atsis., laukiama „Wi-Fi“ Vaizdo įrašas Garso įrašas Tekstas diff --git a/library/ui/src/main/res/values-lv/strings.xml b/library/ui/src/main/res/values-lv/strings.xml index 7449afd71c..c6311de85c 100644 --- a/library/ui/src/main/res/values-lv/strings.xml +++ b/library/ui/src/main/res/values-lv/strings.xml @@ -49,15 +49,6 @@ Iespējot subtitrus Ātrums Parasts - Lejupielādēt - Lejupielādes - Notiek lejupielāde - Lejupielāde ir pabeigta - Lejupielāde neizdevās - Notiek lejupielāžu noņemšana - Lejupielādes ir pārtrauktas. - Lejupielādes gaida savienojumu ar tīklu. - Lejupielādes gaida savienojumu ar Wi-Fi. Video Audio Teksts diff --git a/library/ui/src/main/res/values-mk/strings.xml b/library/ui/src/main/res/values-mk/strings.xml index 6f0b952586..1668e27db5 100644 --- a/library/ui/src/main/res/values-mk/strings.xml +++ b/library/ui/src/main/res/values-mk/strings.xml @@ -47,15 +47,6 @@ Овозможете ги титловите Брзина Нормална - Преземи - Преземања - Се презема - Преземањето заврши - Неуспешно преземање - Се отстрануваат преземањата - Преземањата се паузирани - Се чека мрежа за преземањата - Се чека WiFi за преземањата Видео Аудио Текст diff --git a/library/ui/src/main/res/values-ml/strings.xml b/library/ui/src/main/res/values-ml/strings.xml index 4f7320f9cc..3485bd97e1 100644 --- a/library/ui/src/main/res/values-ml/strings.xml +++ b/library/ui/src/main/res/values-ml/strings.xml @@ -47,15 +47,6 @@ സബ്‌ടൈറ്റിലുകൾ പ്രവർത്തനക്ഷമമാക്കുക വേഗത സാധാരണം - ഡൗൺലോഡ് - ഡൗൺലോഡുകൾ - ഡൗൺലോഡ് ചെയ്യുന്നു - ഡൗൺലോഡ് പൂർത്തിയായി - ഡൗൺലോഡ് പരാജയപ്പെട്ടു - ഡൗൺലോഡുകൾ നീക്കം ചെയ്യുന്നു - ഡൗൺലോഡുകൾ താൽക്കാലികമായി നിർത്തി - ഡൗൺലോഡുകൾ നെറ്റ്‌വർക്കിന് കാത്തിരിക്കുന്നു - ഡൗൺലോഡുകൾ വൈഫൈയ്ക്കായി കാത്തിരിക്കുന്നു വീഡിയോ ഓഡിയോ ടെക്‌സ്റ്റ് diff --git a/library/ui/src/main/res/values-mn/strings.xml b/library/ui/src/main/res/values-mn/strings.xml index 0df9da7395..69c34c991b 100644 --- a/library/ui/src/main/res/values-mn/strings.xml +++ b/library/ui/src/main/res/values-mn/strings.xml @@ -47,15 +47,6 @@ Хадмалыг идэвхжүүлэх Хурд Хэвийн - Татах - Татaлт - Татаж байна - Татаж дууссан - Татаж чадсангүй - Татаж авсан файлыг хасаж байна - Таталтуудыг түр зогсоосон - Таталтууд сүлжээг хүлээж байна - Таталтууд Wi-Fi-г хүлээж байна Видео Дуу Текст diff --git a/library/ui/src/main/res/values-mr/strings.xml b/library/ui/src/main/res/values-mr/strings.xml index 9e20adf3b2..d2823a3d0d 100644 --- a/library/ui/src/main/res/values-mr/strings.xml +++ b/library/ui/src/main/res/values-mr/strings.xml @@ -47,15 +47,6 @@ सबटायटल सुरू करा वेग सामान्य - डाउनलोड करा - डाउनलोड - डाउनलोड होत आहे - डाउनलोड पूर्ण झाले - डाउनलोड अयशस्वी झाले - डाउनलोड काढून टाकत आहे - डाउनलोड थांबवले - डाउनलोड नेटवर्कची प्रतीक्षा करत आहेत - डाउनलोड वायफाय ची प्रतीक्षा करत आहेत व्हिडिओ ऑडिओ मजकूर diff --git a/library/ui/src/main/res/values-ms/strings.xml b/library/ui/src/main/res/values-ms/strings.xml index 3cc85b4e99..d90400b2cc 100644 --- a/library/ui/src/main/res/values-ms/strings.xml +++ b/library/ui/src/main/res/values-ms/strings.xml @@ -47,15 +47,6 @@ Dayakan sari kata Kelajuan Biasa - Muat turun - Muat turun - Memuat turun - Muat turun selesai - Muat turun gagal - Mengalih keluar muat turun - Muat turun dijeda - Muat turun menunggu rangkaian - Muat turun menunggu Wi-Fi Video Audio Teks diff --git a/library/ui/src/main/res/values-my/strings.xml b/library/ui/src/main/res/values-my/strings.xml index 0cba594121..9c46d2d4f2 100644 --- a/library/ui/src/main/res/values-my/strings.xml +++ b/library/ui/src/main/res/values-my/strings.xml @@ -47,15 +47,6 @@ စာတန်းထိုး ဖွင့်ပါ မြန်နှုန်း ပုံမှန် - ဒေါင်းလုဒ် လုပ်ရန် - ဒေါင်းလုဒ်များ - ဒေါင်းလုဒ်လုပ်နေသည် - ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ - ဒေါင်းလုဒ်လုပ်၍ မရပါ - ဒေါင်းလုဒ်များ ဖယ်ရှားနေသည် - ဒေါင်းလုဒ်များ ခဏရပ်ထားသည် - ဒေါင်းလုဒ်များက အင်တာနက်ရရန် စောင့်နေသည် - ဒေါင်းလုဒ်များက WiFi ရရန် စောင့်နေသည် ဗီဒီယို အသံ စာသား diff --git a/library/ui/src/main/res/values-nb/strings.xml b/library/ui/src/main/res/values-nb/strings.xml index 3d407cf930..ebb10985c4 100644 --- a/library/ui/src/main/res/values-nb/strings.xml +++ b/library/ui/src/main/res/values-nb/strings.xml @@ -47,15 +47,6 @@ Slå på undertekstene Hastighet Normal - Last ned - Nedlastinger - Laster ned - Nedlastingen er fullført - Nedlastingen mislyktes - Fjerner nedlastinger - Nedlastinger er satt på pause - Nedlastinger venter på nettverket - Nedlastinger venter på Wi-FI-tilkobling Video Lyd Tekst diff --git a/library/ui/src/main/res/values-ne/strings.xml b/library/ui/src/main/res/values-ne/strings.xml index d922159d92..8e8364c4cb 100644 --- a/library/ui/src/main/res/values-ne/strings.xml +++ b/library/ui/src/main/res/values-ne/strings.xml @@ -47,15 +47,6 @@ सबटाइटलहरू सक्षम पार्नुहोस् गति सामान्य - डाउनलोड गर्नुहोस् - डाउनलोडहरू - डाउनलोड गरिँदै छ - डाउनलोड सम्पन्न भयो - डाउनलोड गर्न सकिएन - डाउनलोडहरू हटाउँदै - डाउनलोड गर्ने कार्य पज गरियो - इन्टरनेटमा कनेक्ट भएपछि डाउनलोड गरिने छ - WiFi मा कनेक्ट भएपछि डाउनलोड गरिने छ भिडियो अडियो पाठ diff --git a/library/ui/src/main/res/values-nl/strings.xml b/library/ui/src/main/res/values-nl/strings.xml index 18822455a8..005cf3cdfc 100644 --- a/library/ui/src/main/res/values-nl/strings.xml +++ b/library/ui/src/main/res/values-nl/strings.xml @@ -47,15 +47,6 @@ Ondertiteling aanzetten Snelheid Normaal - Downloaden - Downloads - Downloaden - Downloaden voltooid - Downloaden mislukt - Downloads verwijderen - Downloads gepauzeerd - Downloads wachten op netwerk - Downloads wachten op wifi Video Audio Tekst diff --git a/library/ui/src/main/res/values-pa/strings.xml b/library/ui/src/main/res/values-pa/strings.xml index 96793a05a4..2c7a531caa 100644 --- a/library/ui/src/main/res/values-pa/strings.xml +++ b/library/ui/src/main/res/values-pa/strings.xml @@ -47,15 +47,6 @@ ਉਪਸਿਰਲੇਖਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ ਗਤੀ ਸਧਾਰਨ - ਡਾਊਨਲੋਡ ਕਰੋ - ਡਾਊਨਲੋਡ - ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ - ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ - ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ - ਡਾਊਨਲੋਡ ਕੀਤੀ ਸਮੱਗਰੀ ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ - ਡਾਊਨਲੋਡ ਰੁਕ ਗਏ ਹਨ - ਡਾਊਨਲੋਡਾਂ ਲਈ ਨੈੱਟਵਰਕ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ - ਡਾਊਨਲੋਡਾਂ ਲਈ ਵਾਈ-ਫਾਈ ਦੀ ਉਡੀਕ ਹੋ ਰਹੀ ਹੈ ਵੀਡੀਓ ਆਡੀਓ ਲਿਖਤ diff --git a/library/ui/src/main/res/values-pl/strings.xml b/library/ui/src/main/res/values-pl/strings.xml index 4ff02a28b0..ef355f178e 100644 --- a/library/ui/src/main/res/values-pl/strings.xml +++ b/library/ui/src/main/res/values-pl/strings.xml @@ -51,15 +51,6 @@ Włącz napisy Szybkość Normalna - Pobierz - Pobieranie - Pobieram - Zakończono pobieranie - Nie udało się pobrać - Usuwam pobrane - Wstrzymano pobieranie - Pobierane pliki oczekują na sieć - Pobierane pliki oczekują na Wi-Fi Film Dźwięk Tekst diff --git a/library/ui/src/main/res/values-pt-rPT/strings.xml b/library/ui/src/main/res/values-pt-rPT/strings.xml index 6a123c6d97..51cfe3e902 100644 --- a/library/ui/src/main/res/values-pt-rPT/strings.xml +++ b/library/ui/src/main/res/values-pt-rPT/strings.xml @@ -47,15 +47,6 @@ Ativar legendas Velocidade Normal - Transferir - Transferências - A transferir… - Transferência concluída - Falha na transferência - A remover as transferências… - Transferências colocadas em pausa - Transferências a aguardar uma rede - Transferências a aguardar Wi-Fi Vídeo Áudio Texto diff --git a/library/ui/src/main/res/values-pt/strings.xml b/library/ui/src/main/res/values-pt/strings.xml index 20758e4906..25711d0ed9 100644 --- a/library/ui/src/main/res/values-pt/strings.xml +++ b/library/ui/src/main/res/values-pt/strings.xml @@ -47,15 +47,6 @@ Ativar legendas Velocidade Normal - Fazer o download - Downloads - Fazendo o download - Download concluído - Falha no download - Removendo downloads - Downloads pausados - Downloads aguardando uma conexão de rede - Downloads aguardando uma rede Wi-Fi Vídeo Áudio Texto diff --git a/library/ui/src/main/res/values-ro/strings.xml b/library/ui/src/main/res/values-ro/strings.xml index 5dbd79d279..ddcd79f943 100644 --- a/library/ui/src/main/res/values-ro/strings.xml +++ b/library/ui/src/main/res/values-ro/strings.xml @@ -49,15 +49,6 @@ Activați subtitrările Viteză Normală - Descărcați - Descărcări - Se descarcă - Descărcarea a fost finalizată - Descărcarea nu a reușit - Se elimină descărcările - Descărcările au fost întrerupte - Descărcările așteaptă rețeaua - Descărcările așteaptă rețeaua Wi-Fi Video Audio Text diff --git a/library/ui/src/main/res/values-ru/strings.xml b/library/ui/src/main/res/values-ru/strings.xml index 651c0a19bc..a515c13ba4 100644 --- a/library/ui/src/main/res/values-ru/strings.xml +++ b/library/ui/src/main/res/values-ru/strings.xml @@ -51,15 +51,6 @@ Включить субтитры Скорость Стандартная - Скачать - Скачивания - Скачивание… - Скачивание завершено - Ошибка скачивания - Удаление скачанных файлов… - Скачивание приостановлено - Ожидание подключения к сети - Ожидание подключения к Wi-Fi Видео Аудио Текст diff --git a/library/ui/src/main/res/values-si/strings.xml b/library/ui/src/main/res/values-si/strings.xml index 2f98ed649c..e0bbc6e0de 100644 --- a/library/ui/src/main/res/values-si/strings.xml +++ b/library/ui/src/main/res/values-si/strings.xml @@ -47,15 +47,6 @@ උපසිරැසි සබල කරන්න වේගය සාමාන්‍ය - බාගන්න - බාගැනීම් - බාගනිමින් - බාගැනීම සම්පූර්ණ කරන ලදී - බාගැනීම අසමත් විය - බාගැනීම් ඉවත් කිරීම - බාගැනීම් විරාම කර ඇත - ජාලය සඳහා බාගැනීම් රැඳී සිටී - WiFi සඳහා බාගැනීම් රැඳී සිටී වීඩියෝ ශ්‍රව්‍ය පෙළ diff --git a/library/ui/src/main/res/values-sk/strings.xml b/library/ui/src/main/res/values-sk/strings.xml index b6822bf46a..9f57220b95 100644 --- a/library/ui/src/main/res/values-sk/strings.xml +++ b/library/ui/src/main/res/values-sk/strings.xml @@ -51,15 +51,6 @@ Povoliť titulky Rýchlosť Normálna - Stiahnuť - Stiahnuté - Sťahuje sa - Sťahovanie bolo dokončené - Nepodarilo sa stiahnuť - Odstraňuje sa stiahnutý obsah - Sťahovanie je pozastavené - Sťahovanie čaká na sieť - Sťahovanie čaká na Wi‑Fi Video Zvuk Text diff --git a/library/ui/src/main/res/values-sl/strings.xml b/library/ui/src/main/res/values-sl/strings.xml index d26d7bbc46..74c2197a7c 100644 --- a/library/ui/src/main/res/values-sl/strings.xml +++ b/library/ui/src/main/res/values-sl/strings.xml @@ -51,15 +51,6 @@ Omogočanje podnapisov Hitrost Običajna - Prenos - Prenosi - Prenašanje - Prenos je končan - Prenos ni uspel - Odstranjevanje prenosov - Prenosi so začasno zaustavljeni. - Prenosi čakajo na povezavo z omrežjem. - Prenosi čakajo na povezavo Wi-Fi. Videoposnetki Zvočni posnetki Podnapisi diff --git a/library/ui/src/main/res/values-sq/strings.xml b/library/ui/src/main/res/values-sq/strings.xml index 9d7300c51c..0321c6e6f1 100644 --- a/library/ui/src/main/res/values-sq/strings.xml +++ b/library/ui/src/main/res/values-sq/strings.xml @@ -47,15 +47,6 @@ Aktivizo titrat Shpejtësia Normale - Shkarko - Shkarkimet - Po shkarkohet - Shkarkimi përfundoi - Shkarkimi dështoi - Shkarkimet po hiqen - Shkarkimet u vendosën në pauzë - Shkarkimet në pritje të rrjetit - Shkarkimet në pritje të WiFi Video Audio Tekst diff --git a/library/ui/src/main/res/values-sr/strings.xml b/library/ui/src/main/res/values-sr/strings.xml index 1e16b8aeab..8a06044431 100644 --- a/library/ui/src/main/res/values-sr/strings.xml +++ b/library/ui/src/main/res/values-sr/strings.xml @@ -49,15 +49,6 @@ Омогући титлове Брзина Уобичајена - Преузми - Преузимања - Преузима се - Преузимање је завршено - Преузимање није успело - Преузимања се уклањају - Преузимања су паузирана - Преузимања чекају на мрежу - Преузимања чекају на WiFi Видео Аудио Текст diff --git a/library/ui/src/main/res/values-sv/strings.xml b/library/ui/src/main/res/values-sv/strings.xml index 0476d861c5..b45a7edfe7 100644 --- a/library/ui/src/main/res/values-sv/strings.xml +++ b/library/ui/src/main/res/values-sv/strings.xml @@ -47,15 +47,6 @@ Aktivera undertexter Hastighet Normal - Ladda ned - Nedladdningar - Laddar ned - Nedladdningen är klar - Nedladdningen misslyckades - Nedladdningar tas bort - Nedladdningar har pausats - Nedladdningar väntar på nätverket - Nedladdningar väntar på wifi Video Ljud Text diff --git a/library/ui/src/main/res/values-sw/strings.xml b/library/ui/src/main/res/values-sw/strings.xml index b17dd7b0c4..02a6174ea9 100644 --- a/library/ui/src/main/res/values-sw/strings.xml +++ b/library/ui/src/main/res/values-sw/strings.xml @@ -47,15 +47,6 @@ Washa manukuu Kasi Kawaida - Pakua - Vipakuliwa - Inapakua - Imepakuliwa - Imeshindwa kupakua - Inaondoa vipakuliwa - Imesimamisha shughuli ya kupakua - Upakuaji unasubiri mtandao - Upakuaji unasubiri Wi-Fi Video Sauti Maandishi diff --git a/library/ui/src/main/res/values-ta/strings.xml b/library/ui/src/main/res/values-ta/strings.xml index f0d61f8dc3..c5053480c4 100644 --- a/library/ui/src/main/res/values-ta/strings.xml +++ b/library/ui/src/main/res/values-ta/strings.xml @@ -47,15 +47,6 @@ வசனங்களை இயக்கும் வேகம் இயல்பு - பதிவிறக்கும் பட்டன் - பதிவிறக்கங்கள் - பதிவிறக்குகிறது - பதிவிறக்கப்பட்டது - பதிவிறக்க முடியவில்லை - பதிவிறக்கங்கள் அகற்றப்படுகின்றன - பதிவிறக்கங்கள் இடைநிறுத்தப்பட்டன - நெட்வொர்க்கிற்காகக் காத்திருக்கின்றன - Wi-Fiகாகக் காத்திருக்கின்றன வீடியோ ஆடியோ உரை diff --git a/library/ui/src/main/res/values-te/strings.xml b/library/ui/src/main/res/values-te/strings.xml index fc5c5291f1..90208f6e3a 100644 --- a/library/ui/src/main/res/values-te/strings.xml +++ b/library/ui/src/main/res/values-te/strings.xml @@ -47,15 +47,6 @@ ఉప శీర్షికలను ఎనేబుల్ చేయి వేగం సాధారణం - డౌన్‌లోడ్ చేయి - డౌన్‌లోడ్‌లు - డౌన్‌లోడ్ చేస్తోంది - డౌన్‌లోడ్ పూర్తయింది - డౌన్‌లోడ్ విఫలమైంది - డౌన్‌లోడ్‌లను తీసివేస్తోంది - డౌన్‌లోడ్‌లు పాజ్ చేయబడ్డాయి - డౌన్‌లోడ్స్ నెట్‌వర్క్ కోసం చూస్తున్నాయి - డౌన్‌లోడ్‌లు WiFi కోసం చూస్తున్నాయి వీడియో ఆడియో వచనం diff --git a/library/ui/src/main/res/values-th/strings.xml b/library/ui/src/main/res/values-th/strings.xml index 4aff37af51..6aecddefdb 100644 --- a/library/ui/src/main/res/values-th/strings.xml +++ b/library/ui/src/main/res/values-th/strings.xml @@ -47,15 +47,6 @@ เปิดใช้คำบรรยาย ความเร็ว ปกติ - ดาวน์โหลด - ดาวน์โหลด - กำลังดาวน์โหลด - การดาวน์โหลดเสร็จสมบูรณ์ - การดาวน์โหลดล้มเหลว - กำลังนำรายการที่ดาวน์โหลดออก - การดาวน์โหลดหยุดชั่วคราว - กำลังรอเครือข่ายเพื่อดาวน์โหลด - กำลังรอ Wi-Fi เพื่อดาวน์โหลด วิดีโอ เสียง ข้อความ diff --git a/library/ui/src/main/res/values-tl/strings.xml b/library/ui/src/main/res/values-tl/strings.xml index ddeed95f0b..7931b0ca5a 100644 --- a/library/ui/src/main/res/values-tl/strings.xml +++ b/library/ui/src/main/res/values-tl/strings.xml @@ -47,15 +47,6 @@ I-enable ang mga subtitle Bilis Normal - I-download - Mga Download - Nagda-download - Tapos na ang pag-download - Hindi na-download - Inaalis ang mga na-download - Na-pause ang mga pag-download - Naghihintay ng network ang pag-download - Naghihintay ng WiFi ang mga pag-download Video Audio Text diff --git a/library/ui/src/main/res/values-tr/strings.xml b/library/ui/src/main/res/values-tr/strings.xml index 71b0dfe531..8b55689e74 100644 --- a/library/ui/src/main/res/values-tr/strings.xml +++ b/library/ui/src/main/res/values-tr/strings.xml @@ -47,15 +47,6 @@ Altyazıları etkinleştir Hız Normal - İndir - İndirilenler - İndiriliyor - İndirme işlemi tamamlandı - İndirilemedi - İndirilenler kaldırılıyor - İndirmeler duraklatıldı - İndirmeler için ağ bekleniyor - İndirmeler için kablosuz ağ bekleniyor Video Ses Metin diff --git a/library/ui/src/main/res/values-uk/strings.xml b/library/ui/src/main/res/values-uk/strings.xml index f3a48e1925..da8a7b6caa 100644 --- a/library/ui/src/main/res/values-uk/strings.xml +++ b/library/ui/src/main/res/values-uk/strings.xml @@ -51,15 +51,6 @@ Увімкнути субтитри Швидкість Звичайна - Завантажити - Завантаження - Завантажується - Завантаження завершено - Не вдалося завантажити - Завантаження видаляються - Завантаження призупинено - Очікується підключення до мережі - Очікується підключення до Wi-Fi Відео Аудіо Текст diff --git a/library/ui/src/main/res/values-ur/strings.xml b/library/ui/src/main/res/values-ur/strings.xml index 998873bc69..d7f60590bb 100644 --- a/library/ui/src/main/res/values-ur/strings.xml +++ b/library/ui/src/main/res/values-ur/strings.xml @@ -47,15 +47,6 @@ سب ٹائٹلز کو فعال کریں رفتار عام - ڈاؤن لوڈ کریں - ڈاؤن لوڈز - ڈاؤن لوڈ ہو رہا ہے - ڈاؤن لوڈ مکمل ہو گیا - ڈاؤن لوڈ ناکام ہو گیا - ڈاؤن لوڈز کو ہٹایا جا رہا ہے - ڈاؤن لوڈز موقوف ہو گئے - ڈاؤن لوڈز نیٹ ورک کے منتظر ہیں - ڈاؤن لوڈز WiFi کے منتظر ہیں ویڈیو آڈیو متن diff --git a/library/ui/src/main/res/values-uz/strings.xml b/library/ui/src/main/res/values-uz/strings.xml index 083aceedfd..3a15f1ad01 100644 --- a/library/ui/src/main/res/values-uz/strings.xml +++ b/library/ui/src/main/res/values-uz/strings.xml @@ -47,15 +47,6 @@ Taglavhalarni yoqish Tezlik Normal - Yuklab olish - Yuklanmalar - Yuklab olinmoqda - Yuklab olindi - Yuklab olinmadi - Yuklanmalar olib tashlanmoqda - Yuklanmalar pauzada - Yuklanmalar internetga ulanishni kutmoqda - Yuklanmalar Wi-Fi aloqasini kutmoqda Video Audio Matn diff --git a/library/ui/src/main/res/values-vi/strings.xml b/library/ui/src/main/res/values-vi/strings.xml index 166febbd1f..4459fc7e21 100644 --- a/library/ui/src/main/res/values-vi/strings.xml +++ b/library/ui/src/main/res/values-vi/strings.xml @@ -47,15 +47,6 @@ Bật phụ đề Tốc độ Bình thường - Tải xuống - Tài nguyên đã tải xuống - Đang tải xuống - Đã hoàn tất tải xuống - Không tải xuống được - Đang xóa các mục đã tải xuống - Đã tạm dừng tải xuống - Đang chờ có mạng để tải xuống - Đang chờ có Wi-Fi để tải xuống Video Âm thanh Văn bản diff --git a/library/ui/src/main/res/values-zh-rCN/strings.xml b/library/ui/src/main/res/values-zh-rCN/strings.xml index 81b7a4df0e..896d390e6a 100644 --- a/library/ui/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui/src/main/res/values-zh-rCN/strings.xml @@ -47,15 +47,6 @@ 启用字幕 速度 正常 - 下载 - 下载内容 - 正在下载 - 下载完毕 - 下载失败 - 正在移除下载内容 - 下载已暂停 - 正在等待连接到网络以进行下载 - 正在等待连接到 WLAN 网络以进行下载 视频 音频 文字 diff --git a/library/ui/src/main/res/values-zh-rHK/strings.xml b/library/ui/src/main/res/values-zh-rHK/strings.xml index 2e8246fb4c..b145cbaac1 100644 --- a/library/ui/src/main/res/values-zh-rHK/strings.xml +++ b/library/ui/src/main/res/values-zh-rHK/strings.xml @@ -47,15 +47,6 @@ 啟用字幕 速度 正常 - 下載 - 下載內容 - 正在下載 - 下載完畢 - 下載失敗 - 正在移除下載內容 - 已暫停下載 - 正在等待網絡連線以下載檔案 - 正在等待 Wi-Fi 連線以下載檔案 影片 音訊 文字 diff --git a/library/ui/src/main/res/values-zh-rTW/strings.xml b/library/ui/src/main/res/values-zh-rTW/strings.xml index e8b46e6c81..538a45f028 100644 --- a/library/ui/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui/src/main/res/values-zh-rTW/strings.xml @@ -47,15 +47,6 @@ 啟用字幕 (Subtitle) 速度 正常 - 下載 - 下載 - 下載中 - 下載完成 - 無法下載 - 正在移除下載內容 - 已暫停下載 - 系統會等到連上網路後再開始下載 - 系統會等到連上 Wi-Fi 後再開始下載 影片 音訊 文字 diff --git a/library/ui/src/main/res/values-zu/strings.xml b/library/ui/src/main/res/values-zu/strings.xml index b663314821..2da4f09884 100644 --- a/library/ui/src/main/res/values-zu/strings.xml +++ b/library/ui/src/main/res/values-zu/strings.xml @@ -47,15 +47,6 @@ Nika amandla imibhalo engezansi Isivinini Ivamile - Landa - Ukulandwa - Iyalanda - Ukulanda kuqedile - Ukulanda kuhlulekile - Kususwa okulandiwe - Okulandwayo kumiswe isikhashana - Ukulanda kulinde inethiwekhi - Ukulanda kulinde i-WiFi Ividiyo Umsindo Umbhalo diff --git a/library/ui/src/main/res/values/strings.xml b/library/ui/src/main/res/values/strings.xml index 0dde445c16..ea31c6cfb8 100644 --- a/library/ui/src/main/res/values/strings.xml +++ b/library/ui/src/main/res/values/strings.xml @@ -79,25 +79,6 @@ 00:00:00 - - Download - - Downloads - - Downloading - - Download completed - - Download failed - - Removing downloads - - Downloads paused - - Downloads waiting for network - - Downloads waiting for WiFi - Video From b74ee00c0ff7c1c4cfe8794e01257a84f870f3b0 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 19 Oct 2021 23:47:14 +0100 Subject: [PATCH 356/441] Minor JavaDoc improvement in ExoPlayerLibraryInfo PiperOrigin-RevId: 404384670 --- .../com/google/android/exoplayer2/ExoPlayerLibraryInfo.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 5687d76392..9f13465861 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 @@ -19,17 +19,17 @@ import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.TraceUtil; import java.util.HashSet; -/** Information about the library. */ +/** Information about the media libraries. */ public final class ExoPlayerLibraryInfo { /** A tag to use when logging library information. */ - public static final String TAG = "ExoPlayer"; + public static final String TAG = "ExoPlayerLib"; /** 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.15.1"; - /** The version of the library expressed as {@code "ExoPlayerLib/" + VERSION}. */ + /** 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.15.1"; From 2ebbdbef8c907aee729d35f6ec417464d81efbe3 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 20 Oct 2021 13:31:57 +0100 Subject: [PATCH 357/441] Move upstream.cache to common ahead of module split PiperOrigin-RevId: 404502640 --- .../java/com/google/android/exoplayer2/upstream/cache/Cache.java | 0 .../google/android/exoplayer2/upstream/cache/CacheDataSink.java | 0 .../google/android/exoplayer2/upstream/cache/CacheDataSource.java | 0 .../google/android/exoplayer2/upstream/cache/CacheEvictor.java | 0 .../android/exoplayer2/upstream/cache/CacheFileMetadata.java | 0 .../android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java | 0 .../google/android/exoplayer2/upstream/cache/CacheKeyFactory.java | 0 .../com/google/android/exoplayer2/upstream/cache/CacheSpan.java | 0 .../com/google/android/exoplayer2/upstream/cache/CacheWriter.java | 0 .../google/android/exoplayer2/upstream/cache/CachedContent.java | 0 .../android/exoplayer2/upstream/cache/CachedContentIndex.java | 0 .../google/android/exoplayer2/upstream/cache/ContentMetadata.java | 0 .../exoplayer2/upstream/cache/ContentMetadataMutations.java | 0 .../android/exoplayer2/upstream/cache/DefaultContentMetadata.java | 0 .../exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java | 0 .../android/exoplayer2/upstream/cache/NoOpCacheEvictor.java | 0 .../exoplayer2/upstream/cache/ReusableBufferedOutputStream.java | 0 .../com/google/android/exoplayer2/upstream/cache/SimpleCache.java | 0 .../google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java | 0 .../google/android/exoplayer2/upstream/cache/package-info.java | 0 .../exoplayer2/upstream/cache/CacheDataSourceContractTest.java | 0 .../android/exoplayer2/upstream/cache/CacheDataSourceTest.java | 0 .../android/exoplayer2/upstream/cache/CacheDataSourceTest2.java | 0 .../exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java | 0 .../android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java | 0 .../google/android/exoplayer2/upstream/cache/CacheWriterTest.java | 0 .../android/exoplayer2/upstream/cache/CachedContentIndexTest.java | 0 .../exoplayer2/upstream/cache/DefaultContentMetadataTest.java | 0 .../upstream/cache/LeastRecentlyUsedCacheEvictorTest.java | 0 .../upstream/cache/ReusableBufferedOutputStreamTest.java | 0 .../android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java | 0 .../google/android/exoplayer2/upstream/cache/SimpleCacheTest.java | 0 32 files changed, 0 insertions(+), 0 deletions(-) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java (100%) rename library/{core => common}/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java (100%) rename library/{core => common}/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java (100%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java similarity index 100% rename from library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java rename to library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java diff --git a/library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java b/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java similarity index 100% rename from library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java rename to library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java From 140ef753f7d159d654d7843d05e88a73a7332cfa Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 20 Oct 2021 14:19:38 +0100 Subject: [PATCH 358/441] Move SimpleExoPlayer.Builder logic to ExoPlayer.Builder. SimpleExoPlayer Builder now wraps an ExoPlayer.Builder, rather than the other way round. PiperOrigin-RevId: 404509106 --- .../google/android/exoplayer2/ExoPlayer.java | 156 +++++++++++++---- .../android/exoplayer2/SimpleExoPlayer.java | 165 +++++------------- 2 files changed, 164 insertions(+), 157 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 184c1de246..1605a3e5a3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -15,6 +15,9 @@ */ package com.google.android.exoplayer2; +import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkState; + import android.content.Context; import android.media.AudioTrack; import android.media.MediaCodec; @@ -359,7 +362,34 @@ public interface ExoPlayer extends Player { @SuppressWarnings("deprecation") final class Builder { - private final SimpleExoPlayer.Builder wrappedBuilder; + /* package */ final Context context; + /* package */ final RenderersFactory renderersFactory; + + /* package */ Clock clock; + /* package */ long foregroundModeTimeoutMs; + /* package */ TrackSelector trackSelector; + /* package */ MediaSourceFactory mediaSourceFactory; + /* package */ LoadControl loadControl; + /* package */ BandwidthMeter bandwidthMeter; + /* package */ AnalyticsCollector analyticsCollector; + /* package */ Looper looper; + @Nullable /* package */ PriorityTaskManager priorityTaskManager; + /* package */ AudioAttributes audioAttributes; + /* package */ boolean handleAudioFocus; + @C.WakeMode /* package */ int wakeMode; + /* package */ boolean handleAudioBecomingNoisy; + /* package */ boolean skipSilenceEnabled; + @C.VideoScalingMode /* package */ int videoScalingMode; + @C.VideoChangeFrameRateStrategy /* package */ int videoChangeFrameRateStrategy; + /* package */ boolean useLazyPreparation; + /* package */ SeekParameters seekParameters; + /* package */ long seekBackIncrementMs; + /* package */ long seekForwardIncrementMs; + /* package */ LivePlaybackSpeedControl livePlaybackSpeedControl; + /* package */ long releaseTimeoutMs; + /* package */ long detachSurfaceTimeoutMs; + /* package */ boolean pauseAtEndOfMediaItems; + /* package */ boolean buildCalled; /** * Creates a builder. @@ -404,7 +434,7 @@ public interface ExoPlayer extends Player { * @param context A {@link Context}. */ public Builder(Context context) { - wrappedBuilder = new SimpleExoPlayer.Builder(context); + this(context, new DefaultRenderersFactory(context), new DefaultExtractorsFactory()); } /** @@ -417,7 +447,7 @@ public interface ExoPlayer extends Player { * player. */ public Builder(Context context, RenderersFactory renderersFactory) { - wrappedBuilder = new SimpleExoPlayer.Builder(context, renderersFactory); + this(context, renderersFactory, new DefaultExtractorsFactory()); } /** @@ -430,7 +460,7 @@ public interface ExoPlayer extends Player { * its container. */ public Builder(Context context, ExtractorsFactory extractorsFactory) { - wrappedBuilder = new SimpleExoPlayer.Builder(context, extractorsFactory); + this(context, new DefaultRenderersFactory(context), extractorsFactory); } /** @@ -446,7 +476,14 @@ public interface ExoPlayer extends Player { */ public Builder( Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { - wrappedBuilder = new SimpleExoPlayer.Builder(context, renderersFactory, extractorsFactory); + this( + context, + renderersFactory, + new DefaultTrackSelector(context), + new DefaultMediaSourceFactory(context, extractorsFactory), + new DefaultLoadControl(), + DefaultBandwidthMeter.getSingletonInstance(context), + new AnalyticsCollector(Clock.DEFAULT)); } /** @@ -472,15 +509,26 @@ public interface ExoPlayer extends Player { LoadControl loadControl, BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) { - wrappedBuilder = - new SimpleExoPlayer.Builder( - context, - renderersFactory, - trackSelector, - mediaSourceFactory, - loadControl, - bandwidthMeter, - analyticsCollector); + this.context = context; + this.renderersFactory = renderersFactory; + this.trackSelector = trackSelector; + this.mediaSourceFactory = mediaSourceFactory; + this.loadControl = loadControl; + this.bandwidthMeter = bandwidthMeter; + this.analyticsCollector = analyticsCollector; + looper = Util.getCurrentOrMainLooper(); + audioAttributes = AudioAttributes.DEFAULT; + wakeMode = C.WAKE_MODE_NONE; + videoScalingMode = C.VIDEO_SCALING_MODE_DEFAULT; + videoChangeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS; + useLazyPreparation = true; + seekParameters = SeekParameters.DEFAULT; + seekBackIncrementMs = C.DEFAULT_SEEK_BACK_INCREMENT_MS; + seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; + livePlaybackSpeedControl = new DefaultLivePlaybackSpeedControl.Builder().build(); + clock = Clock.DEFAULT; + releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS; + detachSurfaceTimeoutMs = DEFAULT_DETACH_SURFACE_TIMEOUT_MS; } /** @@ -493,7 +541,8 @@ public interface ExoPlayer extends Player { * @param timeoutMs The time limit in milliseconds. */ public Builder experimentalSetForegroundModeTimeoutMs(long timeoutMs) { - wrappedBuilder.experimentalSetForegroundModeTimeoutMs(timeoutMs); + checkState(!buildCalled); + foregroundModeTimeoutMs = timeoutMs; return this; } @@ -505,7 +554,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setTrackSelector(TrackSelector trackSelector) { - wrappedBuilder.setTrackSelector(trackSelector); + checkState(!buildCalled); + this.trackSelector = trackSelector; return this; } @@ -517,7 +567,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { - wrappedBuilder.setMediaSourceFactory(mediaSourceFactory); + checkState(!buildCalled); + this.mediaSourceFactory = mediaSourceFactory; return this; } @@ -529,7 +580,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLoadControl(LoadControl loadControl) { - wrappedBuilder.setLoadControl(loadControl); + checkState(!buildCalled); + this.loadControl = loadControl; return this; } @@ -541,7 +593,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { - wrappedBuilder.setBandwidthMeter(bandwidthMeter); + checkState(!buildCalled); + this.bandwidthMeter = bandwidthMeter; return this; } @@ -554,7 +607,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLooper(Looper looper) { - wrappedBuilder.setLooper(looper); + checkState(!buildCalled); + this.looper = looper; return this; } @@ -566,7 +620,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { - wrappedBuilder.setAnalyticsCollector(analyticsCollector); + checkState(!buildCalled); + this.analyticsCollector = analyticsCollector; return this; } @@ -580,7 +635,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { - wrappedBuilder.setPriorityTaskManager(priorityTaskManager); + checkState(!buildCalled); + this.priorityTaskManager = priorityTaskManager; return this; } @@ -598,7 +654,9 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { - wrappedBuilder.setAudioAttributes(audioAttributes, handleAudioFocus); + checkState(!buildCalled); + this.audioAttributes = audioAttributes; + this.handleAudioFocus = handleAudioFocus; return this; } @@ -620,7 +678,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setWakeMode(@C.WakeMode int wakeMode) { - wrappedBuilder.setWakeMode(wakeMode); + checkState(!buildCalled); + this.wakeMode = wakeMode; return this; } @@ -636,7 +695,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { - wrappedBuilder.setHandleAudioBecomingNoisy(handleAudioBecomingNoisy); + checkState(!buildCalled); + this.handleAudioBecomingNoisy = handleAudioBecomingNoisy; return this; } @@ -648,7 +708,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { - wrappedBuilder.setSkipSilenceEnabled(skipSilenceEnabled); + checkState(!buildCalled); + this.skipSilenceEnabled = skipSilenceEnabled; return this; } @@ -663,7 +724,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { - wrappedBuilder.setVideoScalingMode(videoScalingMode); + checkState(!buildCalled); + this.videoScalingMode = videoScalingMode; return this; } @@ -683,7 +745,8 @@ public interface ExoPlayer extends Player { */ public Builder setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { - wrappedBuilder.setVideoChangeFrameRateStrategy(videoChangeFrameRateStrategy); + checkState(!buildCalled); + this.videoChangeFrameRateStrategy = videoChangeFrameRateStrategy; return this; } @@ -699,7 +762,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setUseLazyPreparation(boolean useLazyPreparation) { - wrappedBuilder.setUseLazyPreparation(useLazyPreparation); + checkState(!buildCalled); + this.useLazyPreparation = useLazyPreparation; return this; } @@ -711,7 +775,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekParameters(SeekParameters seekParameters) { - wrappedBuilder.setSeekParameters(seekParameters); + checkState(!buildCalled); + this.seekParameters = seekParameters; return this; } @@ -724,7 +789,9 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { - wrappedBuilder.setSeekBackIncrementMs(seekBackIncrementMs); + checkArgument(seekBackIncrementMs > 0); + checkState(!buildCalled); + this.seekBackIncrementMs = seekBackIncrementMs; return this; } @@ -737,7 +804,9 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { - wrappedBuilder.setSeekForwardIncrementMs(seekForwardIncrementMs); + checkArgument(seekForwardIncrementMs > 0); + checkState(!buildCalled); + this.seekForwardIncrementMs = seekForwardIncrementMs; return this; } @@ -753,7 +822,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { - wrappedBuilder.setReleaseTimeoutMs(releaseTimeoutMs); + checkState(!buildCalled); + this.releaseTimeoutMs = releaseTimeoutMs; return this; } @@ -769,7 +839,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { - wrappedBuilder.setDetachSurfaceTimeoutMs(detachSurfaceTimeoutMs); + checkState(!buildCalled); + this.detachSurfaceTimeoutMs = detachSurfaceTimeoutMs; return this; } @@ -786,7 +857,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { - wrappedBuilder.setPauseAtEndOfMediaItems(pauseAtEndOfMediaItems); + checkState(!buildCalled); + this.pauseAtEndOfMediaItems = pauseAtEndOfMediaItems; return this; } @@ -799,7 +871,8 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If {@link #build()} has already been called. */ public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { - wrappedBuilder.setLivePlaybackSpeedControl(livePlaybackSpeedControl); + checkState(!buildCalled); + this.livePlaybackSpeedControl = livePlaybackSpeedControl; return this; } @@ -813,7 +886,8 @@ public interface ExoPlayer extends Player { */ @VisibleForTesting public Builder setClock(Clock clock) { - wrappedBuilder.setClock(clock); + checkState(!buildCalled); + this.clock = clock; return this; } @@ -823,7 +897,13 @@ public interface ExoPlayer extends Player { * @throws IllegalStateException If this method has already been called. */ public ExoPlayer build() { - return wrappedBuilder.build(); + return buildSimpleExoPlayer(); + } + + /* package */ SimpleExoPlayer buildSimpleExoPlayer() { + checkState(!buildCalled); + buildCalled = true; + return new SimpleExoPlayer(/* builder= */ this); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index c39a2e7ab0..f247b20ebe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -28,7 +28,6 @@ import static com.google.android.exoplayer2.Renderer.MSG_SET_SKIP_SILENCE_ENABLE import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.Renderer.MSG_SET_VOLUME; -import static com.google.android.exoplayer2.util.Assertions.checkArgument; import android.content.Context; import android.graphics.Rect; @@ -53,23 +52,19 @@ import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataOutput; -import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextOutput; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; @@ -102,51 +97,24 @@ public class SimpleExoPlayer extends BasePlayer @SuppressWarnings("deprecation") public static final class Builder { - private final Context context; - private final RenderersFactory renderersFactory; - - private Clock clock; - private long foregroundModeTimeoutMs; - private TrackSelector trackSelector; - private MediaSourceFactory mediaSourceFactory; - private LoadControl loadControl; - private BandwidthMeter bandwidthMeter; - private AnalyticsCollector analyticsCollector; - private Looper looper; - @Nullable private PriorityTaskManager priorityTaskManager; - private AudioAttributes audioAttributes; - private boolean handleAudioFocus; - @C.WakeMode private int wakeMode; - private boolean handleAudioBecomingNoisy; - private boolean skipSilenceEnabled; - @C.VideoScalingMode private int videoScalingMode; - @C.VideoChangeFrameRateStrategy private int videoChangeFrameRateStrategy; - private boolean useLazyPreparation; - private SeekParameters seekParameters; - private long seekBackIncrementMs; - private long seekForwardIncrementMs; - private LivePlaybackSpeedControl livePlaybackSpeedControl; - private long releaseTimeoutMs; - private long detachSurfaceTimeoutMs; - private boolean pauseAtEndOfMediaItems; - private boolean buildCalled; + private final ExoPlayer.Builder wrappedBuilder; /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context)} instead. */ @Deprecated public Builder(Context context) { - this(context, new DefaultRenderersFactory(context), new DefaultExtractorsFactory()); + wrappedBuilder = new ExoPlayer.Builder(context); } /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory)} instead. */ @Deprecated public Builder(Context context, RenderersFactory renderersFactory) { - this(context, renderersFactory, new DefaultExtractorsFactory()); + wrappedBuilder = new ExoPlayer.Builder(context, renderersFactory); } /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context, ExtractorsFactory)} instead. */ @Deprecated public Builder(Context context, ExtractorsFactory extractorsFactory) { - this(context, new DefaultRenderersFactory(context), extractorsFactory); + wrappedBuilder = new ExoPlayer.Builder(context, extractorsFactory); } /** @@ -156,14 +124,7 @@ public class SimpleExoPlayer extends BasePlayer @Deprecated public Builder( Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { - this( - context, - renderersFactory, - new DefaultTrackSelector(context), - new DefaultMediaSourceFactory(context, extractorsFactory), - new DefaultLoadControl(), - DefaultBandwidthMeter.getSingletonInstance(context), - new AnalyticsCollector(Clock.DEFAULT)); + wrappedBuilder = new ExoPlayer.Builder(context, renderersFactory, extractorsFactory); } /** @@ -179,26 +140,15 @@ public class SimpleExoPlayer extends BasePlayer LoadControl loadControl, BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) { - this.context = context; - this.renderersFactory = renderersFactory; - this.trackSelector = trackSelector; - this.mediaSourceFactory = mediaSourceFactory; - this.loadControl = loadControl; - this.bandwidthMeter = bandwidthMeter; - this.analyticsCollector = analyticsCollector; - looper = Util.getCurrentOrMainLooper(); - audioAttributes = AudioAttributes.DEFAULT; - wakeMode = C.WAKE_MODE_NONE; - videoScalingMode = C.VIDEO_SCALING_MODE_DEFAULT; - videoChangeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS; - useLazyPreparation = true; - seekParameters = SeekParameters.DEFAULT; - seekBackIncrementMs = C.DEFAULT_SEEK_BACK_INCREMENT_MS; - seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; - livePlaybackSpeedControl = new DefaultLivePlaybackSpeedControl.Builder().build(); - clock = Clock.DEFAULT; - releaseTimeoutMs = DEFAULT_RELEASE_TIMEOUT_MS; - detachSurfaceTimeoutMs = DEFAULT_DETACH_SURFACE_TIMEOUT_MS; + wrappedBuilder = + new ExoPlayer.Builder( + context, + renderersFactory, + trackSelector, + mediaSourceFactory, + loadControl, + bandwidthMeter, + analyticsCollector); } /** @@ -207,16 +157,14 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder experimentalSetForegroundModeTimeoutMs(long timeoutMs) { - Assertions.checkState(!buildCalled); - foregroundModeTimeoutMs = timeoutMs; + wrappedBuilder.experimentalSetForegroundModeTimeoutMs(timeoutMs); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setTrackSelector(TrackSelector)} instead. */ @Deprecated public Builder setTrackSelector(TrackSelector trackSelector) { - Assertions.checkState(!buildCalled); - this.trackSelector = trackSelector; + wrappedBuilder.setTrackSelector(trackSelector); return this; } @@ -225,32 +173,28 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { - Assertions.checkState(!buildCalled); - this.mediaSourceFactory = mediaSourceFactory; + wrappedBuilder.setMediaSourceFactory(mediaSourceFactory); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setLoadControl(LoadControl)} instead. */ @Deprecated public Builder setLoadControl(LoadControl loadControl) { - Assertions.checkState(!buildCalled); - this.loadControl = loadControl; + wrappedBuilder.setLoadControl(loadControl); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setBandwidthMeter(BandwidthMeter)} instead. */ @Deprecated public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { - Assertions.checkState(!buildCalled); - this.bandwidthMeter = bandwidthMeter; + wrappedBuilder.setBandwidthMeter(bandwidthMeter); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setLooper(Looper)} instead. */ @Deprecated public Builder setLooper(Looper looper) { - Assertions.checkState(!buildCalled); - this.looper = looper; + wrappedBuilder.setLooper(looper); return this; } @@ -259,8 +203,7 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { - Assertions.checkState(!buildCalled); - this.analyticsCollector = analyticsCollector; + wrappedBuilder.setAnalyticsCollector(analyticsCollector); return this; } @@ -270,8 +213,7 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager) { - Assertions.checkState(!buildCalled); - this.priorityTaskManager = priorityTaskManager; + wrappedBuilder.setPriorityTaskManager(priorityTaskManager); return this; } @@ -281,41 +223,35 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { - Assertions.checkState(!buildCalled); - this.audioAttributes = audioAttributes; - this.handleAudioFocus = handleAudioFocus; + wrappedBuilder.setAudioAttributes(audioAttributes, handleAudioFocus); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setWakeMode(int)} instead. */ @Deprecated public Builder setWakeMode(@C.WakeMode int wakeMode) { - Assertions.checkState(!buildCalled); - this.wakeMode = wakeMode; + wrappedBuilder.setWakeMode(wakeMode); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setHandleAudioBecomingNoisy(boolean)} instead. */ @Deprecated public Builder setHandleAudioBecomingNoisy(boolean handleAudioBecomingNoisy) { - Assertions.checkState(!buildCalled); - this.handleAudioBecomingNoisy = handleAudioBecomingNoisy; + wrappedBuilder.setHandleAudioBecomingNoisy(handleAudioBecomingNoisy); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setSkipSilenceEnabled(boolean)} instead. */ @Deprecated public Builder setSkipSilenceEnabled(boolean skipSilenceEnabled) { - Assertions.checkState(!buildCalled); - this.skipSilenceEnabled = skipSilenceEnabled; + wrappedBuilder.setSkipSilenceEnabled(skipSilenceEnabled); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setVideoScalingMode(int)} instead. */ @Deprecated public Builder setVideoScalingMode(@C.VideoScalingMode int videoScalingMode) { - Assertions.checkState(!buildCalled); - this.videoScalingMode = videoScalingMode; + wrappedBuilder.setVideoScalingMode(videoScalingMode); return this; } @@ -323,66 +259,56 @@ public class SimpleExoPlayer extends BasePlayer @Deprecated public Builder setVideoChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy) { - Assertions.checkState(!buildCalled); - this.videoChangeFrameRateStrategy = videoChangeFrameRateStrategy; + wrappedBuilder.setVideoChangeFrameRateStrategy(videoChangeFrameRateStrategy); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setUseLazyPreparation(boolean)} instead. */ @Deprecated public Builder setUseLazyPreparation(boolean useLazyPreparation) { - Assertions.checkState(!buildCalled); - this.useLazyPreparation = useLazyPreparation; + wrappedBuilder.setUseLazyPreparation(useLazyPreparation); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setSeekParameters(SeekParameters)} instead. */ @Deprecated public Builder setSeekParameters(SeekParameters seekParameters) { - Assertions.checkState(!buildCalled); - this.seekParameters = seekParameters; + wrappedBuilder.setSeekParameters(seekParameters); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setSeekBackIncrementMs(long)} instead. */ @Deprecated public Builder setSeekBackIncrementMs(@IntRange(from = 1) long seekBackIncrementMs) { - checkArgument(seekBackIncrementMs > 0); - Assertions.checkState(!buildCalled); - this.seekBackIncrementMs = seekBackIncrementMs; + wrappedBuilder.setSeekBackIncrementMs(seekBackIncrementMs); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setSeekForwardIncrementMs(long)} instead. */ @Deprecated public Builder setSeekForwardIncrementMs(@IntRange(from = 1) long seekForwardIncrementMs) { - checkArgument(seekForwardIncrementMs > 0); - Assertions.checkState(!buildCalled); - this.seekForwardIncrementMs = seekForwardIncrementMs; + wrappedBuilder.setSeekForwardIncrementMs(seekForwardIncrementMs); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setReleaseTimeoutMs(long)} instead. */ @Deprecated public Builder setReleaseTimeoutMs(long releaseTimeoutMs) { - Assertions.checkState(!buildCalled); - this.releaseTimeoutMs = releaseTimeoutMs; + wrappedBuilder.setReleaseTimeoutMs(releaseTimeoutMs); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setDetachSurfaceTimeoutMs(long)} instead. */ @Deprecated public Builder setDetachSurfaceTimeoutMs(long detachSurfaceTimeoutMs) { - Assertions.checkState(!buildCalled); - this.detachSurfaceTimeoutMs = detachSurfaceTimeoutMs; + wrappedBuilder.setDetachSurfaceTimeoutMs(detachSurfaceTimeoutMs); return this; } /** @deprecated Use {@link ExoPlayer.Builder#setPauseAtEndOfMediaItems(boolean)} instead. */ @Deprecated public Builder setPauseAtEndOfMediaItems(boolean pauseAtEndOfMediaItems) { - Assertions.checkState(!buildCalled); - this.pauseAtEndOfMediaItems = pauseAtEndOfMediaItems; + wrappedBuilder.setPauseAtEndOfMediaItems(pauseAtEndOfMediaItems); return this; } @@ -392,8 +318,7 @@ public class SimpleExoPlayer extends BasePlayer */ @Deprecated public Builder setLivePlaybackSpeedControl(LivePlaybackSpeedControl livePlaybackSpeedControl) { - Assertions.checkState(!buildCalled); - this.livePlaybackSpeedControl = livePlaybackSpeedControl; + wrappedBuilder.setLivePlaybackSpeedControl(livePlaybackSpeedControl); return this; } @@ -401,17 +326,14 @@ public class SimpleExoPlayer extends BasePlayer @Deprecated @VisibleForTesting public Builder setClock(Clock clock) { - Assertions.checkState(!buildCalled); - this.clock = clock; + wrappedBuilder.setClock(clock); return this; } /** @deprecated Use {@link ExoPlayer.Builder#build()} instead. */ @Deprecated public SimpleExoPlayer build() { - Assertions.checkState(!buildCalled); - buildCalled = true; - return new SimpleExoPlayer(/* builder= */ this); + return wrappedBuilder.buildSimpleExoPlayer(); } } @@ -463,7 +385,7 @@ public class SimpleExoPlayer extends BasePlayer private DeviceInfo deviceInfo; private VideoSize videoSize; - /** @deprecated Use the {@link Builder} and pass it to {@link #SimpleExoPlayer(Builder)}. */ + /** @deprecated Use the {@link ExoPlayer.Builder}. */ @Deprecated @SuppressWarnings("deprecation") protected SimpleExoPlayer( @@ -478,7 +400,7 @@ public class SimpleExoPlayer extends BasePlayer Clock clock, Looper applicationLooper) { this( - new Builder(context, renderersFactory) + new ExoPlayer.Builder(context, renderersFactory) .setTrackSelector(trackSelector) .setMediaSourceFactory(mediaSourceFactory) .setLoadControl(loadControl) @@ -490,8 +412,13 @@ public class SimpleExoPlayer extends BasePlayer } /** @param builder The {@link Builder} to obtain all construction parameters. */ - @SuppressWarnings("deprecation") protected SimpleExoPlayer(Builder builder) { + this(builder.wrappedBuilder); + } + + /** @param builder The {@link ExoPlayer.Builder} to obtain all construction parameters. */ + @SuppressWarnings("deprecation") + /* package */ SimpleExoPlayer(ExoPlayer.Builder builder) { constructorFinished = new ConditionVariable(); try { applicationContext = builder.context.getApplicationContext(); From bbe2cef7405c7f0017bce9ba7424c741435aa786 Mon Sep 17 00:00:00 2001 From: christosts Date: Thu, 21 Oct 2021 00:31:04 +0100 Subject: [PATCH 359/441] DefaultMediaSourceFactory: Lazily load media source factories Th purpose of this change is to speed up the instantiation of the DefaultMediaSourceFactory. PiperOrigin-RevId: 404665352 --- .../source/DefaultMediaSourceFactory.java | 300 +++++++++++++----- 1 file changed, 216 insertions(+), 84 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 8630628b2d..a98b8f4a1b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -15,10 +15,11 @@ */ package com.google.android.exoplayer2.source; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; import android.content.Context; -import android.util.SparseArray; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; @@ -44,14 +45,19 @@ import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; +import com.google.common.primitives.Ints; import java.io.IOException; -import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; +import org.checkerframework.checker.nullness.compatqual.NullableType; /** * The default {@link MediaSourceFactory} implementation. @@ -111,8 +117,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { private static final String TAG = "DefaultMediaSourceFactory"; private final DataSource.Factory dataSourceFactory; - private final SparseArray mediaSourceFactories; - @C.ContentType private final int[] supportedTypes; + private final DelegateFactoryLoader delegateFactoryLoader; @Nullable private AdsLoaderProvider adsLoaderProvider; @Nullable private AdViewProvider adViewProvider; @@ -165,11 +170,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { public DefaultMediaSourceFactory( DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { this.dataSourceFactory = dataSourceFactory; - mediaSourceFactories = loadDelegates(dataSourceFactory, extractorsFactory); - supportedTypes = new int[mediaSourceFactories.size()]; - for (int i = 0; i < mediaSourceFactories.size(); i++) { - supportedTypes[i] = mediaSourceFactories.keyAt(i); - } + delegateFactoryLoader = new DelegateFactoryLoader(dataSourceFactory, extractorsFactory); liveTargetOffsetMs = C.TIME_UNSET; liveMinOffsetMs = C.TIME_UNSET; liveMaxOffsetMs = C.TIME_UNSET; @@ -278,41 +279,30 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { return this; } - @SuppressWarnings("deprecation") // Calling through to the same deprecated method. @Override public DefaultMediaSourceFactory setDrmHttpDataSourceFactory( @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setDrmHttpDataSourceFactory(drmHttpDataSourceFactory); - } + delegateFactoryLoader.setDrmHttpDataSourceFactory(drmHttpDataSourceFactory); return this; } - @SuppressWarnings("deprecation") // Calling through to the same deprecated method. @Override public DefaultMediaSourceFactory setDrmUserAgent(@Nullable String userAgent) { - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setDrmUserAgent(userAgent); - } + delegateFactoryLoader.setDrmUserAgent(userAgent); return this; } - @SuppressWarnings("deprecation") // Calling through to the same deprecated method. @Override public DefaultMediaSourceFactory setDrmSessionManager( @Nullable DrmSessionManager drmSessionManager) { - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setDrmSessionManager(drmSessionManager); - } + delegateFactoryLoader.setDrmSessionManager(drmSessionManager); return this; } @Override public DefaultMediaSourceFactory setDrmSessionManagerProvider( @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setDrmSessionManagerProvider(drmSessionManagerProvider); - } + delegateFactoryLoader.setDrmSessionManagerProvider(drmSessionManagerProvider); return this; } @@ -320,9 +310,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { public DefaultMediaSourceFactory setLoadErrorHandlingPolicy( @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); - } + delegateFactoryLoader.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); return this; } @@ -334,26 +322,25 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { @Deprecated @Override public DefaultMediaSourceFactory setStreamKeys(@Nullable List streamKeys) { - for (int i = 0; i < mediaSourceFactories.size(); i++) { - mediaSourceFactories.valueAt(i).setStreamKeys(streamKeys); - } + delegateFactoryLoader.setStreamKeys(streamKeys); return this; } @Override public int[] getSupportedTypes() { - return Arrays.copyOf(supportedTypes, supportedTypes.length); + return delegateFactoryLoader.getSupportedTypes(); } @Override public MediaSource createMediaSource(MediaItem mediaItem) { - Assertions.checkNotNull(mediaItem.localConfiguration); + checkNotNull(mediaItem.localConfiguration); @C.ContentType int type = Util.inferContentTypeForUriAndMimeType( mediaItem.localConfiguration.uri, mediaItem.localConfiguration.mimeType); - @Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(type); - Assertions.checkNotNull( + @Nullable + MediaSourceFactory mediaSourceFactory = delegateFactoryLoader.getMediaSourceFactory(type); + checkStateNotNull( mediaSourceFactory, "No suitable media source factory found for content type: " + type); MediaItem.LiveConfiguration.Builder liveConfigurationBuilder = @@ -433,22 +420,22 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } return new ClippingMediaSource( mediaSource, - C.msToUs(mediaItem.clippingConfiguration.startPositionMs), - C.msToUs(mediaItem.clippingConfiguration.endPositionMs), + Util.msToUs(mediaItem.clippingConfiguration.startPositionMs), + Util.msToUs(mediaItem.clippingConfiguration.endPositionMs), /* enableInitialDiscontinuity= */ !mediaItem.clippingConfiguration.startsAtKeyFrame, /* allowDynamicClippingUpdates= */ mediaItem.clippingConfiguration.relativeToLiveWindow, mediaItem.clippingConfiguration.relativeToDefaultPosition); } private MediaSource maybeWrapWithAdsMediaSource(MediaItem mediaItem, MediaSource mediaSource) { - Assertions.checkNotNull(mediaItem.localConfiguration); + checkNotNull(mediaItem.localConfiguration); @Nullable MediaItem.AdsConfiguration adsConfiguration = mediaItem.localConfiguration.adsConfiguration; if (adsConfiguration == null) { return mediaSource; } - AdsLoaderProvider adsLoaderProvider = this.adsLoaderProvider; - AdViewProvider adViewProvider = this.adViewProvider; + @Nullable AdsLoaderProvider adsLoaderProvider = this.adsLoaderProvider; + @Nullable AdViewProvider adViewProvider = this.adViewProvider; if (adsLoaderProvider == null || adViewProvider == null) { Log.w( TAG, @@ -473,51 +460,181 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { adViewProvider); } - private static SparseArray loadDelegates( - DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { - SparseArray factories = new SparseArray<>(); - try { - Class factoryClazz = - Class.forName("com.google.android.exoplayer2.source.dash.DashMediaSource$Factory") - .asSubclass(MediaSourceFactory.class); - factories.put( - C.TYPE_DASH, - factoryClazz.getConstructor(DataSource.Factory.class).newInstance(dataSourceFactory)); - } catch (Exception e) { - // Expected if the app was built without the dash module. + /** Loads media source factories lazily. */ + private static final class DelegateFactoryLoader { + private final DataSource.Factory dataSourceFactory; + private final ExtractorsFactory extractorsFactory; + private final Map> + mediaSourceFactorySuppliers; + private final Set supportedTypes; + private final Map mediaSourceFactories; + + @Nullable private HttpDataSource.Factory drmHttpDataSourceFactory; + @Nullable private String userAgent; + @Nullable private DrmSessionManager drmSessionManager; + @Nullable private DrmSessionManagerProvider drmSessionManagerProvider; + @Nullable private LoadErrorHandlingPolicy loadErrorHandlingPolicy; + @Nullable private List streamKeys; + + public DelegateFactoryLoader( + DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { + this.dataSourceFactory = dataSourceFactory; + this.extractorsFactory = extractorsFactory; + mediaSourceFactorySuppliers = new HashMap<>(); + supportedTypes = new HashSet<>(); + mediaSourceFactories = new HashMap<>(); } - try { - Class factoryClazz = - Class.forName( - "com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory") - .asSubclass(MediaSourceFactory.class); - factories.put( - C.TYPE_SS, - factoryClazz.getConstructor(DataSource.Factory.class).newInstance(dataSourceFactory)); - } catch (Exception e) { - // Expected if the app was built without the smoothstreaming module. + + @C.ContentType + public int[] getSupportedTypes() { + ensureAllSuppliersAreLoaded(); + return Ints.toArray(supportedTypes); } - try { - Class factoryClazz = - Class.forName("com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory") - .asSubclass(MediaSourceFactory.class); - factories.put( - C.TYPE_HLS, - factoryClazz.getConstructor(DataSource.Factory.class).newInstance(dataSourceFactory)); - } catch (Exception e) { - // Expected if the app was built without the hls module. + + @SuppressWarnings("deprecation") // Forwarding to deprecated methods. + @Nullable + public MediaSourceFactory getMediaSourceFactory(@C.ContentType int contentType) { + @Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(contentType); + if (mediaSourceFactory != null) { + return mediaSourceFactory; + } + @Nullable + Supplier mediaSourceFactorySupplier = maybeLoadSupplier(contentType); + if (mediaSourceFactorySupplier == null) { + return null; + } + + mediaSourceFactory = mediaSourceFactorySupplier.get(); + if (drmHttpDataSourceFactory != null) { + mediaSourceFactory.setDrmHttpDataSourceFactory(drmHttpDataSourceFactory); + } + if (userAgent != null) { + mediaSourceFactory.setDrmUserAgent(userAgent); + } + if (drmSessionManager != null) { + mediaSourceFactory.setDrmSessionManager(drmSessionManager); + } + if (drmSessionManagerProvider != null) { + mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); + } + if (loadErrorHandlingPolicy != null) { + mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); + } + if (streamKeys != null) { + mediaSourceFactory.setStreamKeys(streamKeys); + } + mediaSourceFactories.put(contentType, mediaSourceFactory); + return mediaSourceFactory; } - try { - Class factoryClazz = - Class.forName("com.google.android.exoplayer2.source.rtsp.RtspMediaSource$Factory") - .asSubclass(MediaSourceFactory.class); - factories.put(C.TYPE_RTSP, factoryClazz.getConstructor().newInstance()); - } catch (Exception e) { - // Expected if the app was built without the RTSP module. + + @SuppressWarnings("deprecation") // Forwarding to deprecated method. + public void setDrmHttpDataSourceFactory( + @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { + this.drmHttpDataSourceFactory = drmHttpDataSourceFactory; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setDrmHttpDataSourceFactory(drmHttpDataSourceFactory); + } + } + + @SuppressWarnings("deprecation") // Forwarding to deprecated method. + public void setDrmUserAgent(@Nullable String userAgent) { + this.userAgent = userAgent; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setDrmUserAgent(userAgent); + } + } + + @SuppressWarnings("deprecation") // Forwarding to deprecated method. + public void setDrmSessionManager(@Nullable DrmSessionManager drmSessionManager) { + this.drmSessionManager = drmSessionManager; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setDrmSessionManager(drmSessionManager); + } + } + + public void setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + this.drmSessionManagerProvider = drmSessionManagerProvider; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setDrmSessionManagerProvider(drmSessionManagerProvider); + } + } + + public void setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); + } + } + + @SuppressWarnings("deprecation") // Forwarding to deprecated method. + public void setStreamKeys(@Nullable List streamKeys) { + this.streamKeys = streamKeys; + for (MediaSourceFactory mediaSourceFactory : mediaSourceFactories.values()) { + mediaSourceFactory.setStreamKeys(streamKeys); + } + } + + private void ensureAllSuppliersAreLoaded() { + maybeLoadSupplier(C.TYPE_DASH); + maybeLoadSupplier(C.TYPE_SS); + maybeLoadSupplier(C.TYPE_HLS); + maybeLoadSupplier(C.TYPE_RTSP); + maybeLoadSupplier(C.TYPE_OTHER); + } + + @Nullable + private Supplier maybeLoadSupplier(@C.ContentType int contentType) { + if (mediaSourceFactorySuppliers.containsKey(contentType)) { + return mediaSourceFactorySuppliers.get(contentType); + } + + @Nullable Supplier mediaSourceFactorySupplier = null; + try { + Class clazz; + switch (contentType) { + case C.TYPE_DASH: + clazz = + Class.forName("com.google.android.exoplayer2.source.dash.DashMediaSource$Factory") + .asSubclass(MediaSourceFactory.class); + mediaSourceFactorySupplier = () -> newInstance(clazz, dataSourceFactory); + break; + case C.TYPE_SS: + clazz = + Class.forName( + "com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory") + .asSubclass(MediaSourceFactory.class); + mediaSourceFactorySupplier = () -> newInstance(clazz, dataSourceFactory); + break; + case C.TYPE_HLS: + clazz = + Class.forName("com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory") + .asSubclass(MediaSourceFactory.class); + mediaSourceFactorySupplier = () -> newInstance(clazz, dataSourceFactory); + break; + case C.TYPE_RTSP: + clazz = + Class.forName("com.google.android.exoplayer2.source.rtsp.RtspMediaSource$Factory") + .asSubclass(MediaSourceFactory.class); + mediaSourceFactorySupplier = () -> newInstance(clazz); + break; + case C.TYPE_OTHER: + mediaSourceFactorySupplier = + () -> new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory); + break; + default: + // Do nothing. + } + } catch (ClassNotFoundException e) { + // Expected if the app was built without the specific module. + } + mediaSourceFactorySuppliers.put(contentType, mediaSourceFactorySupplier); + if (mediaSourceFactorySupplier != null) { + supportedTypes.add(contentType); + } + return mediaSourceFactorySupplier; } - factories.put( - C.TYPE_OTHER, new ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)); - return factories; } private static final class UnknownSubtitlesExtractor implements Extractor { @@ -555,11 +672,26 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { } @Override - public void seek(long position, long timeUs) { - return; - } + public void seek(long position, long timeUs) {} @Override public void release() {} } + + private static MediaSourceFactory newInstance( + Class clazz, DataSource.Factory dataSourceFactory) { + try { + return clazz.getConstructor(DataSource.Factory.class).newInstance(dataSourceFactory); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private static MediaSourceFactory newInstance(Class clazz) { + try { + return clazz.getConstructor().newInstance(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } } From bffe2f7bb3f98c453fe9a38ed62443421007ec73 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 21 Oct 2021 13:09:55 +0100 Subject: [PATCH 360/441] Fix 2 ErrorProneStyle findings: * @Reason is not a TYPE_USE annotation, so should appear before any modifiers and after Javadocs. (see go/java-style#s4.8.5-annotations) * Curly braces should be used for inline Javadoc tags: {@code ...} (see http://go/bugpattern/InvalidInlineTag) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL looks good? Just LGTM and Approve it! This CL doesn’t look good? This is what you can do: * Revert this CL, by replying "REVERT: " * File a bug under go/error-prone-bug for category ErrorProneStyle if the change looks generally problematic. * Revert this CL and not get a CL that cleans up these paths in the future by replying "BLOCKLIST: ". This is not reversible! We recommend to opt out the respective paths in your CL Robot configuration instead: go/clrobot-opt-out. This CL was generated by CL Robot - a tool that cleans up code findings (go/clrobot). The affected code paths have been enabled for CL Robot in //depot/google3/java/com/google/android/libraries/media/METADATA which is reachable following include_presubmits from //depot/google3/third_party/java_src/android_libs/media/METADATA. Anything wrong with the signup? File a bug at go/clrobot-bug. #codehealth PiperOrigin-RevId: 404769260 --- .../google/android/exoplayer2/source/ClippingMediaSource.java | 2 +- .../google/android/exoplayer2/source/SinglePeriodTimeline.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java index 1a9ad2dae9..b81d222221 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java @@ -57,7 +57,7 @@ public final class ClippingMediaSource extends CompositeMediaSource { public static final int REASON_START_EXCEEDS_END = 2; /** The reason clipping failed. */ - public final @Reason int reason; + @Reason public final int reason; /** @param reason The reason clipping failed. */ public IllegalClippingException(@Reason int reason) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SinglePeriodTimeline.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SinglePeriodTimeline.java index 142bc13755..105b59de83 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SinglePeriodTimeline.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SinglePeriodTimeline.java @@ -147,7 +147,7 @@ public final class SinglePeriodTimeline extends Timeline { * @param isDynamic Whether the window may change when the timeline is updated. * @param useLiveConfiguration Whether the window is live and {@link MediaItem#liveConfiguration} * is used to configure live playback behaviour. - * @param manifest The manifest. May be (@code null}. + * @param manifest The manifest. May be {@code null}. * @param mediaItem A media item used for {@link Timeline.Window#mediaItem}. */ public SinglePeriodTimeline( From ce17f6189989a431d4761a034d2211b3d698c09a Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 21 Oct 2021 17:18:46 +0100 Subject: [PATCH 361/441] Add decoder module PiperOrigin-RevId: 404810682 --- core_settings.gradle | 2 + extensions/av1/build.gradle | 2 + extensions/ffmpeg/build.gradle | 2 + extensions/flac/build.gradle | 2 + extensions/opus/build.gradle | 2 + extensions/vp9/build.gradle | 2 + library/all/build.gradle | 3 ++ library/core/build.gradle | 2 + library/decoder/README.md | 11 +++++ library/decoder/build.gradle | 47 +++++++++++++++++++ library/decoder/src/main/AndroidManifest.xml | 19 ++++++++ .../android/exoplayer2/decoder/Buffer.java | 0 .../exoplayer2/decoder/CryptoConfig.java | 0 .../exoplayer2/decoder/CryptoException.java | 0 .../exoplayer2/decoder/CryptoInfo.java | 0 .../android/exoplayer2/decoder/Decoder.java | 0 .../exoplayer2/decoder/DecoderException.java | 0 .../decoder/DecoderInputBuffer.java | 0 .../exoplayer2/decoder/OutputBuffer.java | 0 .../exoplayer2/decoder/SimpleDecoder.java | 0 .../decoder/SimpleOutputBuffer.java | 0 .../exoplayer2/decoder/package-info.java | 0 library/decoder/src/test/AndroidManifest.xml | 19 ++++++++ .../exoplayer2/decoder/CryptoInfoTest.java | 0 .../decoder/DecoderInputBufferTest.java | 0 library/extractor/build.gradle | 2 + 26 files changed, 115 insertions(+) create mode 100644 library/decoder/README.md create mode 100644 library/decoder/build.gradle create mode 100644 library/decoder/src/main/AndroidManifest.xml rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java (100%) rename library/{common => decoder}/src/main/java/com/google/android/exoplayer2/decoder/package-info.java (100%) create mode 100644 library/decoder/src/test/AndroidManifest.xml rename library/{common => decoder}/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java (100%) rename library/{common => decoder}/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java (100%) diff --git a/core_settings.gradle b/core_settings.gradle index 06a4327aa7..8224ac9588 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -42,6 +42,8 @@ project(modulePrefix + 'library-transformer').projectDir = new File(rootDir, 'li include modulePrefix + 'library-ui' project(modulePrefix + 'library-ui').projectDir = new File(rootDir, 'library/ui') +include modulePrefix + 'library-decoder' +project(modulePrefix + 'library-decoder').projectDir = new File(rootDir, 'library/decoder') include modulePrefix + 'extension-av1' project(modulePrefix + 'extension-av1').projectDir = new File(rootDir, 'extensions/av1') include modulePrefix + 'extension-ffmpeg' diff --git a/extensions/av1/build.gradle b/extensions/av1/build.gradle index d7c6243c3b..9378f08d3f 100644 --- a/extensions/av1/build.gradle +++ b/extensions/av1/build.gradle @@ -44,6 +44,8 @@ if (project.file('src/main/jni/libgav1').exists()) { } dependencies { + implementation project(modulePrefix + 'library-decoder') + // TODO(b/203752526): Remove this dependency. implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/ffmpeg/build.gradle b/extensions/ffmpeg/build.gradle index a9edeaff6b..3bdf0a7600 100644 --- a/extensions/ffmpeg/build.gradle +++ b/extensions/ffmpeg/build.gradle @@ -21,6 +21,8 @@ if (project.file('src/main/jni/ffmpeg').exists()) { } dependencies { + implementation project(modulePrefix + 'library-decoder') + // TODO(b/203752526): Remove this dependency. implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion diff --git a/extensions/flac/build.gradle b/extensions/flac/build.gradle index 9aeeb83eb3..4f20bd24ee 100644 --- a/extensions/flac/build.gradle +++ b/extensions/flac/build.gradle @@ -24,6 +24,8 @@ android { } dependencies { + implementation project(modulePrefix + 'library-decoder') + // TODO(b/203752526): Remove this dependency. implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion diff --git a/extensions/opus/build.gradle b/extensions/opus/build.gradle index ba670037f6..7939292938 100644 --- a/extensions/opus/build.gradle +++ b/extensions/opus/build.gradle @@ -24,6 +24,8 @@ android { } dependencies { + implementation project(modulePrefix + 'library-decoder') + // TODO(b/203752526): Remove this dependency. implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/vp9/build.gradle b/extensions/vp9/build.gradle index 79d85a6ac5..4d5629837c 100644 --- a/extensions/vp9/build.gradle +++ b/extensions/vp9/build.gradle @@ -24,6 +24,8 @@ android { } dependencies { + implementation project(modulePrefix + 'library-decoder') + // TODO(b/203752526): Remove this dependency. implementation project(modulePrefix + 'library-core') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/library/all/build.gradle b/library/all/build.gradle index 4ec8373e2f..965cdc11c4 100644 --- a/library/all/build.gradle +++ b/library/all/build.gradle @@ -14,6 +14,9 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { + api project(modulePrefix + 'library-common') + api project(modulePrefix + 'library-decoder') + api project(modulePrefix + 'library-extractor') api project(modulePrefix + 'library-core') api project(modulePrefix + 'library-dash') api project(modulePrefix + 'library-hls') diff --git a/library/core/build.gradle b/library/core/build.gradle index 4aa74cc439..7d848f9ab5 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -36,6 +36,8 @@ android { dependencies { api project(modulePrefix + 'library-common') + // TODO(b/203754886): Revisit which modules are exported as API dependencies. + api project(modulePrefix + 'library-decoder') api project(modulePrefix + 'library-extractor') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion implementation 'androidx.core:core:' + androidxCoreVersion diff --git a/library/decoder/README.md b/library/decoder/README.md new file mode 100644 index 0000000000..7524b959d4 --- /dev/null +++ b/library/decoder/README.md @@ -0,0 +1,11 @@ +# Decoder module + +Provides a decoder abstraction. Application code will not normally need to +depend on this module directly. + +## Links + +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.decoder.*` belong to this + module. + +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/decoder/build.gradle b/library/decoder/build.gradle new file mode 100644 index 0000000000..48d8054c22 --- /dev/null +++ b/library/decoder/build.gradle @@ -0,0 +1,47 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" + +android { + defaultConfig { + multiDexEnabled true + } + + buildTypes { + debug { + testCoverageEnabled = true + } + } +} + +dependencies { + implementation project(modulePrefix + 'library-common') + implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion + compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion + testImplementation 'androidx.test:core:' + androidxTestCoreVersion + testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion + testImplementation 'com.google.truth:truth:' + truthVersion + testImplementation 'org.robolectric:robolectric:' + robolectricVersion +} + +ext { + javadocTitle = 'Decoder module' +} +apply from: '../../javadoc_library.gradle' + +ext { + releaseArtifactId = 'exoplayer-decoder' + releaseDescription = 'The ExoPlayer library decoder module.' +} +apply from: '../../publish.gradle' diff --git a/library/decoder/src/main/AndroidManifest.xml b/library/decoder/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..66cfd433a3 --- /dev/null +++ b/library/decoder/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Buffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoConfig.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoException.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/CryptoInfo.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/Decoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderException.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/decoder/package-info.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/decoder/package-info.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/package-info.java diff --git a/library/decoder/src/test/AndroidManifest.xml b/library/decoder/src/test/AndroidManifest.xml new file mode 100644 index 0000000000..66cfd433a3 --- /dev/null +++ b/library/decoder/src/test/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/library/common/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java b/library/decoder/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java rename to library/decoder/src/test/java/com/google/android/exoplayer2/decoder/CryptoInfoTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java b/library/decoder/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java rename to library/decoder/src/test/java/com/google/android/exoplayer2/decoder/DecoderInputBufferTest.java diff --git a/library/extractor/build.gradle b/library/extractor/build.gradle index a82da78c2d..839d13c38a 100644 --- a/library/extractor/build.gradle +++ b/library/extractor/build.gradle @@ -26,6 +26,8 @@ android { dependencies { implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion implementation project(modulePrefix + 'library-common') + // TODO(b/203752187): Remove this dependency. + implementation project(modulePrefix + 'library-decoder') compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion From 5e26ba8238f890cc5fe18f0d28a83613f798df03 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 21 Oct 2021 20:17:03 +0100 Subject: [PATCH 362/441] Restructure core_settings PiperOrigin-RevId: 404851976 --- core_settings.gradle | 55 +++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/core_settings.gradle b/core_settings.gradle index 8224ac9588..3002d134fb 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -21,26 +21,42 @@ if (gradle.ext.has('exoplayerModulePrefix')) { modulePrefix += gradle.ext.exoplayerModulePrefix } -include modulePrefix + 'library' -project(modulePrefix + 'library').projectDir = new File(rootDir, 'library/all') include modulePrefix + 'library-common' project(modulePrefix + 'library-common').projectDir = new File(rootDir, 'library/common') + +include modulePrefix + 'extension-mediasession' +project(modulePrefix + 'extension-mediasession').projectDir = new File(rootDir, 'extensions/mediasession') +include modulePrefix + 'extension-media2' +project(modulePrefix + 'extension-media2').projectDir = new File(rootDir, 'extensions/media2') + include modulePrefix + 'library-core' project(modulePrefix + 'library-core').projectDir = new File(rootDir, 'library/core') +include modulePrefix + 'library' +project(modulePrefix + 'library').projectDir = new File(rootDir, 'library/all') include modulePrefix + 'library-dash' project(modulePrefix + 'library-dash').projectDir = new File(rootDir, 'library/dash') -include modulePrefix + 'library-extractor' -project(modulePrefix + 'library-extractor').projectDir = new File(rootDir, 'library/extractor') include modulePrefix + 'library-hls' project(modulePrefix + 'library-hls').projectDir = new File(rootDir, 'library/hls') include modulePrefix + 'library-rtsp' project(modulePrefix + 'library-rtsp').projectDir = new File(rootDir, 'library/rtsp') include modulePrefix + 'library-smoothstreaming' project(modulePrefix + 'library-smoothstreaming').projectDir = new File(rootDir, 'library/smoothstreaming') -include modulePrefix + 'library-transformer' -project(modulePrefix + 'library-transformer').projectDir = new File(rootDir, 'library/transformer') +include modulePrefix + 'extension-ima' +project(modulePrefix + 'extension-ima').projectDir = new File(rootDir, 'extensions/ima') +include modulePrefix + 'extension-workmanager' +project(modulePrefix + 'extension-workmanager').projectDir = new File(rootDir, 'extensions/workmanager') + include modulePrefix + 'library-ui' project(modulePrefix + 'library-ui').projectDir = new File(rootDir, 'library/ui') +include modulePrefix + 'extension-leanback' +project(modulePrefix + 'extension-leanback').projectDir = new File(rootDir, 'extensions/leanback') + +include modulePrefix + 'extension-cronet' +project(modulePrefix + 'extension-cronet').projectDir = new File(rootDir, 'extensions/cronet') +include modulePrefix + 'extension-rtmp' +project(modulePrefix + 'extension-rtmp').projectDir = new File(rootDir, 'extensions/rtmp') +include modulePrefix + 'extension-okhttp' +project(modulePrefix + 'extension-okhttp').projectDir = new File(rootDir, 'extensions/okhttp') include modulePrefix + 'library-decoder' project(modulePrefix + 'library-decoder').projectDir = new File(rootDir, 'library/decoder') @@ -50,28 +66,19 @@ include modulePrefix + 'extension-ffmpeg' project(modulePrefix + 'extension-ffmpeg').projectDir = new File(rootDir, 'extensions/ffmpeg') include modulePrefix + 'extension-flac' project(modulePrefix + 'extension-flac').projectDir = new File(rootDir, 'extensions/flac') -include modulePrefix + 'extension-ima' -project(modulePrefix + 'extension-ima').projectDir = new File(rootDir, 'extensions/ima') -include modulePrefix + 'extension-cast' -project(modulePrefix + 'extension-cast').projectDir = new File(rootDir, 'extensions/cast') -include modulePrefix + 'extension-cronet' -project(modulePrefix + 'extension-cronet').projectDir = new File(rootDir, 'extensions/cronet') -include modulePrefix + 'extension-mediasession' -project(modulePrefix + 'extension-mediasession').projectDir = new File(rootDir, 'extensions/mediasession') -include modulePrefix + 'extension-media2' -project(modulePrefix + 'extension-media2').projectDir = new File(rootDir, 'extensions/media2') -include modulePrefix + 'extension-okhttp' -project(modulePrefix + 'extension-okhttp').projectDir = new File(rootDir, 'extensions/okhttp') include modulePrefix + 'extension-opus' project(modulePrefix + 'extension-opus').projectDir = new File(rootDir, 'extensions/opus') include modulePrefix + 'extension-vp9' project(modulePrefix + 'extension-vp9').projectDir = new File(rootDir, 'extensions/vp9') -include modulePrefix + 'extension-rtmp' -project(modulePrefix + 'extension-rtmp').projectDir = new File(rootDir, 'extensions/rtmp') -include modulePrefix + 'extension-leanback' -project(modulePrefix + 'extension-leanback').projectDir = new File(rootDir, 'extensions/leanback') -include modulePrefix + 'extension-workmanager' -project(modulePrefix + 'extension-workmanager').projectDir = new File(rootDir, 'extensions/workmanager') + +include modulePrefix + 'library-extractor' +project(modulePrefix + 'library-extractor').projectDir = new File(rootDir, 'library/extractor') + +include modulePrefix + 'extension-cast' +project(modulePrefix + 'extension-cast').projectDir = new File(rootDir, 'extensions/cast') + +include modulePrefix + 'library-transformer' +project(modulePrefix + 'library-transformer').projectDir = new File(rootDir, 'library/transformer') include modulePrefix + 'robolectricutils' project(modulePrefix + 'robolectricutils').projectDir = new File(rootDir, 'robolectricutils') From 37b58476810f9e5fd6b06a70ce9976a77243de23 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 21 Oct 2021 22:08:25 +0100 Subject: [PATCH 363/441] Get decoder buffers into the right place PiperOrigin-RevId: 404876228 --- extensions/av1/proguard-rules.txt | 2 +- .../exoplayer2/ext/av1/Gav1Decoder.java | 15 +++--- .../ext/av1/Libgav1VideoRenderer.java | 2 +- extensions/av1/src/main/jni/gav1_jni.cc | 2 +- .../ext/ffmpeg/FfmpegAudioDecoder.java | 12 ++--- .../ext/ffmpeg/FfmpegVideoRenderer.java | 6 +-- .../exoplayer2/ext/flac/FlacDecoder.java | 12 ++--- extensions/opus/proguard-rules.txt | 2 +- .../exoplayer2/ext/opus/OpusDecoder.java | 16 +++--- extensions/opus/src/main/jni/opus_jni.cc | 2 +- extensions/vp9/proguard-rules.txt | 2 +- .../ext/vp9/LibvpxVideoRenderer.java | 2 +- .../exoplayer2/ext/vp9/VpxDecoder.java | 15 +++--- extensions/vp9/src/main/jni/vpx_jni.cc | 2 +- .../audio/DecoderAudioRenderer.java | 10 ++-- .../video/DecoderVideoRenderer.java | 9 ++-- .../video/VideoDecoderGLSurfaceView.java | 1 + .../video/VideoDecoderInputBuffer.java | 54 ------------------- .../VideoDecoderOutputBufferRenderer.java | 2 + .../audio/DecoderAudioRendererTest.java | 12 ++--- .../video/DecoderVideoRendererTest.java | 16 +++--- .../decoder/DecoderInputBuffer.java | 4 ++ ...utBuffer.java => DecoderOutputBuffer.java} | 4 +- .../exoplayer2/decoder/SimpleDecoder.java | 2 +- ...er.java => SimpleDecoderOutputBuffer.java} | 6 +-- .../decoder}/VideoDecoderOutputBuffer.java | 5 +- .../exoplayer2/text/SubtitleOutputBuffer.java | 4 +- 27 files changed, 86 insertions(+), 135 deletions(-) delete mode 100644 library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderInputBuffer.java rename library/decoder/src/main/java/com/google/android/exoplayer2/decoder/{OutputBuffer.java => DecoderOutputBuffer.java} (91%) rename library/decoder/src/main/java/com/google/android/exoplayer2/decoder/{SimpleOutputBuffer.java => SimpleDecoderOutputBuffer.java} (88%) rename library/{core/src/main/java/com/google/android/exoplayer2/video => decoder/src/main/java/com/google/android/exoplayer2/decoder}/VideoDecoderOutputBuffer.java (97%) diff --git a/extensions/av1/proguard-rules.txt b/extensions/av1/proguard-rules.txt index c4ef2286f2..ee6ca93e97 100644 --- a/extensions/av1/proguard-rules.txt +++ b/extensions/av1/proguard-rules.txt @@ -6,6 +6,6 @@ } # Some members of this class are being accessed from native methods. Keep them unobfuscated. --keep class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer { +-keep class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer { *; } diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java index 9e31bd6ef5..63bc16d97e 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Gav1Decoder.java @@ -24,15 +24,14 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; -import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import java.nio.ByteBuffer; /** Gav1 decoder. */ @VisibleForTesting(otherwise = PACKAGE_PRIVATE) public final class Gav1Decoder - extends SimpleDecoder { + extends SimpleDecoder { private static final int GAV1_ERROR = 0; private static final int GAV1_OK = 1; @@ -56,9 +55,7 @@ public final class Gav1Decoder public Gav1Decoder( int numInputBuffers, int numOutputBuffers, int initialInputBufferSize, int threads) throws Gav1DecoderException { - super( - new VideoDecoderInputBuffer[numInputBuffers], - new VideoDecoderOutputBuffer[numOutputBuffers]); + super(new DecoderInputBuffer[numInputBuffers], new VideoDecoderOutputBuffer[numOutputBuffers]); if (!Gav1Library.isAvailable()) { throw new Gav1DecoderException("Failed to load decoder native library."); } @@ -86,8 +83,8 @@ public final class Gav1Decoder } @Override - protected VideoDecoderInputBuffer createInputBuffer() { - return new VideoDecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + protected DecoderInputBuffer createInputBuffer() { + return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); } @Override @@ -98,7 +95,7 @@ public final class Gav1Decoder @Override @Nullable protected Gav1DecoderException decode( - VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { ByteBuffer inputData = Util.castNonNull(inputBuffer.data); int inputSize = inputData.limit(); if (gav1Decode(gav1DecoderContext, inputData, inputSize) == GAV1_ERROR) { diff --git a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java index fc7d6b6091..443f1d1e7c 100644 --- a/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java +++ b/extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java @@ -25,11 +25,11 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.DecoderVideoRenderer; -import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.video.VideoRendererEventListener; /** Decodes and renders video using libgav1 decoder. */ diff --git a/extensions/av1/src/main/jni/gav1_jni.cc b/extensions/av1/src/main/jni/gav1_jni.cc index d2f6532fac..ebce9c9b5a 100644 --- a/extensions/av1/src/main/jni/gav1_jni.cc +++ b/extensions/av1/src/main/jni/gav1_jni.cc @@ -537,7 +537,7 @@ DECODER_FUNC(jlong, gav1Init, jint threads) { // Populate JNI References. const jclass outputBufferClass = env->FindClass( - "com/google/android/exoplayer2/video/VideoDecoderOutputBuffer"); + "com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer"); context->decoder_private_field = env->GetFieldID(outputBufferClass, "decoderPrivate", "I"); context->output_mode_field = env->GetFieldID(outputBufferClass, "mode", "I"); diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java index 5ab47293c3..b042c36a10 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioDecoder.java @@ -20,7 +20,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; @@ -30,7 +30,7 @@ import java.util.List; /** FFmpeg audio decoder. */ /* package */ final class FfmpegAudioDecoder - extends SimpleDecoder { + extends SimpleDecoder { // Output buffer sizes when decoding PCM mu-law streams, which is the maximum FFmpeg outputs. private static final int OUTPUT_BUFFER_SIZE_16BIT = 65536; @@ -56,7 +56,7 @@ import java.util.List; int initialInputBufferSize, boolean outputFloat) throws FfmpegDecoderException { - super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]); + super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]); if (!FfmpegLibrary.isAvailable()) { throw new FfmpegDecoderException("Failed to load decoder native libraries."); } @@ -86,8 +86,8 @@ import java.util.List; } @Override - protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this::releaseOutputBuffer); + protected SimpleDecoderOutputBuffer createOutputBuffer() { + return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer); } @Override @@ -98,7 +98,7 @@ import java.util.List; @Override @Nullable protected FfmpegDecoderException decode( - DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) { if (reset) { nativeContext = ffmpegReset(nativeContext, extraData); if (nativeContext == 0) { diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java index 7cffc3d6c4..e074b87a21 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java @@ -27,12 +27,12 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.Decoder; +import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.DecoderVideoRenderer; -import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; -import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.video.VideoRendererEventListener; // TODO: Remove the NOTE below. @@ -94,7 +94,7 @@ public final class FfmpegVideoRenderer extends DecoderVideoRenderer { @SuppressWarnings("nullness:return") @Override - protected Decoder + protected Decoder createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws FfmpegDecoderException { TraceUtil.beginSection("createFfmpegVideoDecoder"); diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java index f6c5f6a6a7..f2ac5f40e8 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoder.java @@ -23,7 +23,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.extractor.FlacStreamMetadata; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -33,7 +33,7 @@ import java.util.List; /** Flac decoder. */ @VisibleForTesting(otherwise = PACKAGE_PRIVATE) public final class FlacDecoder - extends SimpleDecoder { + extends SimpleDecoder { private final FlacStreamMetadata streamMetadata; private final FlacDecoderJni decoderJni; @@ -55,7 +55,7 @@ public final class FlacDecoder int maxInputBufferSize, List initializationData) throws FlacDecoderException { - super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]); + super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]); if (initializationData.size() != 1) { throw new FlacDecoderException("Initialization data must be of length 1"); } @@ -86,8 +86,8 @@ public final class FlacDecoder } @Override - protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this::releaseOutputBuffer); + protected SimpleDecoderOutputBuffer createOutputBuffer() { + return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer); } @Override @@ -98,7 +98,7 @@ public final class FlacDecoder @Override @Nullable protected FlacDecoderException decode( - DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) { if (reset) { decoderJni.flush(); } diff --git a/extensions/opus/proguard-rules.txt b/extensions/opus/proguard-rules.txt index 2a380e23dd..89eea5ffdc 100644 --- a/extensions/opus/proguard-rules.txt +++ b/extensions/opus/proguard-rules.txt @@ -6,6 +6,6 @@ } # Some members of this class are being accessed from native methods. Keep them unobfuscated. --keep class com.google.android.exoplayer2.decoder.SimpleOutputBuffer { +-keep class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer { *; } diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index 2cea08df14..56617b7d13 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -26,7 +26,7 @@ import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; @@ -35,7 +35,7 @@ import java.util.List; /** Opus decoder. */ @VisibleForTesting(otherwise = PACKAGE_PRIVATE) public final class OpusDecoder - extends SimpleDecoder { + extends SimpleDecoder { private static final int NO_ERROR = 0; private static final int DECODE_ERROR = -1; @@ -73,7 +73,7 @@ public final class OpusDecoder @Nullable CryptoConfig cryptoConfig, boolean outputFloat) throws OpusDecoderException { - super(new DecoderInputBuffer[numInputBuffers], new SimpleOutputBuffer[numOutputBuffers]); + super(new DecoderInputBuffer[numInputBuffers], new SimpleDecoderOutputBuffer[numOutputBuffers]); if (!OpusLibrary.isAvailable()) { throw new OpusDecoderException("Failed to load decoder native libraries"); } @@ -147,8 +147,8 @@ public final class OpusDecoder } @Override - protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this::releaseOutputBuffer); + protected SimpleDecoderOutputBuffer createOutputBuffer() { + return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer); } @Override @@ -159,7 +159,7 @@ public final class OpusDecoder @Override @Nullable protected OpusDecoderException decode( - DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) { if (reset) { opusReset(nativeDecoderContext); // When seeking to 0, skip number of samples as specified in opus header. When seeking to @@ -239,14 +239,14 @@ public final class OpusDecoder long timeUs, ByteBuffer inputBuffer, int inputSize, - SimpleOutputBuffer outputBuffer); + SimpleDecoderOutputBuffer outputBuffer); private native int opusSecureDecode( long decoder, long timeUs, ByteBuffer inputBuffer, int inputSize, - SimpleOutputBuffer outputBuffer, + SimpleDecoderOutputBuffer outputBuffer, int sampleRate, @Nullable CryptoConfig mediaCrypto, int inputMode, diff --git a/extensions/opus/src/main/jni/opus_jni.cc b/extensions/opus/src/main/jni/opus_jni.cc index 96c2838039..49b7675f97 100644 --- a/extensions/opus/src/main/jni/opus_jni.cc +++ b/extensions/opus/src/main/jni/opus_jni.cc @@ -87,7 +87,7 @@ DECODER_FUNC(jlong, opusInit, jint sampleRate, jint channelCount, // Populate JNI References. const jclass outputBufferClass = env->FindClass( - "com/google/android/exoplayer2/decoder/SimpleOutputBuffer"); + "com/google/android/exoplayer2/decoder/SimpleDecoderOutputBuffer"); outputBufferInit = env->GetMethodID(outputBufferClass, "init", "(JI)Ljava/nio/ByteBuffer;"); diff --git a/extensions/vp9/proguard-rules.txt b/extensions/vp9/proguard-rules.txt index 56fca12d19..db074ae7a2 100644 --- a/extensions/vp9/proguard-rules.txt +++ b/extensions/vp9/proguard-rules.txt @@ -6,7 +6,7 @@ } # Some members of this class are being accessed from native methods. Keep them unobfuscated. --keep class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer { +-keep class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer { *; } diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index 218b3b779e..6edf129ff5 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -26,10 +26,10 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.video.DecoderVideoRenderer; -import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.video.VideoRendererEventListener; /** Decodes and renders video using the native VP9 decoder. */ diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index 78b9c96e37..47b51e37ca 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -26,16 +26,15 @@ import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; -import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import java.nio.ByteBuffer; /** Vpx decoder. */ @VisibleForTesting(otherwise = PACKAGE_PRIVATE) public final class VpxDecoder - extends SimpleDecoder { + extends SimpleDecoder { // These constants should match the codes returned from vpxDecode and vpxSecureDecode functions in // https://github.com/google/ExoPlayer/blob/release-v2/extensions/vp9/src/main/jni/vpx_jni.cc. @@ -68,9 +67,7 @@ public final class VpxDecoder @Nullable CryptoConfig cryptoConfig, int threads) throws VpxDecoderException { - super( - new VideoDecoderInputBuffer[numInputBuffers], - new VideoDecoderOutputBuffer[numOutputBuffers]); + super(new DecoderInputBuffer[numInputBuffers], new VideoDecoderOutputBuffer[numOutputBuffers]); if (!VpxLibrary.isAvailable()) { throw new VpxDecoderException("Failed to load decoder native libraries."); } @@ -92,8 +89,8 @@ public final class VpxDecoder } @Override - protected VideoDecoderInputBuffer createInputBuffer() { - return new VideoDecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); + protected DecoderInputBuffer createInputBuffer() { + return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); } @Override @@ -119,7 +116,7 @@ public final class VpxDecoder @Override @Nullable protected VpxDecoderException decode( - VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { if (reset && lastSupplementalData != null) { // Don't propagate supplemental data across calls to flush the decoder. lastSupplementalData.clear(); diff --git a/extensions/vp9/src/main/jni/vpx_jni.cc b/extensions/vp9/src/main/jni/vpx_jni.cc index 3f4c89dc7b..eca4cd6721 100644 --- a/extensions/vp9/src/main/jni/vpx_jni.cc +++ b/extensions/vp9/src/main/jni/vpx_jni.cc @@ -479,7 +479,7 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter, // Populate JNI References. const jclass outputBufferClass = env->FindClass( - "com/google/android/exoplayer2/video/VideoDecoderOutputBuffer"); + "com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer"); initForYuvFrame = env->GetMethodID(outputBufferClass, "initForYuvFrame", "(IIIII)Z"); initForPrivateFrame = diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index ed97f09d3f..b6aa1eaf6d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -44,7 +44,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; @@ -82,7 +82,10 @@ import java.lang.annotation.RetentionPolicy; */ public abstract class DecoderAudioRenderer< T extends - Decoder> + Decoder< + DecoderInputBuffer, + ? extends SimpleDecoderOutputBuffer, + ? extends DecoderException>> extends BaseRenderer implements MediaClock { private static final String TAG = "DecoderAudioRenderer"; @@ -124,7 +127,7 @@ public abstract class DecoderAudioRenderer< @Nullable private T decoder; @Nullable private DecoderInputBuffer inputBuffer; - @Nullable private SimpleOutputBuffer outputBuffer; + @Nullable private SimpleDecoderOutputBuffer outputBuffer; @Nullable private DrmSession decoderDrmSession; @Nullable private DrmSession sourceDrmSession; @@ -456,6 +459,7 @@ public abstract class DecoderAudioRenderer< return false; } inputBuffer.flip(); + inputBuffer.format = inputFormat; onQueueInputBuffer(inputBuffer); decoder.queueInputBuffer(inputBuffer); decoderReceivedBuffers = true; 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 2c64e6c92f..e0e49d478b 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 @@ -42,6 +42,7 @@ import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; @@ -108,10 +109,10 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { @Nullable private Decoder< - VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> + DecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> decoder; - private VideoDecoderInputBuffer inputBuffer; + private DecoderInputBuffer inputBuffer; private VideoDecoderOutputBuffer outputBuffer; @VideoOutputMode private int outputMode; @Nullable private Object output; @@ -415,7 +416,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { * * @param buffer The buffer that will be queued. */ - protected void onQueueInputBuffer(VideoDecoderInputBuffer buffer) { + protected void onQueueInputBuffer(DecoderInputBuffer buffer) { // Do nothing. } @@ -536,7 +537,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { * @throws DecoderException If an error occurred creating a suitable decoder. */ protected abstract Decoder< - VideoDecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> + DecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) throws DecoderException; /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java index f47a76760f..d7d90c5e02 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java @@ -20,6 +20,7 @@ import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.util.AttributeSet; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.GlUtil; import java.nio.ByteBuffer; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderInputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderInputBuffer.java deleted file mode 100644 index c496dbabde..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderInputBuffer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.video; - -import androidx.annotation.Nullable; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.decoder.DecoderInputBuffer; - -/** Input buffer to a video decoder. */ -public class VideoDecoderInputBuffer extends DecoderInputBuffer { - - @Nullable public Format format; - - /** - * Creates a new instance. - * - * @param bufferReplacementMode Determines the behavior of {@link #ensureSpaceForWrite(int)}. One - * of {@link #BUFFER_REPLACEMENT_MODE_DISABLED}, {@link #BUFFER_REPLACEMENT_MODE_NORMAL} and - * {@link #BUFFER_REPLACEMENT_MODE_DIRECT}. - */ - public VideoDecoderInputBuffer(@BufferReplacementMode int bufferReplacementMode) { - super(bufferReplacementMode); - } - - /** - * Creates a new instance. - * - * @param bufferReplacementMode Determines the behavior of {@link #ensureSpaceForWrite(int)}. One - * of {@link #BUFFER_REPLACEMENT_MODE_DISABLED}, {@link #BUFFER_REPLACEMENT_MODE_NORMAL} and - * {@link #BUFFER_REPLACEMENT_MODE_DIRECT}. - * @param paddingSize If non-zero, {@link #ensureSpaceForWrite(int)} will ensure that the buffer - * is this number of bytes larger than the requested length. This can be useful for decoders - * that consume data in fixed size blocks, for efficiency. Setting the padding size to the - * decoder's fixed read size is necessary to prevent such a decoder from trying to read beyond - * the end of the buffer. - */ - public VideoDecoderInputBuffer( - @BufferReplacementMode int bufferReplacementMode, int paddingSize) { - super(bufferReplacementMode, paddingSize); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java index c57794f454..921922f961 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.video; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; + /** Renders the {@link VideoDecoderOutputBuffer}. */ public interface VideoDecoderOutputBufferRenderer { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java index 23161aef05..95bd372aa3 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/DecoderAudioRendererTest.java @@ -34,7 +34,7 @@ import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; -import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; +import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.testutil.FakeSampleStream; @@ -133,10 +133,10 @@ public class DecoderAudioRendererTest { } private static final class FakeDecoder - extends SimpleDecoder { + extends SimpleDecoder { public FakeDecoder() { - super(new DecoderInputBuffer[1], new SimpleOutputBuffer[1]); + super(new DecoderInputBuffer[1], new SimpleDecoderOutputBuffer[1]); } @Override @@ -150,8 +150,8 @@ public class DecoderAudioRendererTest { } @Override - protected SimpleOutputBuffer createOutputBuffer() { - return new SimpleOutputBuffer(this::releaseOutputBuffer); + protected SimpleDecoderOutputBuffer createOutputBuffer() { + return new SimpleDecoderOutputBuffer(this::releaseOutputBuffer); } @Override @@ -161,7 +161,7 @@ public class DecoderAudioRendererTest { @Override protected DecoderException decode( - DecoderInputBuffer inputBuffer, SimpleOutputBuffer outputBuffer, boolean reset) { + DecoderInputBuffer inputBuffer, SimpleDecoderOutputBuffer outputBuffer, boolean reset) { if (inputBuffer.isEndOfStream()) { outputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java index fcaf93bd7e..97a6ccda98 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/video/DecoderVideoRendererTest.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.SimpleDecoder; +import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.testutil.FakeSampleStream; @@ -108,7 +109,7 @@ public final class DecoderVideoRendererTest { } @Override - protected void onQueueInputBuffer(VideoDecoderInputBuffer buffer) { + protected void onQueueInputBuffer(DecoderInputBuffer buffer) { // Decoding is done on a background thread we have no control about from the test. // Ensure the background calls are predictably serialized by waiting for them to finish: // 1. Register queued input buffers here. @@ -125,17 +126,16 @@ public final class DecoderVideoRendererTest { @Override protected SimpleDecoder< - VideoDecoderInputBuffer, + DecoderInputBuffer, ? extends VideoDecoderOutputBuffer, ? extends DecoderException> createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) { return new SimpleDecoder< - VideoDecoderInputBuffer, VideoDecoderOutputBuffer, DecoderException>( - new VideoDecoderInputBuffer[10], new VideoDecoderOutputBuffer[10]) { + DecoderInputBuffer, VideoDecoderOutputBuffer, DecoderException>( + new DecoderInputBuffer[10], new VideoDecoderOutputBuffer[10]) { @Override - protected VideoDecoderInputBuffer createInputBuffer() { - return new VideoDecoderInputBuffer( - DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT) { + protected DecoderInputBuffer createInputBuffer() { + return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT) { @Override public void clear() { super.clear(); @@ -157,7 +157,7 @@ public final class DecoderVideoRendererTest { @Nullable @Override protected DecoderException decode( - VideoDecoderInputBuffer inputBuffer, + DecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { outputBuffer.init(inputBuffer.timeUs, outputMode, /* supplementalData= */ null); diff --git a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java index 71b3a68d19..d10f24184c 100644 --- a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.decoder; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -73,6 +74,9 @@ public class DecoderInputBuffer extends Buffer { /** Allows buffer replacement using {@link ByteBuffer#allocateDirect(int)}. */ public static final int BUFFER_REPLACEMENT_MODE_DIRECT = 2; + /** The {@link Format}. */ + @Nullable public Format format; + /** {@link CryptoInfo} for encrypted data. */ public final CryptoInfo cryptoInfo; diff --git a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderOutputBuffer.java similarity index 91% rename from library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderOutputBuffer.java index bce21cca9c..897f251cc1 100644 --- a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/OutputBuffer.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderOutputBuffer.java @@ -16,10 +16,10 @@ package com.google.android.exoplayer2.decoder; /** Output buffer decoded by a {@link Decoder}. */ -public abstract class OutputBuffer extends Buffer { +public abstract class DecoderOutputBuffer extends Buffer { /** Buffer owner. */ - public interface Owner { + public interface Owner { /** * Releases the buffer. diff --git a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java index 1886cdf9f4..4ac32f685f 100644 --- a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java @@ -27,7 +27,7 @@ import java.util.ArrayDeque; */ @SuppressWarnings("UngroupedOverloads") public abstract class SimpleDecoder< - I extends DecoderInputBuffer, O extends OutputBuffer, E extends DecoderException> + I extends DecoderInputBuffer, O extends DecoderOutputBuffer, E extends DecoderException> implements Decoder { private final Thread decodeThread; diff --git a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoderOutputBuffer.java similarity index 88% rename from library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoderOutputBuffer.java index 81561701e2..cdc3530661 100644 --- a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleOutputBuffer.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoderOutputBuffer.java @@ -20,13 +20,13 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; /** Buffer for {@link SimpleDecoder} output. */ -public class SimpleOutputBuffer extends OutputBuffer { +public class SimpleDecoderOutputBuffer extends DecoderOutputBuffer { - private final Owner owner; + private final Owner owner; @Nullable public ByteBuffer data; - public SimpleOutputBuffer(Owner owner) { + public SimpleDecoderOutputBuffer(Owner owner) { this.owner = owner; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer.java similarity index 97% rename from library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java rename to library/decoder/src/main/java/com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer.java index 0386b7a17c..fde0a73d8b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/VideoDecoderOutputBuffer.java @@ -13,16 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.video; +package com.google.android.exoplayer2.decoder; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.decoder.OutputBuffer; import java.nio.ByteBuffer; /** Video decoder output buffer containing video frame data. */ -public class VideoDecoderOutputBuffer extends OutputBuffer { +public class VideoDecoderOutputBuffer extends DecoderOutputBuffer { public static final int COLORSPACE_UNKNOWN = 0; public static final int COLORSPACE_BT601 = 1; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java index 7d9c8d9c32..898551b84d 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/text/SubtitleOutputBuffer.java @@ -17,12 +17,12 @@ package com.google.android.exoplayer2.text; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.decoder.OutputBuffer; +import com.google.android.exoplayer2.decoder.DecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import java.util.List; /** Base class for {@link SubtitleDecoder} output buffers. */ -public abstract class SubtitleOutputBuffer extends OutputBuffer implements Subtitle { +public abstract class SubtitleOutputBuffer extends DecoderOutputBuffer implements Subtitle { @Nullable private Subtitle subtitle; private long subsampleOffsetUs; From 2ee72076e506af1fd06df1b4e8796e31f534e9c5 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 21 Oct 2021 23:40:40 +0100 Subject: [PATCH 364/441] Add datasource module PiperOrigin-RevId: 404897119 --- core_settings.gradle | 2 + extensions/cronet/build.gradle | 1 + extensions/okhttp/build.gradle | 1 + extensions/rtmp/build.gradle | 1 + library/all/build.gradle | 1 + library/common/build.gradle | 9 --- library/common/proguard-rules.txt | 11 ---- library/core/build.gradle | 1 + library/datasource/README.md | 12 ++++ library/datasource/build.gradle | 65 +++++++++++++++++++ library/datasource/proguard-rules.txt | 12 ++++ .../src/androidTest/AndroidManifest.xml | 6 +- .../ContentDataSourceContractTest.java | 0 .../upstream/ContentDataSourceTest.java | 0 .../RawResourceDataSourceContractTest.java | 2 +- .../src/androidTest/res/raw/resource1 | 0 .../src/androidTest/res/raw/resource2 | 0 .../datasource/src/main/AndroidManifest.xml | 19 ++++++ .../upstream}/AesCipherDataSink.java | 4 +- .../upstream}/AesCipherDataSource.java | 5 +- .../upstream}/AesFlushingCipher.java | 2 +- .../exoplayer2/upstream/AssetDataSource.java | 0 .../exoplayer2/upstream/BaseDataSource.java | 0 .../upstream/ByteArrayDataSink.java | 0 .../upstream/ByteArrayDataSource.java | 0 .../upstream/ContentDataSource.java | 0 .../upstream/DataSchemeDataSource.java | 0 .../android/exoplayer2/upstream/DataSink.java | 0 .../exoplayer2/upstream/DataSource.java | 0 .../upstream/DataSourceException.java | 0 .../upstream/DataSourceInputStream.java | 0 .../exoplayer2/upstream/DataSourceUtil.java | 0 .../android/exoplayer2/upstream/DataSpec.java | 0 .../upstream/DefaultDataSource.java | 0 .../upstream/DefaultDataSourceFactory.java | 0 .../upstream/DefaultHttpDataSource.java | 0 .../exoplayer2/upstream/DummyDataSource.java | 0 .../exoplayer2/upstream/FileDataSource.java | 0 .../exoplayer2/upstream/HttpDataSource.java | 0 .../android/exoplayer2/upstream/HttpUtil.java | 0 .../upstream/PriorityDataSource.java | 0 .../upstream/PriorityDataSourceFactory.java | 0 .../upstream/RawResourceDataSource.java | 0 .../upstream/ResolvingDataSource.java | 0 .../exoplayer2/upstream/StatsDataSource.java | 0 .../exoplayer2/upstream/TeeDataSource.java | 0 .../exoplayer2/upstream/TransferListener.java | 0 .../exoplayer2/upstream/UdpDataSource.java | 0 .../exoplayer2/upstream/cache/Cache.java | 0 .../upstream/cache/CacheDataSink.java | 0 .../upstream/cache/CacheDataSource.java | 0 .../upstream/cache/CacheEvictor.java | 0 .../upstream/cache/CacheFileMetadata.java | 0 .../cache/CacheFileMetadataIndex.java | 0 .../upstream/cache/CacheKeyFactory.java | 0 .../exoplayer2/upstream/cache/CacheSpan.java | 0 .../upstream/cache/CacheWriter.java | 0 .../upstream/cache/CachedContent.java | 0 .../upstream/cache/CachedContentIndex.java | 0 .../upstream/cache/ContentMetadata.java | 0 .../cache/ContentMetadataMutations.java | 0 .../cache/DefaultContentMetadata.java | 0 .../cache/LeastRecentlyUsedCacheEvictor.java | 0 .../upstream/cache/NoOpCacheEvictor.java | 0 .../cache/ReusableBufferedOutputStream.java | 0 .../upstream/cache/SimpleCache.java | 0 .../upstream/cache/SimpleCacheSpan.java | 0 .../upstream/cache/package-info.java | 0 .../exoplayer2/upstream/package-info.java | 0 .../datasource/src/test/AndroidManifest.xml | 19 ++++++ .../upstream}/AesFlushingCipherTest.java | 2 +- .../upstream/AssetDataSourceContractTest.java | 0 .../upstream/AssetDataSourceTest.java | 0 .../upstream/BaseDataSourceTest.java | 0 .../ByteArrayDataSourceContractTest.java | 0 .../upstream/ByteArrayDataSourceTest.java | 0 .../DataSchemeDataSourceContractTest.java | 0 .../upstream/DataSchemeDataSourceTest.java | 0 .../upstream/DataSourceExceptionTest.java | 0 .../upstream/DataSourceInputStreamTest.java | 0 .../exoplayer2/upstream/DataSpecTest.java | 0 .../DefaultHttpDataSourceContractTest.java | 0 .../upstream/DefaultHttpDataSourceTest.java | 0 .../upstream/FileDataSourceContractTest.java | 0 .../exoplayer2/upstream/HttpUtilTest.java | 0 .../ResolvingDataSourceContractTest.java | 0 .../upstream/UdpDataSourceContractTest.java | 0 .../cache/CacheDataSourceContractTest.java | 0 .../upstream/cache/CacheDataSourceTest.java | 0 .../upstream/cache/CacheDataSourceTest2.java | 0 .../cache/CacheFileMetadataIndexTest.java | 0 .../upstream/cache/CacheKeyFactoryTest.java | 0 .../upstream/cache/CacheWriterTest.java | 0 .../cache/CachedContentIndexTest.java | 0 .../cache/DefaultContentMetadataTest.java | 0 .../LeastRecentlyUsedCacheEvictorTest.java | 0 .../ReusableBufferedOutputStreamTest.java | 0 .../upstream/cache/SimpleCacheSpanTest.java | 0 .../upstream/cache/SimpleCacheTest.java | 0 99 files changed, 142 insertions(+), 33 deletions(-) create mode 100644 library/datasource/README.md create mode 100644 library/datasource/build.gradle create mode 100644 library/datasource/proguard-rules.txt rename library/{common => datasource}/src/androidTest/AndroidManifest.xml (86%) rename library/{common => datasource}/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceContractTest.java (100%) rename library/{common => datasource}/src/androidTest/java/com/google/android/exoplayer2/upstream/ContentDataSourceTest.java (100%) rename library/{common => datasource}/src/androidTest/java/com/google/android/exoplayer2/upstream/RawResourceDataSourceContractTest.java (98%) rename library/{common => datasource}/src/androidTest/res/raw/resource1 (100%) rename library/{common => datasource}/src/androidTest/res/raw/resource2 (100%) create mode 100644 library/datasource/src/main/AndroidManifest.xml rename library/{common/src/main/java/com/google/android/exoplayer2/upstream/crypto => datasource/src/main/java/com/google/android/exoplayer2/upstream}/AesCipherDataSink.java (95%) rename library/{common/src/main/java/com/google/android/exoplayer2/upstream/crypto => datasource/src/main/java/com/google/android/exoplayer2/upstream}/AesCipherDataSource.java (91%) rename library/{common/src/main/java/com/google/android/exoplayer2/upstream/crypto => datasource/src/main/java/com/google/android/exoplayer2/upstream}/AesFlushingCipher.java (99%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/BaseDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSourceException.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/HttpUtil.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/TransferListener.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java (100%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/package-info.java (100%) create mode 100644 library/datasource/src/test/AndroidManifest.xml rename library/{common/src/test/java/com/google/android/exoplayer2/upstream/crypto => datasource/src/test/java/com/google/android/exoplayer2/upstream}/AesFlushingCipherTest.java (99%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/BaseDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DataSourceExceptionTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/HttpUtilTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java (100%) rename library/{common => datasource}/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java (100%) diff --git a/core_settings.gradle b/core_settings.gradle index 3002d134fb..1f22196a33 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -51,6 +51,8 @@ project(modulePrefix + 'library-ui').projectDir = new File(rootDir, 'library/ui' include modulePrefix + 'extension-leanback' project(modulePrefix + 'extension-leanback').projectDir = new File(rootDir, 'extensions/leanback') +include modulePrefix + 'library-datasource' +project(modulePrefix + 'library-datasource').projectDir = new File(rootDir, 'library/datasource') include modulePrefix + 'extension-cronet' project(modulePrefix + 'extension-cronet').projectDir = new File(rootDir, 'extensions/cronet') include modulePrefix + 'extension-rtmp' diff --git a/extensions/cronet/build.gradle b/extensions/cronet/build.gradle index 5b806f6f38..6fdba05663 100644 --- a/extensions/cronet/build.gradle +++ b/extensions/cronet/build.gradle @@ -22,6 +22,7 @@ android { dependencies { api "com.google.android.gms:play-services-cronet:17.0.1" implementation project(modulePrefix + 'library-common') + implementation project(modulePrefix + 'library-datasource') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/okhttp/build.gradle b/extensions/okhttp/build.gradle index a8c3c622d2..ba2078e78d 100644 --- a/extensions/okhttp/build.gradle +++ b/extensions/okhttp/build.gradle @@ -17,6 +17,7 @@ android.defaultConfig.minSdkVersion 21 dependencies { implementation project(modulePrefix + 'library-common') + implementation project(modulePrefix + 'library-datasource') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/rtmp/build.gradle b/extensions/rtmp/build.gradle index 7b1e9d244c..b2ff46f80a 100644 --- a/extensions/rtmp/build.gradle +++ b/extensions/rtmp/build.gradle @@ -15,6 +15,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { implementation project(modulePrefix + 'library-common') + implementation project(modulePrefix + 'library-datasource') implementation 'net.butterflytv.utils:rtmp-client:3.1.0' implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/library/all/build.gradle b/library/all/build.gradle index 965cdc11c4..8daf11eea7 100644 --- a/library/all/build.gradle +++ b/library/all/build.gradle @@ -15,6 +15,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { api project(modulePrefix + 'library-common') + api project(modulePrefix + 'library-datasource') api project(modulePrefix + 'library-decoder') api project(modulePrefix + 'library-extractor') api project(modulePrefix + 'library-core') diff --git a/library/common/build.gradle b/library/common/build.gradle index 1a3217fabe..40d6c7c610 100644 --- a/library/common/build.gradle +++ b/library/common/build.gradle @@ -14,19 +14,11 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" android { - defaultConfig { - multiDexEnabled true - } - buildTypes { debug { testCoverageEnabled = true } } - - sourceSets { - androidTest.assets.srcDir '../../testdata/src/test/assets/' - } } dependencies { @@ -56,7 +48,6 @@ dependencies { testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion testImplementation 'junit:junit:' + junitVersion testImplementation 'com.google.truth:truth:' + truthVersion - testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion testImplementation 'org.robolectric:robolectric:' + robolectricVersion testImplementation project(modulePrefix + 'library-core') testImplementation project(modulePrefix + 'testutils') diff --git a/library/common/proguard-rules.txt b/library/common/proguard-rules.txt index 557df0f374..2eb313c45d 100644 --- a/library/common/proguard-rules.txt +++ b/library/common/proguard-rules.txt @@ -1,16 +1,5 @@ # Proguard rules specific to the common module. -# Constant folding for resource integers may mean that a resource passed to this method appears to be unused. Keep the method to prevent this from happening. --keepclassmembers class com.google.android.exoplayer2.upstream.RawResourceDataSource { - public static android.net.Uri buildRawResourceUri(int); -} - -# Constructors accessed via reflection in DefaultDataSource --dontnote com.google.android.exoplayer2.ext.rtmp.RtmpDataSource --keepclassmembers class com.google.android.exoplayer2.ext.rtmp.RtmpDataSource { - (); -} - # Don't warn about checkerframework and Kotlin annotations -dontwarn org.checkerframework.** -dontwarn kotlin.annotations.jvm.** diff --git a/library/core/build.gradle b/library/core/build.gradle index 7d848f9ab5..524948cc1e 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -37,6 +37,7 @@ android { dependencies { api project(modulePrefix + 'library-common') // TODO(b/203754886): Revisit which modules are exported as API dependencies. + api project(modulePrefix + 'library-datasource') api project(modulePrefix + 'library-decoder') api project(modulePrefix + 'library-extractor') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion diff --git a/library/datasource/README.md b/library/datasource/README.md new file mode 100644 index 0000000000..f87be557e9 --- /dev/null +++ b/library/datasource/README.md @@ -0,0 +1,12 @@ +# DataSource module + +Provides a `DataSource` abstraction and a number of concrete implementations for +reading data from different sources. Application code will not normally need to +depend on this module directly. + +## Links + +* [Javadoc][]: Classes matching `com.google.android.exoplayer2.upstream.*` belong to this + module. + +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/datasource/build.gradle b/library/datasource/build.gradle new file mode 100644 index 0000000000..98de23a80e --- /dev/null +++ b/library/datasource/build.gradle @@ -0,0 +1,65 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" + +android { + defaultConfig { + multiDexEnabled true + } + + buildTypes { + debug { + testCoverageEnabled = true + } + } + + sourceSets { + androidTest.assets.srcDir '../../testdata/src/test/assets/' + test.assets.srcDir '../../testdata/src/test/assets/' + } +} + +dependencies { + implementation project(modulePrefix + 'library-common') + implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion + compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version + compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion + compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion + compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion + compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion + androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion + androidTestImplementation 'com.linkedin.dexmaker:dexmaker:' + dexmakerVersion + androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion + androidTestImplementation(project(modulePrefix + 'testutils')) { + exclude module: modulePrefix.substring(1) + 'library-core' + } + testImplementation 'org.mockito:mockito-core:' + mockitoVersion + testImplementation 'androidx.test:core:' + androidxTestCoreVersion + testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion + testImplementation 'com.google.truth:truth:' + truthVersion + testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion + testImplementation 'org.robolectric:robolectric:' + robolectricVersion + testImplementation project(modulePrefix + 'testutils') +} + +ext { + javadocTitle = 'DataSource module' +} +apply from: '../../javadoc_library.gradle' + +ext { + releaseArtifactId = 'exoplayer-datasource' + releaseDescription = 'The ExoPlayer library DataSource module.' +} +apply from: '../../publish.gradle' diff --git a/library/datasource/proguard-rules.txt b/library/datasource/proguard-rules.txt new file mode 100644 index 0000000000..ecdc535689 --- /dev/null +++ b/library/datasource/proguard-rules.txt @@ -0,0 +1,12 @@ +# Proguard rules specific to the DataSource module. + +# Constant folding for resource integers may mean that a resource passed to this method appears to be unused. Keep the method to prevent this from happening. +-keepclassmembers class com.google.android.exoplayer2.upstream.RawResourceDataSource { + public static android.net.Uri buildRawResourceUri(int); +} + +# Constructors accessed via reflection in DefaultDataSource +-dontnote com.google.android.exoplayer2.ext.rtmp.RtmpDataSource +-keepclassmembers class com.google.android.exoplayer2.ext.rtmp.RtmpDataSource { + (); +} diff --git a/library/common/src/androidTest/AndroidManifest.xml b/library/datasource/src/androidTest/AndroidManifest.xml similarity index 86% rename from library/common/src/androidTest/AndroidManifest.xml rename to library/datasource/src/androidTest/AndroidManifest.xml index 15db6a41e0..5edae1db96 100644 --- a/library/common/src/androidTest/AndroidManifest.xml +++ b/library/datasource/src/androidTest/AndroidManifest.xml @@ -1,5 +1,5 @@ - + + + + diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java similarity index 95% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java index 4e5b9f2b8e..5d84485e24 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java @@ -13,14 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.crypto; +package com.google.android.exoplayer2.upstream; import static com.google.android.exoplayer2.util.Util.castNonNull; import static java.lang.Math.min; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.upstream.DataSink; -import com.google.android.exoplayer2.upstream.DataSpec; import java.io.IOException; import javax.crypto.Cipher; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java similarity index 91% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java index 98ec914fa0..77126904bb 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.crypto; +package com.google.android.exoplayer2.upstream; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; @@ -21,9 +21,6 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java similarity index 99% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java index 96cb13604e..5a60a985db 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.crypto; +package com.google.android.exoplayer2.upstream; import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/BaseDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/BaseDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/BaseDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/BaseDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSink.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ByteArrayDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSink.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceException.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceException.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceException.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceException.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceInputStream.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSourceUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSourceFactory.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DummyDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/FileDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpUtil.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpUtil.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/PriorityDataSourceFactory.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ResolvingDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/StatsDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/TeeDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/TransferListener.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/TransferListener.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/TransferListener.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/TransferListener.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/UdpDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/Cache.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSink.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheEvictor.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadata.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndex.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactory.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheSpan.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheWriter.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContent.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadata.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ContentMetadataMutations.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadata.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictor.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/NoOpCacheEvictor.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStream.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/package-info.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/package-info.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/package-info.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/package-info.java diff --git a/library/datasource/src/test/AndroidManifest.xml b/library/datasource/src/test/AndroidManifest.xml new file mode 100644 index 0000000000..173af4332e --- /dev/null +++ b/library/datasource/src/test/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java similarity index 99% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java index 2811b0eada..b6cdb61ba0 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java +++ b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream.crypto; +package com.google.android.exoplayer2.upstream; import static com.google.common.truth.Truth.assertThat; import static java.lang.Math.min; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AssetDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/BaseDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/BaseDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/BaseDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/BaseDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ByteArrayDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceExceptionTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSourceExceptionTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceExceptionTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSourceExceptionTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSourceInputStreamTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DataSpecTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/FileDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/HttpUtilTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/HttpUtilTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/HttpUtilTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/HttpUtilTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/ResolvingDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/UdpDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceContractTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheDataSourceTest2.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheFileMetadataIndexTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheKeyFactoryTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CacheWriterTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/DefaultContentMetadataTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/LeastRecentlyUsedCacheEvictorTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/ReusableBufferedOutputStreamTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpanTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java From 1f3f22a7097d7e3d504cfc9eb846ed1a389b5ccd Mon Sep 17 00:00:00 2001 From: krocard Date: Mon, 25 Oct 2021 11:50:47 +0100 Subject: [PATCH 365/441] Encapsulate TrackSelectionOverrides in its own class The current API exposes an `ImmutableMap` of `TrackGroup` -> `TrackSelectionOverride`. This has several disadvantages: - A difficult to use API for mutation (`ImmutableMap.Builder` doesn't support key removal). - There is no track selection specific methods, how the generic map API mapps to the selection override is not complex but to obvious for a casual reader. - The internal data type is exposed, making internal refactor difficult. This was done to have the API ready as quick as possible. When transitioning the clients to the map API in , it became clear that the map API was too verbose and not mapping to the clients needs, so utility methods were added to make operations clearer and more concise. Nevertheless, having to use utility method to use easily and correctly an API is not the sign of a good API. This cl refactors the track selection API for several improvements: - Add a type `TrackSelectionParameters` that encapsulate the internal data structure (map currently). - For iteration, expose as a list. - Add a `Builder` for easy mutable operations. - Add track selection specific methods to avoid having utilities functions. - Those operations are the same as `DefaultTrackSelector.Parameters` for easier migration. (`setOverride` was renamed to `addOverride`) - Move `TrackSelection` classes outside of `TrackSelectionParameters` as their own top level classes. The migration of the client code is straightforward as most of it were already using the previously mentioned utility functions that are now native methods. The full migration has not been done yet, and is pending on this cl approval. PiperOrigin-RevId: 405362719 --- .../TrackSelectionOverrides.java | 301 ++++++++++++++++++ .../TrackSelectionParameters.java | 144 +-------- .../TrackSelectionOverridesTest.java | 176 ++++++++++ .../TrackSelectionParametersTest.java | 22 +- .../trackselection/DefaultTrackSelector.java | 18 +- .../trackselection/TrackSelectionUtil.java | 73 ----- .../DefaultTrackSelectorTest.java | 26 +- .../ui/StyledPlayerControlView.java | 105 ++++-- 8 files changed, 614 insertions(+), 251 deletions(-) create mode 100644 library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java create mode 100644 library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java new file mode 100644 index 0000000000..65c659cce8 --- /dev/null +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.trackselection; + +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; +import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; +import static java.util.Collections.max; +import static java.util.Collections.min; + +import android.os.Bundle; +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.trackselection.C.TrackType; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.primitives.Ints; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Forces the selection of the specified tracks in {@link TrackGroup TrackGroups}. + * + *

                Each {@link TrackSelectionOverride override} only affects the selection of tracks of that + * {@link TrackType type}. For example overriding the selection of an {@link C#TRACK_TYPE_AUDIO + * audio} {@link TrackGroup} will not affect the selection of {@link C#TRACK_TYPE_VIDEO video} or + * {@link C#TRACK_TYPE_TEXT text} tracks. + * + *

                If multiple {@link TrackGroup TrackGroups} of the same {@link TrackType} are overridden, which + * tracks will be selected depend on the player capabilities. For example, by default {@code + * ExoPlayer} doesn't support selecting more than one {@link TrackGroup} per {@link TrackType}. + * + *

                Overrides of {@link TrackGroup} that are not currently available are ignored. For example, + * when the player transitions to the next {@link MediaItem} in a playlist, any overrides of the + * previous {@link MediaItem} are ignored. + * + * @see TrackSelectionParameters#trackSelectionOverrides + */ +public final class TrackSelectionOverrides implements Bundleable { + + /** Builder for {@link TrackSelectionOverrides}. */ + public static final class Builder { + // Cannot use ImmutableMap.Builder as it doesn't support removing entries. + private final HashMap overrides; + + /** Creates an builder with no {@link TrackSelectionOverride}. */ + public Builder() { + overrides = new HashMap<>(); + } + + private Builder(Map overrides) { + this.overrides = new HashMap<>(overrides); + } + + /** Adds an override for the provided {@link TrackGroup}. */ + public Builder addOverride(TrackSelectionOverride override) { + overrides.put(override.trackGroup, override); + return this; + } + + /** Removes the override associated with the provided {@link TrackGroup} if present. */ + public Builder clearOverride(TrackGroup trackGroup) { + overrides.remove(trackGroup); + return this; + } + + /** Set the override for the type of the provided {@link TrackGroup}. */ + public Builder setOverrideForType(TrackSelectionOverride override) { + clearOverridesOfType(override.getTrackType()); + overrides.put(override.trackGroup, override); + return this; + } + + /** + * Remove any override associated with {@link TrackGroup TrackGroups} of type {@code trackType}. + */ + public Builder clearOverridesOfType(@TrackType int trackType) { + for (Iterator it = overrides.values().iterator(); it.hasNext(); ) { + TrackSelectionOverride trackSelectionOverride = it.next(); + if (trackSelectionOverride.getTrackType() == trackType) { + it.remove(); + } + } + return this; + } + + /** Returns a new {@link TrackSelectionOverrides} instance with the current builder values. */ + public TrackSelectionOverrides build() { + return new TrackSelectionOverrides(overrides); + } + } + + /** + * Forces the selection of {@link #trackIndexes} for a {@link TrackGroup}. + * + *

                If multiple {link #tracks} are overridden, as many as possible will be selected depending on + * the player capabilities. + * + *

                If a {@link TrackSelectionOverride} has no tracks ({@code tracks.isEmpty()}), no tracks will + * be played. This is similar to {@link TrackSelectionParameters#disabledTrackTypes}, except it + * will only affect the playback of the associated {@link TrackGroup}. For example, if the only + * {@link C#TRACK_TYPE_VIDEO} {@link TrackGroup} is associated with no tracks, no video will play + * until the next video starts. + */ + public static final class TrackSelectionOverride implements Bundleable { + + /** The {@link TrackGroup} whose {@link #trackIndexes} are forced to be selected. */ + public final TrackGroup trackGroup; + /** The index of tracks in a {@link TrackGroup} to be selected. */ + public final ImmutableList trackIndexes; + + /** Constructs an instance to force all tracks in {@code trackGroup} to be selected. */ + public TrackSelectionOverride(TrackGroup trackGroup) { + this.trackGroup = trackGroup; + ImmutableList.Builder builder = new ImmutableList.Builder<>(); + for (int i = 0; i < trackGroup.length; i++) { + builder.add(i); + } + this.trackIndexes = builder.build(); + } + + /** + * Constructs an instance to force {@code trackIndexes} in {@code trackGroup} to be selected. + * + * @param trackGroup The {@link TrackGroup} for which to override the track selection. + * @param trackIndexes The indexes of the tracks in the {@link TrackGroup} to select. + */ + public TrackSelectionOverride(TrackGroup trackGroup, List trackIndexes) { + if (!trackIndexes.isEmpty()) { + if (min(trackIndexes) < 0 || max(trackIndexes) >= trackGroup.length) { + throw new IndexOutOfBoundsException(); + } + } + this.trackGroup = trackGroup; + this.trackIndexes = ImmutableList.copyOf(trackIndexes); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + TrackSelectionOverride that = (TrackSelectionOverride) obj; + return trackGroup.equals(that.trackGroup) && trackIndexes.equals(that.trackIndexes); + } + + @Override + public int hashCode() { + return trackGroup.hashCode() + 31 * trackIndexes.hashCode(); + } + + private @TrackType int getTrackType() { + return MimeTypes.getTrackType(trackGroup.getFormat(0).sampleMimeType); + } + + // Bundleable implementation + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_TRACK_GROUP, + FIELD_TRACKS, + }) + private @interface FieldNumber {} + + private static final int FIELD_TRACK_GROUP = 0; + private static final int FIELD_TRACKS = 1; + + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putBundle(keyForField(FIELD_TRACK_GROUP), trackGroup.toBundle()); + bundle.putIntArray(keyForField(FIELD_TRACKS), Ints.toArray(trackIndexes)); + return bundle; + } + + /** Object that can restore {@code TrackSelectionOverride} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + @Nullable Bundle trackGroupBundle = bundle.getBundle(keyForField(FIELD_TRACK_GROUP)); + checkNotNull(trackGroupBundle); // Mandatory as there are no reasonable defaults. + TrackGroup trackGroup = TrackGroup.CREATOR.fromBundle(trackGroupBundle); + @Nullable int[] tracks = bundle.getIntArray(keyForField(FIELD_TRACKS)); + if (tracks == null) { + return new TrackSelectionOverride(trackGroup); + } + return new TrackSelectionOverride(trackGroup, Ints.asList(tracks)); + }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } + } + + /** Empty {@code TrackSelectionOverrides}, where no track selection is overridden. */ + public static final TrackSelectionOverrides EMPTY = + new TrackSelectionOverrides(ImmutableMap.of()); + + private final ImmutableMap overrides; + + private TrackSelectionOverrides(Map overrides) { + this.overrides = ImmutableMap.copyOf(overrides); + } + + /** Returns a {@link Builder} initialized with the values of this instance. */ + public Builder buildUpon() { + return new Builder(overrides); + } + + /** Returns all {@link TrackSelectionOverride} contained. */ + public ImmutableList asList() { + return ImmutableList.copyOf(overrides.values()); + } + + /** + * Returns the {@link TrackSelectionOverride} of the provided {@link TrackGroup} or {@code null} + * if there is none. + */ + @Nullable + public TrackSelectionOverride getOverride(TrackGroup trackGroup) { + return overrides.get(trackGroup); + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + TrackSelectionOverrides that = (TrackSelectionOverrides) obj; + return overrides.equals(that.overrides); + } + + @Override + public int hashCode() { + return overrides.hashCode(); + } + + // Bundleable implementation + + @Documented + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + FIELD_OVERRIDES, + }) + private @interface FieldNumber {} + + private static final int FIELD_OVERRIDES = 0; + + @Override + public Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList( + keyForField(FIELD_OVERRIDES), toBundleArrayList(overrides.values())); + return bundle; + } + + /** Object that can restore {@code TrackSelectionOverrides} from a {@link Bundle}. */ + public static final Creator CREATOR = + bundle -> { + List trackSelectionOverrides = + fromBundleNullableList( + TrackSelectionOverride.CREATOR, + bundle.getParcelableArrayList(keyForField(FIELD_OVERRIDES)), + ImmutableList.of()); + ImmutableMap.Builder builder = + new ImmutableMap.Builder<>(); + for (int i = 0; i < trackSelectionOverrides.size(); i++) { + TrackSelectionOverride trackSelectionOverride = trackSelectionOverrides.get(i); + builder.put(trackSelectionOverride.trackGroup, trackSelectionOverride); + } + return new TrackSelectionOverrides(builder.build()); + }; + + private static String keyForField(@FieldNumber int field) { + return Integer.toString(field, Character.MAX_RADIX); + } +} diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index 57cdc3a970..738cf74e2b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -16,8 +16,7 @@ package com.google.android.exoplayer2.trackselection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; -import static com.google.android.exoplayer2.util.BundleableUtil.fromBundleNullableList; -import static com.google.android.exoplayer2.util.BundleableUtil.toBundleArrayList; +import static com.google.android.exoplayer2.util.BundleableUtil.fromNullableBundle; import static com.google.common.base.MoreObjects.firstNonNull; import android.content.Context; @@ -30,23 +29,17 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Ints; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Set; import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.NonNull; /** * Constraint parameters for track selection. @@ -100,7 +93,7 @@ public class TrackSelectionParameters implements Bundleable { // General private boolean forceLowestBitrate; private boolean forceHighestSupportedBitrate; - private ImmutableMap trackSelectionOverrides; + private TrackSelectionOverrides trackSelectionOverrides; private ImmutableSet<@C.TrackType Integer> disabledTrackTypes; /** @@ -131,7 +124,7 @@ public class TrackSelectionParameters implements Bundleable { // General forceLowestBitrate = false; forceHighestSupportedBitrate = false; - trackSelectionOverrides = ImmutableMap.of(); + trackSelectionOverrides = TrackSelectionOverrides.EMPTY; disabledTrackTypes = ImmutableSet.of(); } @@ -233,17 +226,11 @@ public class TrackSelectionParameters implements Bundleable { bundle.getBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate); - List keys = - fromBundleNullableList( - TrackGroup.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDE_KEYS)), - ImmutableList.of()); - List values = - fromBundleNullableList( - TrackSelectionOverride.CREATOR, - bundle.getParcelableArrayList(keyForField(FIELD_SELECTION_OVERRIDE_VALUES)), - ImmutableList.of()); - trackSelectionOverrides = zipToMap(keys, values); + trackSelectionOverrides = + fromNullableBundle( + TrackSelectionOverrides.CREATOR, + bundle.getBundle(keyForField(FIELD_SELECTION_OVERRIDE_KEYS)), + TrackSelectionOverrides.EMPTY); disabledTrackTypes = ImmutableSet.copyOf( Ints.asList( @@ -642,9 +629,8 @@ public class TrackSelectionParameters implements Bundleable { * @param trackSelectionOverrides The track selection overrides. * @return This builder. */ - public Builder setTrackSelectionOverrides( - Map trackSelectionOverrides) { - this.trackSelectionOverrides = ImmutableMap.copyOf(trackSelectionOverrides); + public Builder setTrackSelectionOverrides(TrackSelectionOverrides trackSelectionOverrides) { + this.trackSelectionOverrides = trackSelectionOverrides; return this; } @@ -692,83 +678,6 @@ public class TrackSelectionParameters implements Bundleable { } return listBuilder.build(); } - - private static ImmutableMap<@NonNull K, @NonNull V> zipToMap( - List<@NonNull K> keys, List<@NonNull V> values) { - ImmutableMap.Builder<@NonNull K, @NonNull V> builder = new ImmutableMap.Builder<>(); - for (int i = 0; i < keys.size(); i++) { - builder.put(keys.get(i), values.get(i)); - } - return builder.build(); - } - } - - /** - * Forces the selection of {@link #tracks} for a {@link TrackGroup}. - * - * @see #trackSelectionOverrides - */ - public static final class TrackSelectionOverride implements Bundleable { - /** Force the selection of the associated {@link TrackGroup}, but no track will be played. */ - public static final TrackSelectionOverride DISABLE = - new TrackSelectionOverride(ImmutableSet.of()); - - /** The index of tracks in a {@link TrackGroup} to be selected. */ - public final ImmutableSet tracks; - - /** Constructs an instance to force {@code tracks} to be selected. */ - public TrackSelectionOverride(ImmutableSet tracks) { - this.tracks = tracks; - } - - @Override - public boolean equals(@Nullable Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - TrackSelectionOverride that = (TrackSelectionOverride) obj; - return tracks.equals(that.tracks); - } - - @Override - public int hashCode() { - return tracks.hashCode(); - } - - // Bundleable implementation - - @Documented - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - FIELD_TRACKS, - }) - private @interface FieldNumber {} - - private static final int FIELD_TRACKS = 0; - - @Override - public Bundle toBundle() { - Bundle bundle = new Bundle(); - bundle.putIntArray(keyForField(FIELD_TRACKS), Ints.toArray(tracks)); - return bundle; - } - - /** Object that can restore {@code TrackSelectionOverride} from a {@link Bundle}. */ - public static final Creator CREATOR = - bundle -> { - @Nullable int[] tracks = bundle.getIntArray(keyForField(FIELD_TRACKS)); - if (tracks == null) { - return DISABLE; - } - return new TrackSelectionOverride(ImmutableSet.copyOf(Ints.asList(tracks))); - }; - - private static String keyForField(@FieldNumber int field) { - return Integer.toString(field, Character.MAX_RADIX); - } } /** @@ -921,29 +830,8 @@ public class TrackSelectionParameters implements Bundleable { */ public final boolean forceHighestSupportedBitrate; - /** - * For each {@link TrackGroup} in the map, forces the tracks associated with it to be selected for - * playback. - * - *

                For example if {@code trackSelectionOverrides.equals(ImmutableMap.of(trackGroup, - * ImmutableSet.of(1, 2, 3)))}, the tracks 1, 2 and 3 of {@code trackGroup} will be selected. - * - *

                If multiple of the current {@link TrackGroup}s of the same {@link C.TrackType} are - * overridden, it is undetermined which one(s) will be selected. For example if a {@link - * MediaItem} has 2 video track groups (for example 2 different angles), and both are overriden, - * it is undetermined which one will be selected. - * - *

                If multiple tracks of the {@link TrackGroup} are overriden, all supported (see {@link - * C.FormatSupport}) will be selected. - * - *

                If a {@link TrackGroup} is associated with an empty set of tracks, no tracks will be played. - * This is similar to {@link #disabledTrackTypes}, except it will only affect the playback of the - * associated {@link TrackGroup}. For example, if the {@link C#TRACK_TYPE_VIDEO} {@link - * TrackGroup} is associated with no tracks, no video will play until the next video starts. - * - *

                The default value is that no {@link TrackGroup} selections are overridden (empty map). - */ - public final ImmutableMap trackSelectionOverrides; + /** Overrides to force tracks to be selected. */ + public final TrackSelectionOverrides trackSelectionOverrides; /** * The track types that are disabled. No track of a disabled type will be selected, thus no track * type contained in the set will be played. The default value is that no track type is disabled @@ -1159,12 +1047,8 @@ public class TrackSelectionParameters implements Bundleable { bundle.putBoolean(keyForField(FIELD_FORCE_LOWEST_BITRATE), forceLowestBitrate); bundle.putBoolean( keyForField(FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE), forceHighestSupportedBitrate); - bundle.putParcelableArrayList( - keyForField(FIELD_SELECTION_OVERRIDE_KEYS), - toBundleArrayList(trackSelectionOverrides.keySet())); - bundle.putParcelableArrayList( - keyForField(FIELD_SELECTION_OVERRIDE_VALUES), - toBundleArrayList(trackSelectionOverrides.values())); + bundle.putBundle( + keyForField(FIELD_SELECTION_OVERRIDE_KEYS), trackSelectionOverrides.toBundle()); bundle.putIntArray(keyForField(FIELD_DISABLED_TRACK_TYPE), Ints.toArray(disabledTrackTypes)); return bundle; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java new file mode 100644 index 0000000000..2d2a27134b --- /dev/null +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.trackselection; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; +import com.google.common.collect.ImmutableList; +import java.util.Arrays; +import org.junit.Test; +import org.junit.runner.RunWith; +// packages.bara.sky: import com.google.android.exoplayer2.util.MimeTypes; +// packages.bara.sky: import com.google.android.exoplayer2.Bundleable; +// packages.bara.sky: import com.google.android.exoplayer2.C; +// packages.bara.sky: import com.google.android.exoplayer2.Format; + +/** Unit tests for {@link TrackSelectionOverrides}. */ +@RunWith(AndroidJUnit4.class) +public final class TrackSelectionOverridesTest { + + public static final TrackGroup AAC_TRACK_GROUP = + new TrackGroup(new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).build()); + + private static TrackGroup newTrackGroupWithIds(int... ids) { + return new TrackGroup( + Arrays.stream(ids) + .mapToObj(id -> new Format.Builder().setId(id).build()) + .toArray(Format[]::new)); + } + + @Test + public void newTrackSelectionOverride_withJustTrackGroup_selectsAllTracks() { + TrackSelectionOverride trackSelectionOverride = + new TrackSelectionOverride(newTrackGroupWithIds(1, 2)); + + assertThat(trackSelectionOverride.trackGroup).isEqualTo(newTrackGroupWithIds(1, 2)); + assertThat(trackSelectionOverride.trackIndexes).containsExactly(0, 1).inOrder(); + } + + @Test + public void newTrackSelectionOverride_withTracks_selectsOnlySpecifiedTracks() { + TrackSelectionOverride trackSelectionOverride = + new TrackSelectionOverride(newTrackGroupWithIds(1, 2), ImmutableList.of(1)); + + assertThat(trackSelectionOverride.trackGroup).isEqualTo(newTrackGroupWithIds(1, 2)); + assertThat(trackSelectionOverride.trackIndexes).containsExactly(1); + } + + @Test + public void newTrackSelectionOverride_with0Tracks_selectsAllSpecifiedTracks() { + TrackSelectionOverride trackSelectionOverride = + new TrackSelectionOverride(newTrackGroupWithIds(1, 2), ImmutableList.of()); + + assertThat(trackSelectionOverride.trackGroup).isEqualTo(newTrackGroupWithIds(1, 2)); + assertThat(trackSelectionOverride.trackIndexes).isEmpty(); + } + + @Test + public void newTrackSelectionOverride_withInvalidIndex_throws() { + assertThrows( + IndexOutOfBoundsException.class, + () -> new TrackSelectionOverride(newTrackGroupWithIds(1, 2), ImmutableList.of(2))); + } + + @Test + public void roundTripViaBundle_withOverrides_yieldsEqualInstance() { + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder() + .setOverrideForType( + new TrackSelectionOverride(newTrackGroupWithIds(3, 4), ImmutableList.of(1))) + .addOverride(new TrackSelectionOverride(newTrackGroupWithIds(5, 6))) + .build(); + + TrackSelectionOverrides fromBundle = + TrackSelectionOverrides.CREATOR.fromBundle(trackSelectionOverrides.toBundle()); + + assertThat(fromBundle).isEqualTo(trackSelectionOverrides); + assertThat(fromBundle.asList()).isEqualTo(trackSelectionOverrides.asList()); + } + + @Test + public void builder_byDefault_isEmpty() { + TrackSelectionOverrides trackSelectionOverrides = new TrackSelectionOverrides.Builder().build(); + + assertThat(trackSelectionOverrides.asList()).isEmpty(); + assertThat(trackSelectionOverrides).isEqualTo(TrackSelectionOverrides.EMPTY); + } + + @Test + public void addOverride_onDifferentGroups_addsOverride() { + TrackSelectionOverride override1 = new TrackSelectionOverride(newTrackGroupWithIds(1)); + TrackSelectionOverride override2 = new TrackSelectionOverride(newTrackGroupWithIds(2)); + + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder().addOverride(override1).addOverride(override2).build(); + + assertThat(trackSelectionOverrides.asList()).containsExactly(override1, override2); + assertThat(trackSelectionOverrides.getOverride(override1.trackGroup)).isEqualTo(override1); + assertThat(trackSelectionOverrides.getOverride(override2.trackGroup)).isEqualTo(override2); + } + + @Test + public void addOverride_onSameGroup_replacesOverride() { + TrackGroup trackGroup = newTrackGroupWithIds(1, 2, 3); + TrackSelectionOverride override1 = + new TrackSelectionOverride(trackGroup, /* trackIndexes= */ ImmutableList.of(0)); + TrackSelectionOverride override2 = + new TrackSelectionOverride(trackGroup, /* trackIndexes= */ ImmutableList.of(1)); + + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder().addOverride(override1).addOverride(override2).build(); + + assertThat(trackSelectionOverrides.asList()).containsExactly(override2); + assertThat(trackSelectionOverrides.getOverride(override2.trackGroup)).isEqualTo(override2); + } + + @Test + public void setOverrideForType_onSameType_replacesOverride() { + TrackSelectionOverride override1 = new TrackSelectionOverride(newTrackGroupWithIds(1)); + TrackSelectionOverride override2 = new TrackSelectionOverride(newTrackGroupWithIds(2)); + + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder() + .setOverrideForType(override1) + .setOverrideForType(override2) + .build(); + + assertThat(trackSelectionOverrides.asList()).containsExactly(override2); + assertThat(trackSelectionOverrides.getOverride(override2.trackGroup)).isEqualTo(override2); + } + + @Test + public void clearOverridesOfType_ofTypeAudio_removesAudioOverride() { + TrackSelectionOverride override1 = new TrackSelectionOverride(AAC_TRACK_GROUP); + TrackSelectionOverride override2 = new TrackSelectionOverride(newTrackGroupWithIds(1)); + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder() + .addOverride(override1) + .addOverride(override2) + .clearOverridesOfType(C.TRACK_TYPE_AUDIO) + .build(); + + assertThat(trackSelectionOverrides.asList()).containsExactly(override2); + assertThat(trackSelectionOverrides.getOverride(override2.trackGroup)).isEqualTo(override2); + } + + @Test + public void clearOverride_ofTypeGroup_removesOverride() { + TrackSelectionOverride override1 = new TrackSelectionOverride(AAC_TRACK_GROUP); + TrackSelectionOverride override2 = new TrackSelectionOverride(newTrackGroupWithIds(1)); + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder() + .addOverride(override1) + .addOverride(override2) + .clearOverride(override2.trackGroup) + .build(); + + assertThat(trackSelectionOverrides.asList()).containsExactly(override1); + assertThat(trackSelectionOverrides.getOverride(override1.trackGroup)).isEqualTo(override1); + } +} diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java index 701d88d0e6..075898d4d0 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java @@ -23,16 +23,16 @@ import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.util.MimeTypes; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.junit.Test; import org.junit.runner.RunWith; /** Tests for {@link TrackSelectionParameters}. */ @RunWith(AndroidJUnit4.class) -public class TrackSelectionParametersTest { +public final class TrackSelectionParametersTest { @Test public void defaultValue_withoutChange_isAsExpected() { @@ -64,16 +64,22 @@ public class TrackSelectionParametersTest { // General assertThat(parameters.forceLowestBitrate).isFalse(); assertThat(parameters.forceHighestSupportedBitrate).isFalse(); - assertThat(parameters.trackSelectionOverrides).isEmpty(); + assertThat(parameters.trackSelectionOverrides.asList()).isEmpty(); assertThat(parameters.disabledTrackTypes).isEmpty(); } @Test public void parametersSet_fromDefault_isAsExpected() { - ImmutableMap trackSelectionOverrides = - ImmutableMap.of( - new TrackGroup(new Format.Builder().build()), - new TrackSelectionOverride(/* tracks= */ ImmutableSet.of(2, 3))); + TrackSelectionOverrides trackSelectionOverrides = + new TrackSelectionOverrides.Builder() + .addOverride(new TrackSelectionOverride(new TrackGroup(new Format.Builder().build()))) + .addOverride( + new TrackSelectionOverride( + new TrackGroup( + new Format.Builder().setId(4).build(), + new Format.Builder().setId(5).build()), + /* trackIndexes= */ ImmutableList.of(1))) + .build(); TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT .buildUpon() 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 40814ceffd..3e0ed7e887 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 @@ -39,7 +39,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.BundleableUtil; import com.google.android.exoplayer2.util.Util; @@ -611,7 +611,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { @Override public ParametersBuilder setTrackSelectionOverrides( - Map trackSelectionOverrides) { + TrackSelectionOverrides trackSelectionOverrides) { super.setTrackSelectionOverrides(trackSelectionOverrides); return this; } @@ -710,7 +710,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { * @param groups The {@link TrackGroupArray} for which the override should be applied. * @param override The override. * @return This builder. + * @deprecated Use {@link TrackSelectionParameters.Builder#setTrackSelectionOverrides}. */ + @Deprecated public final ParametersBuilder setSelectionOverride( int rendererIndex, TrackGroupArray groups, @Nullable SelectionOverride override) { Map overrides = @@ -733,7 +735,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { * @param rendererIndex The renderer index. * @param groups The {@link TrackGroupArray} for which the override should be cleared. * @return This builder. + * @deprecated Use {@link TrackSelectionParameters.Builder#setTrackSelectionOverrides}. */ + @Deprecated public final ParametersBuilder clearSelectionOverride( int rendererIndex, TrackGroupArray groups) { Map overrides = @@ -754,7 +758,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { * * @param rendererIndex The renderer index. * @return This builder. + * @deprecated Use {@link TrackSelectionParameters.Builder#setTrackSelectionOverrides}. */ + @Deprecated public final ParametersBuilder clearSelectionOverrides(int rendererIndex) { Map overrides = selectionOverrides.get(rendererIndex); @@ -770,7 +776,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { * Clears all track selection overrides for all renderers. * * @return This builder. + * @deprecated Use {@link TrackSelectionParameters.Builder#setTrackSelectionOverrides}. */ + @Deprecated public final ParametersBuilder clearSelectionOverrides() { if (selectionOverrides.size() == 0) { // Nothing to clear. @@ -1560,9 +1568,11 @@ public class DefaultTrackSelector extends MappingTrackSelector { for (int j = 0; j < rendererTrackGroups.length; j++) { TrackGroup trackGroup = rendererTrackGroups.get(j); @Nullable - TrackSelectionOverride overrideTracks = params.trackSelectionOverrides.get(trackGroup); + TrackSelectionOverride overrideTracks = + params.trackSelectionOverrides.getOverride(trackGroup); if (overrideTracks != null) { - return new ExoTrackSelection.Definition(trackGroup, Ints.toArray(overrideTracks.tracks)); + return new ExoTrackSelection.Definition( + trackGroup, Ints.toArray(overrideTracks.trackIndexes)); } } return currentDefinition; // No override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java index 42f0ca68a0..a06d15b5cf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java @@ -17,21 +17,11 @@ package com.google.android.exoplayer2.trackselection; import android.os.SystemClock; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.TracksInfo; -import com.google.android.exoplayer2.TracksInfo.TrackGroupInfo; -import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; -import com.google.android.exoplayer2.util.MimeTypes; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import java.util.Map; import org.checkerframework.checker.nullness.compatqual.NullableType; -import org.checkerframework.dataflow.qual.Pure; /** Track selection related utility methods. */ public final class TrackSelectionUtil { @@ -134,67 +124,4 @@ public final class TrackSelectionUtil { numberOfTracks, numberOfExcludedTracks); } - - /** - * Forces tracks in a {@link TrackGroup} to be the only ones selected for a {@link C.TrackType}. - * No other tracks of that type will be selectable. If the forced tracks are not supported, then - * no tracks of that type will be selected. - * - * @param trackSelectionOverrides The current {@link TrackSelectionOverride overrides}. - * @param tracksInfo The current {@link TracksInfo}. - * @param forcedTrackGroupIndex The index of the {@link TrackGroup} in {@code tracksInfo} that - * should have its track selected. - * @param forcedTrackSelectionOverride The tracks to force selection of. - * @return The updated {@link TrackSelectionOverride overrides}. - */ - @Pure - public static ImmutableMap forceTrackSelection( - ImmutableMap trackSelectionOverrides, - TracksInfo tracksInfo, - int forcedTrackGroupIndex, - TrackSelectionOverride forcedTrackSelectionOverride) { - @C.TrackType - int trackType = tracksInfo.getTrackGroupInfos().get(forcedTrackGroupIndex).getTrackType(); - ImmutableMap.Builder overridesBuilder = - new ImmutableMap.Builder<>(); - // Maintain overrides for the other track types. - for (Map.Entry entry : trackSelectionOverrides.entrySet()) { - if (MimeTypes.getTrackType(entry.getKey().getFormat(0).sampleMimeType) != trackType) { - overridesBuilder.put(entry); - } - } - ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); - for (int i = 0; i < trackGroupInfos.size(); i++) { - TrackGroup trackGroup = trackGroupInfos.get(i).getTrackGroup(); - if (i == forcedTrackGroupIndex) { - overridesBuilder.put(trackGroup, forcedTrackSelectionOverride); - } else { - overridesBuilder.put(trackGroup, TrackSelectionOverride.DISABLE); - } - } - return overridesBuilder.build(); - } - - /** - * Removes all {@link TrackSelectionOverride overrides} associated with {@link TrackGroup - * TrackGroups} of type {@code trackType}. - * - * @param trackType The {@link C.TrackType} of all overrides to remove. - * @param trackSelectionOverrides The current {@link TrackSelectionOverride overrides}. - * @return The updated {@link TrackSelectionOverride overrides}. - */ - @Pure - public static ImmutableMap - clearTrackSelectionOverridesForType( - @C.TrackType int trackType, - ImmutableMap trackSelectionOverrides) { - ImmutableMap.Builder overridesBuilder = - ImmutableMap.builder(); - for (Map.Entry entry : trackSelectionOverrides.entrySet()) { - if (MimeTypes.getTrackType(entry.getKey().getFormat(0).sampleMimeType) != trackType) { - overridesBuilder.put(entry); - } - } - return overridesBuilder.build(); - } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index e04a0530a7..0a12b61a12 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -46,13 +46,12 @@ import com.google.android.exoplayer2.testutil.FakeTimeline; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.HashMap; import java.util.Map; @@ -158,12 +157,15 @@ public final class DefaultTrackSelectorTest { /** Tests that an empty override clears a track selection. */ @Test - public void selectTracks_withNullOverride_clearsTrackSelection() throws ExoPlaybackException { + public void selectTracks_withOverrideWithoutTracks_clearsTrackSelection() + throws ExoPlaybackException { trackSelector.setParameters( trackSelector .buildUponParameters() .setTrackSelectionOverrides( - ImmutableMap.of(VIDEO_TRACK_GROUP, new TrackSelectionOverride(ImmutableSet.of())))); + new TrackSelectionOverrides.Builder() + .addOverride(new TrackSelectionOverride(VIDEO_TRACK_GROUP, ImmutableList.of())) + .build())); TrackSelectorResult result = trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); @@ -210,8 +212,11 @@ public final class DefaultTrackSelectorTest { trackSelector .buildUponParameters() .setTrackSelectionOverrides( - ImmutableMap.of( - new TrackGroup(VIDEO_FORMAT, VIDEO_FORMAT), TrackSelectionOverride.DISABLE))); + new TrackSelectionOverrides.Builder() + .setOverrideForType( + new TrackSelectionOverride( + new TrackGroup(VIDEO_FORMAT, VIDEO_FORMAT), ImmutableList.of())) + .build())); TrackSelectorResult result = trackSelector.selectTracks( @@ -1874,9 +1879,12 @@ public final class DefaultTrackSelectorTest { .setRendererDisabled(3, true) .setRendererDisabled(5, false) .setTrackSelectionOverrides( - ImmutableMap.of( - AUDIO_TRACK_GROUP, - new TrackSelectionOverride(/* tracks= */ ImmutableSet.of(3, 4, 5)))) + new TrackSelectionOverrides.Builder() + .setOverrideForType( + new TrackSelectionOverride( + new TrackGroup(AUDIO_FORMAT, AUDIO_FORMAT, AUDIO_FORMAT, AUDIO_FORMAT), + /* trackIndexes= */ ImmutableList.of(0, 2, 3))) + .build()) .setDisabledTrackTypes(ImmutableSet.of(C.TRACK_TYPE_AUDIO)) .build(); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 95dee700e5..30ca26f4f9 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -32,9 +32,8 @@ import static com.google.android.exoplayer2.Player.EVENT_SEEK_FORWARD_INCREMENT_ import static com.google.android.exoplayer2.Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_TIMELINE_CHANGED; import static com.google.android.exoplayer2.Player.EVENT_TRACKS_CHANGED; -import static com.google.android.exoplayer2.trackselection.TrackSelectionUtil.clearTrackSelectionOverridesForType; -import static com.google.android.exoplayer2.trackselection.TrackSelectionUtil.forceTrackSelection; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Util.castNonNull; import android.annotation.SuppressLint; import android.content.Context; @@ -68,13 +67,13 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.TracksInfo.TrackGroupInfo; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides; +import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters.TrackSelectionOverride; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.RepeatModeUtil; import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Arrays; @@ -82,8 +81,8 @@ import java.util.Collections; import java.util.Formatter; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +import org.checkerframework.dataflow.qual.Pure; /** * A view for controlling {@link Player} instances. @@ -2032,14 +2031,8 @@ public class StyledPlayerControlView extends FrameLayout { // Audio track selection option includes "Auto" at the top. holder.textView.setText(R.string.exo_track_selection_auto); // hasSelectionOverride is true means there is an explicit track selection, not "Auto". - boolean hasSelectionOverride = false; TrackSelectionParameters parameters = checkNotNull(player).getTrackSelectionParameters(); - for (int i = 0; i < tracks.size(); i++) { - if (parameters.trackSelectionOverrides.containsKey(tracks.get(i).trackGroup)) { - hasSelectionOverride = true; - break; - } - } + boolean hasSelectionOverride = hasSelectionOverride(parameters.trackSelectionOverrides); holder.checkView.setVisibility(hasSelectionOverride ? INVISIBLE : VISIBLE); holder.itemView.setOnClickListener( v -> { @@ -2048,15 +2041,18 @@ public class StyledPlayerControlView extends FrameLayout { } TrackSelectionParameters trackSelectionParameters = player.getTrackSelectionParameters(); - // Remove all audio overrides. - ImmutableMap trackSelectionOverrides = - clearTrackSelectionOverridesForType( - C.TRACK_TYPE_AUDIO, trackSelectionParameters.trackSelectionOverrides); - player.setTrackSelectionParameters( + TrackSelectionOverrides trackSelectionOverrides = trackSelectionParameters + .trackSelectionOverrides .buildUpon() - .setTrackSelectionOverrides(trackSelectionOverrides) - .build()); + .clearOverridesOfType(C.TRACK_TYPE_AUDIO) + .build(); + castNonNull(player) + .setTrackSelectionParameters( + trackSelectionParameters + .buildUpon() + .setTrackSelectionOverrides(trackSelectionOverrides) + .build()); settingsAdapter.setSubTextAtPosition( SETTINGS_AUDIO_TRACK_SELECTION_POSITION, getResources().getString(R.string.exo_track_selection_auto)); @@ -2064,6 +2060,21 @@ public class StyledPlayerControlView extends FrameLayout { }); } + private boolean hasSelectionOverride(TrackSelectionOverrides trackSelectionOverrides) { + int previousTrackGroupIndex = C.INDEX_UNSET; + for (int i = 0; i < tracks.size(); i++) { + TrackInformation track = tracks.get(i); + if (track.trackGroupIndex == previousTrackGroupIndex) { + continue; + } + if (trackSelectionOverrides.getOverride(track.trackGroup) != null) { + return true; + } + previousTrackGroupIndex = track.trackGroupIndex; + } + return false; + } + @Override public void onTrackSelection(String subtext) { settingsAdapter.setSubTextAtPosition(SETTINGS_AUDIO_TRACK_SELECTION_POSITION, subtext); @@ -2075,9 +2086,10 @@ public class StyledPlayerControlView extends FrameLayout { boolean hasSelectionOverride = false; for (int i = 0; i < trackInformations.size(); i++) { if (checkNotNull(player) - .getTrackSelectionParameters() - .trackSelectionOverrides - .containsKey(trackInformations.get(i).trackGroup)) { + .getTrackSelectionParameters() + .trackSelectionOverrides + .getOverride(trackInformations.get(i).trackGroup) + != null) { hasSelectionOverride = true; break; } @@ -2140,9 +2152,10 @@ public class StyledPlayerControlView extends FrameLayout { TrackInformation track = tracks.get(position - 1); boolean explicitlySelected = checkNotNull(player) - .getTrackSelectionParameters() - .trackSelectionOverrides - .containsKey(track.trackGroup) + .getTrackSelectionParameters() + .trackSelectionOverrides + .getOverride(track.trackGroup) + != null && track.isSelected(); holder.textView.setText(track.trackName); holder.checkView.setVisibility(explicitlySelected ? VISIBLE : INVISIBLE); @@ -2153,12 +2166,13 @@ public class StyledPlayerControlView extends FrameLayout { } TrackSelectionParameters trackSelectionParameters = player.getTrackSelectionParameters(); - Map overrides = + TrackSelectionOverrides overrides = forceTrackSelection( trackSelectionParameters.trackSelectionOverrides, track.tracksInfo, track.trackGroupIndex, - new TrackSelectionOverride(ImmutableSet.of(track.trackIndex))); + new TrackSelectionOverride( + track.trackGroup, ImmutableList.of(track.trackIndex))); checkNotNull(player) .setTrackSelectionParameters( trackSelectionParameters @@ -2196,4 +2210,41 @@ public class StyledPlayerControlView extends FrameLayout { checkView = itemView.findViewById(R.id.exo_check); } } + + /** + * Forces tracks in a {@link TrackGroup} to be the only ones selected for a {@link C.TrackType}. + * No other tracks of that type will be selectable. If the forced tracks are not supported, then + * no tracks of that type will be selected. + * + * @param trackSelectionOverrides The current {@link TrackSelectionOverride overrides}. + * @param tracksInfo The current {@link TracksInfo}. + * @param forcedTrackGroupIndex The index of the {@link TrackGroup} in {@code tracksInfo} that + * should have its track selected. + * @param forcedTrackSelectionOverride The tracks to force selection of. + * @return The updated {@link TrackSelectionOverride overrides}. + */ + @Pure + private static TrackSelectionOverrides forceTrackSelection( + TrackSelectionOverrides trackSelectionOverrides, + TracksInfo tracksInfo, + int forcedTrackGroupIndex, + TrackSelectionOverride forcedTrackSelectionOverride) { + TrackSelectionOverrides.Builder overridesBuilder = trackSelectionOverrides.buildUpon(); + + @C.TrackType + int trackType = tracksInfo.getTrackGroupInfos().get(forcedTrackGroupIndex).getTrackType(); + overridesBuilder.setOverrideForType(forcedTrackSelectionOverride); + // TrackSelectionOverride doesn't currently guarantee that only overwritten track + // group of a given type are selected, so the others have to be explicitly disabled. + // This guarantee is provided in the following patch that removes the need for this method. + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + for (int i = 0; i < trackGroupInfos.size(); i++) { + TrackGroupInfo trackGroupInfo = trackGroupInfos.get(i); + if (i != forcedTrackGroupIndex && trackGroupInfo.getTrackType() == trackType) { + TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); + overridesBuilder.addOverride(new TrackSelectionOverride(trackGroup, ImmutableList.of())); + } + } + return overridesBuilder.build(); + } } From 17d2f5a0b1f6268e9acdc602807c51f09096e166 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 25 Oct 2021 12:05:41 +0100 Subject: [PATCH 366/441] Transformer: avoid retrieving the video decoded bytes Decoded video frames can be large and there is no need to retrieve the corresponding ByteBuffer as we render the decoded frames on a surface for better performance. PiperOrigin-RevId: 405364950 --- .../transformer/TransformerTranscodingVideoRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 88e04a0b70..79d28a208e 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -305,7 +305,7 @@ import java.nio.ByteBuffer; if (!isDecoderSurfacePopulated) { if (!waitingForPopulatedDecoderSurface) { - if (decoder.getOutputBuffer() != null) { + if (decoder.getOutputBufferInfo() != null) { decoder.releaseOutputBuffer(/* render= */ true); waitingForPopulatedDecoderSurface = true; } From a42d9f36b12033eb7accc3c08dbb365c66800e6f Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 12:28:46 +0100 Subject: [PATCH 367/441] Allow output audio MIME type to be set in TranscodingTransformer. This introduces a new option `setAudioMimeType` in `TranscodingTransformer.Builder` and a corresponding check whether the selected type is supported. This check is done using `supportsSampleMimeType` which is now part of the `Muxer.Factory` and `MuxerWrapper` rather than `Muxer`. A new field `audioMimeType` is added to `Transformation` and the `TransformerAudioRenderer` uses this instead of the input MIME type if requested. PiperOrigin-RevId: 405367817 --- .../transformer/FrameworkMuxer.java | 63 +++++++++---------- .../android/exoplayer2/transformer/Muxer.java | 20 +++--- .../exoplayer2/transformer/MuxerWrapper.java | 8 ++- .../transformer/TranscodingTransformer.java | 48 ++++++++++++-- .../transformer/Transformation.java | 7 ++- .../exoplayer2/transformer/Transformer.java | 16 +++-- .../transformer/TransformerAudioRenderer.java | 6 +- .../transformer/TransformerBaseRenderer.java | 8 ++- .../exoplayer2/transformer/TestMuxer.java | 21 +++---- .../transformer/TransformerTest.java | 18 +++++- 10 files changed, 144 insertions(+), 71 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java index 737e1285f5..fc5b65891d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java @@ -42,7 +42,7 @@ import java.nio.ByteBuffer; @Override public FrameworkMuxer create(String path, String outputMimeType) throws IOException { MediaMuxer mediaMuxer = new MediaMuxer(path, mimeTypeToMuxerOutputFormat(outputMimeType)); - return new FrameworkMuxer(mediaMuxer, outputMimeType); + return new FrameworkMuxer(mediaMuxer); } @RequiresApi(26) @@ -53,7 +53,7 @@ import java.nio.ByteBuffer; new MediaMuxer( parcelFileDescriptor.getFileDescriptor(), mimeTypeToMuxerOutputFormat(outputMimeType)); - return new FrameworkMuxer(mediaMuxer, outputMimeType); + return new FrameworkMuxer(mediaMuxer); } @Override @@ -65,47 +65,46 @@ import java.nio.ByteBuffer; } return true; } + + @Override + public boolean supportsSampleMimeType( + @Nullable String sampleMimeType, String containerMimeType) { + // MediaMuxer supported sample formats are documented in MediaMuxer.addTrack(MediaFormat). + boolean isAudio = MimeTypes.isAudio(sampleMimeType); + boolean isVideo = MimeTypes.isVideo(sampleMimeType); + if (containerMimeType.equals(MimeTypes.VIDEO_MP4)) { + if (isVideo) { + return MimeTypes.VIDEO_H263.equals(sampleMimeType) + || MimeTypes.VIDEO_H264.equals(sampleMimeType) + || MimeTypes.VIDEO_MP4V.equals(sampleMimeType) + || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_H265.equals(sampleMimeType)); + } else if (isAudio) { + return MimeTypes.AUDIO_AAC.equals(sampleMimeType) + || MimeTypes.AUDIO_AMR_NB.equals(sampleMimeType) + || MimeTypes.AUDIO_AMR_WB.equals(sampleMimeType); + } + } else if (containerMimeType.equals(MimeTypes.VIDEO_WEBM) && SDK_INT >= 21) { + if (isVideo) { + return MimeTypes.VIDEO_VP8.equals(sampleMimeType) + || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_VP9.equals(sampleMimeType)); + } else if (isAudio) { + return MimeTypes.AUDIO_VORBIS.equals(sampleMimeType); + } + } + return false; + } } private final MediaMuxer mediaMuxer; - private final String outputMimeType; private final MediaCodec.BufferInfo bufferInfo; private boolean isStarted; - private FrameworkMuxer(MediaMuxer mediaMuxer, String outputMimeType) { + private FrameworkMuxer(MediaMuxer mediaMuxer) { this.mediaMuxer = mediaMuxer; - this.outputMimeType = outputMimeType; bufferInfo = new MediaCodec.BufferInfo(); } - @Override - public boolean supportsSampleMimeType(@Nullable String mimeType) { - // MediaMuxer supported sample formats are documented in MediaMuxer.addTrack(MediaFormat). - boolean isAudio = MimeTypes.isAudio(mimeType); - boolean isVideo = MimeTypes.isVideo(mimeType); - if (outputMimeType.equals(MimeTypes.VIDEO_MP4)) { - if (isVideo) { - return MimeTypes.VIDEO_H263.equals(mimeType) - || MimeTypes.VIDEO_H264.equals(mimeType) - || MimeTypes.VIDEO_MP4V.equals(mimeType) - || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_H265.equals(mimeType)); - } else if (isAudio) { - return MimeTypes.AUDIO_AAC.equals(mimeType) - || MimeTypes.AUDIO_AMR_NB.equals(mimeType) - || MimeTypes.AUDIO_AMR_WB.equals(mimeType); - } - } else if (outputMimeType.equals(MimeTypes.VIDEO_WEBM) && SDK_INT >= 21) { - if (isVideo) { - return MimeTypes.VIDEO_VP8.equals(mimeType) - || (Util.SDK_INT >= 24 && MimeTypes.VIDEO_VP9.equals(mimeType)); - } else if (isAudio) { - return MimeTypes.AUDIO_VORBIS.equals(mimeType); - } - } - return false; - } - @Override public int addTrack(Format format) { String sampleMimeType = checkNotNull(format.sampleMimeType); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java index b00fbadfd5..20a868edb2 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Muxer.java @@ -25,11 +25,12 @@ import java.nio.ByteBuffer; /** * Abstracts media muxing operations. * - *

                Query whether {@link #supportsSampleMimeType(String) sample MIME types are supported} and - * {@link #addTrack(Format) add all tracks}, then {@link #writeSampleData(int, ByteBuffer, boolean, - * long) write sample data} to mux samples. Once any sample data has been written, it is not - * possible to add tracks. After writing all sample data, {@link #release(boolean) release} the - * instance to finish writing to the output and return any resources to the system. + *

                Query whether {@link Factory#supportsOutputMimeType(String) container MIME type} and {@link + * Factory#supportsSampleMimeType(String, String) sample MIME types} are supported and {@link + * #addTrack(Format) add all tracks}, then {@link #writeSampleData(int, ByteBuffer, boolean, long) + * write sample data} to mux samples. Once any sample data has been written, it is not possible to + * add tracks. After writing all sample data, {@link #release(boolean) release} the instance to + * finish writing to the output and return any resources to the system. */ /* package */ interface Muxer { @@ -62,10 +63,13 @@ import java.nio.ByteBuffer; /** Returns whether the {@link MimeTypes MIME type} provided is a supported output format. */ boolean supportsOutputMimeType(String mimeType); - } - /** Returns whether the sample {@link MimeTypes MIME type} is supported. */ - boolean supportsSampleMimeType(@Nullable String mimeType); + /** + * Returns whether the sample {@link MimeTypes MIME type} is supported with the given container + * {@link MimeTypes MIME type}. + */ + boolean supportsSampleMimeType(@Nullable String sampleMimeType, String containerMimeType); + } /** * Adds a track with the specified format, and returns its index (to be passed in subsequent calls diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java index 6127fd567a..e8a217f645 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java @@ -45,8 +45,10 @@ import java.nio.ByteBuffer; private static final long MAX_TRACK_WRITE_AHEAD_US = C.msToUs(500); private final Muxer muxer; + private final Muxer.Factory muxerFactory; private final SparseIntArray trackTypeToIndex; private final SparseLongArray trackTypeToTimeUs; + private final String containerMimeType; private int trackCount; private int trackFormatCount; @@ -54,8 +56,10 @@ import java.nio.ByteBuffer; private @C.TrackType int previousTrackType; private long minTrackTimeUs; - public MuxerWrapper(Muxer muxer) { + public MuxerWrapper(Muxer muxer, Muxer.Factory muxerFactory, String containerMimeType) { this.muxer = muxer; + this.muxerFactory = muxerFactory; + this.containerMimeType = containerMimeType; trackTypeToIndex = new SparseIntArray(); trackTypeToTimeUs = new SparseLongArray(); previousTrackType = C.TRACK_TYPE_NONE; @@ -78,7 +82,7 @@ import java.nio.ByteBuffer; /** Returns whether the sample {@link MimeTypes MIME type} is supported. */ public boolean supportsSampleMimeType(@Nullable String mimeType) { - return muxer.supportsSampleMimeType(mimeType); + return muxerFactory.supportsSampleMimeType(mimeType, containerMimeType); } /** diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 02db36c6ad..61feaf5dd0 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -100,6 +100,7 @@ public final class TranscodingTransformer { private boolean removeVideo; private boolean flattenForSlowMotion; private String outputMimeType; + @Nullable private String audioMimeType; private TranscodingTransformer.Listener listener; private Looper looper; private Clock clock; @@ -122,6 +123,7 @@ public final class TranscodingTransformer { this.removeVideo = transcodingTransformer.transformation.removeVideo; this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; this.outputMimeType = transcodingTransformer.transformation.outputMimeType; + this.audioMimeType = transcodingTransformer.transformation.audioMimeType; this.listener = transcodingTransformer.listener; this.looper = transcodingTransformer.looper; this.clock = transcodingTransformer.clock; @@ -212,10 +214,8 @@ public final class TranscodingTransformer { } /** - * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. The - * output MIME type should be supported by the {@link - * Muxer.Factory#supportsOutputMimeType(String) muxer}. Values supported by the default {@link - * FrameworkMuxer} are: + * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported + * values are: * *

                  *
                • {@link MimeTypes#VIDEO_MP4} @@ -230,6 +230,31 @@ public final class TranscodingTransformer { return this; } + /** + * Sets the audio MIME type of the output. The default value is to use the same MIME type as the + * input. Supported values are: + * + *
                    + *
                  • when the container MIME type is {@link MimeTypes#VIDEO_MP4}: + *
                      + *
                    • {@link MimeTypes#AUDIO_AAC} + *
                    • {@link MimeTypes#AUDIO_AMR_NB} + *
                    • {@link MimeTypes#AUDIO_AMR_WB} + *
                    + *
                  • when the container MIME type is {@link MimeTypes#VIDEO_WEBM}: + *
                      + *
                    • {@link MimeTypes#AUDIO_VORBIS} + *
                    + *
                  + * + * @param audioMimeType The MIME type of the audio samples in the output. + * @return This builder. + */ + public Builder setAudioMimeType(String audioMimeType) { + this.audioMimeType = audioMimeType; + return this; + } + /** * Sets the {@link TranscodingTransformer.Listener} to listen to the transformation events. * @@ -290,6 +315,7 @@ public final class TranscodingTransformer { * @throws IllegalStateException If both audio and video have been removed (otherwise the output * would not contain any samples). * @throws IllegalStateException If the muxer doesn't support the requested output MIME type. + * @throws IllegalStateException If the muxer doesn't support the requested audio MIME type. */ public TranscodingTransformer build() { checkStateNotNull(context); @@ -303,8 +329,17 @@ public final class TranscodingTransformer { checkState( muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); + if (audioMimeType != null) { + checkState( + muxerFactory.supportsSampleMimeType(audioMimeType, outputMimeType), + "Unsupported sample MIME type " + + audioMimeType + + " for container MIME type " + + outputMimeType); + } Transformation transformation = - new Transformation(removeAudio, removeVideo, flattenForSlowMotion, outputMimeType); + new Transformation( + removeAudio, removeVideo, flattenForSlowMotion, outputMimeType, audioMimeType); return new TranscodingTransformer( context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); } @@ -469,7 +504,8 @@ public final class TranscodingTransformer { throw new IllegalStateException("There is already a transformation in progress."); } - MuxerWrapper muxerWrapper = new MuxerWrapper(muxer); + MuxerWrapper muxerWrapper = + new MuxerWrapper(muxer, muxerFactory, transformation.outputMimeType); this.muxerWrapper = muxerWrapper; DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); trackSelector.setParameters( diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java index b0c9e8d2cc..a224fe3a93 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java @@ -16,6 +16,8 @@ package com.google.android.exoplayer2.transformer; +import androidx.annotation.Nullable; + /** A media transformation configuration. */ /* package */ final class Transformation { @@ -23,15 +25,18 @@ package com.google.android.exoplayer2.transformer; public final boolean removeVideo; public final boolean flattenForSlowMotion; public final String outputMimeType; + @Nullable public final String audioMimeType; public Transformation( boolean removeAudio, boolean removeVideo, boolean flattenForSlowMotion, - String outputMimeType) { + String outputMimeType, + @Nullable String audioMimeType) { this.removeAudio = removeAudio; this.removeVideo = removeVideo; this.flattenForSlowMotion = flattenForSlowMotion; this.outputMimeType = outputMimeType; + this.audioMimeType = audioMimeType; } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index f300f66aa3..34d10137b8 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -209,10 +209,8 @@ public final class Transformer { } /** - * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. The - * output MIME type should be supported by the {@link - * Muxer.Factory#supportsOutputMimeType(String) muxer}. Values supported by the default {@link - * FrameworkMuxer} are: + * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported + * values are: * *
                    *
                  • {@link MimeTypes#VIDEO_MP4} @@ -301,7 +299,12 @@ public final class Transformer { muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); Transformation transformation = - new Transformation(removeAudio, removeVideo, flattenForSlowMotion, outputMimeType); + new Transformation( + removeAudio, + removeVideo, + flattenForSlowMotion, + outputMimeType, + /* audioMimeType= */ null); return new Transformer( context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); } @@ -464,7 +467,8 @@ public final class Transformer { throw new IllegalStateException("There is already a transformation in progress."); } - MuxerWrapper muxerWrapper = new MuxerWrapper(muxer); + MuxerWrapper muxerWrapper = + new MuxerWrapper(muxer, muxerFactory, transformation.outputMimeType); this.muxerWrapper = muxerWrapper; DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); trackSelector.setParameters( diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 6b1d0f3b90..64dc53d58c 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -350,11 +350,15 @@ import java.nio.ByteBuffer; throw createRendererException(e, PlaybackException.ERROR_CODE_UNSPECIFIED); } } + String audioMimeType = + transformation.audioMimeType == null + ? checkNotNull(inputFormat).sampleMimeType + : transformation.audioMimeType; try { encoder = MediaCodecAdapterWrapper.createForAudioEncoding( new Format.Builder() - .setSampleMimeType(checkNotNull(inputFormat).sampleMimeType) + .setSampleMimeType(audioMimeType) .setSampleRate(outputAudioFormat.sampleRate) .setChannelCount(outputAudioFormat.channelCount) .setAverageBitrate(DEFAULT_ENCODER_BITRATE) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java index 724790b8c6..4f2243000d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java @@ -52,7 +52,13 @@ import com.google.android.exoplayer2.util.MimeTypes; @Nullable String sampleMimeType = format.sampleMimeType; if (MimeTypes.getTrackType(sampleMimeType) != getTrackType()) { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE); - } else if (muxerWrapper.supportsSampleMimeType(sampleMimeType)) { + } else if ((MimeTypes.isAudio(sampleMimeType) + && muxerWrapper.supportsSampleMimeType( + transformation.audioMimeType == null + ? sampleMimeType + : transformation.audioMimeType)) + || (MimeTypes.isVideo(sampleMimeType) + && muxerWrapper.supportsSampleMimeType(sampleMimeType))) { return RendererCapabilities.create(C.FORMAT_HANDLED); } else { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE); diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java index e4835274c2..d47dd0d32f 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TestMuxer.java @@ -26,30 +26,27 @@ import java.util.List; /** * An implementation of {@link Muxer} that supports dumping information about all interactions (for - * testing purposes) and delegates the actual muxing operations to a {@link FrameworkMuxer}. + * testing purposes) and delegates the actual muxing operations to another {@link Muxer} created + * using the factory provided. */ public final class TestMuxer implements Muxer, Dumper.Dumpable { - private final Muxer frameworkMuxer; + private final Muxer muxer; private final List dumpables; /** Creates a new test muxer. */ - public TestMuxer(String path, String outputMimeType) throws IOException { - frameworkMuxer = new FrameworkMuxer.Factory().create(path, outputMimeType); + public TestMuxer(String path, String outputMimeType, Muxer.Factory muxerFactory) + throws IOException { + muxer = muxerFactory.create(path, outputMimeType); dumpables = new ArrayList<>(); dumpables.add(dumper -> dumper.add("containerMimeType", outputMimeType)); } // Muxer implementation. - @Override - public boolean supportsSampleMimeType(String mimeType) { - return frameworkMuxer.supportsSampleMimeType(mimeType); - } - @Override public int addTrack(Format format) { - int trackIndex = frameworkMuxer.addTrack(format); + int trackIndex = muxer.addTrack(format); dumpables.add(new DumpableFormat(format, trackIndex)); return trackIndex; } @@ -58,13 +55,13 @@ public final class TestMuxer implements Muxer, Dumper.Dumpable { public void writeSampleData( int trackIndex, ByteBuffer data, boolean isKeyFrame, long presentationTimeUs) { dumpables.add(new DumpableSample(trackIndex, data, isKeyFrame, presentationTimeUs)); - frameworkMuxer.writeSampleData(trackIndex, data, isKeyFrame, presentationTimeUs); + muxer.writeSampleData(trackIndex, data, isKeyFrame, presentationTimeUs); } @Override public void release(boolean forCancellation) { dumpables.add(dumper -> dumper.add("released", true)); - frameworkMuxer.release(forCancellation); + muxer.release(forCancellation); } // Dumper.Dumpable implementation. diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTest.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTest.java index a99b4a369b..690b6fe2bb 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTest.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/TransformerTest.java @@ -562,16 +562,25 @@ public final class TransformerTest { } private final class TestMuxerFactory implements Muxer.Factory { + + private final Muxer.Factory frameworkMuxerFactory; + + public TestMuxerFactory() { + frameworkMuxerFactory = new FrameworkMuxer.Factory(); + } + @Override public Muxer create(String path, String outputMimeType) throws IOException { - testMuxer = new TestMuxer(path, outputMimeType); + testMuxer = new TestMuxer(path, outputMimeType, frameworkMuxerFactory); return testMuxer; } @Override public Muxer create(ParcelFileDescriptor parcelFileDescriptor, String outputMimeType) throws IOException { - testMuxer = new TestMuxer("FD:" + parcelFileDescriptor.getFd(), outputMimeType); + testMuxer = + new TestMuxer( + "FD:" + parcelFileDescriptor.getFd(), outputMimeType, frameworkMuxerFactory); return testMuxer; } @@ -579,5 +588,10 @@ public final class TransformerTest { public boolean supportsOutputMimeType(String mimeType) { return true; } + + @Override + public boolean supportsSampleMimeType(String sampleMimeType, String outputMimeType) { + return frameworkMuxerFactory.supportsSampleMimeType(sampleMimeType, outputMimeType); + } } } From 2dc7ac38513a7c7eef8f4de9242ec7c5ed2b1029 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 13:23:53 +0100 Subject: [PATCH 368/441] Upgrade RTMP dependency and remove jcenter() PiperOrigin-RevId: 405375352 --- RELEASENOTES.md | 4 ++++ extensions/rtmp/build.gradle | 2 +- .../google/android/exoplayer2/ext/rtmp/RtmpDataSource.java | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2ace17dc48..1d82331ccb 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,7 @@ `Player.removeListener(EventListener)` out of `Player` into subclasses. * Fix `mediaMetadata` being reset when media is repeated ([#9458](https://github.com/google/ExoPlayer/issues/9458)). + * Remove final dependency on `jcenter()`. * Video: * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` @@ -77,6 +78,9 @@ * Populate `Format.sampleMimeType`, `width` and `height` for image `AdaptationSet` elements ([#9500](https://github.com/google/ExoPlayer/issues/9500)). +* RTMP extension: + * Upgrade to `io.antmedia:rtmp_client`, which does not rely on `jcenter()` + ([#9591](https://github.com/google/ExoPlayer/issues/9591)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/extensions/rtmp/build.gradle b/extensions/rtmp/build.gradle index b2ff46f80a..1d55cd0e32 100644 --- a/extensions/rtmp/build.gradle +++ b/extensions/rtmp/build.gradle @@ -16,7 +16,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { implementation project(modulePrefix + 'library-common') implementation project(modulePrefix + 'library-datasource') - implementation 'net.butterflytv.utils:rtmp-client:3.1.0' + implementation 'io.antmedia:rtmp-client:3.2.0' implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion testImplementation project(modulePrefix + 'library-core') diff --git a/extensions/rtmp/src/main/java/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.java b/extensions/rtmp/src/main/java/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.java index 8093b4d275..fdcaf25e67 100644 --- a/extensions/rtmp/src/main/java/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.java +++ b/extensions/rtmp/src/main/java/com/google/android/exoplayer2/ext/rtmp/RtmpDataSource.java @@ -25,9 +25,9 @@ import com.google.android.exoplayer2.upstream.BaseDataSource; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.TransferListener; +import io.antmedia.rtmp_client.RtmpClient; +import io.antmedia.rtmp_client.RtmpClient.RtmpIOException; import java.io.IOException; -import net.butterflytv.rtmp_client.RtmpClient; -import net.butterflytv.rtmp_client.RtmpClient.RtmpIOException; /** A Real-Time Messaging Protocol (RTMP) {@link DataSource}. */ public final class RtmpDataSource extends BaseDataSource { From 988a55db9d69fd66726a39daf698bf01e2256b66 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 13:44:13 +0100 Subject: [PATCH 369/441] Rm stray blank line PiperOrigin-RevId: 405377964 --- common_library_config.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/common_library_config.gradle b/common_library_config.gradle index 431a7ab14d..6164b35e15 100644 --- a/common_library_config.gradle +++ b/common_library_config.gradle @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - apply from: "$gradle.ext.exoplayerSettingsDir/constants.gradle" apply plugin: 'com.android.library' From 2b97455a8c78806b4f2a03695a8e8c5c98c1c2f2 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 13:56:56 +0100 Subject: [PATCH 370/441] Register newly split modules PiperOrigin-RevId: 405379511 --- .../com/google/android/exoplayer2/upstream/DataSpec.java | 5 +++++ .../android/exoplayer2/decoder/DecoderInputBuffer.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java index dde0835517..a117a2e3c5 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DataSpec.java @@ -19,6 +19,7 @@ import android.net.Uri; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.util.Assertions; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -30,6 +31,10 @@ import java.util.Map; /** Defines a region of data in a resource. */ public final class DataSpec { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.datasource"); + } + /** * Builds {@link DataSpec} instances. * diff --git a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java index d10f24184c..5ddfb9cc81 100644 --- a/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java +++ b/library/decoder/src/main/java/com/google/android/exoplayer2/decoder/DecoderInputBuffer.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.decoder; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.Format; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -28,6 +29,10 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull; /** Holds input for a decoder. */ public class DecoderInputBuffer extends Buffer { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.decoder"); + } + /** * Thrown when an attempt is made to write into a {@link DecoderInputBuffer} whose {@link * #bufferReplacementMode} is {@link #BUFFER_REPLACEMENT_MODE_DISABLED} and who {@link #data} From cd6c2e989f68323a5e7a04aea03b76ddd67ae0f6 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Mon, 25 Oct 2021 14:22:30 +0100 Subject: [PATCH 371/441] Change MediaMetadata update priority to favour MediaItem values. The static and dynamic metadata now build up in a list, such that when the MediaMetadata is built, they are applied in an event order. This means that newer/fresher values will overwrite older ones. The MediaItem values are then applied at the end, as they take priority over any other. #minor-release PiperOrigin-RevId: 405383177 --- RELEASENOTES.md | 3 + .../android/exoplayer2/MediaMetadata.java | 102 ++++++++++++++++++ .../com/google/android/exoplayer2/Player.java | 4 +- .../android/exoplayer2/MediaMetadataTest.java | 88 +++++++++------ .../android/exoplayer2/ExoPlayerImpl.java | 42 +++++++- .../android/exoplayer2/ExoPlayerTest.java | 40 +++++++ 6 files changed, 241 insertions(+), 38 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1d82331ccb..023d02d95f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -25,6 +25,9 @@ * Fix `mediaMetadata` being reset when media is repeated ([#9458](https://github.com/google/ExoPlayer/issues/9458)). * Remove final dependency on `jcenter()`. + * Adjust `ExoPlayer` `MediaMetadata` update priority, such that values + input through the `MediaItem.MediaMetadata` are used above media + derived values. * Video: * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java index e76edee173..4dad2da4c3 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java @@ -383,6 +383,108 @@ public final class MediaMetadata implements Bundleable { return this; } + /** Populates all the fields from {@code mediaMetadata}, provided they are non-null. */ + public Builder populate(@Nullable MediaMetadata mediaMetadata) { + if (mediaMetadata == null) { + return this; + } + if (mediaMetadata.title != null) { + setTitle(mediaMetadata.title); + } + if (mediaMetadata.artist != null) { + setArtist(mediaMetadata.artist); + } + if (mediaMetadata.albumTitle != null) { + setAlbumTitle(mediaMetadata.albumTitle); + } + if (mediaMetadata.albumArtist != null) { + setAlbumArtist(mediaMetadata.albumArtist); + } + if (mediaMetadata.displayTitle != null) { + setDisplayTitle(mediaMetadata.displayTitle); + } + if (mediaMetadata.subtitle != null) { + setSubtitle(mediaMetadata.subtitle); + } + if (mediaMetadata.description != null) { + setDescription(mediaMetadata.description); + } + if (mediaMetadata.mediaUri != null) { + setMediaUri(mediaMetadata.mediaUri); + } + if (mediaMetadata.userRating != null) { + setUserRating(mediaMetadata.userRating); + } + if (mediaMetadata.overallRating != null) { + setOverallRating(mediaMetadata.overallRating); + } + if (mediaMetadata.artworkData != null) { + setArtworkData(mediaMetadata.artworkData, mediaMetadata.artworkDataType); + } + if (mediaMetadata.artworkUri != null) { + setArtworkUri(mediaMetadata.artworkUri); + } + if (mediaMetadata.trackNumber != null) { + setTrackNumber(mediaMetadata.trackNumber); + } + if (mediaMetadata.totalTrackCount != null) { + setTotalTrackCount(mediaMetadata.totalTrackCount); + } + if (mediaMetadata.folderType != null) { + setFolderType(mediaMetadata.folderType); + } + if (mediaMetadata.isPlayable != null) { + setIsPlayable(mediaMetadata.isPlayable); + } + if (mediaMetadata.year != null) { + setRecordingYear(mediaMetadata.year); + } + if (mediaMetadata.recordingYear != null) { + setRecordingYear(mediaMetadata.recordingYear); + } + if (mediaMetadata.recordingMonth != null) { + setRecordingMonth(mediaMetadata.recordingMonth); + } + if (mediaMetadata.recordingDay != null) { + setRecordingDay(mediaMetadata.recordingDay); + } + if (mediaMetadata.releaseYear != null) { + setReleaseYear(mediaMetadata.releaseYear); + } + if (mediaMetadata.releaseMonth != null) { + setReleaseMonth(mediaMetadata.releaseMonth); + } + if (mediaMetadata.releaseDay != null) { + setReleaseDay(mediaMetadata.releaseDay); + } + if (mediaMetadata.writer != null) { + setWriter(mediaMetadata.writer); + } + if (mediaMetadata.composer != null) { + setComposer(mediaMetadata.composer); + } + if (mediaMetadata.conductor != null) { + setConductor(mediaMetadata.conductor); + } + if (mediaMetadata.discNumber != null) { + setDiscNumber(mediaMetadata.discNumber); + } + if (mediaMetadata.totalDiscCount != null) { + setTotalDiscCount(mediaMetadata.totalDiscCount); + } + if (mediaMetadata.genre != null) { + setGenre(mediaMetadata.genre); + } + if (mediaMetadata.compilation != null) { + setCompilation(mediaMetadata.compilation); + } + if (mediaMetadata.extras != null) { + setExtras(mediaMetadata.extras); + } + + return this; + } + /** Returns a new {@link MediaMetadata} instance with the current builder values. */ public MediaMetadata build() { return new MediaMetadata(/* builder= */ this); diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index b2b80d0d81..34d94ede8b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -2065,7 +2065,9 @@ public interface Player { * *

                    This {@link MediaMetadata} is a combination of the {@link MediaItem#mediaMetadata} and the * static and dynamic metadata from the {@link TrackSelection#getFormat(int) track selections' - * formats} and {@link Listener#onMetadata(Metadata)}. + * formats} and {@link Listener#onMetadata(Metadata)}. If a field is populated in the {@link + * MediaItem#mediaMetadata}, it will be prioritised above the same field coming from static or + * dynamic metadata. */ MediaMetadata getMediaMetadata(); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/MediaMetadataTest.java b/library/common/src/test/java/com/google/android/exoplayer2/MediaMetadataTest.java index 769758647e..9d2d78f48e 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/MediaMetadataTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/MediaMetadataTest.java @@ -27,6 +27,9 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class MediaMetadataTest { + private static final String EXTRAS_KEY = "exampleKey"; + private static final String EXTRAS_VALUE = "exampleValue"; + @Test public void builder_minimal_correctDefaults() { MediaMetadata mediaMetadata = new MediaMetadata.Builder().build(); @@ -91,41 +94,62 @@ public class MediaMetadataTest { } @Test - public void roundTripViaBundle_yieldsEqualInstance() { - Bundle extras = new Bundle(); - extras.putString("exampleKey", "exampleValue"); + public void populate_populatesEveryField() { + MediaMetadata mediaMetadata = getFullyPopulatedMediaMetadata(); + MediaMetadata populated = new MediaMetadata.Builder().populate(mediaMetadata).build(); - MediaMetadata mediaMetadata = - new MediaMetadata.Builder() - .setTitle("title") - .setAlbumArtist("the artist") - .setMediaUri(Uri.parse("https://www.google.com")) - .setUserRating(new HeartRating(false)) - .setOverallRating(new PercentageRating(87.4f)) - .setArtworkData( - new byte[] {-88, 12, 3, 2, 124, -54, -33, 69}, MediaMetadata.PICTURE_TYPE_MEDIA) - .setTrackNumber(4) - .setTotalTrackCount(12) - .setFolderType(MediaMetadata.FOLDER_TYPE_PLAYLISTS) - .setIsPlayable(true) - .setRecordingYear(2000) - .setRecordingMonth(11) - .setRecordingDay(23) - .setReleaseYear(2001) - .setReleaseMonth(1) - .setReleaseDay(2) - .setComposer("Composer") - .setConductor("Conductor") - .setWriter("Writer") - .setDiscNumber(1) - .setTotalDiscCount(3) - .setGenre("Pop") - .setCompilation("Amazing songs.") - .setExtras(extras) // Extras is not implemented in MediaMetadata.equals(Object o). - .build(); + // If this assertion fails, it's likely that a field is not being updated in + // MediaMetadata.Builder#populate(MediaMetadata). + assertThat(populated).isEqualTo(mediaMetadata); + assertThat(populated.extras.getString(EXTRAS_KEY)).isEqualTo(EXTRAS_VALUE); + } + + @Test + public void roundTripViaBundle_yieldsEqualInstance() { + MediaMetadata mediaMetadata = getFullyPopulatedMediaMetadata(); MediaMetadata fromBundle = MediaMetadata.CREATOR.fromBundle(mediaMetadata.toBundle()); assertThat(fromBundle).isEqualTo(mediaMetadata); - assertThat(fromBundle.extras.getString("exampleKey")).isEqualTo("exampleValue"); + // Extras is not implemented in MediaMetadata.equals(Object o). + assertThat(fromBundle.extras.getString(EXTRAS_KEY)).isEqualTo(EXTRAS_VALUE); + } + + private static MediaMetadata getFullyPopulatedMediaMetadata() { + Bundle extras = new Bundle(); + extras.putString(EXTRAS_KEY, EXTRAS_VALUE); + + return new MediaMetadata.Builder() + .setTitle("title") + .setArtist("artist") + .setAlbumTitle("album title") + .setAlbumArtist("album artist") + .setDisplayTitle("display title") + .setSubtitle("subtitle") + .setDescription("description") + .setMediaUri(Uri.parse("https://www.google.com")) + .setUserRating(new HeartRating(false)) + .setOverallRating(new PercentageRating(87.4f)) + .setArtworkData( + new byte[] {-88, 12, 3, 2, 124, -54, -33, 69}, MediaMetadata.PICTURE_TYPE_MEDIA) + .setArtworkUri(Uri.parse("https://www.google.com")) + .setTrackNumber(4) + .setTotalTrackCount(12) + .setFolderType(MediaMetadata.FOLDER_TYPE_PLAYLISTS) + .setIsPlayable(true) + .setRecordingYear(2000) + .setRecordingMonth(11) + .setRecordingDay(23) + .setReleaseYear(2001) + .setReleaseMonth(1) + .setReleaseDay(2) + .setComposer("Composer") + .setConductor("Conductor") + .setWriter("Writer") + .setDiscNumber(1) + .setTotalDiscCount(3) + .setGenre("Pop") + .setCompilation("Amazing songs.") + .setExtras(extras) + .build(); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index bee9a64ea6..78f232e9a5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -39,6 +39,7 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.ShuffleOrder; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; @@ -111,6 +112,10 @@ import java.util.concurrent.CopyOnWriteArraySet; private MediaMetadata mediaMetadata; private MediaMetadata playlistMetadata; + // MediaMetadata built from static (TrackGroup Format) and dynamic (onMetadata(Metadata)) metadata + // sources. + private MediaMetadata staticAndDynamicMediaMetadata; + // Playback information when there is no pending seek/set source operation. private PlaybackInfo playbackInfo; @@ -229,6 +234,7 @@ import java.util.concurrent.CopyOnWriteArraySet; .build(); mediaMetadata = MediaMetadata.EMPTY; playlistMetadata = MediaMetadata.EMPTY; + staticAndDynamicMediaMetadata = MediaMetadata.EMPTY; maskingWindowIndex = C.INDEX_UNSET; playbackInfoUpdateHandler = clock.createHandler(applicationLooper, /* callback= */ null); playbackInfoUpdateListener = @@ -986,8 +992,11 @@ import java.util.concurrent.CopyOnWriteArraySet; } public void onMetadata(Metadata metadata) { - MediaMetadata newMediaMetadata = - mediaMetadata.buildUpon().populateFromMetadata(metadata).build(); + staticAndDynamicMediaMetadata = + staticAndDynamicMediaMetadata.buildUpon().populateFromMetadata(metadata).build(); + + MediaMetadata newMediaMetadata = buildUpdatedMediaMetadata(); + if (newMediaMetadata.equals(mediaMetadata)) { return; } @@ -1235,12 +1244,17 @@ import java.util.concurrent.CopyOnWriteArraySet; .windowIndex; mediaItem = newPlaybackInfo.timeline.getWindow(windowIndex, window).mediaItem; } - newMediaMetadata = mediaItem != null ? mediaItem.mediaMetadata : MediaMetadata.EMPTY; + staticAndDynamicMediaMetadata = MediaMetadata.EMPTY; } if (mediaItemTransitioned || !previousPlaybackInfo.staticMetadata.equals(newPlaybackInfo.staticMetadata)) { - newMediaMetadata = - newMediaMetadata.buildUpon().populateFromMetadata(newPlaybackInfo.staticMetadata).build(); + staticAndDynamicMediaMetadata = + staticAndDynamicMediaMetadata + .buildUpon() + .populateFromMetadata(newPlaybackInfo.staticMetadata) + .build(); + + newMediaMetadata = buildUpdatedMediaMetadata(); } boolean metadataChanged = !newMediaMetadata.equals(mediaMetadata); mediaMetadata = newMediaMetadata; @@ -1794,6 +1808,24 @@ import java.util.concurrent.CopyOnWriteArraySet; return positionUs; } + /** + * Builds a {@link MediaMetadata} from the main sources. + * + *

                    {@link MediaItem} {@link MediaMetadata} is prioritized, with any gaps/missing fields + * populated by metadata from static ({@link TrackGroup} {@link Format}) and dynamic ({@link + * #onMetadata(Metadata)}) sources. + */ + private MediaMetadata buildUpdatedMediaMetadata() { + @Nullable MediaItem mediaItem = getCurrentMediaItem(); + + if (mediaItem == null) { + return staticAndDynamicMediaMetadata; + } + + // MediaItem metadata is prioritized over metadata within the media. + return staticAndDynamicMediaMetadata.buildUpon().populate(mediaItem.mediaMetadata).build(); + } + private static boolean isPlaying(PlaybackInfo playbackInfo) { return playbackInfo.playbackState == Player.STATE_READY && playbackInfo.playWhenReady diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index bde93310f1..07f61f4e5e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -11181,6 +11181,46 @@ public final class ExoPlayerTest { assertThat(videoRenderer.get().positionResetCount).isEqualTo(1); } + @Test + public void setMediaItem_withMediaMetadata_updatesMediaMetadata() { + MediaMetadata mediaMetadata = new MediaMetadata.Builder().setTitle("the title").build(); + + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + player.setMediaItem( + new MediaItem.Builder() + .setMediaId("id") + .setUri(Uri.EMPTY) + .setMediaMetadata(mediaMetadata) + .build()); + + assertThat(player.getMediaMetadata()).isEqualTo(mediaMetadata); + } + + @Test + public void playingMedia_withNoMetadata_doesNotUpdateMediaMetadata() throws Exception { + MediaMetadata mediaMetadata = new MediaMetadata.Builder().setTitle("the title").build(); + + ExoPlayer player = new TestExoPlayerBuilder(context).build(); + MediaItem mediaItem = + new MediaItem.Builder() + .setMediaId("id") + .setUri(Uri.parse("asset://android_asset/media/mp4/sample.mp4")) + .setMediaMetadata(mediaMetadata) + .build(); + player.setMediaItem(mediaItem); + + assertThat(player.getMediaMetadata()).isEqualTo(mediaMetadata); + + player.prepare(); + TestPlayerRunHelper.playUntilPosition( + player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player.stop(); + + shadowOf(Looper.getMainLooper()).idle(); + + assertThat(player.getMediaMetadata()).isEqualTo(mediaMetadata); + } + // Internal methods. private static ActionSchedule.Builder addSurfaceSwitch(ActionSchedule.Builder builder) { From 647d69b950d9bebb43401cef05f25f40f1ecc3d9 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 15:07:57 +0100 Subject: [PATCH 372/441] Remove jcenter() dependency PiperOrigin-RevId: 405391455 --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index da37ad7bf6..055e3cdaff 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,6 @@ allprojects { repositories { google() mavenCentral() - jcenter() } if (it.hasProperty('externalBuildDir')) { if (!new File(externalBuildDir).isAbsolute()) { From 4a8f2fc78723810403d69467e654cb8f9ed15e8b Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 25 Oct 2021 15:27:41 +0100 Subject: [PATCH 373/441] Update package name PiperOrigin-RevId: 405394994 --- .../android/exoplayer2/testutil/truth/SpannedSubject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java index c156d24779..47d4f57d93 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java @@ -52,7 +52,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** A Truth {@link Subject} for assertions on {@link Spanned} instances containing text styling. */ -// TODO: add support for more Spans i.e. all those used in com.google.android.exoplayer2.text. +// TODO: add support for more Spans i.e. all those used in androidx.media3.common.text. public final class SpannedSubject extends Subject { @Nullable private final Spanned actual; From 922e508213bb31d9b87fae93756b6abe07d6fd66 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Mon, 25 Oct 2021 15:36:59 +0100 Subject: [PATCH 374/441] Update import scrubbing PiperOrigin-RevId: 405396600 --- .../trackselection/TrackSelectionOverridesTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java index 2d2a27134b..ba04f73429 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java @@ -19,15 +19,14 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; +import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; -// packages.bara.sky: import com.google.android.exoplayer2.util.MimeTypes; -// packages.bara.sky: import com.google.android.exoplayer2.Bundleable; -// packages.bara.sky: import com.google.android.exoplayer2.C; -// packages.bara.sky: import com.google.android.exoplayer2.Format; /** Unit tests for {@link TrackSelectionOverrides}. */ @RunWith(AndroidJUnit4.class) From 2ab7f28ec387044caa1c0ebd94dff2d93de5d77a Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 16:38:58 +0100 Subject: [PATCH 375/441] Fix TrackSelectionOverrides imports PiperOrigin-RevId: 405408606 --- .../TrackSelectionOverrides.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java index 65c659cce8..239dd76b60 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.java @@ -24,7 +24,11 @@ import static java.util.Collections.min; import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.trackselection.C.TrackType; +import com.google.android.exoplayer2.Bundleable; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.primitives.Ints; @@ -40,13 +44,13 @@ import java.util.Map; * Forces the selection of the specified tracks in {@link TrackGroup TrackGroups}. * *

                    Each {@link TrackSelectionOverride override} only affects the selection of tracks of that - * {@link TrackType type}. For example overriding the selection of an {@link C#TRACK_TYPE_AUDIO + * {@link C.TrackType type}. For example overriding the selection of an {@link C#TRACK_TYPE_AUDIO * audio} {@link TrackGroup} will not affect the selection of {@link C#TRACK_TYPE_VIDEO video} or * {@link C#TRACK_TYPE_TEXT text} tracks. * - *

                    If multiple {@link TrackGroup TrackGroups} of the same {@link TrackType} are overridden, which - * tracks will be selected depend on the player capabilities. For example, by default {@code - * ExoPlayer} doesn't support selecting more than one {@link TrackGroup} per {@link TrackType}. + *

                    If multiple {@link TrackGroup TrackGroups} of the same {@link C.TrackType} are overridden, + * which tracks will be selected depend on the player capabilities. For example, by default {@code + * ExoPlayer} doesn't support selecting more than one {@link TrackGroup} per {@link C.TrackType}. * *

                    Overrides of {@link TrackGroup} that are not currently available are ignored. For example, * when the player transitions to the next {@link MediaItem} in a playlist, any overrides of the @@ -92,7 +96,7 @@ public final class TrackSelectionOverrides implements Bundleable { /** * Remove any override associated with {@link TrackGroup TrackGroups} of type {@code trackType}. */ - public Builder clearOverridesOfType(@TrackType int trackType) { + public Builder clearOverridesOfType(@C.TrackType int trackType) { for (Iterator it = overrides.values().iterator(); it.hasNext(); ) { TrackSelectionOverride trackSelectionOverride = it.next(); if (trackSelectionOverride.getTrackType() == trackType) { @@ -170,7 +174,7 @@ public final class TrackSelectionOverrides implements Bundleable { return trackGroup.hashCode() + 31 * trackIndexes.hashCode(); } - private @TrackType int getTrackType() { + private @C.TrackType int getTrackType() { return MimeTypes.getTrackType(trackGroup.getFormat(0).sampleMimeType); } From 101b94f8740e5f385bee7b75998de86a001a99c8 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 18:11:53 +0100 Subject: [PATCH 376/441] Remove dependency from opus module to extractor module PiperOrigin-RevId: 405429757 --- .../ext/opus/LibopusAudioRenderer.java | 3 +- .../exoplayer2/ext/opus/OpusDecoder.java | 65 ++++++++++++-- .../exoplayer2/ext/opus/OpusDecoderTest.java | 90 +++++++++++++++++++ .../android/exoplayer2/audio/OpusUtil.java | 37 -------- .../exoplayer2/audio/OpusUtilTest.java | 39 -------- 5 files changed, 150 insertions(+), 84 deletions(-) create mode 100644 extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java index 452a0411c1..1b92708573 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java @@ -24,7 +24,6 @@ import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport; import com.google.android.exoplayer2.audio.DecoderAudioRenderer; -import com.google.android.exoplayer2.audio.OpusUtil; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; @@ -124,6 +123,6 @@ public class LibopusAudioRenderer extends DecoderAudioRenderer { protected Format getOutputFormat(OpusDecoder decoder) { @C.PcmEncoding int pcmEncoding = decoder.outputFloat ? C.ENCODING_PCM_FLOAT : C.ENCODING_PCM_16BIT; - return Util.getPcmFormat(pcmEncoding, decoder.channelCount, OpusUtil.SAMPLE_RATE); + return Util.getPcmFormat(pcmEncoding, decoder.channelCount, OpusDecoder.SAMPLE_RATE); } } diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java index 56617b7d13..b6b7567d81 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java @@ -20,7 +20,6 @@ import static androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.audio.OpusUtil; import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.CryptoException; import com.google.android.exoplayer2.decoder.CryptoInfo; @@ -30,6 +29,7 @@ import com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.List; /** Opus decoder. */ @@ -37,6 +37,12 @@ import java.util.List; public final class OpusDecoder extends SimpleDecoder { + /** Opus streams are always 48000 Hz. */ + /* package */ static final int SAMPLE_RATE = 48_000; + + private static final int DEFAULT_SEEK_PRE_ROLL_SAMPLES = 3840; + private static final int FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT = 3; + private static final int NO_ERROR = 0; private static final int DECODE_ERROR = -1; private static final int DRM_ERROR = -2; @@ -89,14 +95,14 @@ public final class OpusDecoder && (initializationData.get(1).length != 8 || initializationData.get(2).length != 8)) { throw new OpusDecoderException("Invalid pre-skip or seek pre-roll"); } - preSkipSamples = OpusUtil.getPreSkipSamples(initializationData); - seekPreRollSamples = OpusUtil.getSeekPreRollSamples(initializationData); + preSkipSamples = getPreSkipSamples(initializationData); + seekPreRollSamples = getSeekPreRollSamples(initializationData); byte[] headerBytes = initializationData.get(0); if (headerBytes.length < 19) { throw new OpusDecoderException("Invalid header length"); } - channelCount = OpusUtil.getChannelCount(headerBytes); + channelCount = getChannelCount(headerBytes); if (channelCount > 8) { throw new OpusDecoderException("Invalid channel count: " + channelCount); } @@ -124,7 +130,7 @@ public final class OpusDecoder System.arraycopy(headerBytes, 21, streamMap, 0, channelCount); } nativeDecoderContext = - opusInit(OpusUtil.SAMPLE_RATE, channelCount, numStreams, numCoupled, gain, streamMap); + opusInit(SAMPLE_RATE, channelCount, numStreams, numCoupled, gain, streamMap); if (nativeDecoderContext == 0) { throw new OpusDecoderException("Failed to initialize decoder"); } @@ -176,7 +182,7 @@ public final class OpusDecoder inputData, inputData.limit(), outputBuffer, - OpusUtil.SAMPLE_RATE, + SAMPLE_RATE, cryptoConfig, cryptoInfo.mode, Assertions.checkNotNull(cryptoInfo.key), @@ -225,6 +231,53 @@ public final class OpusDecoder opusClose(nativeDecoderContext); } + /** + * Parses the channel count from an Opus Identification Header. + * + * @param header An Opus Identification Header, as defined by RFC 7845. + * @return The parsed channel count. + */ + @VisibleForTesting + /* package */ static int getChannelCount(byte[] header) { + return header[9] & 0xFF; + } + + /** + * Returns the number of pre-skip samples specified by the given Opus codec initialization data. + * + * @param initializationData The codec initialization data. + * @return The number of pre-skip samples. + */ + @VisibleForTesting + /* package */ static int getPreSkipSamples(List initializationData) { + if (initializationData.size() == FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT) { + long codecDelayNs = + ByteBuffer.wrap(initializationData.get(1)).order(ByteOrder.nativeOrder()).getLong(); + return (int) ((codecDelayNs * SAMPLE_RATE) / C.NANOS_PER_SECOND); + } + // Fall back to parsing directly from the Opus Identification header. + byte[] headerData = initializationData.get(0); + return ((headerData[11] & 0xFF) << 8) | (headerData[10] & 0xFF); + } + + /** + * Returns the number of seek per-roll samples specified by the given Opus codec initialization + * data. + * + * @param initializationData The codec initialization data. + * @return The number of seek pre-roll samples. + */ + @VisibleForTesting + /* package */ static int getSeekPreRollSamples(List initializationData) { + if (initializationData.size() == FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT) { + long seekPreRollNs = + ByteBuffer.wrap(initializationData.get(2)).order(ByteOrder.nativeOrder()).getLong(); + return (int) ((seekPreRollNs * SAMPLE_RATE) / C.NANOS_PER_SECOND); + } + // Fall back to returning the default seek pre-roll. + return DEFAULT_SEEK_PRE_ROLL_SAMPLES; + } + private static int readSignedLittleEndian16(byte[] input, int offset) { int value = input[offset] & 0xFF; value |= (input[offset + 1] & 0xFF) << 8; diff --git a/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java new file mode 100644 index 0000000000..f723237646 --- /dev/null +++ b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/OpusDecoderTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.ext.opus; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.common.collect.ImmutableList; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Unit tests for {@link OpusDecoder}. */ +@RunWith(AndroidJUnit4.class) +public final class OpusDecoderTest { + + private static final byte[] HEADER = + new byte[] {79, 112, 117, 115, 72, 101, 97, 100, 0, 2, 1, 56, 0, 0, -69, -128, 0, 0, 0}; + + private static final int HEADER_PRE_SKIP_SAMPLES = 14337; + + private static final int DEFAULT_SEEK_PRE_ROLL_SAMPLES = 3840; + + private static final ImmutableList HEADER_ONLY_INITIALIZATION_DATA = + ImmutableList.of(HEADER); + + private static final long CUSTOM_PRE_SKIP_SAMPLES = 28674; + private static final byte[] CUSTOM_PRE_SKIP_BYTES = + buildNativeOrderByteArray(sampleCountToNanoseconds(CUSTOM_PRE_SKIP_SAMPLES)); + + private static final long CUSTOM_SEEK_PRE_ROLL_SAMPLES = 7680; + private static final byte[] CUSTOM_SEEK_PRE_ROLL_BYTES = + buildNativeOrderByteArray(sampleCountToNanoseconds(CUSTOM_SEEK_PRE_ROLL_SAMPLES)); + + private static final ImmutableList FULL_INITIALIZATION_DATA = + ImmutableList.of(HEADER, CUSTOM_PRE_SKIP_BYTES, CUSTOM_SEEK_PRE_ROLL_BYTES); + + @Test + public void getChannelCount() { + int channelCount = OpusDecoder.getChannelCount(HEADER); + assertThat(channelCount).isEqualTo(2); + } + + @Test + public void getPreSkipSamples_fullInitializationData_returnsOverrideValue() { + int preSkipSamples = OpusDecoder.getPreSkipSamples(FULL_INITIALIZATION_DATA); + assertThat(preSkipSamples).isEqualTo(CUSTOM_PRE_SKIP_SAMPLES); + } + + @Test + public void getPreSkipSamples_headerOnlyInitializationData_returnsHeaderValue() { + int preSkipSamples = OpusDecoder.getPreSkipSamples(HEADER_ONLY_INITIALIZATION_DATA); + assertThat(preSkipSamples).isEqualTo(HEADER_PRE_SKIP_SAMPLES); + } + + @Test + public void getSeekPreRollSamples_fullInitializationData_returnsInitializationDataValue() { + int seekPreRollSamples = OpusDecoder.getSeekPreRollSamples(FULL_INITIALIZATION_DATA); + assertThat(seekPreRollSamples).isEqualTo(CUSTOM_SEEK_PRE_ROLL_SAMPLES); + } + + @Test + public void getSeekPreRollSamples_headerOnlyInitializationData_returnsDefaultValue() { + int seekPreRollSamples = OpusDecoder.getSeekPreRollSamples(HEADER_ONLY_INITIALIZATION_DATA); + assertThat(seekPreRollSamples).isEqualTo(DEFAULT_SEEK_PRE_ROLL_SAMPLES); + } + + private static long sampleCountToNanoseconds(long sampleCount) { + return (sampleCount * C.NANOS_PER_SECOND) / OpusDecoder.SAMPLE_RATE; + } + + private static byte[] buildNativeOrderByteArray(long value) { + return ByteBuffer.allocate(8).order(ByteOrder.nativeOrder()).putLong(value).array(); + } +} diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java index 3e434bb7e8..70b1e96a8c 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/audio/OpusUtil.java @@ -61,39 +61,6 @@ public class OpusUtil { return initializationData; } - /** - * Returns the number of pre-skip samples specified by the given Opus codec initialization data. - * - * @param initializationData The codec initialization data. - * @return The number of pre-skip samples. - */ - public static int getPreSkipSamples(List initializationData) { - if (initializationData.size() == FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT) { - long codecDelayNs = - ByteBuffer.wrap(initializationData.get(1)).order(ByteOrder.nativeOrder()).getLong(); - return (int) nanosecondsToSampleCount(codecDelayNs); - } - // Fall back to parsing directly from the Opus Identification header. - return getPreSkipSamples(initializationData.get(0)); - } - - /** - * Returns the number of seek per-roll samples specified by the given Opus codec initialization - * data. - * - * @param initializationData The codec initialization data. - * @return The number of seek pre-roll samples. - */ - public static int getSeekPreRollSamples(List initializationData) { - if (initializationData.size() == FULL_CODEC_INITIALIZATION_DATA_BUFFER_COUNT) { - long seekPreRollNs = - ByteBuffer.wrap(initializationData.get(2)).order(ByteOrder.nativeOrder()).getLong(); - return (int) nanosecondsToSampleCount(seekPreRollNs); - } - // Fall back to returning the default seek pre-roll. - return DEFAULT_SEEK_PRE_ROLL_SAMPLES; - } - private static int getPreSkipSamples(byte[] header) { return ((header[11] & 0xFF) << 8) | (header[10] & 0xFF); } @@ -105,8 +72,4 @@ public class OpusUtil { private static long sampleCountToNanoseconds(long sampleCount) { return (sampleCount * C.NANOS_PER_SECOND) / SAMPLE_RATE; } - - private static long nanosecondsToSampleCount(long nanoseconds) { - return (nanoseconds * SAMPLE_RATE) / C.NANOS_PER_SECOND; - } } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java index 4fe18aa4d0..d3026359c2 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/audio/OpusUtilTest.java @@ -19,7 +19,6 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; -import com.google.common.collect.ImmutableList; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.List; @@ -41,20 +40,6 @@ public final class OpusUtilTest { private static final byte[] DEFAULT_SEEK_PRE_ROLL_BYTES = buildNativeOrderByteArray(sampleCountToNanoseconds(DEFAULT_SEEK_PRE_ROLL_SAMPLES)); - private static final ImmutableList HEADER_ONLY_INITIALIZATION_DATA = - ImmutableList.of(HEADER); - - private static final long CUSTOM_PRE_SKIP_SAMPLES = 28674; - private static final byte[] CUSTOM_PRE_SKIP_BYTES = - buildNativeOrderByteArray(sampleCountToNanoseconds(CUSTOM_PRE_SKIP_SAMPLES)); - - private static final long CUSTOM_SEEK_PRE_ROLL_SAMPLES = 7680; - private static final byte[] CUSTOM_SEEK_PRE_ROLL_BYTES = - buildNativeOrderByteArray(sampleCountToNanoseconds(CUSTOM_SEEK_PRE_ROLL_SAMPLES)); - - private static final ImmutableList FULL_INITIALIZATION_DATA = - ImmutableList.of(HEADER, CUSTOM_PRE_SKIP_BYTES, CUSTOM_SEEK_PRE_ROLL_BYTES); - @Test public void buildInitializationData() { List initializationData = OpusUtil.buildInitializationData(HEADER); @@ -70,30 +55,6 @@ public final class OpusUtilTest { assertThat(channelCount).isEqualTo(2); } - @Test - public void getPreSkipSamples_fullInitializationData_returnsOverrideValue() { - int preSkipSamples = OpusUtil.getPreSkipSamples(FULL_INITIALIZATION_DATA); - assertThat(preSkipSamples).isEqualTo(CUSTOM_PRE_SKIP_SAMPLES); - } - - @Test - public void getPreSkipSamples_headerOnlyInitializationData_returnsHeaderValue() { - int preSkipSamples = OpusUtil.getPreSkipSamples(HEADER_ONLY_INITIALIZATION_DATA); - assertThat(preSkipSamples).isEqualTo(HEADER_PRE_SKIP_SAMPLES); - } - - @Test - public void getSeekPreRollSamples_fullInitializationData_returnsInitializationDataValue() { - int seekPreRollSamples = OpusUtil.getSeekPreRollSamples(FULL_INITIALIZATION_DATA); - assertThat(seekPreRollSamples).isEqualTo(CUSTOM_SEEK_PRE_ROLL_SAMPLES); - } - - @Test - public void getSeekPreRollSamples_headerOnlyInitializationData_returnsDefaultValue() { - int seekPreRollSamples = OpusUtil.getSeekPreRollSamples(HEADER_ONLY_INITIALIZATION_DATA); - assertThat(seekPreRollSamples).isEqualTo(DEFAULT_SEEK_PRE_ROLL_SAMPLES); - } - private static long sampleCountToNanoseconds(long sampleCount) { return (sampleCount * C.NANOS_PER_SECOND) / OpusUtil.SAMPLE_RATE; } From 23b46d2e0c5cc6bb2d598685feec828bf7c977c2 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 25 Oct 2021 21:10:05 +0100 Subject: [PATCH 377/441] Move NAL unit utils to extractor module PiperOrigin-RevId: 405473686 --- .../java/com/google/android/exoplayer2/util/NalUnitUtil.java | 0 .../google/android/exoplayer2/util/ParsableNalUnitBitArray.java | 1 + .../java/com/google/android/exoplayer2/util/NalUnitUtilTest.java | 0 .../android/exoplayer2/util/ParsableNalUnitBitArrayTest.java | 0 4 files changed, 1 insertion(+) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java (100%) rename library/{common => extractor}/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java (99%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java (100%) rename library/{common => extractor}/src/test/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArrayTest.java (100%) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java b/library/extractor/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java similarity index 99% rename from library/common/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java index 50810bc6a0..33db40b91d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArray.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.util; + /** * Wraps a byte array, providing methods that allow it to be read as a NAL unit bitstream. * diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArrayTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArrayTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArrayTest.java rename to library/extractor/src/test/java/com/google/android/exoplayer2/util/ParsableNalUnitBitArrayTest.java From 241409a888ced6db35ed14c5fa53faab05739fc7 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 26 Oct 2021 09:20:21 +0100 Subject: [PATCH 378/441] Remove resolved TODO This has been done for (almost) all span types. PiperOrigin-RevId: 405588294 --- .../google/android/exoplayer2/testutil/truth/SpannedSubject.java | 1 - 1 file changed, 1 deletion(-) diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java index 47d4f57d93..2e81bff452 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java @@ -52,7 +52,6 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** A Truth {@link Subject} for assertions on {@link Spanned} instances containing text styling. */ -// TODO: add support for more Spans i.e. all those used in androidx.media3.common.text. public final class SpannedSubject extends Subject { @Nullable private final Spanned actual; From 0da494c613b8d2eb38a2cd8b8e126825b78031ce Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 26 Oct 2021 09:54:46 +0100 Subject: [PATCH 379/441] Fix main demo gradle task name PiperOrigin-RevId: 405592960 --- demos/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/README.md b/demos/README.md index 2360e01137..1ec3a1f306 100644 --- a/demos/README.md +++ b/demos/README.md @@ -21,5 +21,5 @@ the demo project. Choose an install option from the `Install tasks` section. **Example**: -`./gradlew :demo:installNoExtensionsDebug` installs the main ExoPlayer demo app - in debug mode with no extensions. +`./gradlew :demo:installNoDecoderExtensionsDebug` installs the main ExoPlayer +demo app in debug mode with no decoder extensions. From 0ad1cdbfa16b762c322d8f5bb4348f5b9d29e027 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 26 Oct 2021 10:30:55 +0100 Subject: [PATCH 380/441] Tidy READMEs PiperOrigin-RevId: 405598530 --- extensions/av1/README.md | 3 +-- extensions/cast/README.md | 5 ++--- extensions/cronet/README.md | 3 +-- extensions/ffmpeg/README.md | 3 +-- extensions/flac/README.md | 3 +-- extensions/ima/README.md | 5 ++--- extensions/leanback/README.md | 3 +-- extensions/okhttp/README.md | 3 +-- extensions/opus/README.md | 3 +-- extensions/rtmp/README.md | 3 +-- extensions/vp9/README.md | 3 +-- extensions/workmanager/README.md | 3 +-- library/common/README.md | 2 +- library/core/README.md | 2 +- library/dash/README.md | 5 ++--- library/datasource/README.md | 3 +-- library/decoder/README.md | 3 +-- library/extractor/README.md | 3 +-- library/hls/README.md | 5 ++--- library/rtsp/README.md | 5 ++--- library/smoothstreaming/README.md | 6 ++---- library/transformer/README.md | 3 +-- library/ui/README.md | 4 ++-- robolectricutils/README.md | 3 +-- testutils/README.md | 3 +-- 25 files changed, 32 insertions(+), 55 deletions(-) diff --git a/extensions/av1/README.md b/extensions/av1/README.md index c7b59baca2..f2a31dcbf1 100644 --- a/extensions/av1/README.md +++ b/extensions/av1/README.md @@ -135,7 +135,6 @@ GL rendering mode has better performance, so should be preferred ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.av1.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/cast/README.md b/extensions/cast/README.md index 880636f154..f09e1450e7 100644 --- a/extensions/cast/README.md +++ b/extensions/cast/README.md @@ -3,7 +3,7 @@ This module provides a [Player][] implementation that controls a Cast receiver app. -[Player]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/Player.html +[Player]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/Player.html ## Getting the module @@ -30,7 +30,6 @@ UI module. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.cast.*` belong to this - module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/cronet/README.md b/extensions/cronet/README.md index 7749d27d6b..fc22a77d33 100644 --- a/extensions/cronet/README.md +++ b/extensions/cronet/README.md @@ -121,7 +121,6 @@ application. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.cronet.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index cb0fdf3f7c..f4d596dc57 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -128,8 +128,7 @@ To try out playback using the module in the [demo application][], see ## Links * [Troubleshooting using extensions][] -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.ffmpeg.*` - belong to this module. +* [Javadoc][] [Troubleshooting using extensions]: https://exoplayer.dev/troubleshooting.html#how-can-i-get-a-decoding-extension-to-load-and-be-used-for-playback [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/flac/README.md b/extensions/flac/README.md index aaa4e35191..0614678f92 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -106,7 +106,6 @@ To try out playback using the module in the [demo application][], see ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.flac.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/ima/README.md b/extensions/ima/README.md index 335f4bf8c5..cb9015fd56 100644 --- a/extensions/ima/README.md +++ b/extensions/ima/README.md @@ -5,7 +5,7 @@ The ExoPlayer IMA module provides an [AdsLoader][] implementation wrapping the content played using ExoPlayer. [IMA]: https://developers.google.com/interactive-media-ads/docs/sdks/android/ -[AdsLoader]: https://exoplayer.dev/doc/reference/index.html?com/google/android/exoplayer2/source/ads/AdsLoader.html +[AdsLoader]: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/source/ads/AdsLoader.html ## Getting the module @@ -53,8 +53,7 @@ player position when backgrounded during ad playback. ## Links * [ExoPlayer documentation on ad insertion][] -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.ima.*` - belong to this module. +* [Javadoc][] [ExoPlayer documentation on ad insertion]: https://exoplayer.dev/ad-insertion.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/leanback/README.md b/extensions/leanback/README.md index 19b1659c45..2f23762b97 100644 --- a/extensions/leanback/README.md +++ b/extensions/leanback/README.md @@ -25,7 +25,6 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.leanback.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/okhttp/README.md b/extensions/okhttp/README.md index 269b9a6100..020e3496c0 100644 --- a/extensions/okhttp/README.md +++ b/extensions/okhttp/README.md @@ -51,7 +51,6 @@ new DefaultDataSourceFactory( ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.okhttp.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/opus/README.md b/extensions/opus/README.md index e3242c3f32..e669344839 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -110,7 +110,6 @@ To try out playback using the module in the [demo application][], see ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.opus.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/rtmp/README.md b/extensions/rtmp/README.md index 3df7db9a56..f825b03367 100644 --- a/extensions/rtmp/README.md +++ b/extensions/rtmp/README.md @@ -48,7 +48,6 @@ doesn't need to handle any other protocols, you can update any ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.rtmp.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index b24d089549..384064d68d 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -148,7 +148,6 @@ GL rendering mode has better performance, so should be preferred. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.vp9.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/extensions/workmanager/README.md b/extensions/workmanager/README.md index d69b47cae4..1cc28c7a37 100644 --- a/extensions/workmanager/README.md +++ b/extensions/workmanager/README.md @@ -22,7 +22,6 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ext.workmanager.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/common/README.md b/library/common/README.md index f2f8e2cca9..e9b59f7236 100644 --- a/library/common/README.md +++ b/library/common/README.md @@ -5,6 +5,6 @@ will not normally need to depend on this module directly. ## Links -* [Javadoc][]: Note that this Javadoc is combined with that of other modules. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/core/README.md b/library/core/README.md index a8c13c9e70..6eb4bad8b7 100644 --- a/library/core/README.md +++ b/library/core/README.md @@ -26,6 +26,6 @@ get started. ## Links -* [Javadoc][]: Note that this Javadoc is combined with that of other modules. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/dash/README.md b/library/dash/README.md index 0eb871a040..ea560e529a 100644 --- a/library/dash/README.md +++ b/library/dash/README.md @@ -36,9 +36,8 @@ instances and pass them directly to the player. For advanced download use cases, ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.dash.*` - belong to this module. +* [Developer Guide][] +* [Javadoc][] [Developer Guide]: https://exoplayer.dev/dash.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/datasource/README.md b/library/datasource/README.md index f87be557e9..ddd37c0e0d 100644 --- a/library/datasource/README.md +++ b/library/datasource/README.md @@ -6,7 +6,6 @@ depend on this module directly. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.upstream.*` belong to this - module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/decoder/README.md b/library/decoder/README.md index 7524b959d4..ef37e98884 100644 --- a/library/decoder/README.md +++ b/library/decoder/README.md @@ -5,7 +5,6 @@ depend on this module directly. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.decoder.*` belong to this - module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/extractor/README.md b/library/extractor/README.md index f7aaad1e4c..b1a08d9129 100644 --- a/library/extractor/README.md +++ b/library/extractor/README.md @@ -5,7 +5,6 @@ not normally need to depend on this module directly. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.extractor.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/hls/README.md b/library/hls/README.md index 93f776c25f..2168df1e80 100644 --- a/library/hls/README.md +++ b/library/hls/README.md @@ -35,9 +35,8 @@ instances and pass them directly to the player. For advanced download use cases, ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.hls.*` belong to - this module. +* [Developer Guide][] +* [Javadoc][] [Developer Guide]: https://exoplayer.dev/hls.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/rtsp/README.md b/library/rtsp/README.md index 08837189b0..c0a94bff5e 100644 --- a/library/rtsp/README.md +++ b/library/rtsp/README.md @@ -30,9 +30,8 @@ instances and pass them directly to the player. ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.source.rtsp.*` belong to - this module. +* [Developer Guide][] +* [Javadoc][] [Developer Guide]: https://exoplayer.dev/dash.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/smoothstreaming/README.md b/library/smoothstreaming/README.md index f187288666..1eceea29ef 100644 --- a/library/smoothstreaming/README.md +++ b/library/smoothstreaming/README.md @@ -35,10 +35,8 @@ instances and pass them directly to the player. For advanced download use cases, ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching - `com.google.android.exoplayer2.source.smoothstreaming.*` belong to this - module. +* [Developer Guide][] +* [Javadoc][] [Developer Guide]: https://exoplayer.dev/smoothstreaming.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/transformer/README.md b/library/transformer/README.md index 0d7ba4f0d1..b9dc677531 100644 --- a/library/transformer/README.md +++ b/library/transformer/README.md @@ -25,7 +25,6 @@ Use of the Transformer module is documented in the ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.transformer.*` belong to this - module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/ui/README.md b/library/ui/README.md index b41072427a..8f1de86449 100644 --- a/library/ui/README.md +++ b/library/ui/README.md @@ -20,8 +20,8 @@ locally. Instructions for doing this can be found in the [top level README][]. ## Links -* [Developer Guide][]. -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.ui.*` belong to this module. +* [Developer Guide][] +* [Javadoc][] [Developer Guide]: https://exoplayer.dev/ui-components.html [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/robolectricutils/README.md b/robolectricutils/README.md index 84f9139c5c..a461d21940 100644 --- a/robolectricutils/README.md +++ b/robolectricutils/README.md @@ -4,7 +4,6 @@ Provides test infrastructure for Robolectric-based media tests. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.robolectric.*` - belong to this module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/testutils/README.md b/testutils/README.md index 9f7f924261..2830e7c640 100644 --- a/testutils/README.md +++ b/testutils/README.md @@ -4,7 +4,6 @@ Provides utility classes for media unit and instrumentation tests. ## Links -* [Javadoc][]: Classes matching `com.google.android.exoplayer2.testutil.*` belong to this - module. +* [Javadoc][] [Javadoc]: https://exoplayer.dev/doc/reference/index.html From 74fb05cfbe41cb1a5b51aff2bfcaf91a51e6ed32 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 26 Oct 2021 12:35:36 +0100 Subject: [PATCH 381/441] Update MediaMetadata javadoc to clarify nuances. PiperOrigin-RevId: 405616711 --- .../src/main/java/com/google/android/exoplayer2/Player.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 34d94ede8b..7c00e1dfb9 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -141,7 +141,11 @@ public interface Player { * *

                    The provided {@link MediaMetadata} is a combination of the {@link MediaItem#mediaMetadata} * and the static and dynamic metadata from the {@link TrackSelection#getFormat(int) track - * selections' formats} and {@link Listener#onMetadata(Metadata)}. + * selections' formats} and {@link Listener#onMetadata(Metadata)}. If a field is populated in + * the {@link MediaItem#mediaMetadata}, it will be prioritised above the same field coming from + * static or dynamic metadata. + * + *

                    This method may be called multiple times in quick succession. * *

                    {@link #onEvents(Player, Events)} will also be called to report this event along with * other events that happen in the same {@link Looper} message queue iteration. From a7aa674a2947c060a74d6b28faa7cd30fca9c975 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 26 Oct 2021 13:29:20 +0100 Subject: [PATCH 382/441] Removed unused link PiperOrigin-RevId: 405624136 --- CONTRIBUTING.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 94b349b217..388b2ed259 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,8 +19,6 @@ We will also consider high quality pull requests. These should normally merge into the `dev-v2` branch. Before a pull request can be accepted you must submit a Contributor License Agreement, as described below. -[dev]: https://github.com/google/ExoPlayer/tree/dev - ## Contributor license agreement ## Contributions to any Google project must be accompanied by a Contributor From f6051654302b28a40f49df2fa3821a1b41de11e0 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 26 Oct 2021 13:45:46 +0100 Subject: [PATCH 383/441] Add database module PiperOrigin-RevId: 405626096 --- core_settings.gradle | 3 ++ .../android/exoplayer2/demo/DemoUtil.java | 4 +- docs/downloading-media.md | 2 +- library/all/build.gradle | 1 + library/core/build.gradle | 1 + .../offline/ActionFileUpgradeUtilTest.java | 6 +-- .../offline/DefaultDownloadIndexTest.java | 10 ++--- library/database/README.md | 10 +++++ library/database/build.gradle | 44 +++++++++++++++++++ library/database/src/main/AndroidManifest.xml | 19 ++++++++ .../database/DatabaseIOException.java | 0 .../exoplayer2/database/DatabaseProvider.java | 0 .../database/DefaultDatabaseProvider.java | 0 .../database/ExoDatabaseProvider.java | 0 .../database/StandaloneDatabaseProvider.java | 0 .../exoplayer2/database/VersionTable.java | 5 +++ .../exoplayer2/database/package-info.java | 0 library/database/src/test/AndroidManifest.xml | 19 ++++++++ .../exoplayer2/database/VersionTableTest.java | 0 library/datasource/build.gradle | 1 + .../playbacktests/gts/DashDownloadTest.java | 6 ++- 21 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 library/database/README.md create mode 100644 library/database/build.gradle create mode 100644 library/database/src/main/AndroidManifest.xml rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java (100%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java (100%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java (100%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java (100%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java (100%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/VersionTable.java (97%) rename library/{common => database}/src/main/java/com/google/android/exoplayer2/database/package-info.java (100%) create mode 100644 library/database/src/test/AndroidManifest.xml rename library/{common => database}/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java (100%) diff --git a/core_settings.gradle b/core_settings.gradle index 1f22196a33..83ec79ef72 100644 --- a/core_settings.gradle +++ b/core_settings.gradle @@ -51,6 +51,9 @@ project(modulePrefix + 'library-ui').projectDir = new File(rootDir, 'library/ui' include modulePrefix + 'extension-leanback' project(modulePrefix + 'extension-leanback').projectDir = new File(rootDir, 'extensions/leanback') +include modulePrefix + 'library-database' +project(modulePrefix + 'library-database').projectDir = new File(rootDir, 'library/database') + include modulePrefix + 'library-datasource' project(modulePrefix + 'library-datasource').projectDir = new File(rootDir, 'library/datasource') include modulePrefix + 'extension-cronet' diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java index a4193184bc..62c3a5a005 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoUtil.java @@ -19,7 +19,7 @@ import android.content.Context; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.database.DatabaseProvider; -import com.google.android.exoplayer2.database.ExoDatabaseProvider; +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; import com.google.android.exoplayer2.ext.cronet.CronetDataSource; import com.google.android.exoplayer2.ext.cronet.CronetUtil; import com.google.android.exoplayer2.offline.ActionFileUpgradeUtil; @@ -194,7 +194,7 @@ public final class DemoUtil { private static synchronized DatabaseProvider getDatabaseProvider(Context context) { if (databaseProvider == null) { - databaseProvider = new ExoDatabaseProvider(context); + databaseProvider = new StandaloneDatabaseProvider(context); } return databaseProvider; } diff --git a/docs/downloading-media.md b/docs/downloading-media.md index e724d0cd4a..6bef8a25d6 100644 --- a/docs/downloading-media.md +++ b/docs/downloading-media.md @@ -63,7 +63,7 @@ which can be returned by `getDownloadManager()` in your `DownloadService`: ~~~ // Note: This should be a singleton in your app. -databaseProvider = new ExoDatabaseProvider(context); +databaseProvider = new StandaloneDatabaseProvider(context); // A download cache should not evict media, so should use a NoopCacheEvictor. downloadCache = new SimpleCache( diff --git a/library/all/build.gradle b/library/all/build.gradle index 8daf11eea7..96c7ff8683 100644 --- a/library/all/build.gradle +++ b/library/all/build.gradle @@ -15,6 +15,7 @@ apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" dependencies { api project(modulePrefix + 'library-common') + api project(modulePrefix + 'library-database') api project(modulePrefix + 'library-datasource') api project(modulePrefix + 'library-decoder') api project(modulePrefix + 'library-extractor') diff --git a/library/core/build.gradle b/library/core/build.gradle index 524948cc1e..1ee7c8a289 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -40,6 +40,7 @@ dependencies { api project(modulePrefix + 'library-datasource') api project(modulePrefix + 'library-decoder') api project(modulePrefix + 'library-extractor') + api project(modulePrefix + 'library-database') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion implementation 'androidx.core:core:' + androidxCoreVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java index 05c0bcc780..239762c57f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/ActionFileUpgradeUtilTest.java @@ -20,7 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import android.net.Uri; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.database.ExoDatabaseProvider; +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; @@ -40,13 +40,13 @@ public class ActionFileUpgradeUtilTest { private static final long NOW_MS = 1234; private File tempFile; - private ExoDatabaseProvider databaseProvider; + private StandaloneDatabaseProvider databaseProvider; private DefaultDownloadIndex downloadIndex; @Before public void setUp() throws Exception { tempFile = Util.createTempFile(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); - databaseProvider = new ExoDatabaseProvider(ApplicationProvider.getApplicationContext()); + databaseProvider = new StandaloneDatabaseProvider(ApplicationProvider.getApplicationContext()); downloadIndex = new DefaultDownloadIndex(databaseProvider); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java index 988b5127ec..96bd6bbf76 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DefaultDownloadIndexTest.java @@ -29,7 +29,7 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.database.DatabaseIOException; -import com.google.android.exoplayer2.database.ExoDatabaseProvider; +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; import com.google.android.exoplayer2.database.VersionTable; import com.google.android.exoplayer2.testutil.DownloadBuilder; import com.google.android.exoplayer2.testutil.TestUtil; @@ -51,12 +51,12 @@ public class DefaultDownloadIndexTest { private static final String EMPTY_NAME = ""; - private ExoDatabaseProvider databaseProvider; + private StandaloneDatabaseProvider databaseProvider; private DefaultDownloadIndex downloadIndex; @Before public void setUp() { - databaseProvider = new ExoDatabaseProvider(ApplicationProvider.getApplicationContext()); + databaseProvider = new StandaloneDatabaseProvider(ApplicationProvider.getApplicationContext()); downloadIndex = new DefaultDownloadIndex(databaseProvider); } @@ -222,7 +222,7 @@ public class DefaultDownloadIndexTest { @Test public void downloadIndex_upgradesFromVersion2() throws IOException { Context context = ApplicationProvider.getApplicationContext(); - File databaseFile = context.getDatabasePath(ExoDatabaseProvider.DATABASE_NAME); + File databaseFile = context.getDatabasePath(StandaloneDatabaseProvider.DATABASE_NAME); try (FileOutputStream output = new FileOutputStream(databaseFile)) { output.write(TestUtil.getByteArray(context, "media/offline/exoplayer_internal_v2.db")); } @@ -251,7 +251,7 @@ public class DefaultDownloadIndexTest { ImmutableList.of(), /* customCacheKey= */ "customCacheKey"); - databaseProvider = new ExoDatabaseProvider(context); + databaseProvider = new StandaloneDatabaseProvider(context); downloadIndex = new DefaultDownloadIndex(databaseProvider); assertEqual(downloadIndex.getDownload("http://www.test.com/manifest.mpd"), dashDownload); diff --git a/library/database/README.md b/library/database/README.md new file mode 100644 index 0000000000..22afea406c --- /dev/null +++ b/library/database/README.md @@ -0,0 +1,10 @@ +# Common module + +Provides database functionality for use by other media modules. Application code +will not normally need to depend on this module directly. + +## Links + +* [Javadoc][] + +[Javadoc]: https://exoplayer.dev/doc/reference/index.html diff --git a/library/database/build.gradle b/library/database/build.gradle new file mode 100644 index 0000000000..9c73e24c68 --- /dev/null +++ b/library/database/build.gradle @@ -0,0 +1,44 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +apply from: "$gradle.ext.exoplayerSettingsDir/common_library_config.gradle" + +android { + buildTypes { + debug { + testCoverageEnabled = true + } + } +} + +dependencies { + implementation project(modulePrefix + 'library-common') + implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion + compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion + testImplementation 'androidx.test:core:' + androidxTestCoreVersion + testImplementation 'androidx.test.ext:junit:' + androidxTestJUnitVersion + testImplementation 'com.google.truth:truth:' + truthVersion + testImplementation 'org.robolectric:robolectric:' + robolectricVersion + testImplementation project(modulePrefix + 'testutils') +} + +ext { + javadocTitle = 'Database module' +} +apply from: '../../javadoc_library.gradle' + +ext { + releaseArtifactId = 'exoplayer-database' + releaseDescription = 'The ExoPlayer database module.' +} +apply from: '../../publish.gradle' diff --git a/library/database/src/main/AndroidManifest.xml b/library/database/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..482b3ea14d --- /dev/null +++ b/library/database/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java b/library/database/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/DatabaseIOException.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java b/library/database/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/DatabaseProvider.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java b/library/database/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/DefaultDatabaseProvider.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java b/library/database/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/ExoDatabaseProvider.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java b/library/database/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.java diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java b/library/database/src/main/java/com/google/android/exoplayer2/database/VersionTable.java similarity index 97% rename from library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/VersionTable.java index d6d2a1cb7d..a55767bd3e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/database/VersionTable.java +++ b/library/database/src/main/java/com/google/android/exoplayer2/database/VersionTable.java @@ -20,6 +20,7 @@ import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import androidx.annotation.IntDef; +import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -31,6 +32,10 @@ import java.lang.annotation.RetentionPolicy; */ public final class VersionTable { + static { + ExoPlayerLibraryInfo.registerModule("goog.exo.database"); + } + /** Returned by {@link #getVersion(SQLiteDatabase, int, String)} if the version is unset. */ public static final int VERSION_UNSET = -1; /** Version of tables used for offline functionality. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/database/package-info.java b/library/database/src/main/java/com/google/android/exoplayer2/database/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/database/package-info.java rename to library/database/src/main/java/com/google/android/exoplayer2/database/package-info.java diff --git a/library/database/src/test/AndroidManifest.xml b/library/database/src/test/AndroidManifest.xml new file mode 100644 index 0000000000..482b3ea14d --- /dev/null +++ b/library/database/src/test/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/library/common/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java b/library/database/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java similarity index 100% rename from library/common/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java rename to library/database/src/test/java/com/google/android/exoplayer2/database/VersionTableTest.java diff --git a/library/datasource/build.gradle b/library/datasource/build.gradle index 98de23a80e..4bd29fb1c2 100644 --- a/library/datasource/build.gradle +++ b/library/datasource/build.gradle @@ -32,6 +32,7 @@ android { dependencies { implementation project(modulePrefix + 'library-common') + implementation project(modulePrefix + 'library-database') implementation 'androidx.annotation:annotation:' + androidxAnnotationVersion compileOnly 'com.google.code.findbugs:jsr305:' + jsr305Version compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion diff --git a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java index 0518fec094..9f54167f62 100644 --- a/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java +++ b/playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashDownloadTest.java @@ -21,7 +21,7 @@ import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.rule.ActivityTestRule; import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.database.ExoDatabaseProvider; +import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.source.dash.DashUtil; import com.google.android.exoplayer2.source.dash.manifest.AdaptationSet; @@ -72,7 +72,9 @@ public final class DashDownloadTest { tempFolder = Util.createTempDirectory(testRule.getActivity(), "ExoPlayerTest"); cache = new SimpleCache( - tempFolder, new NoOpCacheEvictor(), new ExoDatabaseProvider(testRule.getActivity())); + tempFolder, + new NoOpCacheEvictor(), + new StandaloneDatabaseProvider(testRule.getActivity())); httpDataSourceFactory = new DefaultHttpDataSource.Factory(); offlineDataSourceFactory = new CacheDataSource.Factory().setCache(cache); } From 68729ecd490497f21e3d8334060c302d8333d135 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 26 Oct 2021 13:47:25 +0100 Subject: [PATCH 384/441] Remove unneeded release notes. PiperOrigin-RevId: 405626270 --- RELEASENOTES.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 023d02d95f..f5ed04a933 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -16,8 +16,6 @@ `com.google.android.exoplayer2.decoder.CryptoException`. * Move `com.google.android.exoplayer2.upstream.cache.CachedRegionTracker` to `com.google.android.exoplayer2.upstream.CachedRegionTracker`. - * Make `ExoPlayer.Builder` return a `SimpleExoPlayer` instance. - * Deprecate `SimpleExoPlayer.Builder`. Use `ExoPlayer.Builder` instead. * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use `GlUtil.glAssertionsEnabled` instead. * Move `Player.addListener(EventListener)` and From 649fe702f2149ee761947ea921136d2252477e6c Mon Sep 17 00:00:00 2001 From: hschlueter Date: Tue, 26 Oct 2021 14:20:24 +0100 Subject: [PATCH 385/441] Deduce encoder video format from decoder format. When no encoder video MIME type is specified, the `TransformerTranscodingVideoRenderer` now uses the video MIME type of the input for the encoder format. The input format is now read in a new method `ensureInputFormatRead` which is called before the other configuration methods. This removes the logic for reading the input format from `ensureDecoderConfigured`, because it is now needed for both encoder and decoder configuration but the encoder needs to be configured before GL and GL needs to be configured before the decoder, so the decoder can't read the format. The width and height are now inferred from the input and the frame rate and bit rate are still hard-coded but set by the `MediaCodecAdapterWrapper` instead of `TranscodingTransformer`. PiperOrigin-RevId: 405631263 --- .../transformer/MediaCodecAdapterWrapper.java | 13 ++-- .../transformer/TranscodingTransformer.java | 18 ++--- .../transformer/Transformation.java | 5 +- .../exoplayer2/transformer/Transformer.java | 3 +- .../transformer/TransformerAudioRenderer.java | 14 ++-- .../TransformerTranscodingVideoRenderer.java | 67 +++++++++++-------- 6 files changed, 65 insertions(+), 55 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 4afa84dfd3..be05034d70 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -19,7 +19,6 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; -import static java.lang.Math.ceil; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; @@ -202,9 +201,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * MediaCodecAdapter} video encoder. * * @param format The {@link Format} (of the output data) used to determine the underlying {@link - * MediaCodec} and its configuration values. {@link Format#width}, {@link Format#height}, - * {@link Format#frameRate} and {@link Format#averageBitrate} must be set to those of the - * desired output video format. + * MediaCodec} and its configuration values. {@link Format#sampleMimeType}, {@link + * Format#width} and {@link Format#height} must be set to those of the desired output video + * format. * @param additionalEncoderConfig A map of {@link MediaFormat}'s integer settings, where the keys * are from {@code MediaFormat.KEY_*} constants. Its values will override those in {@code * format}. @@ -215,8 +214,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; Format format, Map additionalEncoderConfig) throws IOException { checkArgument(format.width != Format.NO_VALUE); checkArgument(format.height != Format.NO_VALUE); - checkArgument(format.frameRate != Format.NO_VALUE); - checkArgument(format.averageBitrate != Format.NO_VALUE); @Nullable MediaCodecAdapter adapter = null; try { @@ -224,9 +221,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; MediaFormat.createVideoFormat( checkNotNull(format.sampleMimeType), format.width, format.height); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); - mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, (int) ceil(format.frameRate)); + mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); - mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, format.averageBitrate); + mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 413_000); for (Map.Entry encoderSetting : additionalEncoderConfig.entrySet()) { mediaFormat.setInteger(encoderSetting.getKey(), encoderSetting.getValue()); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 61feaf5dd0..8e622c2a9a 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -38,7 +38,6 @@ import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -339,7 +338,12 @@ public final class TranscodingTransformer { } Transformation transformation = new Transformation( - removeAudio, removeVideo, flattenForSlowMotion, outputMimeType, audioMimeType); + removeAudio, + removeVideo, + flattenForSlowMotion, + outputMimeType, + audioMimeType, + /* videoMimeType= */ null); return new TranscodingTransformer( context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); } @@ -639,17 +643,9 @@ public final class TranscodingTransformer { index++; } if (!transformation.removeVideo) { - Format encoderOutputFormat = - new Format.Builder() - .setSampleMimeType(MimeTypes.VIDEO_H264) - .setWidth(480) - .setHeight(360) - .setAverageBitrate(413_000) - .setFrameRate(30) - .build(); renderers[index] = new TransformerTranscodingVideoRenderer( - context, muxerWrapper, mediaClock, transformation, encoderOutputFormat); + context, muxerWrapper, mediaClock, transformation); index++; } return renderers; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java index a224fe3a93..e273c1fde5 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java @@ -26,17 +26,20 @@ import androidx.annotation.Nullable; public final boolean flattenForSlowMotion; public final String outputMimeType; @Nullable public final String audioMimeType; + @Nullable public final String videoMimeType; public Transformation( boolean removeAudio, boolean removeVideo, boolean flattenForSlowMotion, String outputMimeType, - @Nullable String audioMimeType) { + @Nullable String audioMimeType, + @Nullable String videoMimeType) { this.removeAudio = removeAudio; this.removeVideo = removeVideo; this.flattenForSlowMotion = flattenForSlowMotion; this.outputMimeType = outputMimeType; this.audioMimeType = audioMimeType; + this.videoMimeType = videoMimeType; } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 34d10137b8..1a79061f66 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -304,7 +304,8 @@ public final class Transformer { removeVideo, flattenForSlowMotion, outputMimeType, - /* audioMimeType= */ null); + /* audioMimeType= */ null, + /* videoMimeType= */ null); return new Transformer( context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 64dc53d58c..9a8da0ecf6 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -51,7 +51,7 @@ import java.nio.ByteBuffer; @Nullable private MediaCodecAdapterWrapper decoder; @Nullable private MediaCodecAdapterWrapper encoder; @Nullable private SpeedProvider speedProvider; - @Nullable private Format inputFormat; + @Nullable private Format decoderInputFormat; @Nullable private AudioFormat encoderInputAudioFormat; private ByteBuffer sonicOutputBuffer; @@ -100,7 +100,7 @@ import java.nio.ByteBuffer; encoder = null; } speedProvider = null; - inputFormat = null; + decoderInputFormat = null; encoderInputAudioFormat = null; sonicOutputBuffer = AudioProcessor.EMPTY_BUFFER; nextEncoderInputBufferTimeUs = 0; @@ -352,7 +352,7 @@ import java.nio.ByteBuffer; } String audioMimeType = transformation.audioMimeType == null - ? checkNotNull(inputFormat).sampleMimeType + ? checkNotNull(decoderInputFormat).sampleMimeType : transformation.audioMimeType; try { encoder = @@ -385,14 +385,14 @@ import java.nio.ByteBuffer; if (result != C.RESULT_FORMAT_READ) { return false; } - inputFormat = checkNotNull(formatHolder.format); + decoderInputFormat = checkNotNull(formatHolder.format); try { - decoder = MediaCodecAdapterWrapper.createForAudioDecoding(inputFormat); + decoder = MediaCodecAdapterWrapper.createForAudioDecoding(decoderInputFormat); } catch (IOException e) { // TODO (internal b/184262323): Assign an adequate error code. throw createRendererException(e, PlaybackException.ERROR_CODE_UNSPECIFIED); } - speedProvider = new SegmentSpeedProvider(inputFormat); + speedProvider = new SegmentSpeedProvider(decoderInputFormat); currentSpeed = speedProvider.getSpeed(0); return true; } @@ -418,7 +418,7 @@ import java.nio.ByteBuffer; cause, TAG, getIndex(), - inputFormat, + decoderInputFormat, /* rendererFormatSupport= */ C.FORMAT_HANDLED, /* isRecoverable= */ false, errorCode); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 79d28a208e..8c1e11df61 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -42,6 +42,7 @@ import com.google.android.exoplayer2.util.GlUtil; import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.nio.ByteBuffer; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @RequiresApi(18) /* package */ final class TransformerTranscodingVideoRenderer extends TransformerBaseRenderer { @@ -53,12 +54,12 @@ import java.nio.ByteBuffer; private static final String TAG = "TransformerTranscodingVideoRenderer"; private final Context context; - /** The format the encoder is configured to output, may differ from the actual output format. */ - private final Format encoderConfigurationOutputFormat; private final DecoderInputBuffer decoderInputBuffer; private final float[] decoderTextureTransformMatrix; + private @MonotonicNonNull Format decoderInputFormat; + @Nullable private EGLDisplay eglDisplay; @Nullable private EGLContext eglContext; @Nullable private EGLSurface eglSurface; @@ -81,11 +82,9 @@ import java.nio.ByteBuffer; Context context, MuxerWrapper muxerWrapper, TransformerMediaClock mediaClock, - Transformation transformation, - Format encoderConfigurationOutputFormat) { + Transformation transformation) { super(C.TRACK_TYPE_VIDEO, muxerWrapper, mediaClock, transformation); this.context = context; - this.encoderConfigurationOutputFormat = encoderConfigurationOutputFormat; decoderInputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT); decoderTextureTransformMatrix = new float[16]; decoderTextureId = GlUtil.TEXTURE_ID_UNSET; @@ -97,15 +96,13 @@ import java.nio.ByteBuffer; } @Override - protected void onStarted() throws ExoPlaybackException { - super.onStarted(); + public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { + if (!isRendererStarted || isEnded() || !ensureInputFormatRead()) { + return; + } ensureEncoderConfigured(); ensureOpenGlConfigured(); - } - - @Override - public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { - if (!isRendererStarted || isEnded() || !ensureDecoderConfigured()) { + if (!ensureDecoderConfigured()) { return; } @@ -153,6 +150,22 @@ import java.nio.ByteBuffer; muxerWrapperTrackEnded = false; } + private boolean ensureInputFormatRead() { + if (decoderInputFormat != null) { + return true; + } + FormatHolder formatHolder = getFormatHolder(); + @SampleStream.ReadDataResult + int result = + readSource( + formatHolder, decoderInputBuffer, /* readFlags= */ SampleStream.FLAG_REQUIRE_FORMAT); + if (result != C.RESULT_FORMAT_READ) { + return false; + } + decoderInputFormat = checkNotNull(formatHolder.format); + return true; + } + private void ensureEncoderConfigured() throws ExoPlaybackException { if (encoder != null) { return; @@ -161,7 +174,15 @@ import java.nio.ByteBuffer; try { encoder = MediaCodecAdapterWrapper.createForVideoEncoding( - encoderConfigurationOutputFormat, ImmutableMap.of()); + new Format.Builder() + .setWidth(checkNotNull(decoderInputFormat).width) + .setHeight(decoderInputFormat.height) + .setSampleMimeType( + transformation.videoMimeType != null + ? transformation.videoMimeType + : decoderInputFormat.sampleMimeType) + .build(), + ImmutableMap.of()); } catch (IOException e) { throw createRendererException( // TODO(claincly): should be "ENCODER_INIT_FAILED" @@ -190,8 +211,8 @@ import java.nio.ByteBuffer; eglDisplay, eglContext, eglSurface, - encoderConfigurationOutputFormat.width, - encoderConfigurationOutputFormat.height); + checkNotNull(decoderInputFormat).width, + decoderInputFormat.height); decoderTextureId = GlUtil.createExternalTexture(); String vertexShaderCode; String fragmentShaderCode; @@ -248,26 +269,18 @@ import java.nio.ByteBuffer; return true; } - FormatHolder formatHolder = getFormatHolder(); - @SampleStream.ReadDataResult - int result = - readSource( - formatHolder, decoderInputBuffer, /* readFlags= */ SampleStream.FLAG_REQUIRE_FORMAT); - if (result != C.RESULT_FORMAT_READ) { - return false; - } - - Format inputFormat = checkNotNull(formatHolder.format); checkState(decoderTextureId != GlUtil.TEXTURE_ID_UNSET); decoderSurfaceTexture = new SurfaceTexture(decoderTextureId); decoderSurfaceTexture.setOnFrameAvailableListener( surfaceTexture -> isDecoderSurfacePopulated = true); decoderSurface = new Surface(decoderSurfaceTexture); try { - decoder = MediaCodecAdapterWrapper.createForVideoDecoding(inputFormat, decoderSurface); + decoder = + MediaCodecAdapterWrapper.createForVideoDecoding( + checkNotNull(decoderInputFormat), decoderSurface); } catch (IOException e) { throw createRendererException( - e, formatHolder.format, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); + e, decoderInputFormat, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); } return true; } From 98200c2692ba007ba0b177d7b285b957dc08ff93 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 26 Oct 2021 14:31:23 +0100 Subject: [PATCH 386/441] Replace ExtractorsFactory with MediaSourceFactory in ExoPlayer.Builder This has a few benefits: * Aligns the Builder constructors with the setters (setRenderersFactory is missing, but can be easily added in a follow-up change). * Allows DefaultMediaSourceFactory to be stripped by R8 and makes the shrinking dev guide for the cases of providing a custom MediaSourceFactory or directly instantiating MediaSource instances less weird too. #minor-release PiperOrigin-RevId: 405632981 --- docs/shrinking.md | 49 ++++++---- .../google/android/exoplayer2/ExoPlayer.java | 91 ++++++++----------- .../android/exoplayer2/SimpleExoPlayer.java | 23 +++-- .../exoplayer2/source/MediaSourceFactory.java | 50 ++++++++++ 4 files changed, 136 insertions(+), 77 deletions(-) diff --git a/docs/shrinking.md b/docs/shrinking.md index 5506e742c2..7c97c9ea29 100644 --- a/docs/shrinking.md +++ b/docs/shrinking.md @@ -81,36 +81,49 @@ an app that only needs to play mp4 files can provide a factory like: ExtractorsFactory mp4ExtractorFactory = () -> new Extractor[] {new Mp4Extractor()}; ExoPlayer player = - new ExoPlayer.Builder(context, mp4ExtractorFactory).build(); + new ExoPlayer.Builder( + context, + new DefaultMediaSourceFactory(context, mp4ExtractorFactory)) + .build(); ~~~ {: .language-java} This will allow other `Extractor` implementations to be removed by code shrinking, which can result in a significant reduction in size. -You should pass `ExtractorsFactory.EMPTY` to the `ExoPlayer.Builder` -constructor, if your app is doing one of the following: - -* Not playing progressive media at all, for example because it only - plays DASH, HLS or SmoothStreaming content -* Providing a customized `DefaultMediaSourceFactory` -* Using `MediaSource`s directly instead of `MediaItem`s +If your app is not playing progressive content at all, you should pass +`ExtractorsFactory.EMPTY` to the `DefaultMediaSourceFactory` constructor, then +pass that `mediaSourceFactory` to the `ExoPlayer.Builder` constructor. ~~~ -// Only playing DASH, HLS or SmoothStreaming. ExoPlayer player = - new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); + new ExoPlayer.Builder( + context, + new DefaultMediaSourceFactory(context, ExtractorsFactory.EMPTY)) + .build(); +~~~ +{: .language-java} -// Providing a customized `DefaultMediaSourceFactory` -ExoPlayer player = - new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY) - .setMediaSourceFactory( - new DefaultMediaSourceFactory(context, customExtractorsFactory)) - .build(); +## Custom `MediaSource` instantiation ## -// Using a MediaSource directly. +If your app is using a custom `MediaSourceFactory` and you want +`DefaultMediaSourceFactory` to be removed by code stripping, you should pass +your `MediaSourceFactory` directly to the `ExoPlayer.Builder` constructor. + +~~~ ExoPlayer player = - new ExoPlayer.Builder(context, ExtractorsFactory.EMPTY).build(); + new ExoPlayer.Builder(context, customMediaSourceFactory).build(); +~~~ +{: .language-java} + +If your app is using `MediaSource`s directly instead of `MediaItem`s you should +pass `MediaSourceFactory.UNSUPPORTED` to the `ExoPlayer.Builder` constructor, to +ensure `DefaultMediaSourceFactory` and `DefaultExtractorsFactory` can be +stripped by code shrinking. + +~~~ +ExoPlayer player = + new ExoPlayer.Builder(context, MediaSourceFactory.UNSUPPORTED).build(); ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory( dataSourceFactory, customExtractorsFactory) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 1605a3e5a3..635a4051c9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -367,8 +367,8 @@ public interface ExoPlayer extends Player { /* package */ Clock clock; /* package */ long foregroundModeTimeoutMs; - /* package */ TrackSelector trackSelector; /* package */ MediaSourceFactory mediaSourceFactory; + /* package */ TrackSelector trackSelector; /* package */ LoadControl loadControl; /* package */ BandwidthMeter bandwidthMeter; /* package */ AnalyticsCollector analyticsCollector; @@ -395,10 +395,11 @@ public interface ExoPlayer extends Player { * Creates a builder. * *

                    Use {@link #Builder(Context, RenderersFactory)}, {@link #Builder(Context, - * RenderersFactory)} or {@link #Builder(Context, RenderersFactory, ExtractorsFactory)} instead, - * if you intend to provide a custom {@link RenderersFactory} or a custom {@link - * ExtractorsFactory}. This is to ensure that ProGuard or R8 can remove ExoPlayer's {@link - * DefaultRenderersFactory} and {@link DefaultExtractorsFactory} from the APK. + * MediaSourceFactory)} or {@link #Builder(Context, RenderersFactory, MediaSourceFactory)} + * instead, if you intend to provide a custom {@link RenderersFactory}, {@link + * ExtractorsFactory} or {@link DefaultMediaSourceFactory}. This is to ensure that ProGuard or + * R8 can remove ExoPlayer's {@link DefaultRenderersFactory}, {@link DefaultExtractorsFactory} + * and {@link DefaultMediaSourceFactory} from the APK. * *

                    The builder uses the following default values: * @@ -434,7 +435,10 @@ public interface ExoPlayer extends Player { * @param context A {@link Context}. */ public Builder(Context context) { - this(context, new DefaultRenderersFactory(context), new DefaultExtractorsFactory()); + this( + context, + new DefaultRenderersFactory(context), + new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } /** @@ -447,40 +451,23 @@ public interface ExoPlayer extends Player { * player. */ public Builder(Context context, RenderersFactory renderersFactory) { - this(context, renderersFactory, new DefaultExtractorsFactory()); - } - - /** - * Creates a builder with a custom {@link ExtractorsFactory}. - * - *

                    See {@link #Builder(Context)} for a list of default values. - * - * @param context A {@link Context}. - * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from - * its container. - */ - public Builder(Context context, ExtractorsFactory extractorsFactory) { - this(context, new DefaultRenderersFactory(context), extractorsFactory); - } - - /** - * Creates a builder with a custom {@link RenderersFactory} and {@link ExtractorsFactory}. - * - *

                    See {@link #Builder(Context)} for a list of default values. - * - * @param context A {@link Context}. - * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the - * player. - * @param extractorsFactory An {@link ExtractorsFactory} used to extract progressive media from - * its container. - */ - public Builder( - Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { this( context, renderersFactory, + new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); + } + + public Builder(Context context, MediaSourceFactory mediaSourceFactory) { + this(context, new DefaultRenderersFactory(context), mediaSourceFactory); + } + + public Builder( + Context context, RenderersFactory renderersFactory, MediaSourceFactory mediaSourceFactory) { + this( + context, + renderersFactory, + mediaSourceFactory, new DefaultTrackSelector(context), - new DefaultMediaSourceFactory(context, extractorsFactory), new DefaultLoadControl(), DefaultBandwidthMeter.getSingletonInstance(context), new AnalyticsCollector(Clock.DEFAULT)); @@ -495,8 +482,8 @@ public interface ExoPlayer extends Player { * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the * player. - * @param trackSelector A {@link TrackSelector}. * @param mediaSourceFactory A {@link MediaSourceFactory}. + * @param trackSelector A {@link TrackSelector}. * @param loadControl A {@link LoadControl}. * @param bandwidthMeter A {@link BandwidthMeter}. * @param analyticsCollector An {@link AnalyticsCollector}. @@ -504,15 +491,15 @@ public interface ExoPlayer extends Player { public Builder( Context context, RenderersFactory renderersFactory, - TrackSelector trackSelector, MediaSourceFactory mediaSourceFactory, + TrackSelector trackSelector, LoadControl loadControl, BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) { this.context = context; this.renderersFactory = renderersFactory; - this.trackSelector = trackSelector; this.mediaSourceFactory = mediaSourceFactory; + this.trackSelector = trackSelector; this.loadControl = loadControl; this.bandwidthMeter = bandwidthMeter; this.analyticsCollector = analyticsCollector; @@ -546,19 +533,6 @@ public interface ExoPlayer extends Player { return this; } - /** - * Sets the {@link TrackSelector} that will be used by the player. - * - * @param trackSelector A {@link TrackSelector}. - * @return This builder. - * @throws IllegalStateException If {@link #build()} has already been called. - */ - public Builder setTrackSelector(TrackSelector trackSelector) { - checkState(!buildCalled); - this.trackSelector = trackSelector; - return this; - } - /** * Sets the {@link MediaSourceFactory} that will be used by the player. * @@ -572,6 +546,19 @@ public interface ExoPlayer extends Player { return this; } + /** + * Sets the {@link TrackSelector} that will be used by the player. + * + * @param trackSelector A {@link TrackSelector}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setTrackSelector(TrackSelector trackSelector) { + checkState(!buildCalled); + this.trackSelector = trackSelector; + return this; + } + /** * Sets the {@link LoadControl} that will be used by the player. * diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index f247b20ebe..c6fddec392 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -55,6 +55,7 @@ import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.MetadataOutput; +import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.source.ShuffleOrder; @@ -111,25 +112,33 @@ public class SimpleExoPlayer extends BasePlayer wrappedBuilder = new ExoPlayer.Builder(context, renderersFactory); } - /** @deprecated Use {@link ExoPlayer.Builder#Builder(Context, ExtractorsFactory)} instead. */ + /** + * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, MediaSourceFactory)} and {@link + * DefaultMediaSourceFactory#DefaultMediaSourceFactory(Context, ExtractorsFactory)} instead. + */ @Deprecated public Builder(Context context, ExtractorsFactory extractorsFactory) { - wrappedBuilder = new ExoPlayer.Builder(context, extractorsFactory); + wrappedBuilder = + new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory)); } /** * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory, - * ExtractorsFactory)} instead. + * MediaSourceFactory)} and {@link + * DefaultMediaSourceFactory#DefaultMediaSourceFactory(Context, ExtractorsFactory)} instead. */ @Deprecated public Builder( Context context, RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory) { - wrappedBuilder = new ExoPlayer.Builder(context, renderersFactory, extractorsFactory); + wrappedBuilder = + new ExoPlayer.Builder( + context, renderersFactory, new DefaultMediaSourceFactory(context, extractorsFactory)); } /** - * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory, TrackSelector, - * MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)} instead. + * @deprecated Use {@link ExoPlayer.Builder#Builder(Context, RenderersFactory, + * MediaSourceFactory, TrackSelector, LoadControl, BandwidthMeter, AnalyticsCollector)} + * instead. */ @Deprecated public Builder( @@ -144,8 +153,8 @@ public class SimpleExoPlayer extends BasePlayer new ExoPlayer.Builder( context, renderersFactory, - trackSelector, mediaSourceFactory, + trackSelector, loadControl, bandwidthMeter, analyticsCollector); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java index d4a5d6ca62..9a4896a95f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceFactory.java @@ -34,6 +34,56 @@ import java.util.List; /** Factory for creating {@link MediaSource MediaSources} from {@link MediaItem MediaItems}. */ public interface MediaSourceFactory { + /** + * An instance that throws {@link UnsupportedOperationException} from {@link #createMediaSource} + * and {@link #getSupportedTypes()}. + */ + MediaSourceFactory UNSUPPORTED = + new MediaSourceFactory() { + @Override + public MediaSourceFactory setDrmSessionManagerProvider( + @Nullable DrmSessionManagerProvider drmSessionManagerProvider) { + return this; + } + + @Deprecated + @Override + public MediaSourceFactory setDrmSessionManager( + @Nullable DrmSessionManager drmSessionManager) { + return this; + } + + @Deprecated + @Override + public MediaSourceFactory setDrmHttpDataSourceFactory( + @Nullable HttpDataSource.Factory drmHttpDataSourceFactory) { + return this; + } + + @Deprecated + @Override + public MediaSourceFactory setDrmUserAgent(@Nullable String userAgent) { + return this; + } + + @Override + public MediaSourceFactory setLoadErrorHandlingPolicy( + @Nullable LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + return this; + } + + @Override + @C.ContentType + public int[] getSupportedTypes() { + throw new UnsupportedOperationException(); + } + + @Override + public MediaSource createMediaSource(MediaItem mediaItem) { + throw new UnsupportedOperationException(); + } + }; + /** @deprecated Use {@link MediaItem.LocalConfiguration#streamKeys} instead. */ @Deprecated default MediaSourceFactory setStreamKeys(@Nullable List streamKeys) { From 8545a8b35f18360bf52ba2d33387a1dffc4806c6 Mon Sep 17 00:00:00 2001 From: hschlueter Date: Tue, 26 Oct 2021 15:44:37 +0100 Subject: [PATCH 387/441] Allow video MIME type to be set in TranscodingTransformer. Also check that the output video MIME type is supported with the given container MIME type in `TranscodingTransformer` and `TransformerBaseRenderer`. PiperOrigin-RevId: 405645362 --- .../transformer/TranscodingTransformer.java | 50 ++++++++++++++++--- .../transformer/TransformerBaseRenderer.java | 5 +- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 8e622c2a9a..d766987aa8 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -100,6 +100,7 @@ public final class TranscodingTransformer { private boolean flattenForSlowMotion; private String outputMimeType; @Nullable private String audioMimeType; + @Nullable private String videoMimeType; private TranscodingTransformer.Listener listener; private Looper looper; private Clock clock; @@ -123,6 +124,7 @@ public final class TranscodingTransformer { this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; this.outputMimeType = transcodingTransformer.transformation.outputMimeType; this.audioMimeType = transcodingTransformer.transformation.audioMimeType; + this.videoMimeType = transcodingTransformer.transformation.videoMimeType; this.listener = transcodingTransformer.listener; this.looper = transcodingTransformer.looper; this.clock = transcodingTransformer.clock; @@ -229,6 +231,33 @@ public final class TranscodingTransformer { return this; } + /** + * Sets the video MIME type of the output. The default value is to use the same MIME type as the + * input. Supported values are: + * + *

                      + *
                    • when the container MIME type is {@link MimeTypes#VIDEO_MP4}: + *
                        + *
                      • {@link MimeTypes#VIDEO_H263} + *
                      • {@link MimeTypes#VIDEO_H264} + *
                      • {@link MimeTypes#VIDEO_H265} from API level 24 + *
                      • {@link MimeTypes#VIDEO_MP4V} + *
                      + *
                    • when the container MIME type is {@link MimeTypes#VIDEO_WEBM}: + *
                        + *
                      • {@link MimeTypes#VIDEO_VP8} + *
                      • {@link MimeTypes#VIDEO_VP9} from API level 24 + *
                      + *
                    + * + * @param videoMimeType The MIME type of the video samples in the output. + * @return This builder. + */ + public Builder setVideoMimeType(String videoMimeType) { + this.videoMimeType = videoMimeType; + return this; + } + /** * Sets the audio MIME type of the output. The default value is to use the same MIME type as the * input. Supported values are: @@ -329,12 +358,10 @@ public final class TranscodingTransformer { muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); if (audioMimeType != null) { - checkState( - muxerFactory.supportsSampleMimeType(audioMimeType, outputMimeType), - "Unsupported sample MIME type " - + audioMimeType - + " for container MIME type " - + outputMimeType); + checkSampleMimeType(audioMimeType); + } + if (videoMimeType != null) { + checkSampleMimeType(videoMimeType); } Transformation transformation = new Transformation( @@ -343,10 +370,19 @@ public final class TranscodingTransformer { flattenForSlowMotion, outputMimeType, audioMimeType, - /* videoMimeType= */ null); + videoMimeType); return new TranscodingTransformer( context, mediaSourceFactory, muxerFactory, transformation, listener, looper, clock); } + + private void checkSampleMimeType(String sampleMimeType) { + checkState( + muxerFactory.supportsSampleMimeType(sampleMimeType, outputMimeType), + "Unsupported sample MIME type " + + sampleMimeType + + " for container MIME type " + + outputMimeType); + } } /** A listener for the transformation events. */ diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java index 4f2243000d..e0ceb945fc 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java @@ -58,7 +58,10 @@ import com.google.android.exoplayer2.util.MimeTypes; ? sampleMimeType : transformation.audioMimeType)) || (MimeTypes.isVideo(sampleMimeType) - && muxerWrapper.supportsSampleMimeType(sampleMimeType))) { + && muxerWrapper.supportsSampleMimeType( + transformation.videoMimeType == null + ? sampleMimeType + : transformation.videoMimeType))) { return RendererCapabilities.create(C.FORMAT_HANDLED); } else { return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE); From 383bad80ce2aabe8418073f7d81336a6d556c763 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Tue, 26 Oct 2021 16:45:30 +0100 Subject: [PATCH 388/441] Generalize findEsdsPosition to support other types - This CL does not introduce functional changes. - This change will allow searching for the clli box while parsing the mdcv box in order to construct the HDR static info contained in ColorInfo. #minor-release PiperOrigin-RevId: 405656499 --- .../exoplayer2/extractor/mp4/AtomParsers.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index b43eddf300..93b9c5b77a 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -1435,7 +1435,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; int esdsAtomPosition = childAtomType == Atom.TYPE_esds ? childPosition - : findEsdsPosition(parent, childPosition, childAtomSize); + : findBoxPosition(parent, Atom.TYPE_esds, childPosition, childAtomSize); if (esdsAtomPosition != C.POSITION_UNSET) { Pair<@NullableType String, byte @NullableType []> mimeTypeAndInitializationData = parseEsdsFromParent(parent, esdsAtomPosition); @@ -1537,18 +1537,28 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } /** - * Returns the position of the esds box within a parent, or {@link C#POSITION_UNSET} if no esds - * box is found + * Returns the position of the first box with the given {@code boxType} within {@code parent}, or + * {@link C#POSITION_UNSET} if no such box is found. + * + * @param parent The {@link ParsableByteArray} to search. The search will start from the {@link + * ParsableByteArray#getPosition() current position}. + * @param boxType The box type to search for. + * @param parentBoxPosition The position in {@code parent} of the box we are searching. + * @param parentBoxSize The size of the parent box we are searching in bytes. + * @return The position of the first box with the given {@code boxType} within {@code parent}, or + * {@link C#POSITION_UNSET} if no such box is found. */ - private static int findEsdsPosition(ParsableByteArray parent, int position, int size) + private static int findBoxPosition( + ParsableByteArray parent, int boxType, int parentBoxPosition, int parentBoxSize) throws ParserException { int childAtomPosition = parent.getPosition(); - while (childAtomPosition - position < size) { + ExtractorUtil.checkContainerInput(childAtomPosition >= parentBoxPosition, /* message= */ null); + while (childAtomPosition - parentBoxPosition < parentBoxSize) { parent.setPosition(childAtomPosition); int childAtomSize = parent.readInt(); ExtractorUtil.checkContainerInput(childAtomSize > 0, "childAtomSize must be positive"); int childType = parent.readInt(); - if (childType == Atom.TYPE_esds) { + if (childType == boxType) { return childAtomPosition; } childAtomPosition += childAtomSize; From 310f268a626ee54b6a5de0b2d2f223d10db07894 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 26 Oct 2021 22:30:30 +0100 Subject: [PATCH 389/441] Set assumedVideoMinimumCodecOperatingRate for all playbacks PiperOrigin-RevId: 405736227 --- .../video/MediaCodecVideoRenderer.java | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index de6215e0b5..55b6359fef 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -205,7 +205,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { /* enableDecoderFallback= */ false, eventHandler, eventListener, - maxDroppedFramesToNotify); + maxDroppedFramesToNotify, + /* assumedMinimumCodecOperatingRate= */ 30); } /** @@ -238,12 +239,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { enableDecoderFallback, eventHandler, eventListener, - maxDroppedFramesToNotify); + maxDroppedFramesToNotify, + /* assumedMinimumCodecOperatingRate= */ 30); } /** - * Creates a new instance. - * * @param context A context. * @param codecAdapterFactory The {@link MediaCodecAdapter.Factory} used to create {@link * MediaCodecAdapter} instances. @@ -268,12 +268,56 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { @Nullable Handler eventHandler, @Nullable VideoRendererEventListener eventListener, int maxDroppedFramesToNotify) { + + this( + context, + codecAdapterFactory, + mediaCodecSelector, + allowedJoiningTimeMs, + enableDecoderFallback, + eventHandler, + eventListener, + maxDroppedFramesToNotify, + /* assumedMinimumCodecOperatingRate= */ 30); + } + + /** + * Creates a new instance. + * + * @param context A context. + * @param codecAdapterFactory The {@link MediaCodecAdapter.Factory} used to create {@link + * MediaCodecAdapter} instances. + * @param mediaCodecSelector A decoder selector. + * @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer + * can attempt to seamlessly join an ongoing playback. + * @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder + * initialization fails. This may result in using a decoder that is slower/less efficient than + * the primary decoder. + * @param eventHandler A handler to use when delivering events to {@code eventListener}. May be + * null if delivery of events is not required. + * @param eventListener A listener of events. May be null if delivery of events is not required. + * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between + * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. + * @param assumedMinimumCodecOperatingRate A codec operating rate that all codecs instantiated by + * this renderer are assumed to meet implicitly (i.e. without the operating rate being set + * explicitly using {@link MediaFormat#KEY_OPERATING_RATE}). + */ + public MediaCodecVideoRenderer( + Context context, + MediaCodecAdapter.Factory codecAdapterFactory, + MediaCodecSelector mediaCodecSelector, + long allowedJoiningTimeMs, + boolean enableDecoderFallback, + @Nullable Handler eventHandler, + @Nullable VideoRendererEventListener eventListener, + int maxDroppedFramesToNotify, + float assumedMinimumCodecOperatingRate) { super( C.TRACK_TYPE_VIDEO, codecAdapterFactory, mediaCodecSelector, enableDecoderFallback, - /* assumedMinimumCodecOperatingRate= */ 30); + assumedMinimumCodecOperatingRate); this.allowedJoiningTimeMs = allowedJoiningTimeMs; this.maxDroppedFramesToNotify = maxDroppedFramesToNotify; this.context = context.getApplicationContext(); From 3bc0fae70881758ad9b19a845464c263404e2c82 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 27 Oct 2021 10:26:50 +0100 Subject: [PATCH 390/441] Migrate SegmentSpeedProviderTest off deprecated method. PiperOrigin-RevId: 405841397 --- .../transformer/SegmentSpeedProviderTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/SegmentSpeedProviderTest.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/SegmentSpeedProviderTest.java index 616443e963..5fa2880e7c 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/SegmentSpeedProviderTest.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/SegmentSpeedProviderTest.java @@ -19,12 +19,12 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData.Segment; import com.google.android.exoplayer2.metadata.mp4.SmtaMetadataEntry; +import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import java.util.List; import org.junit.Test; @@ -60,17 +60,17 @@ public class SegmentSpeedProviderTest { .setMetadata(new Metadata(new SlowMotionData(segments), SMTA_SPEED_8)) .build()); - assertThat(provider.getSpeed(C.msToUs(0))).isEqualTo(8); - assertThat(provider.getSpeed(C.msToUs(500))).isEqualTo(1); - assertThat(provider.getSpeed(C.msToUs(800))).isEqualTo(1); - assertThat(provider.getSpeed(C.msToUs(1000))).isEqualTo(8); - assertThat(provider.getSpeed(C.msToUs(1250))).isEqualTo(8); - assertThat(provider.getSpeed(C.msToUs(1500))).isEqualTo(2); - assertThat(provider.getSpeed(C.msToUs(1650))).isEqualTo(2); - assertThat(provider.getSpeed(C.msToUs(2000))).isEqualTo(4); - assertThat(provider.getSpeed(C.msToUs(2400))).isEqualTo(4); - assertThat(provider.getSpeed(C.msToUs(2500))).isEqualTo(8); - assertThat(provider.getSpeed(C.msToUs(3000))).isEqualTo(8); + assertThat(provider.getSpeed(Util.msToUs(0))).isEqualTo(8); + assertThat(provider.getSpeed(Util.msToUs(500))).isEqualTo(1); + assertThat(provider.getSpeed(Util.msToUs(800))).isEqualTo(1); + assertThat(provider.getSpeed(Util.msToUs(1000))).isEqualTo(8); + assertThat(provider.getSpeed(Util.msToUs(1250))).isEqualTo(8); + assertThat(provider.getSpeed(Util.msToUs(1500))).isEqualTo(2); + assertThat(provider.getSpeed(Util.msToUs(1650))).isEqualTo(2); + assertThat(provider.getSpeed(Util.msToUs(2000))).isEqualTo(4); + assertThat(provider.getSpeed(Util.msToUs(2400))).isEqualTo(4); + assertThat(provider.getSpeed(Util.msToUs(2500))).isEqualTo(8); + assertThat(provider.getSpeed(Util.msToUs(3000))).isEqualTo(8); } @Test From 39639f8df0f6fe0b8acadf1fbec1b38ed6e20988 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 10:34:03 +0100 Subject: [PATCH 391/441] Allow missing full_range_flag in colr box with type=nclx Test file produced with: $ MP4Box -add "sample.mp4#video:colr=nclc,1,1,1" -new sample_18byte_nclx_colr.mp4 And then manually changing the `nclc` bytes to `nclx`. This produces an 18-byte `colr` box with type `nclx`. The bitstream of this file does not contain HDR content, so the file itself is invalid for playback with a real decoder, but adding the box is enough to test the extractor change in this commit. (aside: MP4Box will let you pass `nclx`, but it requires 4 parameters, i.e. it requires the full_range_flag to be set, resulting in a valid 19-byte colr box) #minor-release Issue: #9332 PiperOrigin-RevId: 405842520 --- RELEASENOTES.md | 7 +- .../exoplayer2/extractor/mp4/AtomParsers.java | 11 +- .../extractor/mp4/Mp4ExtractorTest.java | 11 ++ .../mp4/sample_18byte_nclx_colr.mp4.0.dump | 148 ++++++++++++++++++ .../mp4/sample_18byte_nclx_colr.mp4.1.dump | 148 ++++++++++++++++++ .../mp4/sample_18byte_nclx_colr.mp4.2.dump | 148 ++++++++++++++++++ .../mp4/sample_18byte_nclx_colr.mp4.3.dump | 148 ++++++++++++++++++ ...e_18byte_nclx_colr.mp4.unknown_length.dump | 148 ++++++++++++++++++ .../media/mp4/sample_18byte_nclx_colr.mp4 | Bin 0 -> 91100 bytes 9 files changed, 764 insertions(+), 5 deletions(-) create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.unknown_length.dump create mode 100644 testdata/src/test/assets/media/mp4/sample_18byte_nclx_colr.mp4 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f5ed04a933..bf708bfa32 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,8 +24,8 @@ ([#9458](https://github.com/google/ExoPlayer/issues/9458)). * Remove final dependency on `jcenter()`. * Adjust `ExoPlayer` `MediaMetadata` update priority, such that values - input through the `MediaItem.MediaMetadata` are used above media - derived values. + input through the `MediaItem.MediaMetadata` are used above media derived + values. * Video: * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a released `Surface` when playing without an app-provided `Surface` @@ -61,6 +61,9 @@ * MP4: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * MP4: Add support for Dolby TrueHD (only for unfragmented streams) ([#9496](https://github.com/google/ExoPlayer/issues/9496)). + * MP4: Avoid throwing `ArrayIndexOutOfBoundsException` when parsing + invalid `colr` boxes produced by some device cameras + ([#9332](https://github.com/google/ExoPlayer/issues/9332)). * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Map stream type 0x80 to H262 ([#9472](https://github.com/google/ExoPlayer/issues/9472)). diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index 93b9c5b77a..bc5fa10fe3 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -1198,14 +1198,19 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } } else if (childAtomType == Atom.TYPE_colr) { int colorType = parent.readInt(); - boolean isNclx = colorType == TYPE_nclx; - if (isNclx || colorType == TYPE_nclc) { + if (colorType == TYPE_nclx || colorType == TYPE_nclc) { // For more info on syntax, see Section 8.5.2.2 in ISO/IEC 14496-12:2012(E) and // https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html. int colorPrimaries = parent.readUnsignedShort(); int transferCharacteristics = parent.readUnsignedShort(); parent.skipBytes(2); // matrix_coefficients. - boolean fullRangeFlag = isNclx && (parent.readUnsignedByte() & 0b10000000) != 0; + + // Only try and read full_range_flag if the box is long enough. It should be present in + // all colr boxes with type=nclx (Section 8.5.2.2 in ISO/IEC 14496-12:2012(E)) but some + // device cameras record videos with type=nclx without this final flag (and therefore + // size=18): https://github.com/google/ExoPlayer/issues/9332 + boolean fullRangeFlag = + childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0; colorInfo = new ColorInfo( ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries), diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java index 9c41d361ad..911f3f477e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java @@ -103,6 +103,17 @@ public final class Mp4ExtractorTest { Mp4Extractor::new, "media/mp4/sample_with_color_info.mp4", simulationConfig); } + /** + * Test case for https://github.com/google/ExoPlayer/issues/9332. The file contains a colr box + * with size=18 and type=nclx. This is not valid according to the spec (size must be 19), but + * files like this exist in the wild. + */ + @Test + public void mp4Sample18ByteNclxColr() throws Exception { + ExtractorAsserts.assertBehavior( + Mp4Extractor::new, "media/mp4/sample_18byte_nclx_colr.mp4", simulationConfig); + } + @Test public void mp4SampleWithDolbyTrueHDTrack() throws Exception { ExtractorAsserts.assertBehavior( diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.0.dump new file mode 100644 index 0000000000..30748b0761 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.0.dump @@ -0,0 +1,148 @@ +seekMap: + isSeekable = true + duration = 1001000 + getPosition(0) = [[timeUs=0, position=1160]] + getPosition(1) = [[timeUs=0, position=1160]] + getPosition(500500) = [[timeUs=0, position=1160]] + getPosition(1001000) = [[timeUs=0, position=1160]] +numberOfTracks = 1 +track 0: + total output bytes = 89876 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + codecs = avc1.64001F + maxInputSize = 36722 + width = 1080 + height = 720 + frameRate = 29.970028 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + hdrStaticInfo = length 0, hash 0 + initializationData: + data = length 29, hash 4746B5D9 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36692, hash D216076E + sample 1: + time = 66733 + flags = 0 + data = length 5312, hash D45D3CA0 + sample 2: + time = 33366 + flags = 0 + data = length 599, hash 1BE7812D + sample 3: + time = 200200 + flags = 0 + data = length 7735, hash 4490F110 + sample 4: + time = 133466 + flags = 0 + data = length 987, hash 560B5036 + sample 5: + time = 100100 + flags = 0 + data = length 673, hash ED7CD8C7 + sample 6: + time = 166833 + flags = 0 + data = length 523, hash 3020DF50 + sample 7: + time = 333666 + flags = 0 + data = length 6061, hash 736C72B2 + sample 8: + time = 266933 + flags = 0 + data = length 992, hash FE132F23 + sample 9: + time = 233566 + flags = 0 + data = length 623, hash 5B2C1816 + sample 10: + time = 300300 + flags = 0 + data = length 421, hash 742E69C1 + sample 11: + time = 433766 + flags = 0 + data = length 4899, hash F72F86A1 + sample 12: + time = 400400 + flags = 0 + data = length 568, hash 519A8E50 + sample 13: + time = 367033 + flags = 0 + data = length 620, hash 3990AA39 + sample 14: + time = 567233 + flags = 0 + data = length 5450, hash F06EC4AA + sample 15: + time = 500500 + flags = 0 + data = length 1051, hash 92DFA63A + sample 16: + time = 467133 + flags = 0 + data = length 874, hash 69587FB4 + sample 17: + time = 533866 + flags = 0 + data = length 781, hash 36BE495B + sample 18: + time = 700700 + flags = 0 + data = length 4725, hash AC0C8CD3 + sample 19: + time = 633966 + flags = 0 + data = length 1022, hash 5D8BFF34 + sample 20: + time = 600600 + flags = 0 + data = length 790, hash 99413A99 + sample 21: + time = 667333 + flags = 0 + data = length 610, hash 5E129290 + sample 22: + time = 834166 + flags = 0 + data = length 2751, hash 769974CB + sample 23: + time = 767433 + flags = 0 + data = length 745, hash B78A477A + sample 24: + time = 734066 + flags = 0 + data = length 621, hash CF741E7A + sample 25: + time = 800800 + flags = 0 + data = length 505, hash 1DB4894E + sample 26: + time = 967633 + flags = 0 + data = length 1268, hash C15348DC + sample 27: + time = 900900 + flags = 0 + data = length 880, hash C2DE85D0 + sample 28: + time = 867533 + flags = 0 + data = length 530, hash C98BC6A8 + sample 29: + time = 934266 + flags = 536870912 + data = length 568, hash 4FE5C8EA +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.1.dump b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.1.dump new file mode 100644 index 0000000000..30748b0761 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.1.dump @@ -0,0 +1,148 @@ +seekMap: + isSeekable = true + duration = 1001000 + getPosition(0) = [[timeUs=0, position=1160]] + getPosition(1) = [[timeUs=0, position=1160]] + getPosition(500500) = [[timeUs=0, position=1160]] + getPosition(1001000) = [[timeUs=0, position=1160]] +numberOfTracks = 1 +track 0: + total output bytes = 89876 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + codecs = avc1.64001F + maxInputSize = 36722 + width = 1080 + height = 720 + frameRate = 29.970028 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + hdrStaticInfo = length 0, hash 0 + initializationData: + data = length 29, hash 4746B5D9 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36692, hash D216076E + sample 1: + time = 66733 + flags = 0 + data = length 5312, hash D45D3CA0 + sample 2: + time = 33366 + flags = 0 + data = length 599, hash 1BE7812D + sample 3: + time = 200200 + flags = 0 + data = length 7735, hash 4490F110 + sample 4: + time = 133466 + flags = 0 + data = length 987, hash 560B5036 + sample 5: + time = 100100 + flags = 0 + data = length 673, hash ED7CD8C7 + sample 6: + time = 166833 + flags = 0 + data = length 523, hash 3020DF50 + sample 7: + time = 333666 + flags = 0 + data = length 6061, hash 736C72B2 + sample 8: + time = 266933 + flags = 0 + data = length 992, hash FE132F23 + sample 9: + time = 233566 + flags = 0 + data = length 623, hash 5B2C1816 + sample 10: + time = 300300 + flags = 0 + data = length 421, hash 742E69C1 + sample 11: + time = 433766 + flags = 0 + data = length 4899, hash F72F86A1 + sample 12: + time = 400400 + flags = 0 + data = length 568, hash 519A8E50 + sample 13: + time = 367033 + flags = 0 + data = length 620, hash 3990AA39 + sample 14: + time = 567233 + flags = 0 + data = length 5450, hash F06EC4AA + sample 15: + time = 500500 + flags = 0 + data = length 1051, hash 92DFA63A + sample 16: + time = 467133 + flags = 0 + data = length 874, hash 69587FB4 + sample 17: + time = 533866 + flags = 0 + data = length 781, hash 36BE495B + sample 18: + time = 700700 + flags = 0 + data = length 4725, hash AC0C8CD3 + sample 19: + time = 633966 + flags = 0 + data = length 1022, hash 5D8BFF34 + sample 20: + time = 600600 + flags = 0 + data = length 790, hash 99413A99 + sample 21: + time = 667333 + flags = 0 + data = length 610, hash 5E129290 + sample 22: + time = 834166 + flags = 0 + data = length 2751, hash 769974CB + sample 23: + time = 767433 + flags = 0 + data = length 745, hash B78A477A + sample 24: + time = 734066 + flags = 0 + data = length 621, hash CF741E7A + sample 25: + time = 800800 + flags = 0 + data = length 505, hash 1DB4894E + sample 26: + time = 967633 + flags = 0 + data = length 1268, hash C15348DC + sample 27: + time = 900900 + flags = 0 + data = length 880, hash C2DE85D0 + sample 28: + time = 867533 + flags = 0 + data = length 530, hash C98BC6A8 + sample 29: + time = 934266 + flags = 536870912 + data = length 568, hash 4FE5C8EA +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.2.dump b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.2.dump new file mode 100644 index 0000000000..30748b0761 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.2.dump @@ -0,0 +1,148 @@ +seekMap: + isSeekable = true + duration = 1001000 + getPosition(0) = [[timeUs=0, position=1160]] + getPosition(1) = [[timeUs=0, position=1160]] + getPosition(500500) = [[timeUs=0, position=1160]] + getPosition(1001000) = [[timeUs=0, position=1160]] +numberOfTracks = 1 +track 0: + total output bytes = 89876 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + codecs = avc1.64001F + maxInputSize = 36722 + width = 1080 + height = 720 + frameRate = 29.970028 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + hdrStaticInfo = length 0, hash 0 + initializationData: + data = length 29, hash 4746B5D9 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36692, hash D216076E + sample 1: + time = 66733 + flags = 0 + data = length 5312, hash D45D3CA0 + sample 2: + time = 33366 + flags = 0 + data = length 599, hash 1BE7812D + sample 3: + time = 200200 + flags = 0 + data = length 7735, hash 4490F110 + sample 4: + time = 133466 + flags = 0 + data = length 987, hash 560B5036 + sample 5: + time = 100100 + flags = 0 + data = length 673, hash ED7CD8C7 + sample 6: + time = 166833 + flags = 0 + data = length 523, hash 3020DF50 + sample 7: + time = 333666 + flags = 0 + data = length 6061, hash 736C72B2 + sample 8: + time = 266933 + flags = 0 + data = length 992, hash FE132F23 + sample 9: + time = 233566 + flags = 0 + data = length 623, hash 5B2C1816 + sample 10: + time = 300300 + flags = 0 + data = length 421, hash 742E69C1 + sample 11: + time = 433766 + flags = 0 + data = length 4899, hash F72F86A1 + sample 12: + time = 400400 + flags = 0 + data = length 568, hash 519A8E50 + sample 13: + time = 367033 + flags = 0 + data = length 620, hash 3990AA39 + sample 14: + time = 567233 + flags = 0 + data = length 5450, hash F06EC4AA + sample 15: + time = 500500 + flags = 0 + data = length 1051, hash 92DFA63A + sample 16: + time = 467133 + flags = 0 + data = length 874, hash 69587FB4 + sample 17: + time = 533866 + flags = 0 + data = length 781, hash 36BE495B + sample 18: + time = 700700 + flags = 0 + data = length 4725, hash AC0C8CD3 + sample 19: + time = 633966 + flags = 0 + data = length 1022, hash 5D8BFF34 + sample 20: + time = 600600 + flags = 0 + data = length 790, hash 99413A99 + sample 21: + time = 667333 + flags = 0 + data = length 610, hash 5E129290 + sample 22: + time = 834166 + flags = 0 + data = length 2751, hash 769974CB + sample 23: + time = 767433 + flags = 0 + data = length 745, hash B78A477A + sample 24: + time = 734066 + flags = 0 + data = length 621, hash CF741E7A + sample 25: + time = 800800 + flags = 0 + data = length 505, hash 1DB4894E + sample 26: + time = 967633 + flags = 0 + data = length 1268, hash C15348DC + sample 27: + time = 900900 + flags = 0 + data = length 880, hash C2DE85D0 + sample 28: + time = 867533 + flags = 0 + data = length 530, hash C98BC6A8 + sample 29: + time = 934266 + flags = 536870912 + data = length 568, hash 4FE5C8EA +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.3.dump b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.3.dump new file mode 100644 index 0000000000..30748b0761 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.3.dump @@ -0,0 +1,148 @@ +seekMap: + isSeekable = true + duration = 1001000 + getPosition(0) = [[timeUs=0, position=1160]] + getPosition(1) = [[timeUs=0, position=1160]] + getPosition(500500) = [[timeUs=0, position=1160]] + getPosition(1001000) = [[timeUs=0, position=1160]] +numberOfTracks = 1 +track 0: + total output bytes = 89876 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + codecs = avc1.64001F + maxInputSize = 36722 + width = 1080 + height = 720 + frameRate = 29.970028 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + hdrStaticInfo = length 0, hash 0 + initializationData: + data = length 29, hash 4746B5D9 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36692, hash D216076E + sample 1: + time = 66733 + flags = 0 + data = length 5312, hash D45D3CA0 + sample 2: + time = 33366 + flags = 0 + data = length 599, hash 1BE7812D + sample 3: + time = 200200 + flags = 0 + data = length 7735, hash 4490F110 + sample 4: + time = 133466 + flags = 0 + data = length 987, hash 560B5036 + sample 5: + time = 100100 + flags = 0 + data = length 673, hash ED7CD8C7 + sample 6: + time = 166833 + flags = 0 + data = length 523, hash 3020DF50 + sample 7: + time = 333666 + flags = 0 + data = length 6061, hash 736C72B2 + sample 8: + time = 266933 + flags = 0 + data = length 992, hash FE132F23 + sample 9: + time = 233566 + flags = 0 + data = length 623, hash 5B2C1816 + sample 10: + time = 300300 + flags = 0 + data = length 421, hash 742E69C1 + sample 11: + time = 433766 + flags = 0 + data = length 4899, hash F72F86A1 + sample 12: + time = 400400 + flags = 0 + data = length 568, hash 519A8E50 + sample 13: + time = 367033 + flags = 0 + data = length 620, hash 3990AA39 + sample 14: + time = 567233 + flags = 0 + data = length 5450, hash F06EC4AA + sample 15: + time = 500500 + flags = 0 + data = length 1051, hash 92DFA63A + sample 16: + time = 467133 + flags = 0 + data = length 874, hash 69587FB4 + sample 17: + time = 533866 + flags = 0 + data = length 781, hash 36BE495B + sample 18: + time = 700700 + flags = 0 + data = length 4725, hash AC0C8CD3 + sample 19: + time = 633966 + flags = 0 + data = length 1022, hash 5D8BFF34 + sample 20: + time = 600600 + flags = 0 + data = length 790, hash 99413A99 + sample 21: + time = 667333 + flags = 0 + data = length 610, hash 5E129290 + sample 22: + time = 834166 + flags = 0 + data = length 2751, hash 769974CB + sample 23: + time = 767433 + flags = 0 + data = length 745, hash B78A477A + sample 24: + time = 734066 + flags = 0 + data = length 621, hash CF741E7A + sample 25: + time = 800800 + flags = 0 + data = length 505, hash 1DB4894E + sample 26: + time = 967633 + flags = 0 + data = length 1268, hash C15348DC + sample 27: + time = 900900 + flags = 0 + data = length 880, hash C2DE85D0 + sample 28: + time = 867533 + flags = 0 + data = length 530, hash C98BC6A8 + sample 29: + time = 934266 + flags = 536870912 + data = length 568, hash 4FE5C8EA +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.unknown_length.dump new file mode 100644 index 0000000000..30748b0761 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_18byte_nclx_colr.mp4.unknown_length.dump @@ -0,0 +1,148 @@ +seekMap: + isSeekable = true + duration = 1001000 + getPosition(0) = [[timeUs=0, position=1160]] + getPosition(1) = [[timeUs=0, position=1160]] + getPosition(500500) = [[timeUs=0, position=1160]] + getPosition(1001000) = [[timeUs=0, position=1160]] +numberOfTracks = 1 +track 0: + total output bytes = 89876 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + codecs = avc1.64001F + maxInputSize = 36722 + width = 1080 + height = 720 + frameRate = 29.970028 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + hdrStaticInfo = length 0, hash 0 + initializationData: + data = length 29, hash 4746B5D9 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36692, hash D216076E + sample 1: + time = 66733 + flags = 0 + data = length 5312, hash D45D3CA0 + sample 2: + time = 33366 + flags = 0 + data = length 599, hash 1BE7812D + sample 3: + time = 200200 + flags = 0 + data = length 7735, hash 4490F110 + sample 4: + time = 133466 + flags = 0 + data = length 987, hash 560B5036 + sample 5: + time = 100100 + flags = 0 + data = length 673, hash ED7CD8C7 + sample 6: + time = 166833 + flags = 0 + data = length 523, hash 3020DF50 + sample 7: + time = 333666 + flags = 0 + data = length 6061, hash 736C72B2 + sample 8: + time = 266933 + flags = 0 + data = length 992, hash FE132F23 + sample 9: + time = 233566 + flags = 0 + data = length 623, hash 5B2C1816 + sample 10: + time = 300300 + flags = 0 + data = length 421, hash 742E69C1 + sample 11: + time = 433766 + flags = 0 + data = length 4899, hash F72F86A1 + sample 12: + time = 400400 + flags = 0 + data = length 568, hash 519A8E50 + sample 13: + time = 367033 + flags = 0 + data = length 620, hash 3990AA39 + sample 14: + time = 567233 + flags = 0 + data = length 5450, hash F06EC4AA + sample 15: + time = 500500 + flags = 0 + data = length 1051, hash 92DFA63A + sample 16: + time = 467133 + flags = 0 + data = length 874, hash 69587FB4 + sample 17: + time = 533866 + flags = 0 + data = length 781, hash 36BE495B + sample 18: + time = 700700 + flags = 0 + data = length 4725, hash AC0C8CD3 + sample 19: + time = 633966 + flags = 0 + data = length 1022, hash 5D8BFF34 + sample 20: + time = 600600 + flags = 0 + data = length 790, hash 99413A99 + sample 21: + time = 667333 + flags = 0 + data = length 610, hash 5E129290 + sample 22: + time = 834166 + flags = 0 + data = length 2751, hash 769974CB + sample 23: + time = 767433 + flags = 0 + data = length 745, hash B78A477A + sample 24: + time = 734066 + flags = 0 + data = length 621, hash CF741E7A + sample 25: + time = 800800 + flags = 0 + data = length 505, hash 1DB4894E + sample 26: + time = 967633 + flags = 0 + data = length 1268, hash C15348DC + sample 27: + time = 900900 + flags = 0 + data = length 880, hash C2DE85D0 + sample 28: + time = 867533 + flags = 0 + data = length 530, hash C98BC6A8 + sample 29: + time = 934266 + flags = 536870912 + data = length 568, hash 4FE5C8EA +tracksEnded = true diff --git a/testdata/src/test/assets/media/mp4/sample_18byte_nclx_colr.mp4 b/testdata/src/test/assets/media/mp4/sample_18byte_nclx_colr.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1a2afa2c406af0e398fa1c7ea3d22ac8768753a2 GIT binary patch literal 91100 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 RF)lDJF)L(db7wIvH2^n2*^dAK literal 0 HcmV?d00001 From 9c9671a0af86a21b58c42e2e679aead2dcb90cd0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 13:08:18 +0100 Subject: [PATCH 392/441] Remove all references to @NonNull Our package-info.java files are annotated with @NonNullApi which results in everything being non-null by default, so this annotation is never needed. #minor-release PiperOrigin-RevId: 405864737 --- .../android/exoplayer2/castdemo/MainActivity.java | 11 +++-------- .../android/exoplayer2/castdemo/PlayerManager.java | 3 +-- .../gldemo/VideoProcessingGLSurfaceView.java | 3 +-- .../android/exoplayer2/demo/DemoDownloadService.java | 5 +---- .../android/exoplayer2/demo/DownloadTracker.java | 12 ++++-------- .../android/exoplayer2/demo/PlayerActivity.java | 10 ++++------ .../exoplayer2/demo/SampleChooserActivity.java | 3 +-- .../exoplayer2/demo/TrackSelectionDialog.java | 8 ++------ .../exoplayer2/ext/media2/SessionCallback.java | 10 +++------- .../google/android/exoplayer2/util/ListenerSet.java | 10 +++++----- .../android/exoplayer2/audio/DefaultAudioSink.java | 3 +-- .../mediacodec/AsynchronousMediaCodecCallback.java | 10 ++++------ .../hls/MediaParserHlsMediaChunkExtractor.java | 3 +-- .../android/exoplayer2/testutil/FakeClockTest.java | 3 +-- 14 files changed, 32 insertions(+), 62 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java index 478f11d74f..ef91f29e48 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/MainActivity.java @@ -27,7 +27,6 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; @@ -199,7 +198,6 @@ public class MainActivity extends AppCompatActivity private class MediaQueueListAdapter extends RecyclerView.Adapter { @Override - @NonNull public QueueItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView v = (TextView) @@ -240,9 +238,7 @@ public class MainActivity extends AppCompatActivity @Override public boolean onMove( - @NonNull RecyclerView list, - RecyclerView.ViewHolder origin, - RecyclerView.ViewHolder target) { + RecyclerView list, RecyclerView.ViewHolder origin, RecyclerView.ViewHolder target) { int fromPosition = origin.getAdapterPosition(); int toPosition = target.getAdapterPosition(); if (draggingFromPosition == C.INDEX_UNSET) { @@ -266,7 +262,7 @@ public class MainActivity extends AppCompatActivity } @Override - public void clearView(@NonNull RecyclerView recyclerView, @NonNull ViewHolder viewHolder) { + public void clearView(RecyclerView recyclerView, ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (draggingFromPosition != C.INDEX_UNSET) { QueueItemViewHolder queueItemHolder = (QueueItemViewHolder) viewHolder; @@ -306,8 +302,7 @@ public class MainActivity extends AppCompatActivity } @Override - @NonNull - public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + public View getView(int position, @Nullable View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); ((TextView) view).setText(Util.castNonNull(getItem(position)).mediaMetadata.title); return view; diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 0c9406227d..9e66c823a0 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.castdemo; import android.content.Context; import android.view.KeyEvent; import android.view.View; -import androidx.annotation.NonNull; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; @@ -226,7 +225,7 @@ import java.util.ArrayList; } @Override - public void onTimelineChanged(@NonNull Timeline timeline, @TimelineChangeReason int reason) { + public void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) { updateCurrentItemIndex(); } diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/VideoProcessingGLSurfaceView.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/VideoProcessingGLSurfaceView.java index 4c04ca4c70..4cc0813dab 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/VideoProcessingGLSurfaceView.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/VideoProcessingGLSurfaceView.java @@ -23,7 +23,6 @@ import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.os.Handler; import android.view.Surface; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; @@ -290,7 +289,7 @@ public final class VideoProcessingGLSurfaceView extends GLSurfaceView { public void onVideoFrameAboutToBeRendered( long presentationTimeUs, long releaseTimeNs, - @NonNull Format format, + Format format, @Nullable MediaFormat mediaFormat) { sampleTimestampQueue.add(releaseTimeNs, presentationTimeUs); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java index e32f72f39f..a83992d9b7 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DemoDownloadService.java @@ -19,7 +19,6 @@ import static com.google.android.exoplayer2.demo.DemoUtil.DOWNLOAD_NOTIFICATION_ import android.app.Notification; import android.content.Context; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.exoplayer2.offline.Download; import com.google.android.exoplayer2.offline.DownloadManager; @@ -48,7 +47,6 @@ public class DemoDownloadService extends DownloadService { } @Override - @NonNull protected DownloadManager getDownloadManager() { // This will only happen once, because getDownloadManager is guaranteed to be called only once // in the life cycle of the process. @@ -67,9 +65,8 @@ public class DemoDownloadService extends DownloadService { } @Override - @NonNull protected Notification getForegroundNotification( - @NonNull List downloads, @Requirements.RequirementFlags int notMetRequirements) { + List downloads, @Requirements.RequirementFlags int notMetRequirements) { return DemoUtil.getDownloadNotificationHelper(/* context= */ this) .buildProgressNotification( /* context= */ this, diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index 2bbf99b03c..9eb141e659 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -23,7 +23,6 @@ import android.content.DialogInterface; import android.net.Uri; import android.os.AsyncTask; import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.fragment.app.FragmentManager; @@ -142,9 +141,7 @@ public class DownloadTracker { @Override public void onDownloadChanged( - @NonNull DownloadManager downloadManager, - @NonNull Download download, - @Nullable Exception finalException) { + DownloadManager downloadManager, Download download, @Nullable Exception finalException) { downloads.put(download.request.uri, download); for (Listener listener : listeners) { listener.onDownloadsChanged(); @@ -152,8 +149,7 @@ public class DownloadTracker { } @Override - public void onDownloadRemoved( - @NonNull DownloadManager downloadManager, @NonNull Download download) { + public void onDownloadRemoved(DownloadManager downloadManager, Download download) { downloads.remove(download.request.uri); for (Listener listener : listeners) { listener.onDownloadsChanged(); @@ -196,7 +192,7 @@ public class DownloadTracker { // DownloadHelper.Callback implementation. @Override - public void onPrepared(@NonNull DownloadHelper helper) { + public void onPrepared(DownloadHelper helper) { @Nullable Format format = getFirstFormatWithDrmInitData(helper); if (format == null) { onDownloadPrepared(helper); @@ -231,7 +227,7 @@ public class DownloadTracker { } @Override - public void onPrepareError(@NonNull DownloadHelper helper, @NonNull IOException e) { + public void onPrepareError(DownloadHelper helper, IOException e) { boolean isLiveContent = e instanceof LiveContentUnsupportedException; int toastStringId = isLiveContent ? R.string.download_live_unsupported : R.string.download_start_error; diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index b5a1eefdfd..e080c23f99 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -28,7 +28,6 @@ import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.google.android.exoplayer2.C; @@ -185,7 +184,7 @@ public class PlayerActivity extends AppCompatActivity @Override public void onRequestPermissionsResult( - int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults.length == 0) { // Empty results are triggered if a permission is requested while another request was already @@ -201,7 +200,7 @@ public class PlayerActivity extends AppCompatActivity } @Override - public void onSaveInstanceState(@NonNull Bundle outState) { + public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); updateTrackSelectorParameters(); updateStartPosition(); @@ -424,7 +423,7 @@ public class PlayerActivity extends AppCompatActivity } @Override - public void onPlayerError(@NonNull PlaybackException error) { + public void onPlayerError(PlaybackException error) { if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) { player.seekToDefaultPosition(); player.prepare(); @@ -454,8 +453,7 @@ public class PlayerActivity extends AppCompatActivity private class PlayerErrorMessageProvider implements ErrorMessageProvider { @Override - @NonNull - public Pair getErrorMessage(@NonNull PlaybackException e) { + public Pair getErrorMessage(PlaybackException e) { String errorString = getString(R.string.error_generic); Throwable cause = e.getCause(); if (cause instanceof DecoderInitializationException) { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 70a215ee8f..6cfe215a78 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -40,7 +40,6 @@ import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.google.android.exoplayer2.MediaItem; @@ -163,7 +162,7 @@ public class SampleChooserActivity extends AppCompatActivity @Override public void onRequestPermissionsResult( - int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults.length == 0) { // Empty results are triggered if a permission is requested while another request was already diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java index 5b50298df0..00d90bbcf5 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java @@ -24,7 +24,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDialog; import androidx.fragment.app.DialogFragment; @@ -213,7 +212,6 @@ public final class TrackSelectionDialog extends DialogFragment { } @Override - @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { // We need to own the view to let tab layout work correctly on all API levels. We can't use // AlertDialog because it owns the view itself, so we use AppCompatDialog instead, themed using @@ -225,7 +223,7 @@ public final class TrackSelectionDialog extends DialogFragment { } @Override - public void onDismiss(@NonNull DialogInterface dialog) { + public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); onDismissListener.onDismiss(dialog); } @@ -290,7 +288,6 @@ public final class TrackSelectionDialog extends DialogFragment { } @Override - @NonNull public Fragment getItem(int position) { return tabFragments.valueAt(position); } @@ -364,8 +361,7 @@ public final class TrackSelectionDialog extends DialogFragment { } @Override - public void onTrackSelectionChanged( - boolean isDisabled, @NonNull List overrides) { + public void onTrackSelectionChanged(boolean isDisabled, List overrides) { this.isDisabled = isDisabled; this.overrides = overrides; } diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java index c718efa85d..a682d255a8 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.ext.media2; import static java.util.concurrent.TimeUnit.MILLISECONDS; import android.os.Bundle; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.media2.common.MediaItem; import androidx.media2.common.MediaMetadata; @@ -106,8 +105,7 @@ import java.util.concurrent.TimeoutException; } @Override - public void onPostConnect( - @NonNull MediaSession session, @NonNull MediaSession.ControllerInfo controller) { + public void onPostConnect(MediaSession session, MediaSession.ControllerInfo controller) { if (postConnectCallback != null) { postConnectCallback.onPostConnect(session, controller); } @@ -175,8 +173,7 @@ import java.util.concurrent.TimeoutException; } @Override - public int onSkipBackward( - @NonNull MediaSession session, @NonNull MediaSession.ControllerInfo controller) { + public int onSkipBackward(MediaSession session, MediaSession.ControllerInfo controller) { if (skipCallback != null) { return skipCallback.onSkipBackward(session, controller); } @@ -184,8 +181,7 @@ import java.util.concurrent.TimeoutException; } @Override - public int onSkipForward( - @NonNull MediaSession session, @NonNull MediaSession.ControllerInfo controller) { + public int onSkipForward(MediaSession session, MediaSession.ControllerInfo controller) { if (skipCallback != null) { return skipCallback.onSkipForward(session, controller); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java b/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java index 7f2ce9759a..8aa4025bca 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/ListenerSet.java @@ -22,7 +22,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import java.util.ArrayDeque; import java.util.concurrent.CopyOnWriteArraySet; -import javax.annotation.Nonnull; +import org.checkerframework.checker.nullness.qual.NonNull; /** * A set of listeners. @@ -35,7 +35,7 @@ import javax.annotation.Nonnull; * * @param The listener type. */ -public final class ListenerSet { +public final class ListenerSet { /** * An event sent to a listener. @@ -232,15 +232,15 @@ public final class ListenerSet { return true; } - private static final class ListenerHolder { + private static final class ListenerHolder { - @Nonnull public final T listener; + public final T listener; private FlagSet.Builder flagsBuilder; private boolean needsIterationFinishedEvent; private boolean released; - public ListenerHolder(@Nonnull T listener) { + public ListenerHolder(T listener) { this.listener = listener; this.flagsBuilder = new FlagSet.Builder(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 3bfca92b38..5687282fae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -27,7 +27,6 @@ import android.os.Handler; import android.os.SystemClock; import android.util.Pair; import androidx.annotation.IntDef; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; @@ -1829,7 +1828,7 @@ public final class DefaultAudioSink implements AudioSink { } @Override - public void onTearDown(@NonNull AudioTrack track) { + public void onTearDown(AudioTrack track) { Assertions.checkState(track == audioTrack); if (listener != null && playing) { // The audio track was destroyed while in use. Thus a new AudioTrack needs to be diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java index e4e76ad0b4..b6fe773f4f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecCallback.java @@ -24,7 +24,6 @@ import android.media.MediaFormat; import android.os.Handler; import android.os.HandlerThread; import androidx.annotation.GuardedBy; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.util.Util; @@ -207,15 +206,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Called from the callback thread. @Override - public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) { + public void onInputBufferAvailable(MediaCodec codec, int index) { synchronized (lock) { availableInputBuffers.add(index); } } @Override - public void onOutputBufferAvailable( - @NonNull MediaCodec codec, int index, @NonNull MediaCodec.BufferInfo info) { + public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) { synchronized (lock) { if (pendingOutputFormat != null) { addOutputFormat(pendingOutputFormat); @@ -227,14 +225,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } @Override - public void onError(@NonNull MediaCodec codec, @NonNull MediaCodec.CodecException e) { + public void onError(MediaCodec codec, MediaCodec.CodecException e) { synchronized (lock) { mediaCodecException = e; } } @Override - public void onOutputFormatChanged(@NonNull MediaCodec codec, @NonNull MediaFormat format) { + public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) { synchronized (lock) { addOutputFormat(format); pendingOutputFormat = null; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/MediaParserHlsMediaChunkExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/MediaParserHlsMediaChunkExtractor.java index 893bfc0a32..907d785f26 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/MediaParserHlsMediaChunkExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/MediaParserHlsMediaChunkExtractor.java @@ -31,7 +31,6 @@ import android.media.MediaParser; import android.media.MediaParser.OutputConsumer; import android.media.MediaParser.SeekPoint; import android.text.TextUtils; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.Format; @@ -262,7 +261,7 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt } @Override - public int read(@NonNull byte[] buffer, int offset, int readLength) throws IOException { + public int read(byte[] buffer, int offset, int readLength) throws IOException { int peekedBytes = extractorInput.peek(buffer, offset, readLength); totalPeekedBytes += peekedBytes; return peekedBytes; diff --git a/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeClockTest.java b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeClockTest.java index bcd6fa902e..7fba60ec24 100644 --- a/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeClockTest.java +++ b/testutils/src/test/java/com/google/android/exoplayer2/testutil/FakeClockTest.java @@ -22,7 +22,6 @@ import android.os.ConditionVariable; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.util.HandlerWrapper; @@ -398,7 +397,7 @@ public final class FakeClockTest { } @Override - public boolean handleMessage(@NonNull Message msg) { + public boolean handleMessage(Message msg) { messages.add(new MessageData(msg.what, msg.arg1, msg.arg2, msg.obj)); return true; } From 09c6ccfb66ea4e2d33f3ffaddb15a598889a9782 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 15:00:45 +0100 Subject: [PATCH 393/441] Add missing javadoc to new ExoPlayer.Builder constructors Should have been part of https://github.com/google/ExoPlayer/commit/98200c2692ba007ba0b177d7b285b957dc08ff93 #minor-release PiperOrigin-RevId: 405880982 --- .../google/android/exoplayer2/ExoPlayer.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 635a4051c9..21851f3d5b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -457,10 +457,30 @@ public interface ExoPlayer extends Player { new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } + /** + * Creates a builder with a custom {@link MediaSourceFactory}. + * + *

                    See {@link #Builder(Context)} for a list of default values. + * + * @param context A {@link Context}. + * @param mediaSourceFactory A factory for creating a {@link MediaSource} from a {@link + * MediaItem}. + */ public Builder(Context context, MediaSourceFactory mediaSourceFactory) { this(context, new DefaultRenderersFactory(context), mediaSourceFactory); } + /** + * Creates a builder with a custom {@link RenderersFactory} and {@link MediaSourceFactory}. + * + *

                    See {@link #Builder(Context)} for a list of default values. + * + * @param context A {@link Context}. + * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the + * player. + * @param mediaSourceFactory A factory for creating a {@link MediaSource} from a {@link + * MediaItem}. + */ public Builder( Context context, RenderersFactory renderersFactory, MediaSourceFactory mediaSourceFactory) { this( From 3ef7b70c29936acdd1d7da5a779f33f421f591d6 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 15:10:30 +0100 Subject: [PATCH 394/441] Remove IntRange from Player.getMediaItemAt No other index-related methods in Player are annotated, it's considered obvious that these should be >=0. PiperOrigin-RevId: 405882756 --- .../src/main/java/com/google/android/exoplayer2/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 7c00e1dfb9..3a14e03d1b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -2155,7 +2155,7 @@ public interface Player { int getMediaItemCount(); /** Returns the {@link MediaItem} at the given index. */ - MediaItem getMediaItemAt(@IntRange(from = 0) int index); + MediaItem getMediaItemAt(int index); /** * Returns the duration of the current content or ad in milliseconds, or {@link C#TIME_UNSET} if From 9e8bcc9587c248b2df2598bc7283fa1c13340258 Mon Sep 17 00:00:00 2001 From: hschlueter Date: Wed, 27 Oct 2021 16:23:22 +0100 Subject: [PATCH 395/441] Refactor nullness checks in renderers. `checkNotNull` should be avoided where possible. This change adds `@EnsuresNonNull` or `@EnsuresNonNullIf` to configuration methods for fields they initialize. `checkNotNull` is now avoided for the `@MonotonicNonNull` formats by adding `@RequiresNonNull` annotations. `checkNotNull` is now avoided for the encoder and decoder in `feedMuxerFromEncoder()`, `feedEncoderFromDecoder()`, `feedDecoderFromInput()`, etc. by creating local variables for `encoder` and `decoder` in `render` after the configuration method calls and passing these as non-null parameters. PiperOrigin-RevId: 405893824 --- .../transformer/TransformerAudioRenderer.java | 77 +++++++++-------- .../TransformerTranscodingVideoRenderer.java | 86 +++++++++++-------- 2 files changed, 94 insertions(+), 69 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 9a8da0ecf6..02248296d0 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -36,6 +36,9 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; import java.io.IOException; import java.nio.ByteBuffer; +import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; @RequiresApi(18) /* package */ final class TransformerAudioRenderer extends TransformerBaseRenderer { @@ -51,8 +54,8 @@ import java.nio.ByteBuffer; @Nullable private MediaCodecAdapterWrapper decoder; @Nullable private MediaCodecAdapterWrapper encoder; @Nullable private SpeedProvider speedProvider; - @Nullable private Format decoderInputFormat; - @Nullable private AudioFormat encoderInputAudioFormat; + private @MonotonicNonNull Format decoderInputFormat; + private @MonotonicNonNull AudioFormat encoderInputAudioFormat; private ByteBuffer sonicOutputBuffer; private long nextEncoderInputBufferTimeUs; @@ -100,8 +103,6 @@ import java.nio.ByteBuffer; encoder = null; } speedProvider = null; - decoderInputFormat = null; - encoderInputAudioFormat = null; sonicOutputBuffer = AudioProcessor.EMPTY_BUFFER; nextEncoderInputBufferTimeUs = 0; currentSpeed = SPEED_UNSET; @@ -117,16 +118,18 @@ import java.nio.ByteBuffer; } if (ensureDecoderConfigured()) { + MediaCodecAdapterWrapper decoder = this.decoder; if (ensureEncoderAndAudioProcessingConfigured()) { - while (feedMuxerFromEncoder()) {} + MediaCodecAdapterWrapper encoder = this.encoder; + while (feedMuxerFromEncoder(encoder)) {} if (sonicAudioProcessor.isActive()) { - while (feedEncoderFromSonic()) {} - while (feedSonicFromDecoder()) {} + while (feedEncoderFromSonic(decoder, encoder)) {} + while (feedSonicFromDecoder(decoder)) {} } else { - while (feedEncoderFromDecoder()) {} + while (feedEncoderFromDecoder(decoder, encoder)) {} } } - while (feedDecoderFromInput()) {} + while (feedDecoderFromInput(decoder)) {} } } @@ -134,8 +137,7 @@ import java.nio.ByteBuffer; * Attempts to write encoder output data to the muxer, and returns whether it may be possible to * write more data immediately by calling this method again. */ - private boolean feedMuxerFromEncoder() { - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + private boolean feedMuxerFromEncoder(MediaCodecAdapterWrapper encoder) { if (!hasEncoderOutputFormat) { @Nullable Format encoderOutputFormat = encoder.getOutputFormat(); if (encoderOutputFormat == null) { @@ -170,15 +172,15 @@ import java.nio.ByteBuffer; * Attempts to pass decoder output data to the encoder, and returns whether it may be possible to * pass more data immediately by calling this method again. */ - private boolean feedEncoderFromDecoder() { - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + @RequiresNonNull({"encoderInputAudioFormat"}) + private boolean feedEncoderFromDecoder( + MediaCodecAdapterWrapper decoder, MediaCodecAdapterWrapper encoder) { if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { return false; } if (decoder.isEnded()) { - queueEndOfStreamToEncoder(); + queueEndOfStreamToEncoder(encoder); return false; } @@ -190,7 +192,7 @@ import java.nio.ByteBuffer; flushSonicAndSetSpeed(currentSpeed); return false; } - feedEncoder(decoderOutputBuffer); + feedEncoder(encoder, decoderOutputBuffer); if (!decoderOutputBuffer.hasRemaining()) { decoder.releaseOutputBuffer(); } @@ -201,8 +203,9 @@ import java.nio.ByteBuffer; * Attempts to pass audio processor output data to the encoder, and returns whether it may be * possible to pass more data immediately by calling this method again. */ - private boolean feedEncoderFromSonic() { - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + @RequiresNonNull({"encoderInputAudioFormat"}) + private boolean feedEncoderFromSonic( + MediaCodecAdapterWrapper decoder, MediaCodecAdapterWrapper encoder) { if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { return false; } @@ -210,14 +213,14 @@ import java.nio.ByteBuffer; if (!sonicOutputBuffer.hasRemaining()) { sonicOutputBuffer = sonicAudioProcessor.getOutput(); if (!sonicOutputBuffer.hasRemaining()) { - if (checkNotNull(decoder).isEnded() && sonicAudioProcessor.isEnded()) { - queueEndOfStreamToEncoder(); + if (decoder.isEnded() && sonicAudioProcessor.isEnded()) { + queueEndOfStreamToEncoder(encoder); } return false; } } - feedEncoder(sonicOutputBuffer); + feedEncoder(encoder, sonicOutputBuffer); return true; } @@ -225,9 +228,7 @@ import java.nio.ByteBuffer; * Attempts to process decoder output data, and returns whether it may be possible to process more * data immediately by calling this method again. */ - private boolean feedSonicFromDecoder() { - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); - + private boolean feedSonicFromDecoder(MediaCodecAdapterWrapper decoder) { if (drainingSonicForSpeedChange) { if (sonicAudioProcessor.isEnded() && !sonicOutputBuffer.hasRemaining()) { flushSonicAndSetSpeed(currentSpeed); @@ -268,8 +269,7 @@ import java.nio.ByteBuffer; * Attempts to pass input data to the decoder, and returns whether it may be possible to pass more * data immediately by calling this method again. */ - private boolean feedDecoderFromInput() { - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + private boolean feedDecoderFromInput(MediaCodecAdapterWrapper decoder) { if (!decoder.maybeDequeueInputBuffer(decoderInputBuffer)) { return false; } @@ -295,9 +295,8 @@ import java.nio.ByteBuffer; * Feeds as much data as possible between the current position and limit of the specified {@link * ByteBuffer} to the encoder, and advances its position by the number of bytes fed. */ - private void feedEncoder(ByteBuffer inputBuffer) { - AudioFormat encoderInputAudioFormat = checkNotNull(this.encoderInputAudioFormat); - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + @RequiresNonNull({"encoderInputAudioFormat"}) + private void feedEncoder(MediaCodecAdapterWrapper encoder, ByteBuffer inputBuffer) { ByteBuffer encoderInputBufferData = checkNotNull(encoderInputBuffer.data); int bufferLimit = inputBuffer.limit(); inputBuffer.limit(min(bufferLimit, inputBuffer.position() + encoderInputBufferData.capacity())); @@ -314,8 +313,7 @@ import java.nio.ByteBuffer; encoder.queueInputBuffer(encoderInputBuffer); } - private void queueEndOfStreamToEncoder() { - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + private void queueEndOfStreamToEncoder(MediaCodecAdapterWrapper encoder) { checkState(checkNotNull(encoderInputBuffer.data).position() == 0); encoderInputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); encoderInputBuffer.flip(); @@ -327,11 +325,15 @@ import java.nio.ByteBuffer; * Attempts to configure the {@link #encoder} and Sonic (if applicable), if they have not been * configured yet, and returns whether they have been configured. */ + @RequiresNonNull({"decoder", "decoderInputFormat"}) + @EnsuresNonNullIf( + expression = {"encoder", "encoderInputAudioFormat"}, + result = true) private boolean ensureEncoderAndAudioProcessingConfigured() throws ExoPlaybackException { - if (encoder != null) { + if (encoder != null && encoderInputAudioFormat != null) { return true; } - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + MediaCodecAdapterWrapper decoder = this.decoder; @Nullable Format decoderOutputFormat = decoder.getOutputFormat(); if (decoderOutputFormat == null) { return false; @@ -352,7 +354,7 @@ import java.nio.ByteBuffer; } String audioMimeType = transformation.audioMimeType == null - ? checkNotNull(decoderInputFormat).sampleMimeType + ? decoderInputFormat.sampleMimeType : transformation.audioMimeType; try { encoder = @@ -375,8 +377,11 @@ import java.nio.ByteBuffer; * Attempts to configure the {@link #decoder} if it has not been configured yet, and returns * whether the decoder has been configured. */ + @EnsuresNonNullIf( + expression = {"decoderInputFormat", "decoder"}, + result = true) private boolean ensureDecoderConfigured() throws ExoPlaybackException { - if (decoder != null) { + if (decoder != null && decoderInputFormat != null) { return true; } @@ -386,6 +391,7 @@ import java.nio.ByteBuffer; return false; } decoderInputFormat = checkNotNull(formatHolder.format); + MediaCodecAdapterWrapper decoder; try { decoder = MediaCodecAdapterWrapper.createForAudioDecoding(decoderInputFormat); } catch (IOException e) { @@ -394,6 +400,7 @@ import java.nio.ByteBuffer; } speedProvider = new SegmentSpeedProvider(decoderInputFormat); currentSpeed = speedProvider.getSpeed(0); + this.decoder = decoder; return true; } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 8c1e11df61..90ce3a8071 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -42,7 +42,10 @@ import com.google.android.exoplayer2.util.GlUtil; import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.nio.ByteBuffer; +import org.checkerframework.checker.nullness.qual.EnsuresNonNull; +import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; @RequiresApi(18) /* package */ final class TransformerTranscodingVideoRenderer extends TransformerBaseRenderer { @@ -101,14 +104,26 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; return; } ensureEncoderConfigured(); + MediaCodecAdapterWrapper encoder = this.encoder; ensureOpenGlConfigured(); + EGLDisplay eglDisplay = this.eglDisplay; + EGLSurface eglSurface = this.eglSurface; + GlUtil.Uniform decoderTextureTransformUniform = this.decoderTextureTransformUniform; if (!ensureDecoderConfigured()) { return; } + MediaCodecAdapterWrapper decoder = this.decoder; + SurfaceTexture decoderSurfaceTexture = this.decoderSurfaceTexture; - while (feedMuxerFromEncoder()) {} - while (feedEncoderFromDecoder()) {} - while (feedDecoderFromInput()) {} + while (feedMuxerFromEncoder(encoder)) {} + while (feedEncoderFromDecoder( + decoder, + encoder, + decoderSurfaceTexture, + eglDisplay, + eglSurface, + decoderTextureTransformUniform)) {} + while (feedDecoderFromInput(decoder)) {} } @Override @@ -150,6 +165,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; muxerWrapperTrackEnded = false; } + @EnsuresNonNullIf(expression = "decoderInputFormat", result = true) private boolean ensureInputFormatRead() { if (decoderInputFormat != null) { return true; @@ -166,6 +182,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; return true; } + @RequiresNonNull({"decoderInputFormat"}) + @EnsuresNonNull({"encoder"}) private void ensureEncoderConfigured() throws ExoPlaybackException { if (encoder != null) { return; @@ -175,7 +193,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; encoder = MediaCodecAdapterWrapper.createForVideoEncoding( new Format.Builder() - .setWidth(checkNotNull(decoderInputFormat).width) + .setWidth(decoderInputFormat.width) .setHeight(decoderInputFormat.height) .setSampleMimeType( transformation.videoMimeType != null @@ -186,18 +204,19 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } catch (IOException e) { throw createRendererException( // TODO(claincly): should be "ENCODER_INIT_FAILED" - e, - checkNotNull(this.decoder).getOutputFormat(), - PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); + e, decoderInputFormat, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); } } + @RequiresNonNull({"encoder", "decoderInputFormat"}) + @EnsuresNonNull({"eglDisplay", "eglSurface", "decoderTextureTransformUniform"}) private void ensureOpenGlConfigured() { - if (eglDisplay != null) { + if (eglDisplay != null && eglSurface != null && decoderTextureTransformUniform != null) { return; } - eglDisplay = GlUtil.createEglDisplay(); + MediaCodecAdapterWrapper encoder = this.encoder; + EGLDisplay eglDisplay = GlUtil.createEglDisplay(); EGLContext eglContext; try { eglContext = GlUtil.createEglContext(eglDisplay); @@ -205,14 +224,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } catch (GlUtil.UnsupportedEglVersionException e) { throw new IllegalStateException("EGL version is unsupported", e); } - eglSurface = - GlUtil.getEglSurface(eglDisplay, checkNotNull(checkNotNull(encoder).getInputSurface())); + EGLSurface eglSurface = + GlUtil.getEglSurface(eglDisplay, checkNotNull(encoder.getInputSurface())); GlUtil.focusSurface( - eglDisplay, - eglContext, - eglSurface, - checkNotNull(decoderInputFormat).width, - decoderInputFormat.height); + eglDisplay, eglContext, eglSurface, decoderInputFormat.width, decoderInputFormat.height); decoderTextureId = GlUtil.createExternalTexture(); String vertexShaderCode; String fragmentShaderCode; @@ -262,31 +277,36 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; throw new IllegalStateException("Unexpected uniform name."); } } + checkNotNull(decoderTextureTransformUniform); + this.eglDisplay = eglDisplay; + this.eglSurface = eglSurface; } + @RequiresNonNull({"decoderInputFormat"}) + @EnsuresNonNullIf( + expression = {"decoder", "decoderSurfaceTexture"}, + result = true) private boolean ensureDecoderConfigured() throws ExoPlaybackException { - if (decoder != null) { + if (decoder != null && decoderSurfaceTexture != null) { return true; } checkState(decoderTextureId != GlUtil.TEXTURE_ID_UNSET); - decoderSurfaceTexture = new SurfaceTexture(decoderTextureId); + SurfaceTexture decoderSurfaceTexture = new SurfaceTexture(decoderTextureId); decoderSurfaceTexture.setOnFrameAvailableListener( surfaceTexture -> isDecoderSurfacePopulated = true); decoderSurface = new Surface(decoderSurfaceTexture); try { - decoder = - MediaCodecAdapterWrapper.createForVideoDecoding( - checkNotNull(decoderInputFormat), decoderSurface); + decoder = MediaCodecAdapterWrapper.createForVideoDecoding(decoderInputFormat, decoderSurface); } catch (IOException e) { throw createRendererException( e, decoderInputFormat, PlaybackException.ERROR_CODE_DECODER_INIT_FAILED); } + this.decoderSurfaceTexture = decoderSurfaceTexture; return true; } - private boolean feedDecoderFromInput() { - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + private boolean feedDecoderFromInput(MediaCodecAdapterWrapper decoder) { if (!decoder.maybeDequeueInputBuffer(decoderInputBuffer)) { return false; } @@ -294,7 +314,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; decoderInputBuffer.clear(); @SampleStream.ReadDataResult int result = readSource(getFormatHolder(), decoderInputBuffer, /* readFlags= */ 0); - switch (result) { case C.RESULT_FORMAT_READ: throw new IllegalStateException("Format changes are not supported."); @@ -310,8 +329,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } - private boolean feedEncoderFromDecoder() { - MediaCodecAdapterWrapper decoder = checkNotNull(this.decoder); + private boolean feedEncoderFromDecoder( + MediaCodecAdapterWrapper decoder, + MediaCodecAdapterWrapper encoder, + SurfaceTexture decoderSurfaceTexture, + EGLDisplay eglDisplay, + EGLSurface eglSurface, + GlUtil.Uniform decoderTextureTransformUniform) { if (decoder.isEnded()) { return false; } @@ -323,23 +347,18 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; waitingForPopulatedDecoderSurface = true; } if (decoder.isEnded()) { - checkNotNull(encoder).signalEndOfInputStream(); + encoder.signalEndOfInputStream(); } } return false; } waitingForPopulatedDecoderSurface = false; - SurfaceTexture decoderSurfaceTexture = checkNotNull(this.decoderSurfaceTexture); decoderSurfaceTexture.updateTexImage(); decoderSurfaceTexture.getTransformMatrix(decoderTextureTransformMatrix); - GlUtil.Uniform decoderTextureTransformUniform = - checkNotNull(this.decoderTextureTransformUniform); decoderTextureTransformUniform.setFloats(decoderTextureTransformMatrix); decoderTextureTransformUniform.bind(); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); - EGLDisplay eglDisplay = checkNotNull(this.eglDisplay); - EGLSurface eglSurface = checkNotNull(this.eglSurface); long decoderSurfaceTextureTimestampNs = decoderSurfaceTexture.getTimestamp(); EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, decoderSurfaceTextureTimestampNs); EGL14.eglSwapBuffers(eglDisplay, eglSurface); @@ -347,8 +366,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; return true; } - private boolean feedMuxerFromEncoder() { - MediaCodecAdapterWrapper encoder = checkNotNull(this.encoder); + private boolean feedMuxerFromEncoder(MediaCodecAdapterWrapper encoder) { if (!hasEncoderActualOutputFormat) { @Nullable Format encoderOutputFormat = encoder.getOutputFormat(); if (encoderOutputFormat == null) { From 6285564904cef410612b75383fc4586573474808 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 18:16:48 +0100 Subject: [PATCH 396/441] Clarify that ExoPlayer.Builder constructor overloads only exist for R8 Also add a setRenderersFactory() method, so that all constructor-provided components can also be passed via setters. This comment already appears on the constructor that takes all components, but it applies to these ones as well. PiperOrigin-RevId: 405917343 --- .../google/android/exoplayer2/ExoPlayer.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 21851f3d5b..11d84fc1d4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -363,10 +363,10 @@ public interface ExoPlayer extends Player { final class Builder { /* package */ final Context context; - /* package */ final RenderersFactory renderersFactory; /* package */ Clock clock; /* package */ long foregroundModeTimeoutMs; + /* package */ RenderersFactory renderersFactory; /* package */ MediaSourceFactory mediaSourceFactory; /* package */ TrackSelector trackSelector; /* package */ LoadControl loadControl; @@ -446,6 +446,9 @@ public interface ExoPlayer extends Player { * *

                    See {@link #Builder(Context)} for a list of default values. * + *

                    Note that this constructor is only useful to try and ensure that ExoPlayer's {@link + * DefaultRenderersFactory} can be removed by ProGuard or R8. + * * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the * player. @@ -462,6 +465,10 @@ public interface ExoPlayer extends Player { * *

                    See {@link #Builder(Context)} for a list of default values. * + *

                    Note that this constructor is only useful to try and ensure that ExoPlayer's {@link + * DefaultMediaSourceFactory} (and therefore {@link DefaultExtractorsFactory}) can be removed by + * ProGuard or R8. + * * @param context A {@link Context}. * @param mediaSourceFactory A factory for creating a {@link MediaSource} from a {@link * MediaItem}. @@ -475,6 +482,10 @@ public interface ExoPlayer extends Player { * *

                    See {@link #Builder(Context)} for a list of default values. * + *

                    Note that this constructor is only useful to try and ensure that ExoPlayer's {@link + * DefaultRenderersFactory}, {@link DefaultMediaSourceFactory} (and therefore {@link + * DefaultExtractorsFactory}) can be removed by ProGuard or R8. + * * @param context A {@link Context}. * @param renderersFactory A factory for creating {@link Renderer Renderers} to be used by the * player. @@ -553,6 +564,19 @@ public interface ExoPlayer extends Player { return this; } + /** + * Sets the {@link RenderersFactory} that will be used by the player. + * + * @param renderersFactory A {@link RenderersFactory}. + * @return This builder. + * @throws IllegalStateException If {@link #build()} has already been called. + */ + public Builder setRenderersFactory(RenderersFactory renderersFactory) { + checkState(!buildCalled); + this.renderersFactory = renderersFactory; + return this; + } + /** * Sets the {@link MediaSourceFactory} that will be used by the player. * From ad39f38995d7bc9bb8588e203e90fbcb5de895fe Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Oct 2021 18:51:03 +0100 Subject: [PATCH 397/441] Update most Player parameter & doc references from Window to MediaItem Only deprecated references remain. Usages of the deprecated methods will be migrated in a follow-up change. #minor-release PiperOrigin-RevId: 405927141 --- .../exoplayer2/ext/cast/CastPlayer.java | 15 ++-- .../google/android/exoplayer2/BasePlayer.java | 4 +- .../android/exoplayer2/ForwardingPlayer.java | 13 ++- .../com/google/android/exoplayer2/Player.java | 85 ++++++++++--------- .../android/exoplayer2/ExoPlayerImpl.java | 16 ++-- .../android/exoplayer2/SimpleExoPlayer.java | 9 +- .../exoplayer2/testutil/StubExoPlayer.java | 5 +- 7 files changed, 74 insertions(+), 73 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 25e792f16b..1bf2cd410b 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -324,10 +324,9 @@ public final class CastPlayer extends BasePlayer { } @Override - public void setMediaItems( - List mediaItems, int startWindowIndex, long startPositionMs) { + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { setMediaItemsInternal( - toMediaQueueItems(mediaItems), startWindowIndex, startPositionMs, repeatMode.value); + toMediaQueueItems(mediaItems), startIndex, startPositionMs, repeatMode.value); } @Override @@ -438,23 +437,23 @@ public final class CastPlayer extends BasePlayer { // don't implement onPositionDiscontinuity(). @SuppressWarnings("deprecation") @Override - public void seekTo(int windowIndex, long positionMs) { + public void seekTo(int mediaItemIndex, long positionMs) { MediaStatus mediaStatus = getMediaStatus(); // We assume the default position is 0. There is no support for seeking to the default position // in RemoteMediaClient. positionMs = positionMs != C.TIME_UNSET ? positionMs : 0; if (mediaStatus != null) { - if (getCurrentWindowIndex() != windowIndex) { + if (getCurrentWindowIndex() != mediaItemIndex) { remoteMediaClient .queueJumpToItem( - (int) currentTimeline.getPeriod(windowIndex, period).uid, positionMs, null) + (int) currentTimeline.getPeriod(mediaItemIndex, period).uid, positionMs, null) .setResultCallback(seekResultCallback); } else { remoteMediaClient.seek(positionMs).setResultCallback(seekResultCallback); } PositionInfo oldPosition = getCurrentPositionInfo(); pendingSeekCount++; - pendingSeekWindowIndex = windowIndex; + pendingSeekWindowIndex = mediaItemIndex; pendingSeekPositionMs = positionMs; PositionInfo newPosition = getCurrentPositionInfo(); listeners.queueEvent( @@ -466,7 +465,7 @@ public final class CastPlayer extends BasePlayer { if (oldPosition.mediaItemIndex != newPosition.mediaItemIndex) { // TODO(internal b/182261884): queue `onMediaItemTransition` event when the media item is // repeated. - MediaItem mediaItem = getCurrentTimeline().getWindow(windowIndex, window).mediaItem; + MediaItem mediaItem = getCurrentTimeline().getWindow(mediaItemIndex, window).mediaItem; listeners.queueEvent( Player.EVENT_MEDIA_ITEM_TRANSITION, listener -> diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index 06d675d59f..b60e4a3a7e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -122,8 +122,8 @@ public abstract class BasePlayer implements Player { } @Override - public final void seekToDefaultPosition(int windowIndex) { - seekTo(windowIndex, /* positionMs= */ C.TIME_UNSET); + public final void seekToDefaultPosition(int mediaItemIndex) { + seekTo(mediaItemIndex, /* positionMs= */ C.TIME_UNSET); } @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java index 62e113481d..6b2b7426d8 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java @@ -69,9 +69,8 @@ public class ForwardingPlayer implements Player { } @Override - public void setMediaItems( - List mediaItems, int startWindowIndex, long startPositionMs) { - player.setMediaItems(mediaItems, startWindowIndex, startPositionMs); + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { + player.setMediaItems(mediaItems, startIndex, startPositionMs); } @Override @@ -226,8 +225,8 @@ public class ForwardingPlayer implements Player { } @Override - public void seekToDefaultPosition(int windowIndex) { - player.seekToDefaultPosition(windowIndex); + public void seekToDefaultPosition(int mediaItemIndex) { + player.seekToDefaultPosition(mediaItemIndex); } @Override @@ -236,8 +235,8 @@ public class ForwardingPlayer implements Player { } @Override - public void seekTo(int windowIndex, long positionMs) { - player.seekTo(windowIndex, positionMs); + public void seekTo(int mediaItemIndex, long positionMs) { + player.seekTo(mediaItemIndex, positionMs); } @Override diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 3a14e03d1b..5c60097eb0 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -1507,16 +1507,16 @@ public interface Player { * Clears the playlist and adds the specified {@link MediaItem MediaItems}. * * @param mediaItems The new {@link MediaItem MediaItems}. - * @param startWindowIndex The window index to start playback from. If {@link C#INDEX_UNSET} is - * passed, the current position is not reset. + * @param startIndex The {@link MediaItem} index to start playback from. If {@link C#INDEX_UNSET} + * is passed, the current position is not reset. * @param startPositionMs The position in milliseconds to start playback from. If {@link - * C#TIME_UNSET} is passed, the default position of the given window is used. In any case, if - * {@code startWindowIndex} is set to {@link C#INDEX_UNSET}, this parameter is ignored and the - * position is not reset at all. - * @throws IllegalSeekPositionException If the provided {@code startWindowIndex} is not within the + * C#TIME_UNSET} is passed, the default position of the given {@link MediaItem} is used. In + * any case, if {@code startIndex} is set to {@link C#INDEX_UNSET}, this parameter is ignored + * and the position is not reset at all. + * @throws IllegalSeekPositionException If the provided {@code startIndex} is not within the * bounds of the list of media items. */ - void setMediaItems(List mediaItems, int startWindowIndex, long startPositionMs); + void setMediaItems(List mediaItems, int startIndex, long startPositionMs); /** * Clears the playlist, adds the specified {@link MediaItem} and resets the position to the @@ -1643,9 +1643,9 @@ public interface Player { * Listener#onAvailableCommandsChanged(Commands)} to get an update when the available commands * change. * - *

                    Executing a command that is not available (for example, calling {@link #seekToNextWindow()} - * if {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} is unavailable) will neither throw an exception nor - * generate a {@link #getPlayerError()} player error}. + *

                    Executing a command that is not available (for example, calling {@link + * #seekToNextMediaItem()} if {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} is unavailable) will + * neither throw an exception nor generate a {@link #getPlayerError()} player error}. * *

                    {@link #COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM} and {@link #COMMAND_SEEK_TO_NEXT_MEDIA_ITEM} * are unavailable if there is no such {@link MediaItem}. @@ -1750,14 +1750,14 @@ public interface Player { int getRepeatMode(); /** - * Sets whether shuffling of windows is enabled. + * Sets whether shuffling of media items is enabled. * * @param shuffleModeEnabled Whether shuffling is enabled. */ void setShuffleModeEnabled(boolean shuffleModeEnabled); /** - * Returns whether shuffling of windows is enabled. + * Returns whether shuffling of media items is enabled. * * @see Listener#onShuffleModeEnabledChanged(boolean) */ @@ -1772,42 +1772,42 @@ public interface Player { boolean isLoading(); /** - * Seeks to the default position associated with the current window. The position can depend on - * the type of media being played. For live streams it will typically be the live edge of the - * window. For other streams it will typically be the start of the window. + * Seeks to the default position associated with the current {@link MediaItem}. The position can + * depend on the type of media being played. For live streams it will typically be the live edge. + * For other streams it will typically be the start. */ void seekToDefaultPosition(); /** - * Seeks to the default position associated with the specified window. The position can depend on - * the type of media being played. For live streams it will typically be the live edge of the - * window. For other streams it will typically be the start of the window. + * Seeks to the default position associated with the specified {@link MediaItem}. The position can + * depend on the type of media being played. For live streams it will typically be the live edge. + * For other streams it will typically be the start. * - * @param windowIndex The index of the window whose associated default position should be seeked - * to. + * @param mediaItemIndex The index of the {@link MediaItem} whose associated default position + * should be seeked to. * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided - * {@code windowIndex} is not within the bounds of the current timeline. + * {@code mediaItemIndex} is not within the bounds of the current timeline. */ - void seekToDefaultPosition(int windowIndex); + void seekToDefaultPosition(int mediaItemIndex); /** - * Seeks to a position specified in milliseconds in the current window. + * Seeks to a position specified in milliseconds in the current {@link MediaItem}. * - * @param positionMs The seek position in the current window, or {@link C#TIME_UNSET} to seek to - * the window's default position. + * @param positionMs The seek position in the current {@link MediaItem}, or {@link C#TIME_UNSET} + * to seek to the media item's default position. */ void seekTo(long positionMs); /** - * Seeks to a position specified in milliseconds in the specified window. + * Seeks to a position specified in milliseconds in the specified {@link MediaItem}. * - * @param windowIndex The index of the window. - * @param positionMs The seek position in the specified window, or {@link C#TIME_UNSET} to seek to - * the window's default position. + * @param mediaItemIndex The index of the {@link MediaItem}. + * @param positionMs The seek position in the specified {@link MediaItem}, or {@link C#TIME_UNSET} + * to seek to the media item's default position. * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided - * {@code windowIndex} is not within the bounds of the current timeline. + * {@code mediaItemIndex} is not within the bounds of the current timeline. */ - void seekTo(int windowIndex, long positionMs); + void seekTo(int mediaItemIndex, long positionMs); /** * Returns the {@link #seekBack()} increment. @@ -1817,7 +1817,9 @@ public interface Player { */ long getSeekBackIncrement(); - /** Seeks back in the current window by {@link #getSeekBackIncrement()} milliseconds. */ + /** + * Seeks back in the current {@link MediaItem} by {@link #getSeekBackIncrement()} milliseconds. + */ void seekBack(); /** @@ -1828,7 +1830,10 @@ public interface Player { */ long getSeekForwardIncrement(); - /** Seeks forward in the current window by {@link #getSeekForwardIncrement()} milliseconds. */ + /** + * Seeks forward in the current {@link MediaItem} by {@link #getSeekForwardIncrement()} + * milliseconds. + */ void seekForward(); /** @deprecated Use {@link #hasPreviousMediaItem()} instead. */ @@ -1908,8 +1913,8 @@ public interface Player { boolean hasNextWindow(); /** - * Returns whether a next window exists, which may depend on the current repeat mode and whether - * shuffle mode is enabled. + * Returns whether a next {@link MediaItem} exists, which may depend on the current repeat mode + * and whether shuffle mode is enabled. * *

                    Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more @@ -1926,9 +1931,9 @@ public interface Player { void seekToNextWindow(); /** - * Seeks to the default position of the next window, which may depend on the current repeat mode - * and whether shuffle mode is enabled. Does nothing if {@link #hasNextMediaItem()} is {@code - * false}. + * Seeks to the default position of the next {@link MediaItem}, which may depend on the current + * repeat mode and whether shuffle mode is enabled. Does nothing if {@link #hasNextMediaItem()} is + * {@code false}. * *

                    Note: When the repeat mode is {@link #REPEAT_MODE_ONE}, this method behaves the same as when * the current repeat mode is {@link #REPEAT_MODE_OFF}. See {@link #REPEAT_MODE_ONE} for more @@ -1944,8 +1949,8 @@ public interface Player { *

                  • If the timeline is empty or seeking is not possible, does nothing. *
                  • Otherwise, if {@link #hasNextMediaItem() a next media item exists}, seeks to the default * position of the next {@link MediaItem}. - *
                  • Otherwise, if the current window is {@link #isCurrentMediaItemLive() live} and has not - * ended, seeks to the live edge of the current {@link MediaItem}. + *
                  • Otherwise, if the current {@link MediaItem} is {@link #isCurrentMediaItemLive() live} and + * has not ended, seeks to the live edge of the current {@link MediaItem}. *
                  • Otherwise, does nothing. *
                  */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 78f232e9a5..31fb99dbc2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -408,9 +408,8 @@ import java.util.concurrent.CopyOnWriteArraySet; } @Override - public void setMediaItems( - List mediaItems, int startWindowIndex, long startPositionMs) { - setMediaSources(createMediaSources(mediaItems), startWindowIndex, startPositionMs); + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { + setMediaSources(createMediaSources(mediaItems), startIndex, startPositionMs); } public void setMediaSource(MediaSource mediaSource) { @@ -642,10 +641,11 @@ import java.util.concurrent.CopyOnWriteArraySet; } @Override - public void seekTo(int windowIndex, long positionMs) { + public void seekTo(int mediaItemIndex, long positionMs) { Timeline timeline = playbackInfo.timeline; - if (windowIndex < 0 || (!timeline.isEmpty() && windowIndex >= timeline.getWindowCount())) { - throw new IllegalSeekPositionException(timeline, windowIndex, positionMs); + if (mediaItemIndex < 0 + || (!timeline.isEmpty() && mediaItemIndex >= timeline.getWindowCount())) { + throw new IllegalSeekPositionException(timeline, mediaItemIndex, positionMs); } pendingOperationAcks++; if (isPlayingAd()) { @@ -668,8 +668,8 @@ import java.util.concurrent.CopyOnWriteArraySet; maskTimelineAndPosition( newPlaybackInfo, timeline, - getPeriodPositionOrMaskWindowPosition(timeline, windowIndex, positionMs)); - internalPlayer.seekTo(timeline, windowIndex, C.msToUs(positionMs)); + getPeriodPositionOrMaskWindowPosition(timeline, mediaItemIndex, positionMs)); + internalPlayer.seekTo(timeline, mediaItemIndex, C.msToUs(positionMs)); updatePlaybackInfo( newPlaybackInfo, /* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index c6fddec392..6a061bef5f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1086,10 +1086,9 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public void setMediaItems( - List mediaItems, int startWindowIndex, long startPositionMs) { + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { verifyApplicationThread(); - player.setMediaItems(mediaItems, startWindowIndex, startPositionMs); + player.setMediaItems(mediaItems, startIndex, startPositionMs); } @Override @@ -1235,10 +1234,10 @@ public class SimpleExoPlayer extends BasePlayer } @Override - public void seekTo(int windowIndex, long positionMs) { + public void seekTo(int mediaItemIndex, long positionMs) { verifyApplicationThread(); analyticsCollector.notifySeekStarted(); - player.seekTo(windowIndex, positionMs); + player.seekTo(mediaItemIndex, positionMs); } @Override diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index eeb4c5856a..9a5a50d1d3 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -206,8 +206,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override - public void setMediaItems( - List mediaItems, int startWindowIndex, long startPositionMs) { + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { throw new UnsupportedOperationException(); } @@ -398,7 +397,7 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { } @Override - public void seekTo(int windowIndex, long positionMs) { + public void seekTo(int mediaItemIndex, long positionMs) { throw new UnsupportedOperationException(); } From dcdcb919f48f2b28b2b46bb6021a01bf5218e9c5 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Thu, 28 Oct 2021 11:43:55 +0100 Subject: [PATCH 398/441] Transformer GL: Simplify GL program handling. Relanding http://https://github.com/google/ExoPlayer/commit/9788750ddb23b2064dddf99d6e1ea491b2e45cea, with some changes applied to improve primarily readability, naming, and nullness checks. PiperOrigin-RevId: 406101742 --- .../gldemo/BitmapOverlayVideoProcessor.java | 46 ++- .../android/exoplayer2/util/GlUtil.java | 289 ++++++++++-------- .../video/VideoDecoderGLSurfaceView.java | 28 +- .../video/spherical/ProjectionRenderer.java | 24 +- .../TransformerTranscodingVideoRenderer.java | 18 +- 5 files changed, 233 insertions(+), 172 deletions(-) diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java index 13e2a60684..ecae8033e4 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/BitmapOverlayVideoProcessor.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.gldemo; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -26,11 +28,11 @@ import android.opengl.GLES20; import android.opengl.GLUtils; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.GlUtil; import java.io.IOException; import java.util.Locale; import javax.microedition.khronos.opengles.GL10; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** * Video processor that demonstrates how to overlay a bitmap on video output using a GL shader. The @@ -49,7 +51,7 @@ import javax.microedition.khronos.opengles.GL10; private final Bitmap logoBitmap; private final Canvas overlayCanvas; - private int program; + private GlUtil.@MonotonicNonNull Program program; @Nullable private GlUtil.Attribute[] attributes; @Nullable private GlUtil.Uniform[] uniforms; @@ -77,27 +79,39 @@ import javax.microedition.khronos.opengles.GL10; @Override public void initialize() { - String vertexShaderCode; - String fragmentShaderCode; try { - vertexShaderCode = GlUtil.loadAsset(context, "bitmap_overlay_video_processor_vertex.glsl"); - fragmentShaderCode = - GlUtil.loadAsset(context, "bitmap_overlay_video_processor_fragment.glsl"); + program = + new GlUtil.Program( + context, + /* vertexShaderFilePath= */ "bitmap_overlay_video_processor_vertex.glsl", + /* fragmentShaderFilePath= */ "bitmap_overlay_video_processor_fragment.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - program = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); - GlUtil.Attribute[] attributes = GlUtil.getAttributes(program); - GlUtil.Uniform[] uniforms = GlUtil.getUniforms(program); + GlUtil.Attribute[] attributes = program.getAttributes(); for (GlUtil.Attribute attribute : attributes) { if (attribute.name.equals("a_position")) { - attribute.setBuffer(new float[] {-1, -1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, 1, 1, 0, 1}, 4); + attribute.setBuffer( + new float[] { + -1, -1, 0, 1, + 1, -1, 0, 1, + -1, 1, 0, 1, + 1, 1, 0, 1 + }, + 4); } else if (attribute.name.equals("a_texcoord")) { - attribute.setBuffer(new float[] {0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1}, 4); + attribute.setBuffer( + new float[] { + 0, 0, 0, 1, + 1, 0, 0, 1, + 0, 1, 0, 1, + 1, 1, 0, 1 + }, + 4); } } this.attributes = attributes; - this.uniforms = uniforms; + this.uniforms = program.getUniforms(); GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); GLES20.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); @@ -126,9 +140,9 @@ import javax.microedition.khronos.opengles.GL10; GlUtil.checkGlError(); // Run the shader program. - GlUtil.Uniform[] uniforms = Assertions.checkNotNull(this.uniforms); - GlUtil.Attribute[] attributes = Assertions.checkNotNull(this.attributes); - GLES20.glUseProgram(program); + GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms); + GlUtil.Attribute[] attributes = checkNotNull(this.attributes); + checkNotNull(program).use(); for (GlUtil.Uniform uniform : uniforms) { switch (uniform.name) { case "tex_sampler_0": diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java index a0643ad393..a8e2d5aa48 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java @@ -54,6 +54,160 @@ public final class GlUtil { /** Thrown when the required EGL version is not supported by the device. */ public static final class UnsupportedEglVersionException extends Exception {} + /** GL program. */ + public static final class Program { + /** The identifier of a compiled and linked GLSL shader program. */ + private final int programId; + + /** + * Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code. + * + * @param vertexShaderGlsl The vertex shader program. + * @param fragmentShaderGlsl The fragment shader program. + */ + public Program(String vertexShaderGlsl, String fragmentShaderGlsl) { + programId = GLES20.glCreateProgram(); + checkGlError(); + + // Add the vertex and fragment shaders. + addShader(GLES20.GL_VERTEX_SHADER, vertexShaderGlsl); + addShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderGlsl); + } + + /** + * Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code. + * + * @param context The {@link Context}. + * @param vertexShaderFilePath The path to a vertex shader program. + * @param fragmentShaderFilePath The path to a fragment shader program. + * @throws IOException When failing to read shader files. + */ + public Program(Context context, String vertexShaderFilePath, String fragmentShaderFilePath) + throws IOException { + this(loadAsset(context, vertexShaderFilePath), loadAsset(context, fragmentShaderFilePath)); + } + + /** + * Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code. + * + * @param vertexShaderGlsl The vertex shader program as arrays of strings. Strings are joined by + * adding a new line character in between each of them. + * @param fragmentShaderGlsl The fragment shader program as arrays of strings. Strings are + * joined by adding a new line character in between each of them. + */ + public Program(String[] vertexShaderGlsl, String[] fragmentShaderGlsl) { + this(TextUtils.join("\n", vertexShaderGlsl), TextUtils.join("\n", fragmentShaderGlsl)); + } + + /** Uses the program. */ + public void use() { + // Link and check for errors. + GLES20.glLinkProgram(programId); + int[] linkStatus = new int[] {GLES20.GL_FALSE}; + GLES20.glGetProgramiv(programId, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + throwGlException( + "Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(programId)); + } + checkGlError(); + + GLES20.glUseProgram(programId); + } + + /** Deletes the program. Deleted programs cannot be used again. */ + public void delete() { + GLES20.glDeleteProgram(programId); + } + + /** Returns the location of an {@link Attribute}. */ + public int getAttribLocation(String attributeName) { + return GLES20.glGetAttribLocation(programId, attributeName); + } + + /** Returns the location of a {@link Uniform}. */ + public int getUniformLocation(String uniformName) { + return GLES20.glGetUniformLocation(programId, uniformName); + } + + /** Returns the program's {@link Attribute}s. */ + public Attribute[] getAttributes() { + int[] attributeCount = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); + if (attributeCount[0] != 2) { + throw new IllegalStateException("Expected two attributes."); + } + + Attribute[] attributes = new Attribute[attributeCount[0]]; + for (int i = 0; i < attributeCount[0]; i++) { + attributes[i] = createAttribute(i); + } + return attributes; + } + + /** Returns the program's {@link Uniform}s. */ + public Uniform[] getUniforms() { + int[] uniformCount = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); + + Uniform[] uniforms = new Uniform[uniformCount[0]]; + for (int i = 0; i < uniformCount[0]; i++) { + uniforms[i] = createUniform(i); + } + + return uniforms; + } + + private Attribute createAttribute(int index) { + int[] length = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, length, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] nameBytes = new byte[length[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveAttrib( + programId, index, length[0], ignore, 0, size, 0, type, 0, nameBytes, 0); + String name = new String(nameBytes, 0, strlen(nameBytes)); + int location = getAttribLocation(name); + + return new Attribute(name, index, location); + } + + private Uniform createUniform(int index) { + int[] length = new int[1]; + GLES20.glGetProgramiv(programId, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, length, 0); + + int[] type = new int[1]; + int[] size = new int[1]; + byte[] nameBytes = new byte[length[0]]; + int[] ignore = new int[1]; + + GLES20.glGetActiveUniform( + programId, index, length[0], ignore, 0, size, 0, type, 0, nameBytes, 0); + String name = new String(nameBytes, 0, strlen(nameBytes)); + int location = getUniformLocation(name); + + return new Uniform(name, location, type[0]); + } + + private void addShader(int type, String glsl) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, glsl); + GLES20.glCompileShader(shader); + + int[] result = new int[] {GLES20.GL_FALSE}; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); + if (result[0] != GLES20.GL_TRUE) { + throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + glsl); + } + + GLES20.glAttachShader(programId, shader); + GLES20.glDeleteShader(shader); + checkGlError(); + } + } + /** * GL attribute, which can be attached to a buffer with {@link Attribute#setBuffer(float[], int)}. */ @@ -68,26 +222,11 @@ public final class GlUtil { @Nullable private Buffer buffer; private int size; - /** - * Creates a new GL attribute. - * - * @param program The identifier of a compiled and linked GLSL shader program. - * @param index The index of the attribute. After this instance has been constructed, the name - * of the attribute is available via the {@link #name} field. - */ - public Attribute(int program, int index) { - int[] len = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, len, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] nameBytes = new byte[len[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveAttrib(program, index, len[0], ignore, 0, size, 0, type, 0, nameBytes, 0); - name = new String(nameBytes, 0, strlen(nameBytes)); - location = GLES20.glGetAttribLocation(program, name); + /* Creates a new Attribute. */ + public Attribute(String name, int index, int location) { + this.name = name; this.index = index; + this.location = location; } /** @@ -137,28 +276,12 @@ public final class GlUtil { private int texId; private int unit; - /** - * Creates a new GL uniform. - * - * @param program The identifier of a compiled and linked GLSL shader program. - * @param index The index of the uniform. After this instance has been constructed, the name of - * the uniform is available via the {@link #name} field. - */ - public Uniform(int program, int index) { - int[] len = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORM_MAX_LENGTH, len, 0); - - int[] type = new int[1]; - int[] size = new int[1]; - byte[] name = new byte[len[0]]; - int[] ignore = new int[1]; - - GLES20.glGetActiveUniform(program, index, len[0], ignore, 0, size, 0, type, 0, name, 0); - this.name = new String(name, 0, strlen(name)); - location = GLES20.glGetUniformLocation(program, this.name); - this.type = type[0]; - - value = new float[16]; + /** Creates a new uniform. */ + public Uniform(String name, int location, int type) { + this.name = name; + this.location = location; + this.type = type; + this.value = new float[16]; } /** @@ -332,74 +455,6 @@ public final class GlUtil { Api17.focusSurface(eglDisplay, eglContext, surface, width, height); } - /** - * Builds a GL shader program from vertex and fragment shader code. - * - * @param vertexCode GLES20 vertex shader program as arrays of strings. Strings are joined by - * adding a new line character in between each of them. - * @param fragmentCode GLES20 fragment shader program as arrays of strings. Strings are joined by - * adding a new line character in between each of them. - * @return GLES20 program id. - */ - public static int compileProgram(String[] vertexCode, String[] fragmentCode) { - return compileProgram(TextUtils.join("\n", vertexCode), TextUtils.join("\n", fragmentCode)); - } - - /** - * Builds a GL shader program from vertex and fragment shader code. - * - * @param vertexCode GLES20 vertex shader program. - * @param fragmentCode GLES20 fragment shader program. - * @return GLES20 program id. - */ - public static int compileProgram(String vertexCode, String fragmentCode) { - int program = GLES20.glCreateProgram(); - checkGlError(); - - // Add the vertex and fragment shaders. - addShader(GLES20.GL_VERTEX_SHADER, vertexCode, program); - addShader(GLES20.GL_FRAGMENT_SHADER, fragmentCode, program); - - // Link and check for errors. - GLES20.glLinkProgram(program); - int[] linkStatus = new int[] {GLES20.GL_FALSE}; - GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); - if (linkStatus[0] != GLES20.GL_TRUE) { - throwGlException("Unable to link shader program: \n" + GLES20.glGetProgramInfoLog(program)); - } - checkGlError(); - - return program; - } - - /** Returns the {@link Attribute}s in the specified {@code program}. */ - public static Attribute[] getAttributes(int program) { - int[] attributeCount = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_ATTRIBUTES, attributeCount, 0); - if (attributeCount[0] != 2) { - throw new IllegalStateException("Expected two attributes."); - } - - Attribute[] attributes = new Attribute[attributeCount[0]]; - for (int i = 0; i < attributeCount[0]; i++) { - attributes[i] = new Attribute(program, i); - } - return attributes; - } - - /** Returns the {@link Uniform}s in the specified {@code program}. */ - public static Uniform[] getUniforms(int program) { - int[] uniformCount = new int[1]; - GLES20.glGetProgramiv(program, GLES20.GL_ACTIVE_UNIFORMS, uniformCount, 0); - - Uniform[] uniforms = new Uniform[uniformCount[0]]; - for (int i = 0; i < uniformCount[0]; i++) { - uniforms[i] = new Uniform(program, i); - } - - return uniforms; - } - /** * Deletes a GL texture. * @@ -478,22 +533,6 @@ public final class GlUtil { return texId[0]; } - private static void addShader(int type, String source, int program) { - int shader = GLES20.glCreateShader(type); - GLES20.glShaderSource(shader, source); - GLES20.glCompileShader(shader); - - int[] result = new int[] {GLES20.GL_FALSE}; - GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, result, 0); - if (result[0] != GLES20.GL_TRUE) { - throwGlException(GLES20.glGetShaderInfoLog(shader) + ", source: " + source); - } - - GLES20.glAttachShader(program, shader); - GLES20.glDeleteShader(shader); - checkGlError(); - } - private static void throwGlException(String errorMsg) { Log.e(TAG, errorMsg); if (glAssertionsEnabled) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java index d7d90c5e02..1d9dcadbfb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.video; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; @@ -30,6 +32,7 @@ import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** * GLSurfaceView implementing {@link VideoDecoderOutputBufferRenderer} for rendering {@link @@ -141,7 +144,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView // glDrawArrays uses it. private final FloatBuffer[] textureCoords; - private int program; + private GlUtil.@MonotonicNonNull Program program; private int colorMatrixLocation; // Accessed only from the GL thread. @@ -162,9 +165,9 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView @Override public void onSurfaceCreated(GL10 unused, EGLConfig config) { - program = GlUtil.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER); - GLES20.glUseProgram(program); - int posLocation = GLES20.glGetAttribLocation(program, "in_pos"); + program = new GlUtil.Program(VERTEX_SHADER, FRAGMENT_SHADER); + program.use(); + int posLocation = program.getAttribLocation("in_pos"); GLES20.glEnableVertexAttribArray(posLocation); GLES20.glVertexAttribPointer( posLocation, @@ -173,14 +176,14 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView /* normalized= */ false, /* stride= */ 0, TEXTURE_VERTICES); - texLocations[0] = GLES20.glGetAttribLocation(program, "in_tc_y"); + texLocations[0] = program.getAttribLocation("in_tc_y"); GLES20.glEnableVertexAttribArray(texLocations[0]); - texLocations[1] = GLES20.glGetAttribLocation(program, "in_tc_u"); + texLocations[1] = program.getAttribLocation("in_tc_u"); GLES20.glEnableVertexAttribArray(texLocations[1]); - texLocations[2] = GLES20.glGetAttribLocation(program, "in_tc_v"); + texLocations[2] = program.getAttribLocation("in_tc_v"); GLES20.glEnableVertexAttribArray(texLocations[2]); GlUtil.checkGlError(); - colorMatrixLocation = GLES20.glGetUniformLocation(program, "mColorConversion"); + colorMatrixLocation = program.getUniformLocation("mColorConversion"); GlUtil.checkGlError(); setupTextures(); GlUtil.checkGlError(); @@ -207,7 +210,7 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView renderedOutputBuffer = pendingOutputBuffer; } - VideoDecoderOutputBuffer outputBuffer = Assertions.checkNotNull(renderedOutputBuffer); + VideoDecoderOutputBuffer outputBuffer = checkNotNull(renderedOutputBuffer); // Set color matrix. Assume BT709 if the color space is unknown. float[] colorConversion = kColorConversion709; @@ -230,8 +233,8 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView colorConversion, /* offset= */ 0); - int[] yuvStrides = Assertions.checkNotNull(outputBuffer.yuvStrides); - ByteBuffer[] yuvPlanes = Assertions.checkNotNull(outputBuffer.yuvPlanes); + int[] yuvStrides = checkNotNull(outputBuffer.yuvStrides); + ByteBuffer[] yuvPlanes = checkNotNull(outputBuffer.yuvPlanes); for (int i = 0; i < 3; i++) { int h = (i == 0) ? outputBuffer.height : (outputBuffer.height + 1) / 2; @@ -294,10 +297,11 @@ public final class VideoDecoderGLSurfaceView extends GLSurfaceView surfaceView.requestRender(); } + @RequiresNonNull("program") private void setupTextures() { GLES20.glGenTextures(3, yuvTextures, /* offset= */ 0); for (int i = 0; i < 3; i++) { - GLES20.glUniform1i(GLES20.glGetUniformLocation(program, TEXTURE_UNIFORMS[i]), i); + GLES20.glUniform1i(program.getUniformLocation(TEXTURE_UNIFORMS[i]), i); GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]); GLES20.glTexParameterf( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java index 4ba5dcca08..f313225fc6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.video.spherical; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.GlUtil.checkGlError; import android.opengl.GLES11Ext; @@ -92,9 +93,9 @@ import java.nio.FloatBuffer; private int stereoMode; @Nullable private MeshData leftMeshData; @Nullable private MeshData rightMeshData; + @Nullable private GlUtil.Program program; - // Program related GL items. These are only valid if program != 0. - private int program; + // Program related GL items. These are only valid if program is non-null. private int mvpMatrixHandle; private int uTexMatrixHandle; private int positionHandle; @@ -119,12 +120,12 @@ import java.nio.FloatBuffer; /** Initializes of the GL components. */ /* package */ void init() { - program = GlUtil.compileProgram(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); - mvpMatrixHandle = GLES20.glGetUniformLocation(program, "uMvpMatrix"); - uTexMatrixHandle = GLES20.glGetUniformLocation(program, "uTexMatrix"); - positionHandle = GLES20.glGetAttribLocation(program, "aPosition"); - texCoordsHandle = GLES20.glGetAttribLocation(program, "aTexCoords"); - textureHandle = GLES20.glGetUniformLocation(program, "uTexture"); + program = new GlUtil.Program(VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE); + mvpMatrixHandle = program.getUniformLocation("uMvpMatrix"); + uTexMatrixHandle = program.getUniformLocation("uTexMatrix"); + positionHandle = program.getAttribLocation("aPosition"); + texCoordsHandle = program.getAttribLocation("aTexCoords"); + textureHandle = program.getUniformLocation("uTexture"); } /** @@ -143,7 +144,7 @@ import java.nio.FloatBuffer; } // Configure shader. - GLES20.glUseProgram(program); + checkNotNull(program).use(); checkGlError(); GLES20.glEnableVertexAttribArray(positionHandle); @@ -196,8 +197,9 @@ import java.nio.FloatBuffer; /** Cleans up the GL resources. */ /* package */ void shutdown() { - if (program != 0) { - GLES20.glDeleteProgram(program); + if (program != null) { + program.delete(); + program = null; } } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 90ce3a8071..b04490152b 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -229,17 +229,19 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; GlUtil.focusSurface( eglDisplay, eglContext, eglSurface, decoderInputFormat.width, decoderInputFormat.height); decoderTextureId = GlUtil.createExternalTexture(); - String vertexShaderCode; - String fragmentShaderCode; + GlUtil.Program copyProgram; try { - vertexShaderCode = GlUtil.loadAsset(context, "shaders/blit_vertex_shader.glsl"); - fragmentShaderCode = GlUtil.loadAsset(context, "shaders/copy_external_fragment_shader.glsl"); + copyProgram = + new GlUtil.Program( + context, + /* vertexShaderFilePath= */ "shaders/blit_vertex_shader.glsl", + /* fragmentShaderFilePath= */ "shaders/copy_external_fragment_shader.glsl"); } catch (IOException e) { throw new IllegalStateException(e); } - int copyProgram = GlUtil.compileProgram(vertexShaderCode, fragmentShaderCode); - GLES20.glUseProgram(copyProgram); - GlUtil.Attribute[] copyAttributes = GlUtil.getAttributes(copyProgram); + + copyProgram.use(); + GlUtil.Attribute[] copyAttributes = copyProgram.getAttributes(); checkState(copyAttributes.length == 2, "Expected program to have two vertex attributes."); for (GlUtil.Attribute copyAttribute : copyAttributes) { if (copyAttribute.name.equals("a_position")) { @@ -265,7 +267,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } copyAttribute.bind(); } - GlUtil.Uniform[] copyUniforms = GlUtil.getUniforms(copyProgram); + GlUtil.Uniform[] copyUniforms = copyProgram.getUniforms(); checkState(copyUniforms.length == 2, "Expected program to have two uniforms."); for (GlUtil.Uniform copyUniform : copyUniforms) { if (copyUniform.name.equals("tex_sampler")) { From 689a92c9aeedea89e5ab35f663d819d41441cd5d Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 28 Oct 2021 18:01:01 +0100 Subject: [PATCH 399/441] Update the UI Components dev guide page to use MediaItem API #minor-release PiperOrigin-RevId: 406163529 --- docs/ui-components.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/ui-components.md b/docs/ui-components.md index 79078b1731..c56107eae7 100644 --- a/docs/ui-components.md +++ b/docs/ui-components.md @@ -73,8 +73,8 @@ When a player has been initialized, it can be attached to the view by calling player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); -// Set the media source to be played. -player.setMediaSource(createMediaSource()); +// Set the media item to be played. +player.setMediaItem(mediaItem); // Prepare the player. player.prepare(); ~~~ @@ -160,8 +160,10 @@ private void initializePlayer() { player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerControlView.setPlayer(player); - // Prepare the player with the dash media source. - player.prepare(createMediaSource()); + // Set the media item to be played. + player.setMediaItem(mediaItem); + // Prepare the player. + player.prepare(); } ~~~ {: .language-java} From 1c824561c6dc815762d3fde23e9d0e780a950a03 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 28 Oct 2021 18:15:25 +0100 Subject: [PATCH 400/441] Migrate callers of deprecated C.java methods to Util.java #minor-release PiperOrigin-RevId: 406166670 --- .../exoplayer2/ext/cast/CastUtils.java | 3 +- .../ext/cast/CastTimelineTrackerTest.java | 19 +++-- .../exoplayer2/ext/ima/AdTagLoader.java | 26 +++--- .../exoplayer2/ext/ima/ImaAdsLoader.java | 2 +- .../exoplayer2/ext/ima/FakePlayer.java | 3 +- .../exoplayer2/ext/ima/ImaAdsLoaderTest.java | 40 +++++---- .../google/android/exoplayer2/Timeline.java | 10 +-- .../DefaultLivePlaybackSpeedControl.java | 18 ++-- .../exoplayer2/DefaultLoadControl.java | 10 +-- .../exoplayer2/ExoPlaybackException.java | 2 +- .../android/exoplayer2/ExoPlayerImpl.java | 34 ++++---- .../exoplayer2/ExoPlayerImplInternal.java | 6 +- .../android/exoplayer2/SimpleExoPlayer.java | 4 +- .../analytics/AnalyticsCollector.java | 2 +- .../DefaultPlaybackSessionManager.java | 3 +- .../analytics/PlaybackStatsListener.java | 2 +- .../audio/AudioTrackPositionTracker.java | 8 +- .../android/exoplayer2/drm/DrmUtil.java | 3 +- .../mediacodec/MediaCodecRenderer.java | 4 +- .../source/ClippingMediaSource.java | 3 +- .../source/MediaSourceEventListener.java | 3 +- .../source/ProgressiveMediaPeriod.java | 4 +- .../source/SingleSampleMediaPeriod.java | 3 +- .../ads/ServerSideInsertedAdsMediaSource.java | 6 +- .../source/ads/ServerSideInsertedAdsUtil.java | 5 +- .../source/chunk/ChunkSampleStream.java | 4 +- .../android/exoplayer2/util/EventLogger.java | 4 +- .../exoplayer2/util/StandaloneMediaClock.java | 3 +- .../video/DecoderVideoRenderer.java | 3 +- .../exoplayer2/DefaultLoadControlTest.java | 17 ++-- .../exoplayer2/DefaultMediaClockTest.java | 5 +- .../android/exoplayer2/ExoPlayerTest.java | 82 ++++++++++--------- .../source/dash/DashMediaSource.java | 34 ++++---- .../source/dash/DefaultDashChunkSource.java | 9 +- .../source/dash/manifest/DashManifest.java | 3 +- .../dash/manifest/DashManifestParser.java | 8 +- .../source/dash/offline/DashDownloader.java | 4 +- .../dash/DefaultDashChunkSourceTest.java | 3 +- .../exoplayer2/extractor/mp3/MlltSeeker.java | 8 +- .../extractor/mp3/Mp3Extractor.java | 2 +- .../exoplayer2/source/hls/HlsMediaSource.java | 12 +-- .../source/hls/HlsSampleStreamWrapper.java | 4 +- .../UnexpectedSampleTimestampException.java | 3 +- .../playlist/DefaultHlsPlaylistTracker.java | 6 +- .../hls/playlist/HlsPlaylistParser.java | 2 +- .../source/hls/HlsMediaSourceTest.java | 3 +- .../exoplayer2/source/rtsp/RtspClient.java | 4 +- .../source/rtsp/RtspMediaSource.java | 3 +- .../source/smoothstreaming/SsMediaSource.java | 2 +- .../exoplayer2/transformer/MuxerWrapper.java | 3 +- .../SefSlowMotionVideoSampleTransformer.java | 5 +- .../transformer/SegmentSpeedProvider.java | 7 +- .../exoplayer2/ui/PlayerControlView.java | 6 +- .../ui/StyledPlayerControlView.java | 6 +- .../testutil/FakeMediaSourceFactory.java | 3 +- .../exoplayer2/testutil/FakeTimeline.java | 2 +- 56 files changed, 257 insertions(+), 226 deletions(-) diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java index 3077077616..5b96bc5846 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastUtils.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.ext.cast; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.util.Util; import com.google.android.gms.cast.CastStatusCodes; import com.google.android.gms.cast.MediaInfo; import com.google.android.gms.cast.MediaTrack; @@ -42,7 +43,7 @@ import com.google.android.gms.cast.MediaTrack; } long durationMs = mediaInfo.getStreamDuration(); return durationMs != MediaInfo.UNKNOWN_DURATION && durationMs != LIVE_STREAM_DURATION - ? C.msToUs(durationMs) + ? Util.msToUs(durationMs) : C.TIME_UNSET; } diff --git a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTimelineTrackerTest.java b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTimelineTrackerTest.java index cae117ea00..5b6c6c8511 100644 --- a/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTimelineTrackerTest.java +++ b/extensions/cast/src/test/java/com/google/android/exoplayer2/ext/cast/CastTimelineTrackerTest.java @@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.testutil.TimelineAsserts; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; import com.google.android.gms.cast.MediaInfo; import com.google.android.gms.cast.MediaStatus; import com.google.android.gms.cast.framework.media.MediaQueue; @@ -52,7 +53,7 @@ public class CastTimelineTrackerTest { TimelineAsserts.assertPeriodDurations( tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, - C.msToUs(DURATION_2_MS), + Util.msToUs(DURATION_2_MS), C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET); @@ -65,8 +66,8 @@ public class CastTimelineTrackerTest { TimelineAsserts.assertPeriodDurations( tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, - C.msToUs(DURATION_2_MS), - C.msToUs(DURATION_3_MS)); + Util.msToUs(DURATION_2_MS), + Util.msToUs(DURATION_3_MS)); remoteMediaClient = mockRemoteMediaClient( @@ -74,7 +75,7 @@ public class CastTimelineTrackerTest { /* currentItemId= */ 3, /* currentDurationMs= */ DURATION_3_MS); TimelineAsserts.assertPeriodDurations( - tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, C.msToUs(DURATION_3_MS)); + tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, Util.msToUs(DURATION_3_MS)); remoteMediaClient = mockRemoteMediaClient( @@ -85,8 +86,8 @@ public class CastTimelineTrackerTest { tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, C.TIME_UNSET, - C.msToUs(DURATION_3_MS), - C.msToUs(DURATION_4_MS), + Util.msToUs(DURATION_3_MS), + Util.msToUs(DURATION_4_MS), C.TIME_UNSET); remoteMediaClient = @@ -98,9 +99,9 @@ public class CastTimelineTrackerTest { tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, C.TIME_UNSET, - C.msToUs(DURATION_3_MS), - C.msToUs(DURATION_4_MS), - C.msToUs(DURATION_5_MS)); + Util.msToUs(DURATION_3_MS), + Util.msToUs(DURATION_4_MS), + Util.msToUs(DURATION_5_MS)); } private static RemoteMediaClient mockRemoteMediaClient( diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java index f0c4a199e1..2d446527a1 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java @@ -348,7 +348,7 @@ import java.util.Map; long contentPositionMs = getContentPeriodPositionMs(player, timeline, period); int adGroupForPositionIndex = adPlaybackState.getAdGroupIndexForPositionUs( - C.msToUs(contentPositionMs), C.msToUs(contentDurationMs)); + Util.msToUs(contentPositionMs), Util.msToUs(contentDurationMs)); if (adGroupForPositionIndex != C.INDEX_UNSET && imaAdInfo != null && imaAdInfo.adGroupIndex != adGroupForPositionIndex) { @@ -372,7 +372,7 @@ import java.util.Map; } adPlaybackState = adPlaybackState.withAdResumePositionUs( - playingAd ? C.msToUs(player.getCurrentPosition()) : 0); + playingAd ? Util.msToUs(player.getCurrentPosition()) : 0); } lastVolumePercent = getPlayerVolumePercent(); lastAdProgress = getAdVideoProgressUpdate(); @@ -456,7 +456,7 @@ import java.util.Map; this.timeline = timeline; Player player = checkNotNull(this.player); long contentDurationUs = timeline.getPeriod(player.getCurrentPeriodIndex(), period).durationUs; - contentDurationMs = C.usToMs(contentDurationUs); + contentDurationMs = Util.usToMs(contentDurationUs); if (contentDurationUs != adPlaybackState.contentDurationUs) { adPlaybackState = adPlaybackState.withContentDurationUs(contentDurationUs); updateAdPlaybackState(); @@ -602,10 +602,11 @@ import java.util.Map; // Skip ads based on the start position as required. int adGroupForPositionIndex = adPlaybackState.getAdGroupIndexForPositionUs( - C.msToUs(contentPositionMs), C.msToUs(contentDurationMs)); + Util.msToUs(contentPositionMs), Util.msToUs(contentDurationMs)); if (adGroupForPositionIndex != C.INDEX_UNSET) { boolean playAdWhenStartingPlayback = - adPlaybackState.getAdGroup(adGroupForPositionIndex).timeUs == C.msToUs(contentPositionMs) + adPlaybackState.getAdGroup(adGroupForPositionIndex).timeUs + == Util.msToUs(contentPositionMs) || configuration.playAdBeforeStartPosition; if (!playAdWhenStartingPlayback) { adGroupForPositionIndex++; @@ -790,7 +791,7 @@ import java.util.Map; // An ad is available already. return false; } - long adGroupTimeMs = C.usToMs(adGroup.timeUs); + long adGroupTimeMs = Util.usToMs(adGroup.timeUs); long contentPositionMs = getContentPeriodPositionMs(player, timeline, period); long timeUntilAdMs = adGroupTimeMs - contentPositionMs; return timeUntilAdMs < configuration.adPreloadTimeoutMs; @@ -840,7 +841,7 @@ import java.util.Map; if (!sentContentComplete && !timeline.isEmpty()) { long positionMs = getContentPeriodPositionMs(player, timeline, period); timeline.getPeriod(player.getCurrentPeriodIndex(), period); - int newAdGroupIndex = period.getAdGroupIndexForPositionUs(C.msToUs(positionMs)); + int newAdGroupIndex = period.getAdGroupIndexForPositionUs(Util.msToUs(positionMs)); if (newAdGroupIndex != C.INDEX_UNSET) { sentPendingContentPositionMs = false; pendingContentPositionMs = positionMs; @@ -880,7 +881,7 @@ import java.util.Map; } else { // IMA hasn't called playAd yet, so fake the content position. fakeContentProgressElapsedRealtimeMs = SystemClock.elapsedRealtime(); - fakeContentProgressOffsetMs = C.usToMs(adGroup.timeUs); + fakeContentProgressOffsetMs = Util.usToMs(adGroup.timeUs); if (fakeContentProgressOffsetMs == C.TIME_END_OF_SOURCE) { fakeContentProgressOffsetMs = contentDurationMs; } @@ -1091,7 +1092,7 @@ import java.util.Map; // Send IMA a content position at the ad group so that it will try to play it, at which point // we can notify that it failed to load. fakeContentProgressElapsedRealtimeMs = SystemClock.elapsedRealtime(); - fakeContentProgressOffsetMs = C.usToMs(adPlaybackState.getAdGroup(adGroupIndex).timeUs); + fakeContentProgressOffsetMs = Util.usToMs(adPlaybackState.getAdGroup(adGroupIndex).timeUs); if (fakeContentProgressOffsetMs == C.TIME_END_OF_SOURCE) { fakeContentProgressOffsetMs = contentDurationMs; } @@ -1192,13 +1193,14 @@ import java.util.Map; if (player == null) { return C.INDEX_UNSET; } - long playerPositionUs = C.msToUs(getContentPeriodPositionMs(player, timeline, period)); + long playerPositionUs = Util.msToUs(getContentPeriodPositionMs(player, timeline, period)); int adGroupIndex = - adPlaybackState.getAdGroupIndexForPositionUs(playerPositionUs, C.msToUs(contentDurationMs)); + adPlaybackState.getAdGroupIndexForPositionUs( + playerPositionUs, Util.msToUs(contentDurationMs)); if (adGroupIndex == C.INDEX_UNSET) { adGroupIndex = adPlaybackState.getAdGroupIndexAfterPositionUs( - playerPositionUs, C.msToUs(contentDurationMs)); + playerPositionUs, Util.msToUs(contentDurationMs)); } return adGroupIndex; } diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 7f52005b68..85a39c77e8 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -703,7 +703,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader { timeline.getPeriodPosition( window, period, period.windowIndex, /* windowPositionUs= */ C.TIME_UNSET) .second; - nextAdTagLoader.maybePreloadAds(C.usToMs(periodPositionUs), C.usToMs(period.durationUs)); + nextAdTagLoader.maybePreloadAds(Util.usToMs(periodPositionUs), Util.usToMs(period.durationUs)); } /** diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java index d0a9d4206b..e8f80feed0 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ListenerSet; +import com.google.android.exoplayer2.util.Util; /** A fake player for testing content/ad playback. */ /* package */ final class FakePlayer extends StubExoPlayer { @@ -277,7 +278,7 @@ import com.google.android.exoplayer2.util.ListenerSet; if (isPlayingAd()) { long adDurationUs = timeline.getPeriod(0, period).getAdDurationUs(adGroupIndex, adIndexInAdGroup); - return C.usToMs(adDurationUs); + return Util.usToMs(adDurationUs); } else { return timeline.getWindow(getCurrentWindowIndex(), window).getDurationMs(); } diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java index 06711d6055..cb0deb494b 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java @@ -384,13 +384,13 @@ public final class ImaAdsLoaderTest { playerPositionUs + TimelineWindowDefinition.DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US; long periodDurationUs = CONTENT_TIMELINE.getPeriod(/* periodIndex= */ 0, new Period()).durationUs; - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(playerPositionUs)); + fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, Util.usToMs(playerPositionUs)); // Verify the content progress is updated to reflect the new player position. assertThat(contentProgressProvider.getContentProgress()) .isEqualTo( new VideoProgressUpdate( - C.usToMs(playerPositionInPeriodUs), C.usToMs(periodDurationUs))); + Util.usToMs(playerPositionInPeriodUs), Util.usToMs(periodDurationUs))); } @Test @@ -428,7 +428,8 @@ public final class ImaAdsLoaderTest { // Advance playback to just before the midroll and simulate buffering. imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(adGroupPositionInWindowUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(adGroupPositionInWindowUs)); fakePlayer.setState(Player.STATE_BUFFERING, /* playWhenReady= */ true); // Advance before the timeout and simulating polling content progress. ShadowSystemClock.advanceBy(Duration.ofSeconds(1)); @@ -453,7 +454,8 @@ public final class ImaAdsLoaderTest { // Advance playback to just before the midroll and simulate buffering. imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(adGroupPositionInWindowUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(adGroupPositionInWindowUs)); fakePlayer.setState(Player.STATE_BUFFERING, /* playWhenReady= */ true); // Advance past the timeout and simulate polling content progress. ShadowSystemClock.advanceBy(Duration.ofSeconds(5)); @@ -478,7 +480,8 @@ public final class ImaAdsLoaderTest { ImmutableList cuePoints = ImmutableList.of((float) adGroupTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setState(Player.STATE_BUFFERING, /* playWhenReady= */ true); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(adGroupPositionInWindowUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(adGroupPositionInWindowUs)); // Start ad loading while still buffering and simulate the calls from the IMA SDK to resume then // immediately pause content playback. @@ -506,7 +509,8 @@ public final class ImaAdsLoaderTest { ImmutableList cuePoints = ImmutableList.of((float) adGroupTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setState(Player.STATE_BUFFERING, /* playWhenReady= */ true); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(adGroupPositionInWindowUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(adGroupPositionInWindowUs)); // Start ad loading while still buffering and poll progress without the ad loading. imaAdsLoader.start( @@ -597,7 +601,7 @@ public final class ImaAdsLoaderTest { verify(mockVideoAdPlayerCallback) .onAdProgress( TEST_AD_MEDIA_INFO, - new VideoProgressUpdate(newPlayerPositionMs, C.usToMs(TEST_AD_DURATION_US))); + new VideoProgressUpdate(newPlayerPositionMs, Util.usToMs(TEST_AD_DURATION_US))); } @Test @@ -610,7 +614,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs) - 1_000); + /* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs) - 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -630,7 +634,7 @@ public final class ImaAdsLoaderTest { ImmutableList.of(0f, (float) midrollPeriodTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs)); + fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs)); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -657,7 +661,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs) + 1_000); + /* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs) + 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -691,7 +695,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(secondMidrollWindowTimeUs) - 1_000); + /* periodIndex= */ 0, Util.usToMs(secondMidrollWindowTimeUs) - 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -718,7 +722,8 @@ public final class ImaAdsLoaderTest { (float) secondMidrollPeriodTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(secondMidrollWindowTimeUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(secondMidrollWindowTimeUs)); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -760,7 +765,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs) - 1_000); + /* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs) - 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -801,7 +806,7 @@ public final class ImaAdsLoaderTest { ImmutableList.of(0f, (float) midrollPeriodTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs)); + fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs)); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -843,7 +848,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(midrollWindowTimeUs) + 1_000); + /* periodIndex= */ 0, Util.usToMs(midrollWindowTimeUs) + 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -889,7 +894,7 @@ public final class ImaAdsLoaderTest { when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); fakePlayer.setPlayingContentPosition( - /* periodIndex= */ 0, C.usToMs(secondMidrollWindowTimeUs) - 1_000); + /* periodIndex= */ 0, Util.usToMs(secondMidrollWindowTimeUs) - 1_000); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); @@ -937,7 +942,8 @@ public final class ImaAdsLoaderTest { (float) secondMidrollPeriodTimeUs / C.MICROS_PER_SECOND); when(mockAdsManager.getAdCuePoints()).thenReturn(cuePoints); - fakePlayer.setPlayingContentPosition(/* periodIndex= */ 0, C.usToMs(secondMidrollWindowTimeUs)); + fakePlayer.setPlayingContentPosition( + /* periodIndex= */ 0, Util.usToMs(secondMidrollWindowTimeUs)); imaAdsLoader.start( adsMediaSource, TEST_DATA_SPEC, TEST_ADS_ID, adViewProvider, adsLoaderListener); 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 945f2c5107..8b6e734e68 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 @@ -300,7 +300,7 @@ public abstract class Timeline implements Bundleable { * whilst remaining within the bounds of the window. */ public long getDefaultPositionMs() { - return C.usToMs(defaultPositionUs); + return Util.usToMs(defaultPositionUs); } /** @@ -315,7 +315,7 @@ public abstract class Timeline implements Bundleable { /** Returns the duration of the window in milliseconds, or {@link C#TIME_UNSET} if unknown. */ public long getDurationMs() { - return C.usToMs(durationUs); + return Util.usToMs(durationUs); } /** Returns the duration of this window in microseconds, or {@link C#TIME_UNSET} if unknown. */ @@ -328,7 +328,7 @@ public abstract class Timeline implements Bundleable { * belonging to it, in milliseconds. */ public long getPositionInFirstPeriodMs() { - return C.usToMs(positionInFirstPeriodUs); + return Util.usToMs(positionInFirstPeriodUs); } /** @@ -671,7 +671,7 @@ public abstract class Timeline implements Bundleable { /** Returns the duration of the period in milliseconds, or {@link C#TIME_UNSET} if unknown. */ public long getDurationMs() { - return C.usToMs(durationUs); + return Util.usToMs(durationUs); } /** Returns the duration of this period in microseconds, or {@link C#TIME_UNSET} if unknown. */ @@ -685,7 +685,7 @@ public abstract class Timeline implements Bundleable { * window. */ public long getPositionInWindowMs() { - return C.usToMs(positionInWindowUs); + return Util.usToMs(positionInWindowUs); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLivePlaybackSpeedControl.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLivePlaybackSpeedControl.java index e4fa65c436..59753448db 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLivePlaybackSpeedControl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLivePlaybackSpeedControl.java @@ -106,9 +106,10 @@ public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedC fallbackMaxPlaybackSpeed = DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED; minUpdateIntervalMs = DEFAULT_MIN_UPDATE_INTERVAL_MS; proportionalControlFactorUs = DEFAULT_PROPORTIONAL_CONTROL_FACTOR / C.MICROS_PER_SECOND; - maxLiveOffsetErrorUsForUnitSpeed = C.msToUs(DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED); + maxLiveOffsetErrorUsForUnitSpeed = + Util.msToUs(DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED); targetLiveOffsetIncrementOnRebufferUs = - C.msToUs(DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS); + Util.msToUs(DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS); minPossibleLiveOffsetSmoothingFactor = DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR; } @@ -187,7 +188,7 @@ public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedC */ public Builder setMaxLiveOffsetErrorMsForUnitSpeed(long maxLiveOffsetErrorMsForUnitSpeed) { Assertions.checkArgument(maxLiveOffsetErrorMsForUnitSpeed > 0); - this.maxLiveOffsetErrorUsForUnitSpeed = C.msToUs(maxLiveOffsetErrorMsForUnitSpeed); + this.maxLiveOffsetErrorUsForUnitSpeed = Util.msToUs(maxLiveOffsetErrorMsForUnitSpeed); return this; } @@ -202,7 +203,8 @@ public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedC public Builder setTargetLiveOffsetIncrementOnRebufferMs( long targetLiveOffsetIncrementOnRebufferMs) { Assertions.checkArgument(targetLiveOffsetIncrementOnRebufferMs >= 0); - this.targetLiveOffsetIncrementOnRebufferUs = C.msToUs(targetLiveOffsetIncrementOnRebufferMs); + this.targetLiveOffsetIncrementOnRebufferUs = + Util.msToUs(targetLiveOffsetIncrementOnRebufferMs); return this; } @@ -295,9 +297,9 @@ public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedC @Override public void setLiveConfiguration(LiveConfiguration liveConfiguration) { - mediaConfigurationTargetLiveOffsetUs = C.msToUs(liveConfiguration.targetOffsetMs); - minTargetLiveOffsetUs = C.msToUs(liveConfiguration.minOffsetMs); - maxTargetLiveOffsetUs = C.msToUs(liveConfiguration.maxOffsetMs); + mediaConfigurationTargetLiveOffsetUs = Util.msToUs(liveConfiguration.targetOffsetMs); + minTargetLiveOffsetUs = Util.msToUs(liveConfiguration.minOffsetMs); + maxTargetLiveOffsetUs = Util.msToUs(liveConfiguration.maxOffsetMs); minPlaybackSpeed = liveConfiguration.minPlaybackSpeed != C.RATE_UNSET ? liveConfiguration.minPlaybackSpeed @@ -416,7 +418,7 @@ public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedC // There is room for decreasing the target offset towards the ideal or safe offset (whichever // is larger). We want to limit the decrease so that the playback speed delta we achieve is // the same as the maximum delta when slowing down towards the target. - long minUpdateIntervalUs = C.msToUs(minUpdateIntervalMs); + long minUpdateIntervalUs = Util.msToUs(minUpdateIntervalMs); long decrementToOffsetCurrentSpeedUs = (long) ((adjustedPlaybackSpeed - 1f) * minUpdateIntervalUs); long decrementToIncreaseSpeedUs = (long) ((maxPlaybackSpeed - 1f) * minUpdateIntervalUs); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java index b947755f6d..d2ea709e76 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java @@ -299,17 +299,17 @@ public class DefaultLoadControl implements LoadControl { assertGreaterOrEqual(backBufferDurationMs, 0, "backBufferDurationMs", "0"); this.allocator = allocator; - this.minBufferUs = C.msToUs(minBufferMs); - this.maxBufferUs = C.msToUs(maxBufferMs); - this.bufferForPlaybackUs = C.msToUs(bufferForPlaybackMs); - this.bufferForPlaybackAfterRebufferUs = C.msToUs(bufferForPlaybackAfterRebufferMs); + this.minBufferUs = Util.msToUs(minBufferMs); + this.maxBufferUs = Util.msToUs(maxBufferMs); + this.bufferForPlaybackUs = Util.msToUs(bufferForPlaybackMs); + this.bufferForPlaybackAfterRebufferUs = Util.msToUs(bufferForPlaybackAfterRebufferMs); this.targetBufferBytesOverwrite = targetBufferBytes; this.targetBufferBytes = targetBufferBytesOverwrite != C.LENGTH_UNSET ? targetBufferBytesOverwrite : DEFAULT_MIN_BUFFER_SIZE; this.prioritizeTimeOverSizeThresholds = prioritizeTimeOverSizeThresholds; - this.backBufferDurationUs = C.msToUs(backBufferDurationMs); + this.backBufferDurationUs = Util.msToUs(backBufferDurationMs); this.retainBackBufferFromKeyframe = retainBackBufferFromKeyframe; } 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 f78441bda1..bc342e7995 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 @@ -359,7 +359,7 @@ public final class ExoPlaybackException extends PlaybackException { + ", format=" + rendererFormat + ", format_supported=" - + C.getFormatSupportString(rendererFormatSupport); + + Util.getFormatSupportString(rendererFormatSupport); break; case TYPE_REMOTE: message = "Remote error"; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 31fb99dbc2..653135e59c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -669,7 +669,7 @@ import java.util.concurrent.CopyOnWriteArraySet; newPlaybackInfo, timeline, getPeriodPositionOrMaskWindowPosition(timeline, mediaItemIndex, positionMs)); - internalPlayer.seekTo(timeline, mediaItemIndex, C.msToUs(positionMs)); + internalPlayer.seekTo(timeline, mediaItemIndex, Util.msToUs(positionMs)); updatePlaybackInfo( newPlaybackInfo, /* ignored */ TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, @@ -865,21 +865,21 @@ import java.util.concurrent.CopyOnWriteArraySet; MediaPeriodId periodId = playbackInfo.periodId; playbackInfo.timeline.getPeriodByUid(periodId.periodUid, period); long adDurationUs = period.getAdDurationUs(periodId.adGroupIndex, periodId.adIndexInAdGroup); - return C.usToMs(adDurationUs); + return Util.usToMs(adDurationUs); } return getContentDuration(); } @Override public long getCurrentPosition() { - return C.usToMs(getCurrentPositionUsInternal(playbackInfo)); + return Util.usToMs(getCurrentPositionUsInternal(playbackInfo)); } @Override public long getBufferedPosition() { if (isPlayingAd()) { return playbackInfo.loadingMediaPeriodId.equals(playbackInfo.periodId) - ? C.usToMs(playbackInfo.bufferedPositionUs) + ? Util.usToMs(playbackInfo.bufferedPositionUs) : getDuration(); } return getContentBufferedPosition(); @@ -887,7 +887,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @Override public long getTotalBufferedDuration() { - return C.usToMs(playbackInfo.totalBufferedDurationUs); + return Util.usToMs(playbackInfo.totalBufferedDurationUs); } @Override @@ -911,7 +911,7 @@ import java.util.concurrent.CopyOnWriteArraySet; playbackInfo.timeline.getPeriodByUid(playbackInfo.periodId.periodUid, period); return playbackInfo.requestedContentPositionUs == C.TIME_UNSET ? playbackInfo.timeline.getWindow(getCurrentWindowIndex(), window).getDefaultPositionMs() - : period.getPositionInWindowMs() + C.usToMs(playbackInfo.requestedContentPositionUs); + : period.getPositionInWindowMs() + Util.usToMs(playbackInfo.requestedContentPositionUs); } else { return getCurrentPosition(); } @@ -936,7 +936,7 @@ import java.util.concurrent.CopyOnWriteArraySet; contentBufferedPositionUs = loadingPeriod.durationUs; } } - return C.usToMs( + return Util.usToMs( periodPositionUsToWindowPositionUs( playbackInfo.timeline, playbackInfo.loadingMediaPeriodId, contentBufferedPositionUs)); } @@ -1136,7 +1136,7 @@ import java.util.concurrent.CopyOnWriteArraySet; private long getCurrentPositionUsInternal(PlaybackInfo playbackInfo) { if (playbackInfo.timeline.isEmpty()) { - return C.msToUs(maskingWindowPositionMs); + return Util.msToUs(maskingWindowPositionMs); } else if (playbackInfo.periodId.isAd()) { return playbackInfo.positionUs; } else { @@ -1425,8 +1425,8 @@ import java.util.concurrent.CopyOnWriteArraySet; oldMediaItem, oldPeriodUid, oldPeriodIndex, - C.usToMs(oldPositionUs), - C.usToMs(oldContentPositionUs), + Util.usToMs(oldPositionUs), + Util.usToMs(oldContentPositionUs), oldPlaybackInfo.periodId.adGroupIndex, oldPlaybackInfo.periodId.adIndexInAdGroup); } @@ -1444,7 +1444,7 @@ import java.util.concurrent.CopyOnWriteArraySet; newWindowUid = playbackInfo.timeline.getWindow(newWindowIndex, window).uid; newMediaItem = window.mediaItem; } - long positionMs = C.usToMs(discontinuityWindowStartPositionUs); + long positionMs = Util.usToMs(discontinuityWindowStartPositionUs); return new PositionInfo( newWindowUid, newWindowIndex, @@ -1453,7 +1453,7 @@ import java.util.concurrent.CopyOnWriteArraySet; newPeriodIndex, positionMs, /* contentPositionMs= */ playbackInfo.periodId.isAd() - ? C.usToMs(getRequestedContentPositionUs(playbackInfo)) + ? Util.usToMs(getRequestedContentPositionUs(playbackInfo)) : positionMs, playbackInfo.periodId.adGroupIndex, playbackInfo.periodId.adIndexInAdGroup); @@ -1567,7 +1567,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } newPlaybackInfo = newPlaybackInfo.copyWithPlaybackState(maskingPlaybackState); internalPlayer.setMediaSources( - holders, startWindowIndex, C.msToUs(startPositionMs), shuffleOrder); + holders, startWindowIndex, Util.msToUs(startPositionMs), shuffleOrder); boolean positionDiscontinuity = !playbackInfo.periodId.periodUid.equals(newPlaybackInfo.periodId.periodUid) && !playbackInfo.timeline.isEmpty(); @@ -1647,7 +1647,7 @@ import java.util.concurrent.CopyOnWriteArraySet; if (timeline.isEmpty()) { // Reset periodId and loadingPeriodId. MediaPeriodId dummyMediaPeriodId = PlaybackInfo.getDummyPeriodForEmptyTimeline(); - long positionUs = C.msToUs(maskingWindowPositionMs); + long positionUs = Util.msToUs(maskingWindowPositionMs); playbackInfo = playbackInfo.copyWithNewPosition( dummyMediaPeriodId, @@ -1668,7 +1668,7 @@ import java.util.concurrent.CopyOnWriteArraySet; MediaPeriodId newPeriodId = playingPeriodChanged ? new MediaPeriodId(periodPosition.first) : playbackInfo.periodId; long newContentPositionUs = periodPosition.second; - long oldContentPositionUs = C.msToUs(getContentPosition()); + long oldContentPositionUs = Util.msToUs(getContentPosition()); if (!oldTimeline.isEmpty()) { oldContentPositionUs -= oldTimeline.getPeriodByUid(oldPeriodUid, period).getPositionInWindowUs(); @@ -1757,7 +1757,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @Nullable Pair oldPeriodPosition = oldTimeline.getPeriodPosition( - window, period, currentWindowIndex, C.msToUs(currentPositionMs)); + window, period, currentWindowIndex, Util.msToUs(currentPositionMs)); Object periodUid = castNonNull(oldPeriodPosition).first; if (newTimeline.getIndexOfPeriod(periodUid) != C.INDEX_UNSET) { // The old period position is still available in the new timeline. @@ -1798,7 +1798,7 @@ import java.util.concurrent.CopyOnWriteArraySet; windowIndex = timeline.getFirstWindowIndex(shuffleModeEnabled); windowPositionMs = timeline.getWindow(windowIndex, window).getDefaultPositionMs(); } - return timeline.getPeriodPosition(window, period, windowIndex, C.msToUs(windowPositionMs)); + return timeline.getPeriodPosition(window, period, windowIndex, Util.msToUs(windowPositionMs)); } private long periodPositionUsToWindowPositionUs( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 02cf785eed..30085aeb9a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1082,7 +1082,7 @@ import java.util.concurrent.atomic.AtomicBoolean; if (window.windowStartTimeMs == C.TIME_UNSET || !window.isLive() || !window.isDynamic) { return C.TIME_UNSET; } - return C.msToUs(window.getCurrentUnixTimeMs() - window.windowStartTimeMs) + return Util.msToUs(window.getCurrentUnixTimeMs() - window.windowStartTimeMs) - (periodPositionUs + period.getPositionInWindowUs()); } @@ -1184,7 +1184,7 @@ import java.util.concurrent.atomic.AtomicBoolean; playingPeriodHolder.mediaPeriod.getAdjustedSeekPositionUs( newPeriodPositionUs, seekParameters); } - if (C.usToMs(newPeriodPositionUs) == C.usToMs(playbackInfo.positionUs) + if (Util.usToMs(newPeriodPositionUs) == Util.usToMs(playbackInfo.positionUs) && (playbackInfo.playbackState == Player.STATE_BUFFERING || playbackInfo.playbackState == Player.STATE_READY)) { // Seek will be performed to the current position. Do nothing. @@ -2710,7 +2710,7 @@ import java.util.concurrent.atomic.AtomicBoolean; long requestPositionUs = pendingMessageInfo.message.getPositionMs() == C.TIME_END_OF_SOURCE ? C.TIME_UNSET - : C.msToUs(pendingMessageInfo.message.getPositionMs()); + : Util.msToUs(pendingMessageInfo.message.getPositionMs()); @Nullable Pair periodPosition = resolveSeekPosition( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 6a061bef5f..f0637df30a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -455,7 +455,7 @@ public class SimpleExoPlayer extends BasePlayer if (Util.SDK_INT < 21) { audioSessionId = initializeKeepSessionIdAudioTrack(C.AUDIO_SESSION_ID_UNSET); } else { - audioSessionId = C.generateAudioSessionIdV21(applicationContext); + audioSessionId = Util.generateAudioSessionIdV21(applicationContext); } currentCues = Collections.emptyList(); throwsWhenUsingWrongThread = true; @@ -770,7 +770,7 @@ public class SimpleExoPlayer extends BasePlayer if (Util.SDK_INT < 21) { audioSessionId = initializeKeepSessionIdAudioTrack(C.AUDIO_SESSION_ID_UNSET); } else { - audioSessionId = C.generateAudioSessionIdV21(applicationContext); + audioSessionId = Util.generateAudioSessionIdV21(applicationContext); } } else if (Util.SDK_INT < 21) { // We need to re-initialize keepSessionIdAudioTrack to make sure the session is kept alive for diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 4d1bcd457f..ae22609e29 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -1157,7 +1157,7 @@ public class AnalyticsCollector : playerTimeline .getPeriod(playerPeriodIndex, period) .getAdGroupIndexAfterPositionUs( - C.msToUs(player.getCurrentPosition()) - period.getPositionInWindowUs()); + Util.msToUs(player.getCurrentPosition()) - period.getPositionInWindowUs()); for (int i = 0; i < mediaPeriodQueue.size(); i++) { MediaPeriodId mediaPeriodId = mediaPeriodQueue.get(i); if (isMatchingMediaPeriod( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java index 7d4d6087dc..2403f9bf77 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.analytics; -import static com.google.android.exoplayer2.C.usToMs; import static java.lang.Math.max; import android.util.Base64; @@ -141,7 +140,7 @@ public final class DefaultPlaybackSessionManager implements PlaybackSessionManag contentSession.isCreated = true; eventTime.timeline.getPeriodByUid(eventTime.mediaPeriodId.periodUid, period); long adGroupPositionMs = - usToMs(period.getAdGroupTimeUs(eventTime.mediaPeriodId.adGroupIndex)) + Util.usToMs(period.getAdGroupTimeUs(eventTime.mediaPeriodId.adGroupIndex)) + period.getPositionInWindowMs(); // getAdGroupTimeUs may return 0 for prerolls despite period offset. adGroupPositionMs = max(0, adGroupPositionMs); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java index 343fa4ce76..868bfb617c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java @@ -333,7 +333,7 @@ public final class PlaybackStatsListener eventTime.mediaPeriodId.periodUid, eventTime.mediaPeriodId.windowSequenceNumber, eventTime.mediaPeriodId.adGroupIndex), - /* eventPlaybackPositionMs= */ C.usToMs(contentWindowPositionUs), + /* eventPlaybackPositionMs= */ Util.usToMs(contentWindowPositionUs), eventTime.timeline, eventTime.currentWindowIndex, eventTime.currentMediaPeriodId, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java index 6c26d87fcf..9c8186ffa6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java @@ -302,12 +302,12 @@ import java.lang.reflect.Method; if (!notifiedPositionIncreasing && positionUs > lastPositionUs) { notifiedPositionIncreasing = true; - long mediaDurationSinceLastPositionUs = C.usToMs(positionUs - lastPositionUs); + long mediaDurationSinceLastPositionUs = Util.usToMs(positionUs - lastPositionUs); long playoutDurationSinceLastPositionUs = Util.getPlayoutDurationForMediaDuration( mediaDurationSinceLastPositionUs, audioTrackPlaybackSpeed); long playoutStartSystemTimeMs = - System.currentTimeMillis() - C.usToMs(playoutDurationSinceLastPositionUs); + System.currentTimeMillis() - Util.usToMs(playoutDurationSinceLastPositionUs); listener.onPositionAdvancing(playoutStartSystemTimeMs); } @@ -357,7 +357,7 @@ import java.lang.reflect.Method; boolean hadData = hasData; hasData = hasPendingData(writtenFrames); if (hadData && !hasData && playState != PLAYSTATE_STOPPED) { - listener.onUnderrun(bufferSize, C.usToMs(bufferSizeUs)); + listener.onUnderrun(bufferSize, Util.usToMs(bufferSizeUs)); } return true; @@ -379,7 +379,7 @@ import java.lang.reflect.Method; /** Returns the duration of audio that is buffered but unplayed. */ public long getPendingBufferDurationMs(long writtenFrames) { - return C.usToMs(framesToDurationUs(writtenFrames - getPlaybackHeadPosition())); + return Util.usToMs(framesToDurationUs(writtenFrames - getPlaybackHeadPosition())); } /** Returns whether the track is in an invalid state and must be recreated. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java index bd89d2d373..1b2237bf1b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java @@ -23,7 +23,6 @@ import androidx.annotation.DoNotInline; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; @@ -122,7 +121,7 @@ public final class DrmUtil { @Nullable String diagnosticsInfo = ((MediaDrm.MediaDrmStateException) throwable).getDiagnosticInfo(); int drmErrorCode = Util.getErrorCodeFromPlatformDiagnosticsInfo(diagnosticsInfo); - return C.getErrorCodeForMediaDrmErrorCode(drmErrorCode); + return Util.getErrorCodeForMediaDrmErrorCode(drmErrorCode); } } 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 389e675c59..3a476229e1 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 @@ -1240,7 +1240,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } } catch (CryptoException e) { throw createRendererException( - e, inputFormat, C.getErrorCodeForMediaDrmErrorCode(e.getErrorCode())); + e, inputFormat, Util.getErrorCodeForMediaDrmErrorCode(e.getErrorCode())); } return false; } @@ -1312,7 +1312,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { } } catch (CryptoException e) { throw createRendererException( - e, inputFormat, C.getErrorCodeForMediaDrmErrorCode(e.getErrorCode())); + e, inputFormat, Util.getErrorCodeForMediaDrmErrorCode(e.getErrorCode())); } resetInputBuffer(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java index b81d222221..f86b81760d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -338,7 +339,7 @@ public final class ClippingMediaSource extends CompositeMediaSource { endUs == C.TIME_UNSET ? window.defaultPositionUs : min(window.defaultPositionUs, endUs); window.defaultPositionUs -= startUs; } - long startMs = C.usToMs(startUs); + long startMs = Util.usToMs(startUs); if (window.presentationStartTimeMs != C.TIME_UNSET) { window.presentationStartTimeMs += startMs; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java index 13f7562576..d1bcf9380c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.concurrent.CopyOnWriteArrayList; @@ -472,7 +473,7 @@ public interface MediaSourceEventListener { } private long adjustMediaTime(long mediaTimeUs) { - long mediaTimeMs = C.usToMs(mediaTimeUs); + long mediaTimeMs = Util.usToMs(mediaTimeUs); return mediaTimeMs == C.TIME_UNSET ? C.TIME_UNSET : mediaTimeOffsetMs + mediaTimeMs; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index c30476405d..4c0b795f80 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -641,8 +641,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* trackFormat= */ null, C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, - /* mediaStartTimeMs= */ C.usToMs(loadable.seekTimeUs), - C.usToMs(durationUs)); + /* mediaStartTimeMs= */ Util.usToMs(loadable.seekTimeUs), + Util.usToMs(durationUs)); LoadErrorAction loadErrorAction; long retryDelayMs = loadErrorHandlingPolicy.getRetryDelayMsFor( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java index a018f94de2..e589e8cca4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -282,7 +283,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeMs= */ 0, - C.usToMs(durationUs)); + Util.usToMs(durationUs)); long retryDelay = loadErrorHandlingPolicy.getRetryDelayMsFor( new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount)); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java index 69588f504c..1a5d94ad1f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsMediaSource.java @@ -512,7 +512,7 @@ public final class ServerSideInsertedAdsMediaSource extends BaseMediaSource if (mediaPositionMs == C.TIME_UNSET) { return C.TIME_UNSET; } - long mediaPositionUs = C.msToUs(mediaPositionMs); + long mediaPositionUs = Util.msToUs(mediaPositionMs); MediaPeriodId id = mediaPeriod.mediaPeriodId; long correctedPositionUs = id.isAd() @@ -522,7 +522,7 @@ public final class ServerSideInsertedAdsMediaSource extends BaseMediaSource // content pieces (beyond nextAdGroupIndex). : getMediaPeriodPositionUsForContent( mediaPositionUs, /* nextAdGroupIndex= */ C.INDEX_UNSET, adPlaybackState); - return C.usToMs(correctedPositionUs); + return Util.usToMs(correctedPositionUs); } private static final class SharedMediaPeriod implements MediaPeriod.Callback { @@ -591,7 +591,7 @@ public final class ServerSideInsertedAdsMediaSource extends BaseMediaSource MediaPeriodImpl mediaPeriod = mediaPeriods.get(i); long startTimeInPeriodUs = getMediaPeriodPositionUs( - C.msToUs(mediaLoadData.mediaStartTimeMs), + Util.msToUs(mediaLoadData.mediaStartTimeMs), mediaPeriod.mediaPeriodId, adPlaybackState); long mediaPeriodEndPositionUs = getMediaPeriodEndPositionUs(mediaPeriod, adPlaybackState); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.java index 65567d005b..48ba8da7aa 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideInsertedAdsUtil.java @@ -124,11 +124,12 @@ public final class ServerSideInsertedAdsUtil { if (player.isPlayingAd()) { int adGroupIndex = player.getCurrentAdGroupIndex(); int adIndexInAdGroup = player.getCurrentAdIndexInAdGroup(); - long adPositionUs = C.msToUs(player.getCurrentPosition()); + long adPositionUs = Util.msToUs(player.getCurrentPosition()); return getStreamPositionUsForAd( adPositionUs, adGroupIndex, adIndexInAdGroup, adPlaybackState); } - long periodPositionUs = C.msToUs(player.getCurrentPosition()) - period.getPositionInWindowUs(); + long periodPositionUs = + Util.msToUs(player.getCurrentPosition()) - period.getPositionInWindowUs(); return getStreamPositionUsForContent( periodPositionUs, /* nextAdGroupIndex= */ C.INDEX_UNSET, adPlaybackState); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index a44a0615c4..9df2e489f9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -510,8 +510,8 @@ public class ChunkSampleStream loadable.trackFormat, loadable.trackSelectionReason, loadable.trackSelectionData, - C.usToMs(loadable.startTimeUs), - C.usToMs(loadable.endTimeUs)); + Util.usToMs(loadable.startTimeUs), + Util.usToMs(loadable.endTimeUs)); LoadErrorInfo loadErrorInfo = new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 16801c6bab..62a78ca42e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -277,7 +277,7 @@ public class EventLogger implements AnalyticsListener { for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { String status = getTrackStatusString(trackSelection, trackGroup, trackIndex); String formatSupport = - C.getFormatSupportString( + Util.getFormatSupportString( mappedTrackInfo.getTrackSupport(rendererIndex, groupIndex, trackIndex)); logd( " " @@ -315,7 +315,7 @@ public class EventLogger implements AnalyticsListener { TrackGroup trackGroup = unassociatedTrackGroups.get(groupIndex); for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { String status = getTrackStatusString(false); - String formatSupport = C.getFormatSupportString(C.FORMAT_UNSUPPORTED_TYPE); + String formatSupport = Util.getFormatSupportString(C.FORMAT_UNSUPPORTED_TYPE); logd( " " + status diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/StandaloneMediaClock.java b/library/core/src/main/java/com/google/android/exoplayer2/util/StandaloneMediaClock.java index 4c4d4d114b..46806cb65a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/StandaloneMediaClock.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/StandaloneMediaClock.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.util; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.PlaybackParameters; /** @@ -75,7 +74,7 @@ public final class StandaloneMediaClock implements MediaClock { if (started) { long elapsedSinceBaseMs = clock.elapsedRealtime() - baseElapsedMs; if (playbackParameters.speed == 1f) { - positionUs += C.msToUs(elapsedSinceBaseMs); + positionUs += Util.msToUs(elapsedSinceBaseMs); } else { // Add the media time in microseconds that will elapse in elapsedSinceBaseMs milliseconds of // wallclock time 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 e0e49d478b..b4af6cfb46 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 @@ -50,6 +50,7 @@ import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.TimedValueQueue; import com.google.android.exoplayer2.util.TraceUtil; +import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener.EventDispatcher; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -558,7 +559,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { frameMetadataListener.onVideoFrameAboutToBeRendered( presentationTimeUs, System.nanoTime(), outputFormat, /* mediaFormat= */ null); } - lastRenderTimeUs = C.msToUs(SystemClock.elapsedRealtime() * 1000); + lastRenderTimeUs = Util.msToUs(SystemClock.elapsedRealtime() * 1000); int bufferMode = outputBuffer.mode; boolean renderSurface = bufferMode == C.VIDEO_OUTPUT_MODE_SURFACE_YUV && outputSurface != null; boolean renderYuv = bufferMode == C.VIDEO_OUTPUT_MODE_YUV && outputBufferRenderer != null; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/DefaultLoadControlTest.java b/library/core/src/test/java/com/google/android/exoplayer2/DefaultLoadControlTest.java index 1cebbbd011..f89e7b3f48 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/DefaultLoadControlTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/DefaultLoadControlTest.java @@ -22,6 +22,7 @@ import com.google.android.exoplayer2.DefaultLoadControl.Builder; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.util.Util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,7 +32,7 @@ import org.junit.runner.RunWith; public class DefaultLoadControlTest { private static final float SPEED = 1f; - private static final long MAX_BUFFER_US = C.msToUs(DefaultLoadControl.DEFAULT_MAX_BUFFER_MS); + private static final long MAX_BUFFER_US = Util.msToUs(DefaultLoadControl.DEFAULT_MAX_BUFFER_MS); private static final long MIN_BUFFER_US = MAX_BUFFER_US / 2; private static final int TARGET_BUFFER_BYTES = C.DEFAULT_BUFFER_SEGMENT_SIZE * 2; @@ -64,8 +65,8 @@ public class DefaultLoadControlTest { @Test public void shouldNotContinueLoadingOnceBufferingStopped_untilBelowMinBuffer() { builder.setBufferDurationsMs( - /* minBufferMs= */ (int) C.usToMs(MIN_BUFFER_US), - /* maxBufferMs= */ (int) C.usToMs(MAX_BUFFER_US), + /* minBufferMs= */ (int) Util.usToMs(MIN_BUFFER_US), + /* maxBufferMs= */ (int) Util.usToMs(MAX_BUFFER_US), /* bufferForPlaybackMs= */ 0, /* bufferForPlaybackAfterRebufferMs= */ 0); build(); @@ -88,7 +89,7 @@ public class DefaultLoadControlTest { public void continueLoadingOnceBufferingStopped_andBufferAlmostEmpty_evenIfMinBufferNotReached() { builder.setBufferDurationsMs( /* minBufferMs= */ 0, - /* maxBufferMs= */ (int) C.usToMs(MAX_BUFFER_US), + /* maxBufferMs= */ (int) Util.usToMs(MAX_BUFFER_US), /* bufferForPlaybackMs= */ 0, /* bufferForPlaybackAfterRebufferMs= */ 0); build(); @@ -107,8 +108,8 @@ public class DefaultLoadControlTest { public void shouldContinueLoadingWithTargetBufferBytesReached_untilMinBufferReached() { builder.setPrioritizeTimeOverSizeThresholds(true); builder.setBufferDurationsMs( - /* minBufferMs= */ (int) C.usToMs(MIN_BUFFER_US), - /* maxBufferMs= */ (int) C.usToMs(MAX_BUFFER_US), + /* minBufferMs= */ (int) Util.usToMs(MIN_BUFFER_US), + /* maxBufferMs= */ (int) Util.usToMs(MAX_BUFFER_US), /* bufferForPlaybackMs= */ 0, /* bufferForPlaybackAfterRebufferMs= */ 0); build(); @@ -158,8 +159,8 @@ public class DefaultLoadControlTest { @Test public void shouldContinueLoadingWithMinBufferReached_inFastPlayback() { builder.setBufferDurationsMs( - /* minBufferMs= */ (int) C.usToMs(MIN_BUFFER_US), - /* maxBufferMs= */ (int) C.usToMs(MAX_BUFFER_US), + /* minBufferMs= */ (int) Util.usToMs(MIN_BUFFER_US), + /* maxBufferMs= */ (int) Util.usToMs(MAX_BUFFER_US), /* bufferForPlaybackMs= */ 0, /* bufferForPlaybackAfterRebufferMs= */ 0); build(); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java b/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java index 9be4c76e62..38c41b5d68 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/DefaultMediaClockTest.java @@ -25,6 +25,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.DefaultMediaClock.PlaybackParametersListener; import com.google.android.exoplayer2.testutil.FakeClock; import com.google.android.exoplayer2.testutil.FakeMediaClockRenderer; +import com.google.android.exoplayer2.util.Util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -263,7 +264,7 @@ public class DefaultMediaClockTest { mediaClock.onRendererDisabled(mediaClockRenderer); fakeClock.advanceTime(SLEEP_TIME_MS); assertThat(mediaClock.syncAndGetPositionUs(/* isReadingAhead= */ false)) - .isEqualTo(TEST_POSITION_US + C.msToUs(SLEEP_TIME_MS)); + .isEqualTo(TEST_POSITION_US + Util.msToUs(SLEEP_TIME_MS)); assertClockIsRunning(/* isReadingAhead= */ false); } @@ -329,7 +330,7 @@ public class DefaultMediaClockTest { mediaClockRenderer.positionUs = TEST_POSITION_US; mediaClock.onRendererDisabled(mediaClockRenderer); assertThat(mediaClock.syncAndGetPositionUs(/* isReadingAhead= */ false)) - .isEqualTo(C.msToUs(fakeClock.elapsedRealtime())); + .isEqualTo(Util.msToUs(fakeClock.elapsedRealtime())); } @Test diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 07f61f4e5e..64044b2a3f 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -145,6 +145,7 @@ import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Range; @@ -2765,7 +2766,7 @@ public final class ExoPlayerTest { // Ensure next period is pre-buffered by playing until end of first period. .playUntilPosition( /* windowIndex= */ 0, - /* positionMs= */ C.usToMs(TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US)) + /* positionMs= */ Util.usToMs(TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US)) .executeRunnable(() -> mediaSource.setNewSourceInfo(timeline2)) .waitForTimelineChanged( timeline2, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) @@ -2857,7 +2858,7 @@ public final class ExoPlayerTest { /* adsPerAdGroup= */ 1, /* adGroupTimesUs...= */ TimelineWindowDefinition .DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US - + C.msToUs(adGroupWindowTimeMs)); + + Util.msToUs(adGroupWindowTimeMs)); Timeline timeline = new FakeTimeline( new TimelineWindowDefinition( @@ -2865,7 +2866,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(contentDurationMs), + /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); AtomicBoolean hasCreatedAdMediaPeriod = new AtomicBoolean(); FakeMediaSource mediaSource = @@ -3268,7 +3269,7 @@ public final class ExoPlayerTest { assertThat(positionAtDiscontinuityMs.get()).isAtLeast(0L); assertThat(clockAtDiscontinuityMs.get() - clockAtStartMs.get()) - .isAtLeast(C.usToMs(expectedDurationUs)); + .isAtLeast(Util.usToMs(expectedDurationUs)); } @Test @@ -3487,7 +3488,8 @@ public final class ExoPlayerTest { .start() .blockUntilEnded(TIMEOUT_MS); - assertThat(bufferedPositionAtFirstDiscontinuityMs.get()).isEqualTo(C.usToMs(windowDurationUs)); + assertThat(bufferedPositionAtFirstDiscontinuityMs.get()) + .isEqualTo(Util.usToMs(windowDurationUs)); } @Test @@ -4603,7 +4605,7 @@ public final class ExoPlayerTest { ImmutableList.of( oneByteSample(windowOffsetInFirstPeriodUs, C.BUFFER_FLAG_KEY_FRAME), oneByteSample( - windowOffsetInFirstPeriodUs + C.msToUs(maxBufferedPositionMs), + windowOffsetInFirstPeriodUs + Util.msToUs(maxBufferedPositionMs), C.BUFFER_FLAG_KEY_FRAME)), mediaSourceEventDispatcher, drmSessionManager, @@ -4623,7 +4625,7 @@ public final class ExoPlayerTest { adPlaybackState = adPlaybackState.withAdUri(/* adGroupIndex= */ 0, /* adIndexInAdGroup= */ 0, Uri.EMPTY); long[][] durationsUs = new long[1][]; - durationsUs[0] = new long[] {C.msToUs(adDurationMs)}; + durationsUs[0] = new long[] {Util.msToUs(adDurationMs)}; adPlaybackState = adPlaybackState.withAdDurationsUs(durationsUs); Timeline adTimeline = new FakeTimeline( @@ -4632,7 +4634,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(contentDurationMs), + /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); int[] windowIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4724,7 +4726,7 @@ public final class ExoPlayerTest { adPlaybackState = adPlaybackState.withAdUri(/* adGroupIndex= */ 0, /* adIndexInAdGroup= */ 0, Uri.EMPTY); long[][] durationsUs = new long[1][]; - durationsUs[0] = new long[] {C.msToUs(adDurationMs)}; + durationsUs[0] = new long[] {Util.msToUs(adDurationMs)}; adPlaybackState = adPlaybackState.withAdDurationsUs(durationsUs); Timeline adTimeline = new FakeTimeline( @@ -4733,7 +4735,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(contentDurationMs), + /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); int[] windowIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4805,7 +4807,7 @@ public final class ExoPlayerTest { .withAdCount(/* adGroupIndex= */ 0, /* adCount= */ 1) .withAdUri(/* adGroupIndex= */ 0, /* adIndexInAdGroup= */ 0, Uri.EMPTY); long[][] durationsUs = new long[1][]; - durationsUs[0] = new long[] {C.msToUs(adDurationMs)}; + durationsUs[0] = new long[] {Util.msToUs(adDurationMs)}; adPlaybackState = adPlaybackState.withAdDurationsUs(durationsUs); Timeline adTimeline = new FakeTimeline( @@ -4814,7 +4816,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(contentDurationMs), + /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); @@ -5037,7 +5039,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000), + /* durationUs= */ Util.msToUs(10000), adPlaybackState)); // Simulate the second ad not being prepared. FakeMediaSource mediaSource = @@ -5078,14 +5080,14 @@ public final class ExoPlayerTest { /* id= */ 1, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); TimelineWindowDefinition secondWindowDefinition = new TimelineWindowDefinition( /* periodCount= */ 1, /* id= */ 2, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); Timeline timeline1 = new FakeTimeline(firstWindowDefinition); Timeline timeline2 = new FakeTimeline(secondWindowDefinition); MediaSource mediaSource1 = new FakeMediaSource(timeline1); @@ -5128,21 +5130,21 @@ public final class ExoPlayerTest { /* id= */ 1, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); TimelineWindowDefinition secondWindowDefinition = new TimelineWindowDefinition( /* periodCount= */ 1, /* id= */ 2, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); TimelineWindowDefinition thirdWindowDefinition = new TimelineWindowDefinition( /* periodCount= */ 1, /* id= */ 3, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); Timeline timeline1 = new FakeTimeline(firstWindowDefinition); Timeline timeline2 = new FakeTimeline(secondWindowDefinition); Timeline timeline3 = new FakeTimeline(thirdWindowDefinition); @@ -5188,21 +5190,21 @@ public final class ExoPlayerTest { /* id= */ 1, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); TimelineWindowDefinition secondWindowDefinition = new TimelineWindowDefinition( /* periodCount= */ 1, /* id= */ 2, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); TimelineWindowDefinition thirdWindowDefinition = new TimelineWindowDefinition( /* periodCount= */ 1, /* id= */ 3, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10000)); + /* durationUs= */ Util.msToUs(10000)); Timeline timeline1 = new FakeTimeline(firstWindowDefinition); Timeline timeline2 = new FakeTimeline(secondWindowDefinition); Timeline timeline3 = new FakeTimeline(thirdWindowDefinition); @@ -8354,7 +8356,7 @@ public final class ExoPlayerTest { new AdPlaybackState(/* adsId= */ new Object(), /* adGroupTimesUs...= */ 0) .withAdCount(/* adGroupIndex= */ 0, /* adCount= */ 1) .withAdUri(/* adGroupIndex= */ 0, /* adIndexInAdGroup= */ 0, Uri.EMPTY) - .withAdDurationsUs(/* adDurationUs= */ new long[][] {{C.msToUs(4_000)}}); + .withAdDurationsUs(/* adDurationUs= */ new long[][] {{Util.msToUs(4_000)}}); Timeline adTimeline = new FakeTimeline( new TimelineWindowDefinition( @@ -8362,7 +8364,7 @@ public final class ExoPlayerTest { /* id= */ 0, /* isSeekable= */ true, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10_000), + /* durationUs= */ Util.msToUs(10_000), adPlaybackState)); ExoPlayer player = new TestExoPlayerBuilder(context).build(); @@ -8391,7 +8393,7 @@ public final class ExoPlayerTest { new TimelineWindowDefinition( /* isSeekable= */ false, /* isDynamic= */ false, - /* durationUs= */ C.msToUs(10_000))); + /* durationUs= */ Util.msToUs(10_000))); ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addMediaSource(new FakeMediaSource(timelineWithUnseekableWindow)); @@ -9107,7 +9109,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9156,7 +9158,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9201,7 +9203,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9248,7 +9250,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9266,7 +9268,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs + 50_000), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs + 50_000), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9330,7 +9332,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 20 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9383,7 +9385,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9427,7 +9429,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9445,7 +9447,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9493,7 +9495,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9511,7 +9513,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder() .setUri(Uri.EMPTY) @@ -9599,7 +9601,7 @@ public final class ExoPlayerTest { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 8 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(windowStartUnixTimeMs), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(windowStartUnixTimeMs), AdPlaybackState.NONE, new MediaItem.Builder().setUri(Uri.EMPTY).build())); player.pause(); @@ -10808,7 +10810,7 @@ public final class ExoPlayerTest { new TimelineWindowDefinition( /* isSeekable= */ true, /* isDynamic= */ true, - /* durationUs= */ C.msToUs(3 * C.DEFAULT_SEEK_BACK_INCREMENT_MS))); + /* durationUs= */ Util.msToUs(3 * C.DEFAULT_SEEK_BACK_INCREMENT_MS))); player.setMediaSource(new FakeMediaSource(fakeTimeline)); player.prepare(); @@ -10855,7 +10857,7 @@ public final class ExoPlayerTest { new TimelineWindowDefinition( /* isSeekable= */ true, /* isDynamic= */ true, - /* durationUs= */ C.msToUs(C.DEFAULT_SEEK_BACK_INCREMENT_MS))); + /* durationUs= */ Util.msToUs(C.DEFAULT_SEEK_BACK_INCREMENT_MS))); player.setMediaSource(new FakeMediaSource(fakeTimeline)); player.prepare(); @@ -10878,7 +10880,7 @@ public final class ExoPlayerTest { new TimelineWindowDefinition( /* isSeekable= */ true, /* isDynamic= */ true, - /* durationUs= */ C.msToUs(2 * C.DEFAULT_SEEK_FORWARD_INCREMENT_MS))); + /* durationUs= */ Util.msToUs(2 * C.DEFAULT_SEEK_FORWARD_INCREMENT_MS))); player.setMediaSource(new FakeMediaSource(fakeTimeline)); player.prepare(); @@ -10915,7 +10917,7 @@ public final class ExoPlayerTest { new TimelineWindowDefinition( /* isSeekable= */ true, /* isDynamic= */ true, - /* durationUs= */ C.msToUs(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS / 2))); + /* durationUs= */ Util.msToUs(C.DEFAULT_SEEK_FORWARD_INCREMENT_MS / 2))); player.setMediaSource(new FakeMediaSource(fakeTimeline)); player.prepare(); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index af0ee0ef22..327cbb308f 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -907,7 +907,7 @@ public final class DashMediaSource extends BaseMediaSource { int lastPeriodIndex = manifest.getPeriodCount() - 1; Period lastPeriod = manifest.getPeriod(lastPeriodIndex); long lastPeriodDurationUs = manifest.getPeriodDurationUs(lastPeriodIndex); - long nowUnixTimeUs = C.msToUs(Util.getNowUnixTimeMs(elapsedRealtimeOffsetMs)); + long nowUnixTimeUs = Util.msToUs(Util.getNowUnixTimeMs(elapsedRealtimeOffsetMs)); long windowStartTimeInManifestUs = getAvailableStartTimeInManifestUs( firstPeriod, manifest.getPeriodDurationUs(0), nowUnixTimeUs); @@ -917,7 +917,7 @@ public final class DashMediaSource extends BaseMediaSource { if (windowChangingImplicitly && manifest.timeShiftBufferDepthMs != C.TIME_UNSET) { // Update the available start time to reflect the manifest's time shift buffer depth. long timeShiftBufferStartTimeInManifestUs = - windowEndTimeInManifestUs - C.msToUs(manifest.timeShiftBufferDepthMs); + windowEndTimeInManifestUs - Util.msToUs(manifest.timeShiftBufferDepthMs); windowStartTimeInManifestUs = max(windowStartTimeInManifestUs, timeShiftBufferStartTimeInManifestUs); } @@ -927,11 +927,13 @@ public final class DashMediaSource extends BaseMediaSource { if (manifest.dynamic) { checkState(manifest.availabilityStartTimeMs != C.TIME_UNSET); long nowInWindowUs = - nowUnixTimeUs - C.msToUs(manifest.availabilityStartTimeMs) - windowStartTimeInManifestUs; + nowUnixTimeUs + - Util.msToUs(manifest.availabilityStartTimeMs) + - windowStartTimeInManifestUs; updateMediaItemLiveConfiguration(nowInWindowUs, windowDurationUs); windowStartUnixTimeMs = - manifest.availabilityStartTimeMs + C.usToMs(windowStartTimeInManifestUs); - windowDefaultPositionUs = nowInWindowUs - C.msToUs(liveConfiguration.targetOffsetMs); + manifest.availabilityStartTimeMs + Util.usToMs(windowStartTimeInManifestUs); + windowDefaultPositionUs = nowInWindowUs - Util.msToUs(liveConfiguration.targetOffsetMs); long minimumWindowDefaultPositionUs = min(MIN_LIVE_DEFAULT_START_POSITION_US, windowDurationUs / 2); if (windowDefaultPositionUs < minimumWindowDefaultPositionUs) { @@ -941,7 +943,7 @@ public final class DashMediaSource extends BaseMediaSource { windowDefaultPositionUs = minimumWindowDefaultPositionUs; } } - long offsetInFirstPeriodUs = windowStartTimeInManifestUs - C.msToUs(firstPeriod.startMs); + long offsetInFirstPeriodUs = windowStartTimeInManifestUs - Util.msToUs(firstPeriod.startMs); DashTimeline timeline = new DashTimeline( manifest.availabilityStartTimeMs, @@ -995,7 +997,7 @@ public final class DashMediaSource extends BaseMediaSource { && manifest.serviceDescription.maxOffsetMs != C.TIME_UNSET) { maxLiveOffsetMs = manifest.serviceDescription.maxOffsetMs; } else { - maxLiveOffsetMs = C.usToMs(nowInWindowUs); + maxLiveOffsetMs = Util.usToMs(nowInWindowUs); } long minLiveOffsetMs; if (mediaItem.liveConfiguration.minOffsetMs != C.TIME_UNSET) { @@ -1004,7 +1006,7 @@ public final class DashMediaSource extends BaseMediaSource { && manifest.serviceDescription.minOffsetMs != C.TIME_UNSET) { minLiveOffsetMs = manifest.serviceDescription.minOffsetMs; } else { - minLiveOffsetMs = C.usToMs(nowInWindowUs - windowDurationUs); + minLiveOffsetMs = Util.usToMs(nowInWindowUs - windowDurationUs); if (minLiveOffsetMs < 0 && maxLiveOffsetMs > 0) { // The current time is in the window, so assume all clocks are synchronized and set the // minimum to a live offset of zero. @@ -1033,7 +1035,7 @@ public final class DashMediaSource extends BaseMediaSource { long safeDistanceFromWindowStartUs = min(MIN_LIVE_DEFAULT_START_POSITION_US, windowDurationUs / 2); long maxTargetOffsetForSafeDistanceToWindowStartMs = - C.usToMs(nowInWindowUs - safeDistanceFromWindowStartUs); + Util.usToMs(nowInWindowUs - safeDistanceFromWindowStartUs); targetOffsetMs = Util.constrainValue( maxTargetOffsetForSafeDistanceToWindowStartMs, minLiveOffsetMs, maxLiveOffsetMs); @@ -1097,11 +1099,11 @@ public final class DashMediaSource extends BaseMediaSource { DashManifest manifest, long nowUnixTimeMs) { int periodIndex = manifest.getPeriodCount() - 1; Period period = manifest.getPeriod(periodIndex); - long periodStartUs = C.msToUs(period.startMs); + long periodStartUs = Util.msToUs(period.startMs); long periodDurationUs = manifest.getPeriodDurationUs(periodIndex); - long nowUnixTimeUs = C.msToUs(nowUnixTimeMs); - long availabilityStartTimeUs = C.msToUs(manifest.availabilityStartTimeMs); - long intervalUs = C.msToUs(DEFAULT_NOTIFY_MANIFEST_INTERVAL_MS); + long nowUnixTimeUs = Util.msToUs(nowUnixTimeMs); + long availabilityStartTimeUs = Util.msToUs(manifest.availabilityStartTimeMs); + long intervalUs = Util.msToUs(DEFAULT_NOTIFY_MANIFEST_INTERVAL_MS); for (int i = 0; i < period.adaptationSets.size(); i++) { List representations = period.adaptationSets.get(i).representations; if (representations.isEmpty()) { @@ -1127,7 +1129,7 @@ public final class DashMediaSource extends BaseMediaSource { private static long getAvailableStartTimeInManifestUs( Period period, long periodDurationUs, long nowUnixTimeUs) { - long periodStartTimeInManifestUs = C.msToUs(period.startMs); + long periodStartTimeInManifestUs = Util.msToUs(period.startMs); long availableStartTimeInManifestUs = periodStartTimeInManifestUs; boolean haveAudioVideoAdaptationSets = hasVideoOrAudioAdaptationSets(period); for (int i = 0; i < period.adaptationSets.size(); i++) { @@ -1159,7 +1161,7 @@ public final class DashMediaSource extends BaseMediaSource { private static long getAvailableEndTimeInManifestUs( Period period, long periodDurationUs, long nowUnixTimeUs) { - long periodStartTimeInManifestUs = C.msToUs(period.startMs); + long periodStartTimeInManifestUs = Util.msToUs(period.startMs); long availableEndTimeInManifestUs = Long.MAX_VALUE; boolean haveAudioVideoAdaptationSets = hasVideoOrAudioAdaptationSets(period); for (int i = 0; i < period.adaptationSets.size(); i++) { @@ -1266,7 +1268,7 @@ public final class DashMediaSource extends BaseMediaSource { uid, 0, manifest.getPeriodDurationUs(periodIndex), - C.msToUs(manifest.getPeriod(periodIndex).startMs - manifest.getPeriod(0).startMs) + Util.msToUs(manifest.getPeriod(periodIndex).startMs - manifest.getPeriod(0).startMs) - offsetInFirstPeriodUs); } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index 234c0f4dfd..3d850161df 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -305,8 +305,8 @@ public class DefaultDashChunkSource implements DashChunkSource { long bufferedDurationUs = loadPositionUs - playbackPositionUs; long presentationPositionUs = - C.msToUs(manifest.availabilityStartTimeMs) - + C.msToUs(manifest.getPeriod(periodIndex).startMs) + Util.msToUs(manifest.availabilityStartTimeMs) + + Util.msToUs(manifest.getPeriod(periodIndex).startMs) + loadPositionUs; if (playerTrackEmsgHandler != null @@ -315,7 +315,7 @@ public class DefaultDashChunkSource implements DashChunkSource { return; } - long nowUnixTimeUs = C.msToUs(Util.getNowUnixTimeMs(elapsedRealtimeOffsetMs)); + long nowUnixTimeUs = Util.msToUs(Util.getNowUnixTimeMs(elapsedRealtimeOffsetMs)); long nowPeriodTimeUs = getNowPeriodTimeUs(nowUnixTimeUs); MediaChunk previous = queue.isEmpty() ? null : queue.get(queue.size() - 1); MediaChunkIterator[] chunkIterators = new MediaChunkIterator[trackSelection.length()]; @@ -600,7 +600,8 @@ public class DefaultDashChunkSource implements DashChunkSource { return manifest.availabilityStartTimeMs == C.TIME_UNSET ? C.TIME_UNSET : nowUnixTimeUs - - C.msToUs(manifest.availabilityStartTimeMs + manifest.getPeriod(periodIndex).startMs); + - Util.msToUs( + manifest.availabilityStartTimeMs + manifest.getPeriod(periodIndex).startMs); } protected Chunk newInitializationChunk( diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java index c0d8a36e9d..6bdbb0d6b0 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java @@ -20,6 +20,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.offline.FilterableManifest; import com.google.android.exoplayer2.offline.StreamKey; +import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; @@ -132,7 +133,7 @@ public class DashManifest implements FilterableManifest { } public final long getPeriodDurationUs(int index) { - return C.msToUs(getPeriodDurationMs(index)); + return Util.msToUs(getPeriodDurationMs(index)); } @Override diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index 91bf3b2eca..d997187a9d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -967,8 +967,8 @@ public class DashManifestParser extends DefaultHandler timeline, availabilityTimeOffsetUs, segments, - C.msToUs(timeShiftBufferDepthMs), - C.msToUs(periodStartUnixTimeMs)); + Util.msToUs(timeShiftBufferDepthMs), + Util.msToUs(periodStartUnixTimeMs)); } protected SegmentTemplate parseSegmentTemplate( @@ -1057,8 +1057,8 @@ public class DashManifestParser extends DefaultHandler availabilityTimeOffsetUs, initializationTemplate, mediaTemplate, - C.msToUs(timeShiftBufferDepthMs), - C.msToUs(periodStartUnixTimeMs)); + Util.msToUs(timeShiftBufferDepthMs), + Util.msToUs(periodStartUnixTimeMs)); } /** diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java index 5bc557761d..f397b5c2be 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.source.dash.offline; import static com.google.android.exoplayer2.util.Util.castNonNull; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.offline.DownloadException; @@ -38,6 +37,7 @@ import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.ParsingLoadable.Parser; import com.google.android.exoplayer2.upstream.cache.CacheDataSource; import com.google.android.exoplayer2.util.RunnableFutureTask; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -128,7 +128,7 @@ public final class DashDownloader extends SegmentDownloader { ArrayList segments = new ArrayList<>(); for (int i = 0; i < manifest.getPeriodCount(); i++) { Period period = manifest.getPeriod(i); - long periodStartUs = C.msToUs(period.startMs); + long periodStartUs = Util.msToUs(period.startMs); long periodDurationUs = manifest.getPeriodDurationUs(i); List adaptationSets = period.adaptationSets; for (int j = 0; j < adaptationSets.size(); j++) { diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java index 88e8b3f84c..7343c07bff 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSourceTest.java @@ -45,6 +45,7 @@ import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; @@ -96,7 +97,7 @@ public class DefaultDashChunkSourceTest { /* closedCaptionFormats */ ImmutableList.of(), /* playerTrackEmsgHandler= */ null); - long nowInPeriodUs = C.msToUs(nowMs - manifest.availabilityStartTimeMs); + long nowInPeriodUs = Util.msToUs(nowMs - manifest.availabilityStartTimeMs); ChunkHolder output = new ChunkHolder(); chunkSource.getNextChunk( diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/MlltSeeker.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/MlltSeeker.java index f30b830249..2204cfccd7 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/MlltSeeker.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/MlltSeeker.java @@ -62,7 +62,7 @@ import com.google.android.exoplayer2.util.Util; this.durationUs = durationUs != C.TIME_UNSET ? durationUs - : C.msToUs(referenceTimesMs[referenceTimesMs.length - 1]); + : Util.msToUs(referenceTimesMs[referenceTimesMs.length - 1]); } @Override @@ -74,8 +74,8 @@ import com.google.android.exoplayer2.util.Util; public SeekPoints getSeekPoints(long timeUs) { timeUs = Util.constrainValue(timeUs, 0, durationUs); Pair timeMsAndPosition = - linearlyInterpolate(C.usToMs(timeUs), referenceTimesMs, referencePositions); - timeUs = C.msToUs(timeMsAndPosition.first); + linearlyInterpolate(Util.usToMs(timeUs), referenceTimesMs, referencePositions); + timeUs = Util.msToUs(timeMsAndPosition.first); long position = timeMsAndPosition.second; return new SeekPoints(new SeekPoint(timeUs, position)); } @@ -84,7 +84,7 @@ import com.google.android.exoplayer2.util.Util; public long getTimeUs(long position) { Pair positionAndTimeMs = linearlyInterpolate(position, referencePositions, referenceTimesMs); - return C.msToUs(positionAndTimeMs.second); + return Util.msToUs(positionAndTimeMs.second); } @Override diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java index 4e22637144..d70b6c2f90 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java @@ -586,7 +586,7 @@ public final class Mp3Extractor implements Extractor { Metadata.Entry entry = metadata.get(i); if (entry instanceof TextInformationFrame && ((TextInformationFrame) entry).id.equals("TLEN")) { - return C.msToUs(Long.parseLong(((TextInformationFrame) entry).value)); + return Util.msToUs(Long.parseLong(((TextInformationFrame) entry).value)); } } } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 45c16bb8c9..56ebfb5762 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -508,7 +508,7 @@ public final class HlsMediaSource extends BaseMediaSource @Override public void onPrimaryPlaylistRefreshed(HlsMediaPlaylist mediaPlaylist) { long windowStartTimeMs = - mediaPlaylist.hasProgramDateTime ? C.usToMs(mediaPlaylist.startTimeUs) : C.TIME_UNSET; + mediaPlaylist.hasProgramDateTime ? Util.usToMs(mediaPlaylist.startTimeUs) : C.TIME_UNSET; // For playlist types EVENT and VOD we know segments are never removed, so the presentation // started at the same time as the window. Otherwise, we don't know the presentation start time. long presentationStartTimeMs = @@ -541,7 +541,7 @@ public final class HlsMediaSource extends BaseMediaSource long targetLiveOffsetUs; if (liveConfiguration.targetOffsetMs != C.TIME_UNSET) { // Media item has a defined target offset. - targetLiveOffsetUs = C.msToUs(liveConfiguration.targetOffsetMs); + targetLiveOffsetUs = Util.msToUs(liveConfiguration.targetOffsetMs); } else { // Decide target offset from playlist. targetLiveOffsetUs = getTargetLiveOffsetUs(playlist, liveEdgeOffsetUs); @@ -607,7 +607,7 @@ public final class HlsMediaSource extends BaseMediaSource private long getLiveEdgeOffsetUs(HlsMediaPlaylist playlist) { return playlist.hasProgramDateTime - ? C.msToUs(Util.getNowUnixTimeMs(elapsedRealTimeOffsetMs)) - playlist.getEndTimeUs() + ? Util.msToUs(Util.getNowUnixTimeMs(elapsedRealTimeOffsetMs)) - playlist.getEndTimeUs() : 0; } @@ -616,7 +616,9 @@ public final class HlsMediaSource extends BaseMediaSource long startPositionUs = playlist.startOffsetUs != C.TIME_UNSET ? playlist.startOffsetUs - : playlist.durationUs + liveEdgeOffsetUs - C.msToUs(liveConfiguration.targetOffsetMs); + : playlist.durationUs + + liveEdgeOffsetUs + - Util.msToUs(liveConfiguration.targetOffsetMs); if (playlist.preciseStart) { return startPositionUs; } @@ -639,7 +641,7 @@ public final class HlsMediaSource extends BaseMediaSource } private void maybeUpdateLiveConfiguration(long targetLiveOffsetUs) { - long targetLiveOffsetMs = C.usToMs(targetLiveOffsetUs); + long targetLiveOffsetMs = Util.usToMs(targetLiveOffsetUs); if (targetLiveOffsetMs != liveConfiguration.targetOffsetMs) { liveConfiguration = liveConfiguration.buildUpon().setTargetOffsetMs(targetLiveOffsetMs).build(); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index ca72c5516d..da4fbad97d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -916,8 +916,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackFormat, loadable.trackSelectionReason, loadable.trackSelectionData, - C.usToMs(loadable.startTimeUs), - C.usToMs(loadable.endTimeUs)); + Util.usToMs(loadable.startTimeUs), + Util.usToMs(loadable.endTimeUs)); LoadErrorInfo loadErrorInfo = new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); LoadErrorAction loadErrorAction; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/UnexpectedSampleTimestampException.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/UnexpectedSampleTimestampException.java index 50a11170a3..331af0fa7d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/UnexpectedSampleTimestampException.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/UnexpectedSampleTimestampException.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source.hls; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.chunk.MediaChunk; +import com.google.android.exoplayer2.util.Util; import java.io.IOException; /** @@ -52,7 +53,7 @@ import java.io.IOException; MediaChunk mediaChunk, long lastAcceptedSampleTimeUs, long rejectedSampleTimeUs) { super( "Unexpected sample timestamp: " - + C.usToMs(rejectedSampleTimeUs) + + Util.usToMs(rejectedSampleTimeUs) + " in chunk [" + mediaChunk.startTimeUs + ", " diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java index 0558105100..68d300966e 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java @@ -536,7 +536,7 @@ public final class DefaultHlsPlaylistTracker return false; } long currentTimeMs = SystemClock.elapsedRealtime(); - long snapshotValidityDurationMs = max(30000, C.usToMs(playlistSnapshot.durationUs)); + long snapshotValidityDurationMs = max(30000, Util.usToMs(playlistSnapshot.durationUs)); return playlistSnapshot.hasEndTag || playlistSnapshot.playlistType == HlsMediaPlaylist.PLAYLIST_TYPE_EVENT || playlistSnapshot.playlistType == HlsMediaPlaylist.PLAYLIST_TYPE_VOD @@ -726,7 +726,7 @@ public final class DefaultHlsPlaylistTracker forceRetry = true; playlistError = new PlaylistResetException(playlistUrl); } else if (currentTimeMs - lastSnapshotChangeMs - > C.usToMs(playlistSnapshot.targetDurationUs) + > Util.usToMs(playlistSnapshot.targetDurationUs) * playlistStuckTargetDurationCoefficient) { // TODO: Allow customization of stuck playlists handling. playlistError = new PlaylistStuckException(playlistUrl); @@ -752,7 +752,7 @@ public final class DefaultHlsPlaylistTracker ? playlistSnapshot.targetDurationUs : (playlistSnapshot.targetDurationUs / 2); } - earliestNextLoadTimeMs = currentTimeMs + C.usToMs(durationUntilNextLoadUs); + earliestNextLoadTimeMs = currentTimeMs + Util.usToMs(durationUntilNextLoadUs); // Schedule a load if this is the primary playlist or a playlist of a low-latency stream and // it doesn't have an end tag. Else the next load will be scheduled when refreshPlaylist is // called, or when this playlist becomes the primary. diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index ac8bf1e5a8..250ee72754 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -844,7 +844,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser { - timelineDurationUs = C.msToUs(timing.getDurationMs()); + timelineDurationUs = Util.msToUs(timing.getDurationMs()); timelineIsSeekable = !timing.isLive(); timelineIsLive = timing.isLive(); timelineIsPlaceholder = false; diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index aabe71ce73..fd2f3a49fe 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -604,7 +604,7 @@ public final class SsMediaSource extends BaseMediaSource startTimeUs = max(startTimeUs, endTimeUs - manifest.dvrWindowLengthUs); } long durationUs = endTimeUs - startTimeUs; - long defaultStartPositionUs = durationUs - C.msToUs(livePresentationDelayMs); + long defaultStartPositionUs = durationUs - Util.msToUs(livePresentationDelayMs); if (defaultStartPositionUs < MIN_LIVE_DEFAULT_START_POSITION_US) { // The default start position is too close to the start of the live window. Set it to the // minimum default start position provided the window is at least twice as big. Else set diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java index e8a217f645..76e74efa95 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MuxerWrapper.java @@ -26,6 +26,7 @@ import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; import java.nio.ByteBuffer; /** @@ -42,7 +43,7 @@ import java.nio.ByteBuffer; *

                  The value of this constant has been chosen based on the interleaving observed in a few media * files, where continuous chunks of the same track were about 0.5 seconds long. */ - private static final long MAX_TRACK_WRITE_AHEAD_US = C.msToUs(500); + private static final long MAX_TRACK_WRITE_AHEAD_US = Util.msToUs(500); private final Muxer muxer; private final Muxer.Factory muxerFactory; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SefSlowMotionVideoSampleTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SefSlowMotionVideoSampleTransformer.java index a232d82a52..db90f38094 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SefSlowMotionVideoSampleTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SefSlowMotionVideoSampleTransformer.java @@ -31,6 +31,7 @@ import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData; import com.google.android.exoplayer2.metadata.mp4.SmtaMetadataEntry; import com.google.android.exoplayer2.util.MimeTypes; +import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import java.nio.ByteBuffer; import java.util.Arrays; @@ -366,8 +367,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; public final int maxLayer; public SegmentInfo(SlowMotionData.Segment segment, int inputMaxLayer, int normalSpeedLayer) { - this.startTimeUs = C.msToUs(segment.startTimeMs); - this.endTimeUs = C.msToUs(segment.endTimeMs); + this.startTimeUs = Util.msToUs(segment.startTimeMs); + this.endTimeUs = Util.msToUs(segment.endTimeMs); this.speedDivisor = segment.speedDivisor; this.maxLayer = getSlowMotionMaxLayer(speedDivisor, inputMaxLayer, normalSpeedLayer); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SegmentSpeedProvider.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SegmentSpeedProvider.java index 2320367076..91a6d49da6 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SegmentSpeedProvider.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/SegmentSpeedProvider.java @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData; import com.google.android.exoplayer2.metadata.mp4.SlowMotionData.Segment; import com.google.android.exoplayer2.metadata.mp4.SmtaMetadataEntry; +import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedMap; import java.util.ArrayList; @@ -72,7 +73,7 @@ import java.util.TreeMap; for (int i = 0; i < segments.size(); i++) { Segment currentSegment = segments.get(i); speedsByStartTimeUs.put( - C.msToUs(currentSegment.startTimeMs), baseSpeed / currentSegment.speedDivisor); + Util.msToUs(currentSegment.startTimeMs), baseSpeed / currentSegment.speedDivisor); } // If the map has an entry at endTime, this is the next segments start time. If no such entry @@ -80,8 +81,8 @@ import java.util.TreeMap; // segment. for (int i = 0; i < segments.size(); i++) { Segment currentSegment = segments.get(i); - if (!speedsByStartTimeUs.containsKey(C.msToUs(currentSegment.endTimeMs))) { - speedsByStartTimeUs.put(C.msToUs(currentSegment.endTimeMs), baseSpeed); + if (!speedsByStartTimeUs.containsKey(Util.msToUs(currentSegment.endTimeMs))) { + speedsByStartTimeUs.put(Util.msToUs(currentSegment.endTimeMs), baseSpeed); } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 824b44e1f3..6adfe54b4f 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -955,7 +955,7 @@ public class PlayerControlView extends FrameLayout { int lastWindowIndex = multiWindowTimeBar ? timeline.getWindowCount() - 1 : currentWindowIndex; for (int i = firstWindowIndex; i <= lastWindowIndex; i++) { if (i == currentWindowIndex) { - currentWindowOffset = C.usToMs(durationUs); + currentWindowOffset = Util.usToMs(durationUs); } timeline.getWindow(i, window); if (window.durationUs == C.TIME_UNSET) { @@ -982,7 +982,7 @@ public class PlayerControlView extends FrameLayout { adGroupTimesMs = Arrays.copyOf(adGroupTimesMs, newLength); playedAdGroups = Arrays.copyOf(playedAdGroups, newLength); } - adGroupTimesMs[adGroupCount] = C.usToMs(durationUs + adGroupTimeInWindowUs); + adGroupTimesMs[adGroupCount] = Util.usToMs(durationUs + adGroupTimeInWindowUs); playedAdGroups[adGroupCount] = period.hasPlayedAdGroup(adGroupIndex); adGroupCount++; } @@ -991,7 +991,7 @@ public class PlayerControlView extends FrameLayout { durationUs += window.durationUs; } } - long durationMs = C.usToMs(durationUs); + long durationMs = Util.usToMs(durationUs); if (durationView != null) { durationView.setText(Util.getStringForTime(formatBuilder, formatter, durationMs)); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 30ca26f4f9..279e907476 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -1274,7 +1274,7 @@ public class StyledPlayerControlView extends FrameLayout { int lastWindowIndex = multiWindowTimeBar ? timeline.getWindowCount() - 1 : currentWindowIndex; for (int i = firstWindowIndex; i <= lastWindowIndex; i++) { if (i == currentWindowIndex) { - currentWindowOffset = C.usToMs(durationUs); + currentWindowOffset = Util.usToMs(durationUs); } timeline.getWindow(i, window); if (window.durationUs == C.TIME_UNSET) { @@ -1301,7 +1301,7 @@ public class StyledPlayerControlView extends FrameLayout { adGroupTimesMs = Arrays.copyOf(adGroupTimesMs, newLength); playedAdGroups = Arrays.copyOf(playedAdGroups, newLength); } - adGroupTimesMs[adGroupCount] = C.usToMs(durationUs + adGroupTimeInWindowUs); + adGroupTimesMs[adGroupCount] = Util.usToMs(durationUs + adGroupTimeInWindowUs); playedAdGroups[adGroupCount] = period.hasPlayedAdGroup(adGroupIndex); adGroupCount++; } @@ -1310,7 +1310,7 @@ public class StyledPlayerControlView extends FrameLayout { durationUs += window.durationUs; } } - long durationMs = C.usToMs(durationUs); + long durationMs = Util.usToMs(durationUs); if (durationView != null) { durationView.setText(Util.getStringForTime(formatBuilder, formatter, durationMs)); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java index dc77ccccb6..0be568b2ef 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.source.ads.AdPlaybackState; import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.util.Util; /** Fake {@link MediaSourceFactory} that creates a {@link FakeMediaSource}. */ public class FakeMediaSourceFactory implements MediaSourceFactory { @@ -81,7 +82,7 @@ public class FakeMediaSourceFactory implements MediaSourceFactory { /* isPlaceholder= */ false, /* durationUs= */ 1000 * C.MICROS_PER_SECOND, /* defaultPositionUs= */ 2 * C.MICROS_PER_SECOND, - /* windowOffsetInFirstPeriodUs= */ C.msToUs(123456789), + /* windowOffsetInFirstPeriodUs= */ Util.msToUs(123456789), AdPlaybackState.NONE, mediaItem); return new FakeMediaSource(new FakeTimeline(timelineWindowDefinition)); 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 6bd498e199..720e7d550b 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 @@ -367,7 +367,7 @@ public final class FakeTimeline extends Timeline { manifests[windowIndex], /* presentationStartTimeMs= */ C.TIME_UNSET, /* windowStartTimeMs= */ windowDefinition.isLive - ? C.usToMs(windowDefinition.windowOffsetInFirstPeriodUs) + ? Util.usToMs(windowDefinition.windowOffsetInFirstPeriodUs) : C.TIME_UNSET, /* elapsedRealtimeEpochOffsetMs= */ windowDefinition.isLive ? 0 : C.TIME_UNSET, windowDefinition.isSeekable, From 797518285669fb12657a441e7fd1811a3fbd048d Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 29 Oct 2021 01:30:01 +0100 Subject: [PATCH 401/441] Make package in test manifest consistent PiperOrigin-RevId: 406255369 --- extensions/cronet/src/androidTest/AndroidManifest.xml | 4 ++-- extensions/cronet/src/test/AndroidManifest.xml | 2 +- extensions/ffmpeg/src/test/AndroidManifest.xml | 2 +- extensions/flac/src/test/AndroidManifest.xml | 2 +- extensions/opus/src/test/AndroidManifest.xml | 2 +- extensions/rtmp/src/test/AndroidManifest.xml | 2 +- extensions/vp9/src/test/AndroidManifest.xml | 2 +- library/common/src/test/AndroidManifest.xml | 2 +- library/datasource/src/test/AndroidManifest.xml | 2 +- library/decoder/src/test/AndroidManifest.xml | 2 +- playbacktests/src/androidTest/AndroidManifest.xml | 4 ++-- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/extensions/cronet/src/androidTest/AndroidManifest.xml b/extensions/cronet/src/androidTest/AndroidManifest.xml index 96e8e54f57..5ce815adae 100644 --- a/extensions/cronet/src/androidTest/AndroidManifest.xml +++ b/extensions/cronet/src/androidTest/AndroidManifest.xml @@ -16,7 +16,7 @@ + package="com.google.android.exoplayer2.ext.cronet.test"> @@ -28,7 +28,7 @@ tools:ignore="MissingApplicationIcon,HardcodedDebugMode"/> diff --git a/extensions/cronet/src/test/AndroidManifest.xml b/extensions/cronet/src/test/AndroidManifest.xml index d6e09107a7..ea3f510328 100644 --- a/extensions/cronet/src/test/AndroidManifest.xml +++ b/extensions/cronet/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/extensions/ffmpeg/src/test/AndroidManifest.xml b/extensions/ffmpeg/src/test/AndroidManifest.xml index 6ec1cea289..cb214bc41a 100644 --- a/extensions/ffmpeg/src/test/AndroidManifest.xml +++ b/extensions/ffmpeg/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/extensions/flac/src/test/AndroidManifest.xml b/extensions/flac/src/test/AndroidManifest.xml index 509151aa21..362e3986e3 100644 --- a/extensions/flac/src/test/AndroidManifest.xml +++ b/extensions/flac/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/extensions/opus/src/test/AndroidManifest.xml b/extensions/opus/src/test/AndroidManifest.xml index d17f889d17..b015221785 100644 --- a/extensions/opus/src/test/AndroidManifest.xml +++ b/extensions/opus/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/extensions/rtmp/src/test/AndroidManifest.xml b/extensions/rtmp/src/test/AndroidManifest.xml index b2e19827d9..ff41eda581 100644 --- a/extensions/rtmp/src/test/AndroidManifest.xml +++ b/extensions/rtmp/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/extensions/vp9/src/test/AndroidManifest.xml b/extensions/vp9/src/test/AndroidManifest.xml index 851213e653..08c7e6b6ee 100644 --- a/extensions/vp9/src/test/AndroidManifest.xml +++ b/extensions/vp9/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/library/common/src/test/AndroidManifest.xml b/library/common/src/test/AndroidManifest.xml index 46c19f53c9..a90b358a73 100644 --- a/library/common/src/test/AndroidManifest.xml +++ b/library/common/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/library/datasource/src/test/AndroidManifest.xml b/library/datasource/src/test/AndroidManifest.xml index 173af4332e..869326cce0 100644 --- a/library/datasource/src/test/AndroidManifest.xml +++ b/library/datasource/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/library/decoder/src/test/AndroidManifest.xml b/library/decoder/src/test/AndroidManifest.xml index 66cfd433a3..bcb61fbc63 100644 --- a/library/decoder/src/test/AndroidManifest.xml +++ b/library/decoder/src/test/AndroidManifest.xml @@ -14,6 +14,6 @@ limitations under the License. --> - + diff --git a/playbacktests/src/androidTest/AndroidManifest.xml b/playbacktests/src/androidTest/AndroidManifest.xml index 2c2099496a..5f9b5429f9 100644 --- a/playbacktests/src/androidTest/AndroidManifest.xml +++ b/playbacktests/src/androidTest/AndroidManifest.xml @@ -16,7 +16,7 @@ + package="com.google.android.exoplayer2.playbacktests.test"> @@ -32,7 +32,7 @@ From dacdf5c42d6c8031277be1e52731a0b1e548e2b5 Mon Sep 17 00:00:00 2001 From: bachinger Date: Fri, 29 Oct 2021 12:13:32 +0100 Subject: [PATCH 402/441] Defer setting defaults for rendition reports until playlist is parsed This makes sure that #EXT-X-RENDITION-REPORT tags can be placed before the list of segments/parts as well. We were previously assuming that these come at the end, which naturally would make sense and is done like this in all examples, but it is not explicitly defined by the spec. Issue: google/ExoPlayer#9592 PiperOrigin-RevId: 406329684 --- .../hls/playlist/HlsPlaylistParser.java | 34 +++-- .../playlist/HlsMediaPlaylistParserTest.java | 116 +++++++++++++++++- 2 files changed, 135 insertions(+), 15 deletions(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 250ee72754..863ea198bb 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -645,7 +645,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser segments = new ArrayList<>(); List trailingParts = new ArrayList<>(); @Nullable Part preloadPart = null; - Map renditionReports = new HashMap<>(); + List renditionReports = new ArrayList<>(); List tags = new ArrayList<>(); long segmentDurationUs = 0; @@ -854,17 +854,11 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser lastParts = - trailingParts.isEmpty() ? Iterables.getLast(segments).parts : trailingParts; - int defaultPartIndex = - partTargetDurationUs != C.TIME_UNSET ? lastParts.size() - 1 : C.INDEX_UNSET; - int lastPartIndex = parseOptionalIntAttr(line, REGEX_LAST_PART, defaultPartIndex); + long lastMediaSequence = parseOptionalLongAttr(line, REGEX_LAST_MSN, C.INDEX_UNSET); + int lastPartIndex = parseOptionalIntAttr(line, REGEX_LAST_PART, C.INDEX_UNSET); String uri = parseStringAttr(line, REGEX_URI, variableDefinitions); Uri playlistUri = Uri.parse(UriUtil.resolve(baseUri, uri)); - renditionReports.put( - playlistUri, new RenditionReport(playlistUri, lastMediaSequence, lastPartIndex)); + renditionReports.add(new RenditionReport(playlistUri, lastMediaSequence, lastPartIndex)); } else if (line.startsWith(TAG_PRELOAD_HINT)) { if (preloadPart != null) { continue; @@ -1022,6 +1016,24 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser renditionReportMap = new HashMap<>(); + for (int i = 0; i < renditionReports.size(); i++) { + RenditionReport renditionReport = renditionReports.get(i); + long lastMediaSequence = renditionReport.lastMediaSequence; + if (lastMediaSequence == C.INDEX_UNSET) { + lastMediaSequence = mediaSequence + segments.size() - (trailingParts.isEmpty() ? 1 : 0); + } + int lastPartIndex = renditionReport.lastPartIndex; + if (lastPartIndex == C.INDEX_UNSET && partTargetDurationUs != C.TIME_UNSET) { + List lastParts = + trailingParts.isEmpty() ? Iterables.getLast(segments).parts : trailingParts; + lastPartIndex = lastParts.size() - 1; + } + renditionReportMap.put( + renditionReport.playlistUri, + new RenditionReport(renditionReport.playlistUri, lastMediaSequence, lastPartIndex)); + } + if (preloadPart != null) { trailingParts.add(preloadPart); } @@ -1046,7 +1058,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser Date: Fri, 29 Oct 2021 12:34:43 +0100 Subject: [PATCH 403/441] DefaultExtractorsFactory: lazily load flac extension PiperOrigin-RevId: 406332026 --- .../extractor/DefaultExtractorsFactory.java | 95 ++++++++++++------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java index abaefe2547..a71796cbb8 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java @@ -19,6 +19,7 @@ import static com.google.android.exoplayer2.util.FileTypes.inferFileTypeFromResp import static com.google.android.exoplayer2.util.FileTypes.inferFileTypeFromUri; import android.net.Uri; +import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -46,6 +47,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; /** * An {@link ExtractorsFactory} that provides an array of extractors for the following formats: @@ -99,32 +101,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { FileTypes.JPEG, }; - @Nullable - private static final Constructor FLAC_EXTENSION_EXTRACTOR_CONSTRUCTOR; - - static { - @Nullable Constructor flacExtensionExtractorConstructor = null; - try { - @SuppressWarnings("nullness:argument") - boolean isFlacNativeLibraryAvailable = - Boolean.TRUE.equals( - Class.forName("com.google.android.exoplayer2.ext.flac.FlacLibrary") - .getMethod("isAvailable") - .invoke(/* obj= */ null)); - if (isFlacNativeLibraryAvailable) { - flacExtensionExtractorConstructor = - Class.forName("com.google.android.exoplayer2.ext.flac.FlacExtractor") - .asSubclass(Extractor.class) - .getConstructor(int.class); - } - } catch (ClassNotFoundException e) { - // Expected if the app was built without the FLAC extension. - } catch (Exception e) { - // The FLAC extension is present, but instantiation failed. - throw new RuntimeException("Error instantiating FLAC extension", e); - } - FLAC_EXTENSION_EXTRACTOR_CONSTRUCTOR = flacExtensionExtractorConstructor; - } + private static final FlacExtensionLoader FLAC_EXTENSION_LOADER = new FlacExtensionLoader(); private boolean constantBitrateSeekingEnabled; private boolean constantBitrateSeekingAlwaysEnabled; @@ -377,13 +354,9 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { : 0))); break; case FileTypes.FLAC: - if (FLAC_EXTENSION_EXTRACTOR_CONSTRUCTOR != null) { - try { - extractors.add(FLAC_EXTENSION_EXTRACTOR_CONSTRUCTOR.newInstance(flacFlags)); - } catch (Exception e) { - // Should never happen. - throw new IllegalStateException("Unexpected error creating FLAC extractor", e); - } + @Nullable Extractor flacExtractor = FLAC_EXTENSION_LOADER.getExtractor(flacFlags); + if (flacExtractor != null) { + extractors.add(flacExtractor); } else { extractors.add(new FlacExtractor(flacFlags)); } @@ -430,4 +403,60 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { break; } } + + private static final class FlacExtensionLoader { + private final AtomicBoolean extensionLoaded; + + @GuardedBy("extensionLoaded") + @Nullable + private Constructor extractorConstructor; + + public FlacExtensionLoader() { + extensionLoaded = new AtomicBoolean(false); + } + + @Nullable + public Extractor getExtractor(int flags) { + @Nullable + Constructor extractorConstructor = maybeLoadExtractorConstructor(); + if (extractorConstructor == null) { + return null; + } + try { + return extractorConstructor.newInstance(flags); + } catch (Exception e) { + throw new IllegalStateException("Unexpected error creating FLAC extractor", e); + } + } + + @Nullable + private Constructor maybeLoadExtractorConstructor() { + synchronized (extensionLoaded) { + if (extensionLoaded.get()) { + return extractorConstructor; + } + try { + @SuppressWarnings("nullness:argument") + boolean isFlacNativeLibraryAvailable = + Boolean.TRUE.equals( + Class.forName("com.google.android.exoplayer2.ext.flac.FlacLibrary") + .getMethod("isAvailable") + .invoke(/* obj= */ null)); + if (isFlacNativeLibraryAvailable) { + extractorConstructor = + Class.forName("com.google.android.exoplayer2.ext.flac.FlacExtractor") + .asSubclass(Extractor.class) + .getConstructor(int.class); + } + } catch (ClassNotFoundException e) { + // Expected if the app was built without the FLAC extension. + } catch (Exception e) { + // The FLAC extension is present, but instantiation failed. + throw new RuntimeException("Error instantiating FLAC extension", e); + } + extensionLoaded.set(true); + return extractorConstructor; + } + } + } } From a0f8ac7503b55ad5c4a75a06b694c9f5910972f7 Mon Sep 17 00:00:00 2001 From: christosts Date: Fri, 29 Oct 2021 13:31:12 +0000 Subject: [PATCH 404/441] ExoPlayer.Builder: lazily initialize default components Initialize default components lazily in ExoPlayer.Builder to avoid redundant component instantiations, useful in cases where apps overwrite default components with ExoPlayer.Builder setters. The fields in ExoPlayer.Builder are wrapped in a Supplier (rather than just making then nullable and initializing them in ExoPlayer.Builder.build()) so that we maintain the proguarding properties of this class. The exception is ExoPlayer.Builder.AnalyticsCollector which became nullable and is initialized in ExoPlayer.Builder.build() in order to use any Clock that has been set separately with ExoPlayer.Builder.setClock(). #minor-release PiperOrigin-RevId: 406345976 --- .../google/android/exoplayer2/ExoPlayer.java | 92 ++++++++++++------- .../android/exoplayer2/SimpleExoPlayer.java | 53 ++++++----- 2 files changed, 90 insertions(+), 55 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 11d84fc1d4..e594883c72 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2; import static com.google.android.exoplayer2.util.Assertions.checkArgument; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; import android.content.Context; @@ -59,6 +60,7 @@ import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; +import com.google.common.base.Supplier; import java.util.List; /** @@ -366,12 +368,12 @@ public interface ExoPlayer extends Player { /* package */ Clock clock; /* package */ long foregroundModeTimeoutMs; - /* package */ RenderersFactory renderersFactory; - /* package */ MediaSourceFactory mediaSourceFactory; - /* package */ TrackSelector trackSelector; - /* package */ LoadControl loadControl; - /* package */ BandwidthMeter bandwidthMeter; - /* package */ AnalyticsCollector analyticsCollector; + /* package */ Supplier renderersFactorySupplier; + /* package */ Supplier mediaSourceFactorySupplier; + /* package */ Supplier trackSelectorSupplier; + /* package */ Supplier loadControlSupplier; + /* package */ Supplier bandwidthMeterSupplier; + /* package */ Supplier analyticsCollectorSupplier; /* package */ Looper looper; @Nullable /* package */ PriorityTaskManager priorityTaskManager; /* package */ AudioAttributes audioAttributes; @@ -437,8 +439,8 @@ public interface ExoPlayer extends Player { public Builder(Context context) { this( context, - new DefaultRenderersFactory(context), - new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); + () -> new DefaultRenderersFactory(context), + () -> new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } /** @@ -456,8 +458,8 @@ public interface ExoPlayer extends Player { public Builder(Context context, RenderersFactory renderersFactory) { this( context, - renderersFactory, - new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); + () -> renderersFactory, + () -> new DefaultMediaSourceFactory(context, new DefaultExtractorsFactory())); } /** @@ -474,7 +476,7 @@ public interface ExoPlayer extends Player { * MediaItem}. */ public Builder(Context context, MediaSourceFactory mediaSourceFactory) { - this(context, new DefaultRenderersFactory(context), mediaSourceFactory); + this(context, () -> new DefaultRenderersFactory(context), () -> mediaSourceFactory); } /** @@ -494,14 +496,7 @@ public interface ExoPlayer extends Player { */ public Builder( Context context, RenderersFactory renderersFactory, MediaSourceFactory mediaSourceFactory) { - this( - context, - renderersFactory, - mediaSourceFactory, - new DefaultTrackSelector(context), - new DefaultLoadControl(), - DefaultBandwidthMeter.getSingletonInstance(context), - new AnalyticsCollector(Clock.DEFAULT)); + this(context, () -> renderersFactory, () -> mediaSourceFactory); } /** @@ -527,13 +522,48 @@ public interface ExoPlayer extends Player { LoadControl loadControl, BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) { + this( + context, + () -> renderersFactory, + () -> mediaSourceFactory, + () -> trackSelector, + () -> loadControl, + () -> bandwidthMeter, + () -> analyticsCollector); + } + + private Builder( + Context context, + Supplier renderersFactorySupplier, + Supplier mediaSourceFactorySupplier) { + this( + context, + renderersFactorySupplier, + mediaSourceFactorySupplier, + () -> new DefaultTrackSelector(context), + DefaultLoadControl::new, + () -> DefaultBandwidthMeter.getSingletonInstance(context), + /* analyticsCollectorSupplier= */ null); + } + + private Builder( + Context context, + Supplier renderersFactorySupplier, + Supplier mediaSourceFactorySupplier, + Supplier trackSelectorSupplier, + Supplier loadControlSupplier, + Supplier bandwidthMeterSupplier, + @Nullable Supplier analyticsCollectorSupplier) { this.context = context; - this.renderersFactory = renderersFactory; - this.mediaSourceFactory = mediaSourceFactory; - this.trackSelector = trackSelector; - this.loadControl = loadControl; - this.bandwidthMeter = bandwidthMeter; - this.analyticsCollector = analyticsCollector; + this.renderersFactorySupplier = renderersFactorySupplier; + this.mediaSourceFactorySupplier = mediaSourceFactorySupplier; + this.trackSelectorSupplier = trackSelectorSupplier; + this.loadControlSupplier = loadControlSupplier; + this.bandwidthMeterSupplier = bandwidthMeterSupplier; + this.analyticsCollectorSupplier = + analyticsCollectorSupplier != null + ? analyticsCollectorSupplier + : () -> new AnalyticsCollector(checkNotNull(clock)); looper = Util.getCurrentOrMainLooper(); audioAttributes = AudioAttributes.DEFAULT; wakeMode = C.WAKE_MODE_NONE; @@ -573,7 +603,7 @@ public interface ExoPlayer extends Player { */ public Builder setRenderersFactory(RenderersFactory renderersFactory) { checkState(!buildCalled); - this.renderersFactory = renderersFactory; + this.renderersFactorySupplier = () -> renderersFactory; return this; } @@ -586,7 +616,7 @@ public interface ExoPlayer extends Player { */ public Builder setMediaSourceFactory(MediaSourceFactory mediaSourceFactory) { checkState(!buildCalled); - this.mediaSourceFactory = mediaSourceFactory; + this.mediaSourceFactorySupplier = () -> mediaSourceFactory; return this; } @@ -599,7 +629,7 @@ public interface ExoPlayer extends Player { */ public Builder setTrackSelector(TrackSelector trackSelector) { checkState(!buildCalled); - this.trackSelector = trackSelector; + this.trackSelectorSupplier = () -> trackSelector; return this; } @@ -612,7 +642,7 @@ public interface ExoPlayer extends Player { */ public Builder setLoadControl(LoadControl loadControl) { checkState(!buildCalled); - this.loadControl = loadControl; + this.loadControlSupplier = () -> loadControl; return this; } @@ -625,7 +655,7 @@ public interface ExoPlayer extends Player { */ public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter) { checkState(!buildCalled); - this.bandwidthMeter = bandwidthMeter; + this.bandwidthMeterSupplier = () -> bandwidthMeter; return this; } @@ -652,7 +682,7 @@ public interface ExoPlayer extends Player { */ public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector) { checkState(!buildCalled); - this.analyticsCollector = analyticsCollector; + this.analyticsCollectorSupplier = () -> analyticsCollector; return this; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index f0637df30a..3c6607611e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -28,6 +28,7 @@ import static com.google.android.exoplayer2.Renderer.MSG_SET_SKIP_SILENCE_ENABLE import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER; import static com.google.android.exoplayer2.Renderer.MSG_SET_VIDEO_OUTPUT; import static com.google.android.exoplayer2.Renderer.MSG_SET_VOLUME; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import android.content.Context; import android.graphics.Rect; @@ -66,7 +67,6 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ConditionVariable; import com.google.android.exoplayer2.util.Log; @@ -409,12 +409,14 @@ public class SimpleExoPlayer extends BasePlayer Clock clock, Looper applicationLooper) { this( - new ExoPlayer.Builder(context, renderersFactory) - .setTrackSelector(trackSelector) - .setMediaSourceFactory(mediaSourceFactory) - .setLoadControl(loadControl) - .setBandwidthMeter(bandwidthMeter) - .setAnalyticsCollector(analyticsCollector) + new ExoPlayer.Builder( + context, + renderersFactory, + mediaSourceFactory, + trackSelector, + loadControl, + bandwidthMeter, + analyticsCollector) .setUseLazyPreparation(useLazyPreparation) .setClock(clock) .setLooper(applicationLooper)); @@ -431,7 +433,7 @@ public class SimpleExoPlayer extends BasePlayer constructorFinished = new ConditionVariable(); try { applicationContext = builder.context.getApplicationContext(); - analyticsCollector = builder.analyticsCollector; + analyticsCollector = builder.analyticsCollectorSupplier.get(); priorityTaskManager = builder.priorityTaskManager; audioAttributes = builder.audioAttributes; videoScalingMode = builder.videoScalingMode; @@ -443,12 +445,15 @@ public class SimpleExoPlayer extends BasePlayer listeners = new CopyOnWriteArraySet<>(); Handler eventHandler = new Handler(builder.looper); renderers = - builder.renderersFactory.createRenderers( - eventHandler, - componentListener, - componentListener, - componentListener, - componentListener); + builder + .renderersFactorySupplier + .get() + .createRenderers( + eventHandler, + componentListener, + componentListener, + componentListener, + componentListener); // Set initial values. volume = 1; @@ -476,10 +481,10 @@ public class SimpleExoPlayer extends BasePlayer player = new ExoPlayerImpl( renderers, - builder.trackSelector, - builder.mediaSourceFactory, - builder.loadControl, - builder.bandwidthMeter, + builder.trackSelectorSupplier.get(), + builder.mediaSourceFactorySupplier.get(), + builder.loadControlSupplier.get(), + builder.bandwidthMeterSupplier.get(), analyticsCollector, builder.useLazyPreparation, builder.seekParameters, @@ -848,7 +853,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addAnalyticsListener(AnalyticsListener listener) { // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); + checkNotNull(listener); analyticsCollector.addListener(listener); } @@ -874,7 +879,7 @@ public class SimpleExoPlayer extends BasePlayer return; } if (isPriorityTaskManagerRegistered) { - Assertions.checkNotNull(this.priorityTaskManager).remove(C.PRIORITY_PLAYBACK); + checkNotNull(this.priorityTaskManager).remove(C.PRIORITY_PLAYBACK); } if (priorityTaskManager != null && isLoading()) { priorityTaskManager.add(C.PRIORITY_PLAYBACK); @@ -982,7 +987,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Listener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); listeners.add(listener); EventListener eventListener = listener; addListener(eventListener); @@ -992,13 +997,13 @@ public class SimpleExoPlayer extends BasePlayer @Override public void addListener(Player.EventListener listener) { // Don't verify application thread. We allow calls to this method from any thread. - Assertions.checkNotNull(listener); + checkNotNull(listener); player.addEventListener(listener); } @Override public void removeListener(Listener listener) { - Assertions.checkNotNull(listener); + checkNotNull(listener); listeners.remove(listener); EventListener eventListener = listener; removeListener(eventListener); @@ -1322,7 +1327,7 @@ public class SimpleExoPlayer extends BasePlayer ownedSurface = null; } if (isPriorityTaskManagerRegistered) { - Assertions.checkNotNull(priorityTaskManager).remove(C.PRIORITY_PLAYBACK); + checkNotNull(priorityTaskManager).remove(C.PRIORITY_PLAYBACK); isPriorityTaskManagerRegistered = false; } currentCues = Collections.emptyList(); From 405b811454c60babf4e1f73d3a5b27e66ab48a0d Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 29 Oct 2021 13:40:08 +0000 Subject: [PATCH 405/441] Update developer guide to use non-deprecated symbols #minor-release PiperOrigin-RevId: 406347412 --- docs/ad-insertion.md | 10 ++++++++-- docs/drm.md | 19 +++++++++++-------- docs/live-streaming.md | 2 +- docs/media-items.md | 36 ++++++++++++++++++++---------------- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 0886ca6a92..4e42430f5b 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -178,7 +178,10 @@ MediaItem preRollAd = MediaItem.fromUri(preRollAdUri); MediaItem contentStart = new MediaItem.Builder() .setUri(contentUri) - .setClipEndPositionMs(120_000) + .setClippingConfiguration( + new ClippingConfiguration.Builder() + .setEndPositionMs(120_000) + .build()) .build(); // A mid-roll ad. MediaItem midRollAd = MediaItem.fromUri(midRollAdUri); @@ -186,7 +189,10 @@ MediaItem midRollAd = MediaItem.fromUri(midRollAdUri); MediaItem contentEnd = new MediaItem.Builder() .setUri(contentUri) - .setClipStartPositionMs(120_000) + .setClippingConfiguration( + new ClippingConfiguration.Builder() + .setStartPositionMs(120_000) + .build()) .build(); // Build the playlist. diff --git a/docs/drm.md b/docs/drm.md index a943f49ba7..4b64640989 100644 --- a/docs/drm.md +++ b/docs/drm.md @@ -24,7 +24,8 @@ outlined in the sections below. ### Key rotation ### To play streams with rotating keys, pass `true` to -`MediaItem.Builder.setDrmMultiSession` when building the media item. +`MediaItem.DrmConfiguration.Builder.setMultiSession` when building the media +item. ### Multi-key content ### @@ -49,8 +50,9 @@ to access the different streams. In this case, the license server is configured to respond with only the key specified in the request. Multi-key content can be played with this license -server configuration by passing `true` to `MediaItem.Builder.setDrmMultiSession` -when building the media item. +server configuration by passing `true` to +`MediaItem.DrmConfiguration.Builder.setMultiSession` when building the media +item. We do not recommend configuring your license server to behave in this way. It requires extra license requests to play multi-key content, which is less @@ -59,9 +61,9 @@ efficient and robust than the alternative described above. ### Offline keys ### An offline key set can be loaded by passing the key set ID to -`MediaItem.Builder.setDrmKeySetId` when building the media item. This -allows playback using the keys stored in the offline key set with the specified -ID. +`MediaItem.DrmConfiguration.Builder.setKeySetId` when building the media item. +This allows playback using the keys stored in the offline key set with the +specified ID. {% include known-issue-box.html issue-id="3872" description="Only one offline key set can be specified per playback. As a result, offline playback of @@ -75,8 +77,9 @@ clear content as are used when playing encrypted content. When media contains both clear and encrypted sections, you may want to use placeholder `DrmSessions` to avoid re-creation of decoders when transitions between clear and encrypted sections occur. Use of placeholder `DrmSessions` for audio and video tracks can -be enabled by passing `true` to `MediaItem.Builder.setDrmSessionForClearPeriods` -when building the media item. +be enabled by passing `true` to +`MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks` when +building the media item. ### Using a custom DrmSessionManager ### diff --git a/docs/live-streaming.md b/docs/live-streaming.md index d24d0f4dd0..f9091ba261 100644 --- a/docs/live-streaming.md +++ b/docs/live-streaming.md @@ -89,7 +89,7 @@ components to support additional modes when playing live streams. By default, ExoPlayer uses live playback parameters defined by the media. If you want to configure the live playback parameters yourself, you can set them on a -per `MediaItem` basis by calling `MediaItem.Builder.setLiveXXX` methods. If +per `MediaItem` basis by calling `MediaItem.Builder.setLiveConfiguration`. If you'd like to set these values globally for all items, you can set them on the `DefaultMediaSourceFactory` provided to the player. In both cases, the provided values will override parameters defined by the media. diff --git a/docs/media-items.md b/docs/media-items.md index 710ded16d6..f1c342c2a5 100644 --- a/docs/media-items.md +++ b/docs/media-items.md @@ -86,17 +86,17 @@ To sideload subtitle tracks, `MediaItem.Subtitle` instances can be added when when building a media item: ~~~ -MediaItem.Subtitle subtitle = - new MediaItem.Subtitle( - subtitleUri, - MimeTypes.APPLICATION_SUBRIP, // The correct MIME type. - language, // The subtitle language. May be null. - selectionFlags); // Selection flags for the track. - -MediaItem mediaItem = new MediaItem.Builder() - .setUri(videoUri) - .setSubtitles(Lists.newArrayList(subtitle)) - .build(); +MediaItem.SubtitleConfiguration subtitle = + new MediaItem.SubtitleConfiguration.Builder(subtitleUri) + .setMimeType(MimeTypes.APPLICATION_SUBRIP) // The correct MIME type (required). + .setLanguage(language) // The subtitle language (optional). + .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). + .build(); +MediaItem mediaItem = + new MediaItem.Builder() + .setUri(videoUri) + .setSubtitleConfigurations(ImmutableList.of(subtitle)) + .build(); ~~~ {: .language-java} @@ -110,11 +110,15 @@ It's possible to clip the content referred to by a media item by setting custom start and end positions: ~~~ -MediaItem mediaItem = new MediaItem.Builder() - .setUri(videoUri) - .setClipStartPositionMs(startPositionMs) - .setClipEndPositionMs(endPositionMs) - .build(); +MediaItem mediaItem = + new MediaItem.Builder() + .setUri(videoUri) + .setClippingConfiguration( + new ClippingConfiguration.Builder() + .setStartPositionMs(startPositionMs) + .setEndPositionMs(endPositionMs) + .build()) + .build(); ~~~ {: .language-java} From 8e2083a27b5879dc50d6ac6c30ccc7d6a87ab145 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 29 Oct 2021 14:27:32 +0000 Subject: [PATCH 406/441] Remove dependency from common tests to exoplayer PiperOrigin-RevId: 406354526 --- .../{FakePlayer.java => FakeExoPlayer.java} | 9 +- .../exoplayer2/ext/ima/ImaAdsLoaderTest.java | 4 +- library/common/build.gradle | 1 - .../google/android/exoplayer2/FormatTest.java | 7 +- .../exoplayer2/ForwardingPlayerTest.java | 16 +- .../exoplayer2/metadata/MetadataTest.java | 5 +- .../TrackSelectionParametersTest.java | 15 - .../exoplayer2/util/AtomicFileTest.java | 2 +- .../exoplayer2/util/MediaFormatUtilTest.java | 6 +- .../DefaultTrackSelectorTest.java | 13 + .../testutil/FakeMetadataEntry.java | 78 ++++ .../exoplayer2/testutil/StubExoPlayer.java | 383 +---------------- .../exoplayer2/testutil/StubPlayer.java | 399 ++++++++++++++++++ 13 files changed, 510 insertions(+), 428 deletions(-) rename extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/{FakePlayer.java => FakeExoPlayer.java} (97%) create mode 100644 testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMetadataEntry.java create mode 100644 testutils/src/main/java/com/google/android/exoplayer2/testutil/StubPlayer.java diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java similarity index 97% rename from extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java rename to extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java index e8f80feed0..fb2975920d 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakePlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java @@ -15,9 +15,9 @@ */ package com.google.android.exoplayer2.ext.ima; -import android.content.Context; import android.os.Looper; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; @@ -29,8 +29,8 @@ import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.ListenerSet; import com.google.android.exoplayer2.util.Util; -/** A fake player for testing content/ad playback. */ -/* package */ final class FakePlayer extends StubExoPlayer { +/** A fake {@link ExoPlayer} for testing content/ad playback. */ +/* package */ final class FakeExoPlayer extends StubExoPlayer { private final ListenerSet listeners; private final Timeline.Period period; @@ -48,8 +48,7 @@ import com.google.android.exoplayer2.util.Util; private int adGroupIndex; private int adIndexInAdGroup; - public FakePlayer(Context context) { - super(context); + public FakeExoPlayer() { listeners = new ListenerSet<>( Looper.getMainLooper(), diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java index cb0deb494b..0d9e7f042f 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java @@ -139,13 +139,13 @@ public final class ImaAdsLoaderTest { private ContentProgressProvider contentProgressProvider; private VideoAdPlayer videoAdPlayer; private TestAdsLoaderListener adsLoaderListener; - private FakePlayer fakePlayer; + private FakeExoPlayer fakePlayer; private ImaAdsLoader imaAdsLoader; @Before public void setUp() { setupMocks(); - fakePlayer = new FakePlayer(getApplicationContext()); + fakePlayer = new FakeExoPlayer(); adViewGroup = new FrameLayout(getApplicationContext()); View adOverlayView = new View(getApplicationContext()); adViewProvider = diff --git a/library/common/build.gradle b/library/common/build.gradle index 40d6c7c610..b59552d366 100644 --- a/library/common/build.gradle +++ b/library/common/build.gradle @@ -49,7 +49,6 @@ dependencies { testImplementation 'junit:junit:' + junitVersion testImplementation 'com.google.truth:truth:' + truthVersion testImplementation 'org.robolectric:robolectric:' + robolectricVersion - testImplementation project(modulePrefix + 'library-core') testImplementation project(modulePrefix + 'testutils') } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java index fbc40afd12..36c5e448b1 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/FormatTest.java @@ -23,7 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.id3.TextInformationFrame; +import com.google.android.exoplayer2.testutil.FakeMetadataEntry; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.video.ColorInfo; import java.util.ArrayList; @@ -65,10 +65,7 @@ public final class FormatTest { byte[] projectionData = new byte[] {1, 2, 3}; - Metadata metadata = - new Metadata( - new TextInformationFrame("id1", "description1", "value1"), - new TextInformationFrame("id2", "description2", "value2")); + Metadata metadata = new Metadata(new FakeMetadataEntry("id1"), new FakeMetadataEntry("id2")); ColorInfo colorInfo = new ColorInfo( diff --git a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java index 41f590ed03..9c6e481e50 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/ForwardingPlayerTest.java @@ -24,10 +24,8 @@ import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import android.content.Context; -import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.testutil.StubExoPlayer; +import com.google.android.exoplayer2.testutil.StubPlayer; import com.google.android.exoplayer2.util.FlagSet; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -48,7 +46,7 @@ public class ForwardingPlayerTest { @Test public void addListener_addsForwardingListener() { - FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); + FakePlayer player = new FakePlayer(); Player.Listener listener1 = mock(Player.Listener.class); Player.Listener listener2 = mock(Player.Listener.class); @@ -63,7 +61,7 @@ public class ForwardingPlayerTest { @Test public void removeListener_removesForwardingListener() { - FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); + FakePlayer player = new FakePlayer(); Player.Listener listener1 = mock(Player.Listener.class); Player.Listener listener2 = mock(Player.Listener.class); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); @@ -81,7 +79,7 @@ public class ForwardingPlayerTest { @Test public void onEvents_passesForwardingPlayerAsArgument() { - FakePlayer player = new FakePlayer(ApplicationProvider.getApplicationContext()); + FakePlayer player = new FakePlayer(); Player.Listener listener = mock(Player.Listener.class); ForwardingPlayer forwardingPlayer = new ForwardingPlayer(player); forwardingPlayer.addListener(listener); @@ -180,14 +178,10 @@ public class ForwardingPlayerTest { throw new IllegalStateException(); } - private static class FakePlayer extends StubExoPlayer { + private static class FakePlayer extends StubPlayer { private final Set listeners = new HashSet<>(); - public FakePlayer(Context context) { - super(context); - } - @Override public void addListener(Listener listener) { listeners.add(listener); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/MetadataTest.java b/library/common/src/test/java/com/google/android/exoplayer2/metadata/MetadataTest.java index ac3bfdcef9..f2457e0346 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/metadata/MetadataTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/metadata/MetadataTest.java @@ -19,7 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import android.os.Parcel; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.metadata.id3.BinaryFrame; +import com.google.android.exoplayer2.testutil.FakeMetadataEntry; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,8 +30,7 @@ public class MetadataTest { @Test public void parcelable() { Metadata metadataToParcel = - new Metadata( - new BinaryFrame("id1", new byte[] {1}), new BinaryFrame("id2", new byte[] {2})); + new Metadata(new FakeMetadataEntry("id1"), new FakeMetadataEntry("id2")); Parcel parcel = Parcel.obtain(); metadataToParcel.writeToParcel(parcel, 0); diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java index 075898d4d0..7fab202421 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java @@ -19,10 +19,8 @@ import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.Bundleable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; @@ -183,17 +181,4 @@ public final class TrackSelectionParametersTest { assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportOrientationMayChange).isTrue(); } - - /** Tests {@link SelectionOverride}'s {@link Bundleable} implementation. */ - @Test - public void roundTripViaBundle_ofSelectionOverride_yieldsEqualInstance() { - SelectionOverride selectionOverrideToBundle = - new SelectionOverride(/* groupIndex= */ 1, /* tracks...= */ 2, 3); - - SelectionOverride selectionOverrideFromBundle = - DefaultTrackSelector.SelectionOverride.CREATOR.fromBundle( - selectionOverrideToBundle.toBundle()); - - assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle); - } } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java index dd5ccac8cd..c5486b5f4a 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/AtomicFileTest.java @@ -39,7 +39,7 @@ public final class AtomicFileTest { @Before public void setUp() throws Exception { tempFolder = - Util.createTempDirectory(ApplicationProvider.getApplicationContext(), "ExoPlayerTest"); + Util.createTempDirectory(ApplicationProvider.getApplicationContext(), "AtomicFileTest"); file = new File(tempFolder, "atomicFile"); atomicFile = new AtomicFile(file); } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java index 0888796417..959b1279a0 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java @@ -31,7 +31,7 @@ import org.junit.runner.RunWith; public class MediaFormatUtilTest { @Test - public void createMediaFormatFromEmptyExoPlayerFormat_generatesExpectedEntries() { + public void createMediaFormatFromFormat_withEmptyFormat_generatesExpectedEntries() { MediaFormat mediaFormat = MediaFormatUtil.createMediaFormatFromFormat(new Format.Builder().build()); // Assert that no invalid keys are accidentally being populated. @@ -59,7 +59,7 @@ public class MediaFormatUtilTest { } @Test - public void createMediaFormatFromPopulatedExoPlayerFormat_generatesExpectedMediaFormatEntries() { + public void createMediaFormatFromFormat_withPopulatedFormat_generatesExpectedEntries() { Format format = new Format.Builder() .setAverageBitrate(1) @@ -145,7 +145,7 @@ public class MediaFormatUtilTest { } @Test - public void createMediaFormatWithExoPlayerPcmEncoding_containsExoPlayerSpecificEncoding() { + public void createMediaFormatFromFormat_withPcmEncoding_setsCustomPcmEncodingEntry() { Format format = new Format.Builder().setPcmEncoding(C.ENCODING_PCM_32BIT).build(); MediaFormat mediaFormat = MediaFormatUtil.createMediaFormatFromFormat(format); assertThat(mediaFormat.getInteger(MediaFormatUtil.KEY_EXO_PCM_ENCODING)) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 0a12b61a12..c2eaf5ddaf 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -1750,6 +1750,19 @@ public final class DefaultTrackSelectorTest { assertThat(trackGroupInfos.get(0).getTrackSupport(0)).isEqualTo(FORMAT_HANDLED); } + /** Tests {@link SelectionOverride}'s {@link Bundleable} implementation. */ + @Test + public void roundTripViaBundle_ofSelectionOverride_yieldsEqualInstance() { + SelectionOverride selectionOverrideToBundle = + new SelectionOverride(/* groupIndex= */ 1, /* tracks...= */ 2, 3); + + SelectionOverride selectionOverrideFromBundle = + DefaultTrackSelector.SelectionOverride.CREATOR.fromBundle( + selectionOverrideToBundle.toBundle()); + + assertThat(selectionOverrideFromBundle).isEqualTo(selectionOverrideToBundle); + } + private static void assertSelections(TrackSelectorResult result, TrackSelection[] expected) { assertThat(result.length).isEqualTo(expected.length); for (int i = 0; i < expected.length; i++) { diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMetadataEntry.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMetadataEntry.java new file mode 100644 index 0000000000..e84d60dc4f --- /dev/null +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMetadataEntry.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.testutil; + +import static com.google.android.exoplayer2.util.Util.castNonNull; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.metadata.Metadata; + +/** A fake {@link Metadata.Entry}. */ +public final class FakeMetadataEntry implements Metadata.Entry { + + public final String data; + + public FakeMetadataEntry(String data) { + this.data = data; + } + + /* package */ FakeMetadataEntry(Parcel in) { + data = castNonNull(in.readString()); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + FakeMetadataEntry other = (FakeMetadataEntry) obj; + return data.equals(other.data); + } + + @Override + public int hashCode() { + return data.hashCode(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(data); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + + @Override + public FakeMetadataEntry createFromParcel(Parcel in) { + return new FakeMetadataEntry(in); + } + + @Override + public FakeMetadataEntry[] newArray(int size) { + return new FakeMetadataEntry[size]; + } + }; +} diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 9a5a50d1d3..c0acae1da6 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -15,26 +15,14 @@ */ package com.google.android.exoplayer2.testutil; -import android.content.Context; import android.os.Looper; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.TextureView; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.BasePlayer; -import com.google.android.exoplayer2.DeviceInfo; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.MediaMetadata; -import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.SeekParameters; -import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; @@ -42,15 +30,10 @@ import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ShuffleOrder; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.text.Cue; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.util.Clock; import com.google.android.exoplayer2.util.PriorityTaskManager; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; -import com.google.android.exoplayer2.video.VideoSize; import com.google.android.exoplayer2.video.spherical.CameraMotionListener; import java.util.List; @@ -58,11 +41,7 @@ import java.util.List; * An abstract {@link ExoPlayer} implementation that throws {@link UnsupportedOperationException} * from every method. */ -public class StubExoPlayer extends BasePlayer implements ExoPlayer { - - public StubExoPlayer(Context context) { - super(); - } +public class StubExoPlayer extends StubPlayer implements ExoPlayer { @Override @Deprecated @@ -93,31 +72,16 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public Looper getApplicationLooper() { - throw new UnsupportedOperationException(); - } - @Override public Clock getClock() { throw new UnsupportedOperationException(); } - @Override - public void addListener(Listener listener) { - throw new UnsupportedOperationException(); - } - @Override public void addListener(Player.EventListener listener) { throw new UnsupportedOperationException(); } - @Override - public void removeListener(Listener listener) { - throw new UnsupportedOperationException(); - } - @Override public void removeListener(Player.EventListener listener) { throw new UnsupportedOperationException(); @@ -148,68 +112,29 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - @State - public int getPlaybackState() { - throw new UnsupportedOperationException(); - } - - @Override - @PlaybackSuppressionReason - public int getPlaybackSuppressionReason() { - throw new UnsupportedOperationException(); - } - @Override public ExoPlaybackException getPlayerError() { throw new UnsupportedOperationException(); } - /** @deprecated Use {@link #prepare()} instead. */ @Deprecated @Override public void retry() { throw new UnsupportedOperationException(); } - /** - * @deprecated Use {@link #setMediaSource(MediaSource)} and {@link ExoPlayer#prepare()} instead. - */ - @Deprecated - @Override - public void prepare() { - throw new UnsupportedOperationException(); - } - - /** - * @deprecated Use {@link #setMediaSource(MediaSource)} and {@link ExoPlayer#prepare()} instead. - */ @Deprecated @Override public void prepare(MediaSource mediaSource) { throw new UnsupportedOperationException(); } - /** - * @deprecated Use {@link #setMediaSource(MediaSource, boolean)} and {@link ExoPlayer#prepare()} - * instead. - */ @Deprecated @Override public void prepare(MediaSource mediaSource, boolean resetPosition, boolean resetState) { throw new UnsupportedOperationException(); } - @Override - public void setMediaItems(List mediaItems, boolean resetPosition) { - throw new UnsupportedOperationException(); - } - - @Override - public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { - throw new UnsupportedOperationException(); - } - @Override public void setMediaSource(MediaSource mediaSource) { throw new UnsupportedOperationException(); @@ -241,11 +166,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public void addMediaItems(int index, List mediaItems) { - throw new UnsupportedOperationException(); - } - @Override public void addMediaSource(MediaSource mediaSource) { throw new UnsupportedOperationException(); @@ -266,41 +186,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public void moveMediaItems(int fromIndex, int toIndex, int newIndex) { - throw new UnsupportedOperationException(); - } - - @Override - public void removeMediaItems(int fromIndex, int toIndex) { - throw new UnsupportedOperationException(); - } - - @Override - public Commands getAvailableCommands() { - throw new UnsupportedOperationException(); - } - - @Override - public void setPlayWhenReady(boolean playWhenReady) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean getPlayWhenReady() { - throw new UnsupportedOperationException(); - } - - @Override - public void setRepeatMode(@RepeatMode int repeatMode) { - throw new UnsupportedOperationException(); - } - - @Override - public int getRepeatMode() { - throw new UnsupportedOperationException(); - } - @Override public void setShuffleOrder(ShuffleOrder shuffleOrder) { throw new UnsupportedOperationException(); @@ -381,51 +266,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public void setShuffleModeEnabled(boolean shuffleModeEnabled) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean getShuffleModeEnabled() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isLoading() { - throw new UnsupportedOperationException(); - } - - @Override - public void seekTo(int mediaItemIndex, long positionMs) { - throw new UnsupportedOperationException(); - } - - @Override - public long getSeekBackIncrement() { - throw new UnsupportedOperationException(); - } - - @Override - public long getSeekForwardIncrement() { - throw new UnsupportedOperationException(); - } - - @Override - public long getMaxSeekToPreviousPosition() { - throw new UnsupportedOperationException(); - } - - @Override - public void setPlaybackParameters(PlaybackParameters playbackParameters) { - throw new UnsupportedOperationException(); - } - - @Override - public PlaybackParameters getPlaybackParameters() { - throw new UnsupportedOperationException(); - } - @Override public void setSeekParameters(@Nullable SeekParameters seekParameters) { throw new UnsupportedOperationException(); @@ -436,22 +276,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public void stop() { - throw new UnsupportedOperationException(); - } - - @Deprecated - @Override - public void stop(boolean reset) { - throw new UnsupportedOperationException(); - } - - @Override - public void release() { - throw new UnsupportedOperationException(); - } - @Override public PlayerMessage createMessage(PlayerMessage.Target target) { throw new UnsupportedOperationException(); @@ -473,211 +297,6 @@ public class StubExoPlayer extends BasePlayer implements ExoPlayer { throw new UnsupportedOperationException(); } - @Override - public TrackGroupArray getCurrentTrackGroups() { - throw new UnsupportedOperationException(); - } - - @Override - public TrackSelectionArray getCurrentTrackSelections() { - throw new UnsupportedOperationException(); - } - - @Override - public TracksInfo getCurrentTracksInfo() { - throw new UnsupportedOperationException(); - } - - @Override - public TrackSelectionParameters getTrackSelectionParameters() { - throw new UnsupportedOperationException(); - } - - @Override - public void setTrackSelectionParameters(TrackSelectionParameters parameters) { - throw new UnsupportedOperationException(); - } - - @Override - public MediaMetadata getMediaMetadata() { - throw new UnsupportedOperationException(); - } - - @Override - public MediaMetadata getPlaylistMetadata() { - throw new UnsupportedOperationException(); - } - - @Override - public void setPlaylistMetadata(MediaMetadata mediaMetadata) { - throw new UnsupportedOperationException(); - } - - @Override - public Timeline getCurrentTimeline() { - throw new UnsupportedOperationException(); - } - - @Override - public int getCurrentPeriodIndex() { - throw new UnsupportedOperationException(); - } - - @Override - public int getCurrentMediaItemIndex() { - throw new UnsupportedOperationException(); - } - - @Override - public long getDuration() { - throw new UnsupportedOperationException(); - } - - @Override - public long getCurrentPosition() { - throw new UnsupportedOperationException(); - } - - @Override - public long getBufferedPosition() { - throw new UnsupportedOperationException(); - } - - @Override - public long getTotalBufferedDuration() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isPlayingAd() { - throw new UnsupportedOperationException(); - } - - @Override - public int getCurrentAdGroupIndex() { - throw new UnsupportedOperationException(); - } - - @Override - public int getCurrentAdIndexInAdGroup() { - throw new UnsupportedOperationException(); - } - - @Override - public long getContentPosition() { - throw new UnsupportedOperationException(); - } - - @Override - public long getContentBufferedPosition() { - throw new UnsupportedOperationException(); - } - - @Override - public AudioAttributes getAudioAttributes() { - throw new UnsupportedOperationException(); - } - - @Override - public void setVolume(float volume) { - throw new UnsupportedOperationException(); - } - - @Override - public float getVolume() { - throw new UnsupportedOperationException(); - } - - @Override - public void clearVideoSurface() { - throw new UnsupportedOperationException(); - } - - @Override - public void clearVideoSurface(@Nullable Surface surface) { - throw new UnsupportedOperationException(); - } - - @Override - public void setVideoSurface(@Nullable Surface surface) { - throw new UnsupportedOperationException(); - } - - @Override - public void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { - throw new UnsupportedOperationException(); - } - - @Override - public void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { - throw new UnsupportedOperationException(); - } - - @Override - public void setVideoSurfaceView(@Nullable SurfaceView surfaceView) { - throw new UnsupportedOperationException(); - } - - @Override - public void clearVideoSurfaceView(@Nullable SurfaceView surfaceView) { - throw new UnsupportedOperationException(); - } - - @Override - public void setVideoTextureView(@Nullable TextureView textureView) { - throw new UnsupportedOperationException(); - } - - @Override - public void clearVideoTextureView(@Nullable TextureView textureView) { - throw new UnsupportedOperationException(); - } - - @Override - public VideoSize getVideoSize() { - throw new UnsupportedOperationException(); - } - - @Override - public List getCurrentCues() { - throw new UnsupportedOperationException(); - } - - @Override - public DeviceInfo getDeviceInfo() { - throw new UnsupportedOperationException(); - } - - @Override - public int getDeviceVolume() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isDeviceMuted() { - throw new UnsupportedOperationException(); - } - - @Override - public void setDeviceVolume(int volume) { - throw new UnsupportedOperationException(); - } - - @Override - public void increaseDeviceVolume() { - throw new UnsupportedOperationException(); - } - - @Override - public void decreaseDeviceVolume() { - throw new UnsupportedOperationException(); - } - - @Override - public void setDeviceMuted(boolean muted) { - throw new UnsupportedOperationException(); - } - @Override public void setForegroundMode(boolean foregroundMode) { throw new UnsupportedOperationException(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubPlayer.java new file mode 100644 index 0000000000..79f1214810 --- /dev/null +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubPlayer.java @@ -0,0 +1,399 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.testutil; + +import android.os.Looper; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.TextureView; +import androidx.annotation.Nullable; +import com.google.android.exoplayer2.BasePlayer; +import com.google.android.exoplayer2.DeviceInfo; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.MediaMetadata; +import com.google.android.exoplayer2.PlaybackException; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; +import com.google.android.exoplayer2.audio.AudioAttributes; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.text.Cue; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; +import com.google.android.exoplayer2.video.VideoSize; +import java.util.List; + +/** + * An abstract {@link Player} implementation that throws {@link UnsupportedOperationException} from + * every method. + */ +public class StubPlayer extends BasePlayer { + + @Override + public Looper getApplicationLooper() { + throw new UnsupportedOperationException(); + } + + @Override + public void addListener(Listener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeListener(Listener listener) { + throw new UnsupportedOperationException(); + } + + @Override + @State + public int getPlaybackState() { + throw new UnsupportedOperationException(); + } + + @Override + @PlaybackSuppressionReason + public int getPlaybackSuppressionReason() { + throw new UnsupportedOperationException(); + } + + @Override + public PlaybackException getPlayerError() { + throw new UnsupportedOperationException(); + } + + @Override + public void prepare() { + throw new UnsupportedOperationException(); + } + + @Override + public void setMediaItems(List mediaItems, boolean resetPosition) { + throw new UnsupportedOperationException(); + } + + @Override + public void setMediaItems(List mediaItems, int startIndex, long startPositionMs) { + throw new UnsupportedOperationException(); + } + + @Override + public void addMediaItems(int index, List mediaItems) { + throw new UnsupportedOperationException(); + } + + @Override + public void moveMediaItems(int fromIndex, int toIndex, int newIndex) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeMediaItems(int fromIndex, int toIndex) { + throw new UnsupportedOperationException(); + } + + @Override + public Commands getAvailableCommands() { + throw new UnsupportedOperationException(); + } + + @Override + public void setPlayWhenReady(boolean playWhenReady) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getPlayWhenReady() { + throw new UnsupportedOperationException(); + } + + @Override + public void setRepeatMode(@RepeatMode int repeatMode) { + throw new UnsupportedOperationException(); + } + + @Override + public int getRepeatMode() { + throw new UnsupportedOperationException(); + } + + @Override + public void setShuffleModeEnabled(boolean shuffleModeEnabled) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getShuffleModeEnabled() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isLoading() { + throw new UnsupportedOperationException(); + } + + @Override + public void seekTo(int mediaItemIndex, long positionMs) { + throw new UnsupportedOperationException(); + } + + @Override + public long getSeekBackIncrement() { + throw new UnsupportedOperationException(); + } + + @Override + public long getSeekForwardIncrement() { + throw new UnsupportedOperationException(); + } + + @Override + public long getMaxSeekToPreviousPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public void setPlaybackParameters(PlaybackParameters playbackParameters) { + throw new UnsupportedOperationException(); + } + + @Override + public PlaybackParameters getPlaybackParameters() { + throw new UnsupportedOperationException(); + } + + @Override + public void stop() { + throw new UnsupportedOperationException(); + } + + @Deprecated + @Override + public void stop(boolean reset) { + throw new UnsupportedOperationException(); + } + + @Override + public void release() { + throw new UnsupportedOperationException(); + } + + @Override + public TrackGroupArray getCurrentTrackGroups() { + throw new UnsupportedOperationException(); + } + + @Override + public TrackSelectionArray getCurrentTrackSelections() { + throw new UnsupportedOperationException(); + } + + @Override + public TracksInfo getCurrentTracksInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public TrackSelectionParameters getTrackSelectionParameters() { + throw new UnsupportedOperationException(); + } + + @Override + public void setTrackSelectionParameters(TrackSelectionParameters parameters) { + throw new UnsupportedOperationException(); + } + + @Override + public MediaMetadata getMediaMetadata() { + throw new UnsupportedOperationException(); + } + + @Override + public MediaMetadata getPlaylistMetadata() { + throw new UnsupportedOperationException(); + } + + @Override + public void setPlaylistMetadata(MediaMetadata mediaMetadata) { + throw new UnsupportedOperationException(); + } + + @Override + public Timeline getCurrentTimeline() { + throw new UnsupportedOperationException(); + } + + @Override + public int getCurrentPeriodIndex() { + throw new UnsupportedOperationException(); + } + + @Override + public int getCurrentMediaItemIndex() { + throw new UnsupportedOperationException(); + } + + @Override + public long getDuration() { + throw new UnsupportedOperationException(); + } + + @Override + public long getCurrentPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public long getBufferedPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public long getTotalBufferedDuration() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isPlayingAd() { + throw new UnsupportedOperationException(); + } + + @Override + public int getCurrentAdGroupIndex() { + throw new UnsupportedOperationException(); + } + + @Override + public int getCurrentAdIndexInAdGroup() { + throw new UnsupportedOperationException(); + } + + @Override + public long getContentPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public long getContentBufferedPosition() { + throw new UnsupportedOperationException(); + } + + @Override + public AudioAttributes getAudioAttributes() { + throw new UnsupportedOperationException(); + } + + @Override + public void setVolume(float volume) { + throw new UnsupportedOperationException(); + } + + @Override + public float getVolume() { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoSurface() { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoSurface(@Nullable Surface surface) { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoSurface(@Nullable Surface surface) { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder) { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoSurfaceView(@Nullable SurfaceView surfaceView) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoSurfaceView(@Nullable SurfaceView surfaceView) { + throw new UnsupportedOperationException(); + } + + @Override + public void setVideoTextureView(@Nullable TextureView textureView) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearVideoTextureView(@Nullable TextureView textureView) { + throw new UnsupportedOperationException(); + } + + @Override + public VideoSize getVideoSize() { + throw new UnsupportedOperationException(); + } + + @Override + public List getCurrentCues() { + throw new UnsupportedOperationException(); + } + + @Override + public DeviceInfo getDeviceInfo() { + throw new UnsupportedOperationException(); + } + + @Override + public int getDeviceVolume() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isDeviceMuted() { + throw new UnsupportedOperationException(); + } + + @Override + public void setDeviceVolume(int volume) { + throw new UnsupportedOperationException(); + } + + @Override + public void increaseDeviceVolume() { + throw new UnsupportedOperationException(); + } + + @Override + public void decreaseDeviceVolume() { + throw new UnsupportedOperationException(); + } + + @Override + public void setDeviceMuted(boolean muted) { + throw new UnsupportedOperationException(); + } +} From 288899ee9d57926f02b3acff720c1359eb0860c6 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Fri, 29 Oct 2021 14:35:53 +0000 Subject: [PATCH 407/441] Change Transformer to use Player.Listener. AnalyticsListener should not be used for non-analytical actions. PiperOrigin-RevId: 406355758 --- .../transformer/TranscodingTransformer.java | 18 ++++++++---------- .../exoplayer2/transformer/Transformer.java | 17 ++++++++--------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index d766987aa8..6f58812be4 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -45,7 +45,6 @@ import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; -import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; @@ -573,8 +572,7 @@ public final class TranscodingTransformer { .setClock(clock) .build(); player.setMediaItem(mediaItem); - player.addAnalyticsListener( - new TranscodingTransformerAnalyticsListener(mediaItem, muxerWrapper)); + player.addListener(new TranscodingTransformerPlayerListener(mediaItem, muxerWrapper)); player.prepare(); progressState = PROGRESS_STATE_WAITING_FOR_AVAILABILITY; @@ -688,30 +686,30 @@ public final class TranscodingTransformer { } } - private final class TranscodingTransformerAnalyticsListener implements AnalyticsListener { + private final class TranscodingTransformerPlayerListener implements Player.Listener { private final MediaItem mediaItem; private final MuxerWrapper muxerWrapper; - public TranscodingTransformerAnalyticsListener(MediaItem mediaItem, MuxerWrapper muxerWrapper) { + public TranscodingTransformerPlayerListener(MediaItem mediaItem, MuxerWrapper muxerWrapper) { this.mediaItem = mediaItem; this.muxerWrapper = muxerWrapper; } @Override - public void onPlaybackStateChanged(EventTime eventTime, int state) { + public void onPlaybackStateChanged(int state) { if (state == Player.STATE_ENDED) { handleTransformationEnded(/* exception= */ null); } } @Override - public void onTimelineChanged(EventTime eventTime, int reason) { + public void onTimelineChanged(Timeline timeline, int reason) { if (progressState != PROGRESS_STATE_WAITING_FOR_AVAILABILITY) { return; } Timeline.Window window = new Timeline.Window(); - eventTime.timeline.getWindow(/* windowIndex= */ 0, window); + timeline.getWindow(/* windowIndex= */ 0, window); if (!window.isPlaceholder) { long durationUs = window.durationUs; // Make progress permanently unavailable if the duration is unknown, so that it doesn't jump @@ -726,7 +724,7 @@ public final class TranscodingTransformer { } @Override - public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { + public void onTracksInfoChanged(TracksInfo tracksInfo) { if (muxerWrapper.getTrackCount() == 0) { handleTransformationEnded( new IllegalStateException( @@ -736,7 +734,7 @@ public final class TranscodingTransformer { } @Override - public void onPlayerError(EventTime eventTime, PlaybackException error) { + public void onPlayerError(PlaybackException error) { handleTransformationEnded(error); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 1a79061f66..0fd763ad26 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -46,7 +46,6 @@ import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.TracksInfo; -import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; @@ -496,7 +495,7 @@ public final class Transformer { .setClock(clock) .build(); player.setMediaItem(mediaItem); - player.addAnalyticsListener(new TransformerAnalyticsListener(mediaItem, muxerWrapper)); + player.addListener(new TransformerPlayerListener(mediaItem, muxerWrapper)); player.prepare(); progressState = PROGRESS_STATE_WAITING_FOR_AVAILABILITY; @@ -606,30 +605,30 @@ public final class Transformer { } } - private final class TransformerAnalyticsListener implements AnalyticsListener { + private final class TransformerPlayerListener implements Player.Listener { private final MediaItem mediaItem; private final MuxerWrapper muxerWrapper; - public TransformerAnalyticsListener(MediaItem mediaItem, MuxerWrapper muxerWrapper) { + public TransformerPlayerListener(MediaItem mediaItem, MuxerWrapper muxerWrapper) { this.mediaItem = mediaItem; this.muxerWrapper = muxerWrapper; } @Override - public void onPlaybackStateChanged(EventTime eventTime, int state) { + public void onPlaybackStateChanged(int state) { if (state == Player.STATE_ENDED) { handleTransformationEnded(/* exception= */ null); } } @Override - public void onTimelineChanged(EventTime eventTime, int reason) { + public void onTimelineChanged(Timeline timeline, int reason) { if (progressState != PROGRESS_STATE_WAITING_FOR_AVAILABILITY) { return; } Timeline.Window window = new Timeline.Window(); - eventTime.timeline.getWindow(/* windowIndex= */ 0, window); + timeline.getWindow(/* windowIndex= */ 0, window); if (!window.isPlaceholder) { long durationUs = window.durationUs; // Make progress permanently unavailable if the duration is unknown, so that it doesn't jump @@ -644,7 +643,7 @@ public final class Transformer { } @Override - public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { + public void onTracksInfoChanged(TracksInfo tracksInfo) { if (muxerWrapper.getTrackCount() == 0) { handleTransformationEnded( new IllegalStateException( @@ -654,7 +653,7 @@ public final class Transformer { } @Override - public void onPlayerError(EventTime eventTime, PlaybackException error) { + public void onPlayerError(PlaybackException error) { handleTransformationEnded(error); } From fa98935c0615efc9432de96c6cd397fa22204ec1 Mon Sep 17 00:00:00 2001 From: kimvde Date: Fri, 29 Oct 2021 16:39:07 +0000 Subject: [PATCH 408/441] WavExtractor: split read stages into states This refactoring is the basis to support RF64 (see Issue: google/ExoPlayer#9543). #minor-release PiperOrigin-RevId: 406377924 --- .../extractor/wav/WavExtractor.java | 148 ++++++++++++------ .../extractor/wav/WavHeaderReader.java | 10 +- 2 files changed, 100 insertions(+), 58 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java index c1dd2a6ddc..97d98b5fcc 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java @@ -19,6 +19,7 @@ import static java.lang.Math.max; import static java.lang.Math.min; import android.util.Pair; +import androidx.annotation.IntDef; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; @@ -34,8 +35,14 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.IOException; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import org.checkerframework.checker.nullness.qual.EnsuresNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** Extracts data from WAV byte streams. */ public final class WavExtractor implements Extractor { @@ -50,13 +57,26 @@ public final class WavExtractor implements Extractor { /** Factory for {@link WavExtractor} instances. */ public static final ExtractorsFactory FACTORY = () -> new Extractor[] {new WavExtractor()}; + /** Parser state. */ + @Documented + @Retention(RetentionPolicy.SOURCE) + @Target({ElementType.TYPE_USE}) + @IntDef({STATE_READING_HEADER, STATE_SKIPPING_TO_SAMPLE_DATA, STATE_READING_SAMPLE_DATA}) + private @interface State {} + + private static final int STATE_READING_HEADER = 0; + private static final int STATE_SKIPPING_TO_SAMPLE_DATA = 1; + private static final int STATE_READING_SAMPLE_DATA = 2; + private @MonotonicNonNull ExtractorOutput extractorOutput; private @MonotonicNonNull TrackOutput trackOutput; + private @State int state; private @MonotonicNonNull OutputWriter outputWriter; private int dataStartPosition; private long dataEndPosition; public WavExtractor() { + state = STATE_READING_HEADER; dataStartPosition = C.POSITION_UNSET; dataEndPosition = C.POSITION_UNSET; } @@ -75,6 +95,7 @@ public final class WavExtractor implements Extractor { @Override public void seek(long position, long timeUs) { + state = position == 0 ? STATE_READING_HEADER : STATE_READING_SAMPLE_DATA; if (outputWriter != null) { outputWriter.reset(timeUs); } @@ -86,59 +107,21 @@ public final class WavExtractor implements Extractor { } @Override + @ReadResult public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { assertInitialized(); - if (outputWriter == null) { - WavHeader header = WavHeaderReader.peek(input); - if (header == null) { - // Should only happen if the media wasn't sniffed. - throw ParserException.createForMalformedContainer( - "Unsupported or unrecognized wav header.", /* cause= */ null); - } - - if (header.formatType == WavUtil.TYPE_IMA_ADPCM) { - outputWriter = new ImaAdPcmOutputWriter(extractorOutput, trackOutput, header); - } else if (header.formatType == WavUtil.TYPE_ALAW) { - outputWriter = - new PassthroughOutputWriter( - extractorOutput, - trackOutput, - header, - MimeTypes.AUDIO_ALAW, - /* pcmEncoding= */ Format.NO_VALUE); - } else if (header.formatType == WavUtil.TYPE_MLAW) { - outputWriter = - new PassthroughOutputWriter( - extractorOutput, - trackOutput, - header, - MimeTypes.AUDIO_MLAW, - /* pcmEncoding= */ Format.NO_VALUE); - } else { - @C.PcmEncoding - int pcmEncoding = WavUtil.getPcmEncodingForType(header.formatType, header.bitsPerSample); - if (pcmEncoding == C.ENCODING_INVALID) { - throw ParserException.createForUnsupportedContainerFeature( - "Unsupported WAV format type: " + header.formatType); - } - outputWriter = - new PassthroughOutputWriter( - extractorOutput, trackOutput, header, MimeTypes.AUDIO_RAW, pcmEncoding); - } + switch (state) { + case STATE_READING_HEADER: + readHeader(input); + return Extractor.RESULT_CONTINUE; + case STATE_SKIPPING_TO_SAMPLE_DATA: + skipToSampleData(input); + return Extractor.RESULT_CONTINUE; + case STATE_READING_SAMPLE_DATA: + return readSampleData(input); + default: + throw new IllegalStateException(); } - - if (dataStartPosition == C.POSITION_UNSET) { - Pair dataBounds = WavHeaderReader.skipToData(input); - dataStartPosition = dataBounds.first.intValue(); - dataEndPosition = dataBounds.second; - outputWriter.init(dataStartPosition, dataEndPosition); - } else if (input.getPosition() == 0) { - input.skipFully(dataStartPosition); - } - - Assertions.checkState(dataEndPosition != C.POSITION_UNSET); - long bytesLeft = dataEndPosition - input.getPosition(); - return outputWriter.sampleData(input, bytesLeft) ? RESULT_END_OF_INPUT : RESULT_CONTINUE; } @EnsuresNonNull({"extractorOutput", "trackOutput"}) @@ -147,6 +130,71 @@ public final class WavExtractor implements Extractor { Util.castNonNull(extractorOutput); } + @RequiresNonNull({"extractorOutput", "trackOutput"}) + private void readHeader(ExtractorInput input) throws IOException { + Assertions.checkState(input.getPosition() == 0); + if (dataStartPosition != C.POSITION_UNSET) { + input.skipFully(dataStartPosition); + state = STATE_READING_SAMPLE_DATA; + return; + } + WavHeader header = WavHeaderReader.peek(input); + if (header == null) { + // Should only happen if the media wasn't sniffed. + throw ParserException.createForMalformedContainer( + "Unsupported or unrecognized wav header.", /* cause= */ null); + } + input.skipFully((int) (input.getPeekPosition() - input.getPosition())); + + if (header.formatType == WavUtil.TYPE_IMA_ADPCM) { + outputWriter = new ImaAdPcmOutputWriter(extractorOutput, trackOutput, header); + } else if (header.formatType == WavUtil.TYPE_ALAW) { + outputWriter = + new PassthroughOutputWriter( + extractorOutput, + trackOutput, + header, + MimeTypes.AUDIO_ALAW, + /* pcmEncoding= */ Format.NO_VALUE); + } else if (header.formatType == WavUtil.TYPE_MLAW) { + outputWriter = + new PassthroughOutputWriter( + extractorOutput, + trackOutput, + header, + MimeTypes.AUDIO_MLAW, + /* pcmEncoding= */ Format.NO_VALUE); + } else { + @C.PcmEncoding + int pcmEncoding = WavUtil.getPcmEncodingForType(header.formatType, header.bitsPerSample); + if (pcmEncoding == C.ENCODING_INVALID) { + throw ParserException.createForUnsupportedContainerFeature( + "Unsupported WAV format type: " + header.formatType); + } + outputWriter = + new PassthroughOutputWriter( + extractorOutput, trackOutput, header, MimeTypes.AUDIO_RAW, pcmEncoding); + } + state = STATE_SKIPPING_TO_SAMPLE_DATA; + } + + private void skipToSampleData(ExtractorInput input) throws IOException { + Pair dataBounds = WavHeaderReader.skipToSampleData(input); + dataStartPosition = dataBounds.first.intValue(); + dataEndPosition = dataBounds.second; + Assertions.checkNotNull(outputWriter).init(dataStartPosition, dataEndPosition); + state = STATE_READING_SAMPLE_DATA; + } + + @ReadResult + private int readSampleData(ExtractorInput input) throws IOException { + Assertions.checkState(dataEndPosition != C.POSITION_UNSET); + long bytesLeft = dataEndPosition - input.getPosition(); + return Assertions.checkNotNull(outputWriter).sampleData(input, bytesLeft) + ? RESULT_END_OF_INPUT + : RESULT_CONTINUE; + } + /** Writes to the extractor's output. */ private interface OutputWriter { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java index f794933d16..147fba9c53 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java @@ -108,7 +108,7 @@ import java.io.IOException; * @throws ParserException If an error occurs parsing chunks. * @throws IOException If reading from the input fails. */ - public static Pair skipToData(ExtractorInput input) throws IOException { + public static Pair skipToSampleData(ExtractorInput input) throws IOException { Assertions.checkNotNull(input); // Make sure the peek position is set to the read position before we peek the first header. @@ -118,14 +118,8 @@ import java.io.IOException; // Skip all chunks until we find the data header. ChunkHeader chunkHeader = ChunkHeader.peek(input, scratch); while (chunkHeader.id != WavUtil.DATA_FOURCC) { - if (chunkHeader.id != WavUtil.RIFF_FOURCC && chunkHeader.id != WavUtil.FMT_FOURCC) { - Log.w(TAG, "Ignoring unknown WAV chunk: " + chunkHeader.id); - } + Log.w(TAG, "Ignoring unknown WAV chunk: " + chunkHeader.id); long bytesToSkip = ChunkHeader.SIZE_IN_BYTES + chunkHeader.size; - // Override size of RIFF chunk, since it describes its size as the entire file. - if (chunkHeader.id == WavUtil.RIFF_FOURCC) { - bytesToSkip = ChunkHeader.SIZE_IN_BYTES + 4; - } if (bytesToSkip > Integer.MAX_VALUE) { throw ParserException.createForUnsupportedContainerFeature( "Chunk is too large (~2GB+) to skip; id: " + chunkHeader.id); From c53924326dd100874d080c55812659a3cb9e843a Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Fri, 29 Oct 2021 17:16:01 +0000 Subject: [PATCH 409/441] GL: Make ProjectionRenderer's GL Program @MonotonicNonNull. PiperOrigin-RevId: 406385758 --- .../video/spherical/ProjectionRenderer.java | 8 ++--- .../video/spherical/SceneRenderer.java | 2 +- .../transformer/TranscodingTransformer.java | 29 +++++++++++++++++++ .../transformer/Transformation.java | 3 ++ .../exoplayer2/transformer/Transformer.java | 2 ++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java index f313225fc6..692b7e687e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java @@ -24,6 +24,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.util.GlUtil; import java.nio.FloatBuffer; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** * Utility class to render spherical meshes for video or images. Call {@link #init()} on the GL @@ -93,9 +94,9 @@ import java.nio.FloatBuffer; private int stereoMode; @Nullable private MeshData leftMeshData; @Nullable private MeshData rightMeshData; - @Nullable private GlUtil.Program program; + private GlUtil.@MonotonicNonNull Program program; - // Program related GL items. These are only valid if program is non-null. + // Program related GL items. These are only valid if Program is valid. private int mvpMatrixHandle; private int uTexMatrixHandle; private int positionHandle; @@ -195,11 +196,10 @@ import java.nio.FloatBuffer; GLES20.glDisableVertexAttribArray(texCoordsHandle); } - /** Cleans up the GL resources. */ + /** Cleans up GL resources. */ /* package */ void shutdown() { if (program != null) { program.delete(); - program = null; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/SceneRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/SceneRenderer.java index dcc15d1fed..0fcff23c5e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/SceneRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/SceneRenderer.java @@ -129,7 +129,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; projectionRenderer.draw(textureId, tempMatrix, rightEye); } - /** Cleans up the GL resources. */ + /** Cleans up GL resources. */ public void shutdown() { projectionRenderer.shutdown(); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 6f58812be4..348f3dac04 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -55,6 +55,7 @@ import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.util.Clock; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener; @@ -91,12 +92,16 @@ public final class TranscodingTransformer { /** A builder for {@link TranscodingTransformer} instances. */ public static final class Builder { + // Mandatory field. private @MonotonicNonNull Context context; + + // Optional fields. private @MonotonicNonNull MediaSourceFactory mediaSourceFactory; private Muxer.Factory muxerFactory; private boolean removeAudio; private boolean removeVideo; private boolean flattenForSlowMotion; + private int outputHeight; private String outputMimeType; @Nullable private String audioMimeType; @Nullable private String videoMimeType; @@ -121,6 +126,7 @@ public final class TranscodingTransformer { this.removeAudio = transcodingTransformer.transformation.removeAudio; this.removeVideo = transcodingTransformer.transformation.removeVideo; this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; + this.outputHeight = transcodingTransformer.transformation.outputHeight; this.outputMimeType = transcodingTransformer.transformation.outputMimeType; this.audioMimeType = transcodingTransformer.transformation.audioMimeType; this.videoMimeType = transcodingTransformer.transformation.videoMimeType; @@ -213,6 +219,21 @@ public final class TranscodingTransformer { return this; } + /** + * Sets the output resolution for the video, using the output height. The default value is to + * use the same height as the input. Output width will scale to preserve the input video's + * aspect ratio. + * + *

                  For example, a 1920x1440 video can be scaled to 640x480 by calling setResolution(480). + * + * @param outputHeight The output height for the video, in pixels. + * @return This builder. + */ + public Builder setResolution(int outputHeight) { + this.outputHeight = outputHeight; + return this; + } + /** * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported * values are: @@ -356,6 +377,12 @@ public final class TranscodingTransformer { checkState( muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); + // TODO(ME): Test with values of 10, 100, 1000). + Log.e("TranscodingTransformer", "outputHeight = " + outputHeight); + if (outputHeight == 0) { + // TODO(ME): get output height from input video. + outputHeight = 480; + } if (audioMimeType != null) { checkSampleMimeType(audioMimeType); } @@ -367,6 +394,7 @@ public final class TranscodingTransformer { removeAudio, removeVideo, flattenForSlowMotion, + outputHeight, outputMimeType, audioMimeType, videoMimeType); @@ -453,6 +481,7 @@ public final class TranscodingTransformer { checkState( !transformation.removeAudio || !transformation.removeVideo, "Audio and video cannot both be removed."); + checkState(!(transformation.removeVideo)); this.context = context; this.mediaSourceFactory = mediaSourceFactory; this.muxerFactory = muxerFactory; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java index e273c1fde5..ed8bf64bf3 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java @@ -24,6 +24,7 @@ import androidx.annotation.Nullable; public final boolean removeAudio; public final boolean removeVideo; public final boolean flattenForSlowMotion; + public final int outputHeight; public final String outputMimeType; @Nullable public final String audioMimeType; @Nullable public final String videoMimeType; @@ -32,12 +33,14 @@ import androidx.annotation.Nullable; boolean removeAudio, boolean removeVideo, boolean flattenForSlowMotion, + int outputHeight, String outputMimeType, @Nullable String audioMimeType, @Nullable String videoMimeType) { this.removeAudio = removeAudio; this.removeVideo = removeVideo; this.flattenForSlowMotion = flattenForSlowMotion; + this.outputHeight = outputHeight; this.outputMimeType = outputMimeType; this.audioMimeType = audioMimeType; this.videoMimeType = videoMimeType; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 0fd763ad26..093f63caeb 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -297,11 +297,13 @@ public final class Transformer { checkState( muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); + int outputHeight = 0; // TODO(ME): How do we get the input height here? Transformation transformation = new Transformation( removeAudio, removeVideo, flattenForSlowMotion, + outputHeight, outputMimeType, /* audioMimeType= */ null, /* videoMimeType= */ null); From 4c40e80da60547b9ccfd53cc22ce7a29586d1202 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 1 Nov 2021 10:06:02 +0000 Subject: [PATCH 410/441] Remove unecessary warning suppression in PlaybackException PiperOrigin-RevId: 406783965 --- .../java/com/google/android/exoplayer2/PlaybackException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java index 335dcf2612..b643530678 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java @@ -423,7 +423,6 @@ public class PlaybackException extends Exception implements Bundleable { protected static final int FIELD_CUSTOM_ID_BASE = 1000; /** Object that can create a {@link PlaybackException} from a {@link Bundle}. */ - @SuppressWarnings("unchecked") public static final Creator CREATOR = PlaybackException::new; @CallSuper From 4e6960ee168c73c3c9a5647d0a18fda3af676c49 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 10:23:58 +0000 Subject: [PATCH 411/441] Add large renderer position offset. This helps to prevent issues where decoders can't handle negative timestamps. In particular it avoids issues when the media accidentally or intentionally starts with small negative timestamps. But it also helps to prevent other renderer resets at a later point, for example if a live stream with a large start offset is enqueued in the playlist. #minor-release PiperOrigin-RevId: 406786977 --- .../exoplayer2/ExoPlayerImplInternal.java | 9 +-- .../android/exoplayer2/MediaPeriodQueue.java | 24 +++++++- .../exoplayer2/MediaPeriodQueueTest.java | 47 ++++++++++----- .../transformer/TransformerAudioRenderer.java | 1 + .../transformer/TransformerBaseRenderer.java | 7 +++ .../TransformerMuxingVideoRenderer.java | 1 + .../TransformerTranscodingVideoRenderer.java | 1 + .../mka/bear-flac-16bit.mka.audiosink.dump | 58 +++++++++---------- .../mka/bear-flac-24bit.mka.audiosink.dump | 58 +++++++++---------- 9 files changed, 127 insertions(+), 79 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 30085aeb9a..9fadb56a79 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1266,7 +1266,8 @@ import java.util.concurrent.atomic.AtomicBoolean; queue.advancePlayingPeriod(); } queue.removeAfter(newPlayingPeriodHolder); - newPlayingPeriodHolder.setRendererOffset(/* rendererPositionOffsetUs= */ 0); + newPlayingPeriodHolder.setRendererOffset( + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US); enableRenderers(); } } @@ -1299,7 +1300,7 @@ import java.util.concurrent.atomic.AtomicBoolean; MediaPeriodHolder playingMediaPeriod = queue.getPlayingPeriod(); rendererPositionUs = playingMediaPeriod == null - ? periodPositionUs + ? MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + periodPositionUs : playingMediaPeriod.toRendererTime(periodPositionUs); mediaClock.resetPosition(rendererPositionUs); for (Renderer renderer : renderers) { @@ -1375,7 +1376,7 @@ import java.util.concurrent.atomic.AtomicBoolean; pendingRecoverableRendererError = null; isRebuffering = false; mediaClock.stop(); - rendererPositionUs = 0; + rendererPositionUs = MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US; for (Renderer renderer : renderers) { try { disableRenderer(renderer); @@ -1963,7 +1964,7 @@ import java.util.concurrent.atomic.AtomicBoolean; emptyTrackSelectorResult); mediaPeriodHolder.mediaPeriod.prepare(this, info.startPositionUs); if (queue.getPlayingPeriod() == mediaPeriodHolder) { - resetRendererPosition(mediaPeriodHolder.getStartPositionRendererTime()); + resetRendererPosition(info.startPositionUs); } handleLoadingMediaPeriodChanged(/* loadingTrackSelectionChanged= */ false); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java index 18b258d779..f00ca859f1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java @@ -37,6 +37,26 @@ import com.google.common.collect.ImmutableList; */ /* package */ final class MediaPeriodQueue { + /** + * Initial renderer position offset used for the first item in the queue, in microseconds. + * + *

                  Choosing a positive value, larger than any reasonable single media duration, ensures three + * things: + * + *

                    + *
                  • Media that accidentally or intentionally starts with small negative timestamps doesn't + * send samples with negative timestamps to decoders. This makes rendering more robust as + * many decoders are known to have problems with negative timestamps. + *
                  • Enqueueing media after the initial item with a non-zero start offset (e.g. content after + * ad breaks or live streams) is virtually guaranteed to stay in the positive timestamp + * range even when seeking back. This prevents renderer resets that are required if the + * allowed timestamp range may become negative. + *
                  • Choosing a large value with zeros at all relevant digits simplifies debugging as the + * original timestamp of the media is still visible. + *
                  + */ + public static final long INITIAL_RENDERER_POSITION_OFFSET_US = 1_000_000_000_000L; + /** * Limits the maximum number of periods to buffer ahead of the current playing period. The * buffering policy normally prevents buffering too far ahead, but the policy could allow too many @@ -163,9 +183,7 @@ import com.google.common.collect.ImmutableList; TrackSelectorResult emptyTrackSelectorResult) { long rendererPositionOffsetUs = loading == null - ? (info.id.isAd() && info.requestedContentPositionUs != C.TIME_UNSET - ? info.requestedContentPositionUs - : 0) + ? INITIAL_RENDERER_POSITION_OFFSET_US : (loading.getRendererOffset() + loading.info.durationUs - info.startPositionUs); MediaPeriodHolder newPeriodHolder = new MediaPeriodHolder( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java index 635167e658..53bc87e5e6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java @@ -493,10 +493,13 @@ public final class MediaPeriodQueueTest { // Change position of first ad (= change duration of playing content before first ad). updateAdPlaybackStateAndTimeline(/* adGroupTimesUs...= */ FIRST_AD_START_TIME_US - 2000); setAdGroupLoaded(/* adGroupIndex= */ 0); - long maxRendererReadPositionUs = FIRST_AD_START_TIME_US - 3000; + long maxRendererReadPositionUs = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + FIRST_AD_START_TIME_US - 3000; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( - playbackInfo.timeline, /* rendererPositionUs= */ 0, maxRendererReadPositionUs); + playbackInfo.timeline, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, + maxRendererReadPositionUs); assertThat(changeHandled).isTrue(); assertThat(getQueueLength()).isEqualTo(1); @@ -518,10 +521,13 @@ public final class MediaPeriodQueueTest { // Change position of first ad (= change duration of playing content before first ad). updateAdPlaybackStateAndTimeline(/* adGroupTimesUs...= */ FIRST_AD_START_TIME_US - 2000); setAdGroupLoaded(/* adGroupIndex= */ 0); - long maxRendererReadPositionUs = FIRST_AD_START_TIME_US - 1000; + long maxRendererReadPositionUs = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + FIRST_AD_START_TIME_US - 1000; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( - playbackInfo.timeline, /* rendererPositionUs= */ 0, maxRendererReadPositionUs); + playbackInfo.timeline, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, + maxRendererReadPositionUs); assertThat(changeHandled).isFalse(); assertThat(getQueueLength()).isEqualTo(1); @@ -552,10 +558,13 @@ public final class MediaPeriodQueueTest { .withIsServerSideInserted(/* adGroupIndex= */ 0, /* isServerSideInserted= */ true); updateTimeline(); setAdGroupLoaded(/* adGroupIndex= */ 0); - long maxRendererReadPositionUs = FIRST_AD_START_TIME_US - 1000; + long maxRendererReadPositionUs = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + FIRST_AD_START_TIME_US - 1000; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( - playbackInfo.timeline, /* rendererPositionUs= */ 0, maxRendererReadPositionUs); + playbackInfo.timeline, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, + maxRendererReadPositionUs); assertThat(changeHandled).isTrue(); assertThat(getQueueLength()).isEqualTo(1); @@ -583,7 +592,9 @@ public final class MediaPeriodQueueTest { setAdGroupLoaded(/* adGroupIndex= */ 1); boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( - playbackInfo.timeline, /* rendererPositionUs= */ 0, /* maxRendererReadPositionUs= */ 0); + playbackInfo.timeline, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, + /* maxRendererReadPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US); assertThat(changeHandled).isTrue(); assertThat(getQueueLength()).isEqualTo(3); @@ -608,11 +619,13 @@ public final class MediaPeriodQueueTest { /* adGroupTimesUs...= */ FIRST_AD_START_TIME_US, SECOND_AD_START_TIME_US - 1000); setAdGroupLoaded(/* adGroupIndex= */ 0); setAdGroupLoaded(/* adGroupIndex= */ 1); + long maxRendererReadPositionUs = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + FIRST_AD_START_TIME_US; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( playbackInfo.timeline, - /* rendererPositionUs= */ 0, - /* maxRendererReadPositionUs= */ FIRST_AD_START_TIME_US); + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, + maxRendererReadPositionUs); assertThat(changeHandled).isFalse(); assertThat(getQueueLength()).isEqualTo(3); @@ -636,11 +649,14 @@ public final class MediaPeriodQueueTest { /* adGroupTimesUs...= */ FIRST_AD_START_TIME_US, SECOND_AD_START_TIME_US - 1000); setAdGroupLoaded(/* adGroupIndex= */ 0); setAdGroupLoaded(/* adGroupIndex= */ 1); - long readingPositionAtStartOfContentBetweenAds = FIRST_AD_START_TIME_US + AD_DURATION_US; + long readingPositionAtStartOfContentBetweenAds = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + + FIRST_AD_START_TIME_US + + AD_DURATION_US; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( playbackInfo.timeline, - /* rendererPositionUs= */ 0, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, /* maxRendererReadPositionUs= */ readingPositionAtStartOfContentBetweenAds); assertThat(changeHandled).isTrue(); @@ -665,11 +681,14 @@ public final class MediaPeriodQueueTest { /* adGroupTimesUs...= */ FIRST_AD_START_TIME_US, SECOND_AD_START_TIME_US - 1000); setAdGroupLoaded(/* adGroupIndex= */ 0); setAdGroupLoaded(/* adGroupIndex= */ 1); - long readingPositionAtEndOfContentBetweenAds = SECOND_AD_START_TIME_US + AD_DURATION_US; + long readingPositionAtEndOfContentBetweenAds = + MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US + + SECOND_AD_START_TIME_US + + AD_DURATION_US; boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( playbackInfo.timeline, - /* rendererPositionUs= */ 0, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, /* maxRendererReadPositionUs= */ readingPositionAtEndOfContentBetweenAds); assertThat(changeHandled).isFalse(); @@ -697,7 +716,7 @@ public final class MediaPeriodQueueTest { boolean changeHandled = mediaPeriodQueue.updateQueuedPeriods( playbackInfo.timeline, - /* rendererPositionUs= */ 0, + /* rendererPositionUs= */ MediaPeriodQueue.INITIAL_RENDERER_POSITION_OFFSET_US, /* maxRendererReadPositionUs= */ C.TIME_END_OF_SOURCE); assertThat(changeHandled).isFalse(); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 02248296d0..8da9dcd2e1 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -279,6 +279,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; int result = readSource(getFormatHolder(), decoderInputBuffer, /* readFlags= */ 0); switch (result) { case C.RESULT_BUFFER_READ: + decoderInputBuffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), decoderInputBuffer.timeUs); decoderInputBuffer.flip(); decoder.queueInputBuffer(decoderInputBuffer); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java index e0ceb945fc..6e19f0b9f9 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.util.MimeTypes; protected final Transformation transformation; protected boolean isRendererStarted; + protected long streamOffsetUs; public TransformerBaseRenderer( int trackType, @@ -46,6 +47,12 @@ import com.google.android.exoplayer2.util.MimeTypes; this.transformation = transformation; } + @Override + protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) + throws ExoPlaybackException { + this.streamOffsetUs = offsetUs; + } + @Override @C.FormatSupport public final int supportsFormat(Format format) { diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java index 0be02ecdee..d14378754e 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java @@ -117,6 +117,7 @@ import java.nio.ByteBuffer; muxerWrapper.endTrack(getTrackType()); return false; } + buffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), buffer.timeUs); ByteBuffer data = checkNotNull(buffer.data); data.flip(); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index b04490152b..931e985a5d 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -320,6 +320,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; case C.RESULT_FORMAT_READ: throw new IllegalStateException("Format changes are not supported."); case C.RESULT_BUFFER_READ: + decoderInputBuffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), decoderInputBuffer.timeUs); ByteBuffer data = checkNotNull(decoderInputBuffer.data); data.flip(); diff --git a/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-16bit.mka.audiosink.dump b/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-16bit.mka.audiosink.dump index 044cde306c..b7319b872b 100644 --- a/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-16bit.mka.audiosink.dump +++ b/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-16bit.mka.audiosink.dump @@ -3,89 +3,89 @@ config: channelCount = 2 sampleRate = 48000 buffer: - time = 1000 + time = 1000000001000 data = 1217833679 buffer: - time = 97000 + time = 1000000097000 data = 558614672 buffer: - time = 193000 + time = 1000000193000 data = -709714787 buffer: - time = 289000 + time = 1000000289000 data = 1367870571 buffer: - time = 385000 + time = 1000000385000 data = -141229457 buffer: - time = 481000 + time = 1000000481000 data = 1287758361 buffer: - time = 577000 + time = 1000000577000 data = 1125289147 buffer: - time = 673000 + time = 1000000673000 data = -1677383475 buffer: - time = 769000 + time = 1000000769000 data = 2130742861 buffer: - time = 865000 + time = 1000000865000 data = -1292320253 buffer: - time = 961000 + time = 1000000961000 data = -456587163 buffer: - time = 1057000 + time = 1000001057000 data = 748981534 buffer: - time = 1153000 + time = 1000001153000 data = 1550456016 buffer: - time = 1249000 + time = 1000001249000 data = 1657906039 buffer: - time = 1345000 + time = 1000001345000 data = -762677083 buffer: - time = 1441000 + time = 1000001441000 data = -1343810763 buffer: - time = 1537000 + time = 1000001537000 data = 1137318783 buffer: - time = 1633000 + time = 1000001633000 data = -1891318229 buffer: - time = 1729000 + time = 1000001729000 data = -472068495 buffer: - time = 1825000 + time = 1000001825000 data = 832315001 buffer: - time = 1921000 + time = 1000001921000 data = 2054935175 buffer: - time = 2017000 + time = 1000002017000 data = 57921641 buffer: - time = 2113000 + time = 1000002113000 data = 2132759067 buffer: - time = 2209000 + time = 1000002209000 data = -1742540521 buffer: - time = 2305000 + time = 1000002305000 data = 1657024301 buffer: - time = 2401000 + time = 1000002401000 data = -585080145 buffer: - time = 2497000 + time = 1000002497000 data = 427271397 buffer: - time = 2593000 + time = 1000002593000 data = -364201340 buffer: - time = 2689000 + time = 1000002689000 data = -627965287 diff --git a/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-24bit.mka.audiosink.dump b/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-24bit.mka.audiosink.dump index 319ee311f0..f425e7e2f2 100644 --- a/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-24bit.mka.audiosink.dump +++ b/testdata/src/test/assets/audiosinkdumps/mka/bear-flac-24bit.mka.audiosink.dump @@ -3,89 +3,89 @@ config: channelCount = 2 sampleRate = 48000 buffer: - time = 0 + time = 1000000000000 data = 225023649 buffer: - time = 96000 + time = 1000000096000 data = 455106306 buffer: - time = 192000 + time = 1000000192000 data = 2025727297 buffer: - time = 288000 + time = 1000000288000 data = 758514657 buffer: - time = 384000 + time = 1000000384000 data = 1044986473 buffer: - time = 480000 + time = 1000000480000 data = -2030029695 buffer: - time = 576000 + time = 1000000576000 data = 1907053281 buffer: - time = 672000 + time = 1000000672000 data = -1974954431 buffer: - time = 768000 + time = 1000000768000 data = -206248383 buffer: - time = 864000 + time = 1000000864000 data = 1484984417 buffer: - time = 960000 + time = 1000000960000 data = -1306117439 buffer: - time = 1056000 + time = 1000001056000 data = 692829792 buffer: - time = 1152000 + time = 1000001152000 data = 1070563058 buffer: - time = 1248000 + time = 1000001248000 data = -1444096479 buffer: - time = 1344000 + time = 1000001344000 data = 1753016419 buffer: - time = 1440000 + time = 1000001440000 data = 1947797953 buffer: - time = 1536000 + time = 1000001536000 data = 266121411 buffer: - time = 1632000 + time = 1000001632000 data = 1275494369 buffer: - time = 1728000 + time = 1000001728000 data = 372077825 buffer: - time = 1824000 + time = 1000001824000 data = -993079679 buffer: - time = 1920000 + time = 1000001920000 data = 177307937 buffer: - time = 2016000 + time = 1000002016000 data = 2037083009 buffer: - time = 2112000 + time = 1000002112000 data = -435776287 buffer: - time = 2208000 + time = 1000002208000 data = 1867447329 buffer: - time = 2304000 + time = 1000002304000 data = 1884495937 buffer: - time = 2400000 + time = 1000002400000 data = -804673375 buffer: - time = 2496000 + time = 1000002496000 data = -588531007 buffer: - time = 2592000 + time = 1000002592000 data = -1064642970 buffer: - time = 2688000 + time = 1000002688000 data = -1771406207 From f0be0931404b14092db118557569b9465c3e15ba Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 1 Nov 2021 10:42:22 +0000 Subject: [PATCH 412/441] Upgrade gradle plugin version PiperOrigin-RevId: 406789671 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 055e3cdaff..d362ff785b 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0' + classpath 'com.android.tools.build:gradle:7.0.3' classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.2' } } From 3f4cde1873cd1d06b163c894bb9ae842e0647ac5 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 1 Nov 2021 11:13:15 +0000 Subject: [PATCH 413/441] Add TYPE_USE to IntDefs used in the media3 stable API This allows the use of the intdef in parameterized types, e.g. List<@MyIntDef Integer> For IntDefs that are already released in ExoPlayer 2.15.1 we add TYPE_USE in addition to all other reasonable targets, to maintain backwards compatibility with Kotlin code (where an incorrectly positioned annotation is a compilation failure). 'reasonable targets' includes FIELD, METHOD, PARAMETER and LOCAL_VARIABLE but not TYPE, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE or MODULE. TYPE_PARAMETER is implied by TYPE_USE. For not-yet-released IntDefs we just add TYPE_USE. #minor-release PiperOrigin-RevId: 406793413 --- .../java/com/google/android/exoplayer2/C.java | 17 +++++++++++++++-- .../android/exoplayer2/MediaMetadata.java | 9 +++++++++ .../android/exoplayer2/PlaybackException.java | 8 ++++++++ .../com/google/android/exoplayer2/Player.java | 16 ++++++++++++++++ .../com/google/android/exoplayer2/text/Cue.java | 11 +++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index a779729bd9..7c26b57600 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -15,6 +15,12 @@ */ package com.google.android.exoplayer2; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; + import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFormat; @@ -29,7 +35,6 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.errorprone.annotations.InlineMe; import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -126,6 +131,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target(TYPE_USE) @IntDef( open = true, value = { @@ -306,6 +312,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ CONTENT_TYPE_MOVIE, CONTENT_TYPE_MUSIC, @@ -334,6 +341,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef( flag = true, value = {FLAG_AUDIBILITY_ENFORCED}) @@ -354,6 +362,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ USAGE_ALARM, USAGE_ASSISTANCE_ACCESSIBILITY, @@ -422,6 +431,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ALLOW_CAPTURE_BY_ALL, ALLOW_CAPTURE_BY_NONE, ALLOW_CAPTURE_BY_SYSTEM}) public @interface AudioAllowedCapturePolicy {} /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_ALL}. */ @@ -565,6 +575,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef( flag = true, value = {SELECTION_FLAG_DEFAULT, SELECTION_FLAG_FORCED, SELECTION_FLAG_AUTOSELECT}) @@ -680,7 +691,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) - @Target({ElementType.TYPE_USE}) + @Target(TYPE_USE) @IntDef( open = true, value = { @@ -976,6 +987,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({WAKE_MODE_NONE, WAKE_MODE_LOCAL, WAKE_MODE_NETWORK}) public @interface WakeMode {} /** @@ -1012,6 +1024,7 @@ public final class C { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef( flag = true, value = { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java index 4dad2da4c3..3df88a5aa9 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java @@ -15,6 +15,12 @@ */ package com.google.android.exoplayer2; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; + import android.net.Uri; import android.os.Bundle; import androidx.annotation.IntDef; @@ -26,6 +32,7 @@ import com.google.common.base.Objects; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.Arrays; import java.util.List; @@ -500,6 +507,7 @@ public final class MediaMetadata implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ FOLDER_TYPE_NONE, FOLDER_TYPE_MIXED, @@ -537,6 +545,7 @@ public final class MediaMetadata implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ PICTURE_TYPE_OTHER, PICTURE_TYPE_FILE_ICON, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java index b643530678..0adea0535a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java @@ -15,6 +15,12 @@ */ package com.google.android.exoplayer2; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; + import android.net.ConnectivityManager; import android.os.Bundle; import android.os.RemoteException; @@ -28,6 +34,7 @@ import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** Thrown when a non locally recoverable playback failure occurs. */ public class PlaybackException extends Exception implements Bundleable { @@ -40,6 +47,7 @@ public class PlaybackException extends Exception implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef( open = true, value = { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 5c60097eb0..08bfbe9016 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -15,6 +15,12 @@ */ package com.google.android.exoplayer2; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; + import android.os.Bundle; import android.os.Looper; import android.view.Surface; @@ -40,6 +46,7 @@ import com.google.common.base.Objects; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.ArrayList; import java.util.List; @@ -1079,6 +1086,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED}) @interface State {} /** The player is idle, and must be {@link #prepare() prepared} before it will play the media. */ @@ -1107,6 +1115,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, @@ -1133,6 +1142,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS @@ -1149,6 +1159,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({REPEAT_MODE_OFF, REPEAT_MODE_ONE, REPEAT_MODE_ALL}) @interface RepeatMode {} /** @@ -1180,6 +1191,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_SEEK, @@ -1218,6 +1230,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE}) @interface TimelineChangeReason {} /** Timeline changed as a result of a change of the playlist items or the order of the items. */ @@ -1238,6 +1251,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_AUTO, @@ -1270,6 +1284,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ EVENT_TIMELINE_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, @@ -1355,6 +1370,7 @@ public interface Player { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ COMMAND_INVALID, COMMAND_PLAY_PAUSE, diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java b/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java index 66ab2f3682..0ef89f9b0b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java @@ -15,6 +15,12 @@ */ package com.google.android.exoplayer2.text; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; + import android.graphics.Bitmap; import android.graphics.Color; import android.os.Bundle; @@ -32,6 +38,7 @@ import com.google.common.base.Objects; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import org.checkerframework.dataflow.qual.Pure; /** Contains information about a specific cue, including textual content and formatting data. */ @@ -53,6 +60,7 @@ public final class Cue implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({TYPE_UNSET, ANCHOR_TYPE_START, ANCHOR_TYPE_MIDDLE, ANCHOR_TYPE_END}) public @interface AnchorType {} @@ -80,6 +88,7 @@ public final class Cue implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({TYPE_UNSET, LINE_TYPE_FRACTION, LINE_TYPE_NUMBER}) public @interface LineType {} @@ -96,6 +105,7 @@ public final class Cue implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ TYPE_UNSET, TEXT_SIZE_TYPE_FRACTIONAL, @@ -119,6 +129,7 @@ public final class Cue implements Bundleable { */ @Documented @Retention(RetentionPolicy.SOURCE) + @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @IntDef({ TYPE_UNSET, VERTICAL_TYPE_RL, From 56b589c422c51dd704f72e3f1a741cb91e4c9e8c Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 1 Nov 2021 12:29:21 +0000 Subject: [PATCH 414/441] Re-position IntDefs in media3 stable API These IntDefs are now annotated with TYPE_USE [1], so they can be moved to directly before the type (int). [1] Since PiperOrigin-RevId: 406803555 --- .../main/java/com/google/android/exoplayer2/Format.java | 8 ++++---- .../java/com/google/android/exoplayer2/MediaItem.java | 8 ++++---- .../java/com/google/android/exoplayer2/MediaMetadata.java | 4 ++-- .../com/google/android/exoplayer2/PlaybackException.java | 2 +- .../main/java/com/google/android/exoplayer2/Player.java | 6 ++---- .../main/java/com/google/android/exoplayer2/text/Cue.java | 8 ++++---- .../trackselection/TrackSelectionParameters.java | 8 ++++---- 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java index 909c759c85..c21e68c886 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java @@ -128,8 +128,8 @@ public final class Format implements Bundleable { @Nullable private String id; @Nullable private String label; @Nullable private String language; - @C.SelectionFlags private int selectionFlags; - @C.RoleFlags private int roleFlags; + private @C.SelectionFlags int selectionFlags; + private @C.RoleFlags int roleFlags; private int averageBitrate; private int peakBitrate; @Nullable private String codecs; @@ -620,9 +620,9 @@ public final class Format implements Bundleable { /** The language as an IETF BCP 47 conformant tag, or null if unknown or not applicable. */ @Nullable public final String language; /** Track selection flags. */ - @C.SelectionFlags public final int selectionFlags; + public final @C.SelectionFlags int selectionFlags; /** Track role flags. */ - @C.RoleFlags public final int roleFlags; + public final @C.RoleFlags int roleFlags; /** * The average bitrate in bits per second, or {@link #NO_VALUE} if unknown or not applicable. The * way in which this field is populated depends on the type of media to which the format diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index 7b4ed43d38..b18c52018e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -1235,8 +1235,8 @@ public final class MediaItem implements Bundleable { private Uri uri; @Nullable private String mimeType; @Nullable private String language; - @C.SelectionFlags private int selectionFlags; - @C.RoleFlags private int roleFlags; + private @C.SelectionFlags int selectionFlags; + private @C.RoleFlags int roleFlags; @Nullable private String label; /** @@ -1310,9 +1310,9 @@ public final class MediaItem implements Bundleable { /** The language. */ @Nullable public final String language; /** The selection flags. */ - @C.SelectionFlags public final int selectionFlags; + public final @C.SelectionFlags int selectionFlags; /** The role flags. */ - @C.RoleFlags public final int roleFlags; + public final @C.RoleFlags int roleFlags; /** The label. */ @Nullable public final String label; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java index 3df88a5aa9..f0c1243e09 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java @@ -623,7 +623,7 @@ public final class MediaMetadata implements Bundleable { /** Optional artwork data as a compressed byte array. */ @Nullable public final byte[] artworkData; /** Optional {@link PictureType} of the artwork data. */ - @Nullable @PictureType public final Integer artworkDataType; + @Nullable public final @PictureType Integer artworkDataType; /** Optional artwork {@link Uri}. */ @Nullable public final Uri artworkUri; /** Optional track number. */ @@ -631,7 +631,7 @@ public final class MediaMetadata implements Bundleable { /** Optional total number of tracks. */ @Nullable public final Integer totalTrackCount; /** Optional {@link FolderType}. */ - @Nullable @FolderType public final Integer folderType; + @Nullable public final @FolderType Integer folderType; /** Optional boolean for media playability. */ @Nullable public final Boolean isPlayable; /** @deprecated Use {@link #recordingYear} instead. */ diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java index 0adea0535a..febb938fdb 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java @@ -320,7 +320,7 @@ public class PlaybackException extends Exception implements Bundleable { } /** An error code which identifies the cause of the playback failure. */ - @ErrorCode public final int errorCode; + public final @ErrorCode int errorCode; /** The value of {@link SystemClock#elapsedRealtime()} when this exception was created. */ public final long timestampMs; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Player.java b/library/common/src/main/java/com/google/android/exoplayer2/Player.java index 08bfbe9016..b6222596a7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/Player.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/Player.java @@ -454,8 +454,7 @@ public interface Player { * @return The {@link Event} at the given index. * @throws IndexOutOfBoundsException If index is outside the allowed range. */ - @Event - public int get(int index) { + public @Event int get(int index) { return flags.get(index); } @@ -870,8 +869,7 @@ public interface Player { * @return The {@link Command} at the given index. * @throws IndexOutOfBoundsException If index is outside the allowed range. */ - @Command - public int get(int index) { + public @Command int get(int index) { return flags.get(index); } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java b/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java index 0ef89f9b0b..a386580f3d 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java @@ -556,16 +556,16 @@ public final class Cue implements Bundleable { @Nullable private Alignment multiRowAlignment; private float line; @LineType private int lineType; - @AnchorType private int lineAnchor; + private @AnchorType int lineAnchor; private float position; - @AnchorType private int positionAnchor; - @TextSizeType private int textSizeType; + private @AnchorType int positionAnchor; + private @TextSizeType int textSizeType; private float textSize; private float size; private float bitmapHeight; private boolean windowColorSet; @ColorInt private int windowColor; - @VerticalType private int verticalType; + private @VerticalType int verticalType; private float shearDegrees; public Builder() { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java index 738cf74e2b..8080451246 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java @@ -82,13 +82,13 @@ public class TrackSelectionParameters implements Bundleable { private ImmutableList preferredVideoMimeTypes; // Audio private ImmutableList preferredAudioLanguages; - @C.RoleFlags private int preferredAudioRoleFlags; + private @C.RoleFlags int preferredAudioRoleFlags; private int maxAudioChannelCount; private int maxAudioBitrate; private ImmutableList preferredAudioMimeTypes; // Text private ImmutableList preferredTextLanguages; - @C.RoleFlags private int preferredTextRoleFlags; + private @C.RoleFlags int preferredTextRoleFlags; private boolean selectUndeterminedTextLanguage; // General private boolean forceLowestBitrate; @@ -781,7 +781,7 @@ public class TrackSelectionParameters implements Bundleable { * The preferred {@link C.RoleFlags} for audio tracks. {@code 0} selects the default track if * there is one, or the first track if there's no default. The default value is {@code 0}. */ - @C.RoleFlags public final int preferredAudioRoleFlags; + public final @C.RoleFlags int preferredAudioRoleFlags; /** * Maximum allowed audio channel count. The default value is {@link Integer#MAX_VALUE} (i.e. no * constraint). @@ -811,7 +811,7 @@ public class TrackSelectionParameters implements Bundleable { * | {@link C#ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND} if the accessibility {@link CaptioningManager} * is enabled. */ - @C.RoleFlags public final int preferredTextRoleFlags; + public final @C.RoleFlags int preferredTextRoleFlags; /** * Whether a text track with undetermined language should be selected if no track with {@link * #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The From 08f66c4d5bb1937198a6f21861477507fde58b4b Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 13:18:48 +0000 Subject: [PATCH 415/441] Throw pending clipping errors created during period preparation. Currently, clipping errors are never thrown if we already have a MediaPeriod. This may happen for example for ProgressiveMediaSource where we need to create a MediaPeriod before knowing whether clipping is supported. Playback will still fail, but with unrelated assertion errors that are hard to understand for users. Fix this by setting the pending error on the ClippingMediaPeriod. #minor-release Issue: Issue: google/ExoPlayer#9580 PiperOrigin-RevId: 406809737 --- .../exoplayer2/source/ClippingMediaPeriod.java | 18 ++++++++++++++++++ .../exoplayer2/source/ClippingMediaSource.java | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java index 464bf497fe..10cc75de32 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.source.ClippingMediaSource.IllegalClippingException; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; @@ -42,6 +43,7 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb private long pendingInitialDiscontinuityPositionUs; /* package */ long startUs; /* package */ long endUs; + @Nullable private IllegalClippingException clippingError; /** * Creates a new clipping media period that provides a clipped view of the specified {@link @@ -78,6 +80,16 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb this.endUs = endUs; } + /** + * Sets a clipping error detected by the media source so that it can be thrown as a period error + * at the next opportunity. + * + * @param clippingError The clipping error. + */ + public void setClippingError(IllegalClippingException clippingError) { + this.clippingError = clippingError; + } + @Override public void prepare(MediaPeriod.Callback callback, long positionUs) { this.callback = callback; @@ -86,6 +98,9 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb @Override public void maybeThrowPrepareError() throws IOException { + if (clippingError != null) { + throw clippingError; + } mediaPeriod.maybeThrowPrepareError(); } @@ -218,6 +233,9 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb @Override public void onPrepared(MediaPeriod mediaPeriod) { + if (clippingError != null) { + return; + } Assertions.checkNotNull(callback).onPrepared(this); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java index f86b81760d..ab62cca0c5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java @@ -276,6 +276,11 @@ public final class ClippingMediaSource extends CompositeMediaSource { clippingTimeline = new ClippingTimeline(timeline, windowStartUs, windowEndUs); } catch (IllegalClippingException e) { clippingError = e; + // The clipping error won't be propagated while we have existing MediaPeriods. Setting the + // error at the MediaPeriods ensures it will be thrown as soon as possible. + for (int i = 0; i < mediaPeriods.size(); i++) { + mediaPeriods.get(i).setClippingError(clippingError); + } return; } refreshSourceInfo(clippingTimeline); From 4803ab3bd12b71fc32150e96475c0e16aaf6ddc5 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 13:19:35 +0000 Subject: [PATCH 416/441] Fix rounding error in fMP4 presentation time calculation The presentation time in fMP4 is calculated by adding and subtracting 3 values. All 3 values are currently converted to microseconds first before the calculation, leading to rounding errors. The rounding errors can be avoided by doing the conversion to microseconds as the last step. For example: In timescale 96000: 8008+8008-16016 = 0 Rounding to us first: 83416+83416-166833=-1 #minor-release PiperOrigin-RevId: 406809844 --- .../extractor/mp4/FragmentedMp4Extractor.java | 23 ++++++++----------- .../extractor/mp4/TrackFragment.java | 14 ++++------- .../mp4/sample_fragmented.mp4.0.dump | 20 ++++++++-------- .../sample_fragmented.mp4.unknown_length.dump | 20 ++++++++-------- .../mp4/sample_fragmented_seekable.mp4.0.dump | 20 ++++++++-------- .../mp4/sample_fragmented_seekable.mp4.1.dump | 20 ++++++++-------- .../mp4/sample_fragmented_seekable.mp4.2.dump | 20 ++++++++-------- .../mp4/sample_fragmented_seekable.mp4.3.dump | 20 ++++++++-------- ...ragmented_seekable.mp4.unknown_length.dump | 20 ++++++++-------- .../mp4/sample_fragmented_sei.mp4.0.dump | 20 ++++++++-------- ...ple_fragmented_sei.mp4.unknown_length.dump | 20 ++++++++-------- ...ple_fragmented_sideloaded_track.mp4.0.dump | 20 ++++++++-------- ...d_sideloaded_track.mp4.unknown_length.dump | 20 ++++++++-------- .../sample_partially_fragmented.mp4.0.dump | 18 +++++++-------- ...rtially_fragmented.mp4.unknown_length.dump | 18 +++++++-------- 15 files changed, 142 insertions(+), 151 deletions(-) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java index b72159be1d..df05019f9b 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java @@ -999,21 +999,18 @@ public class FragmentedMp4Extractor implements Extractor { // Offset to the entire video timeline. In the presence of B-frames this is usually used to // ensure that the first frame's presentation timestamp is zero. - long edtsOffsetUs = 0; + long edtsOffset = 0; // Currently we only support a single edit that moves the entire media timeline (indicated by // duration == 0). Other uses of edit lists are uncommon and unsupported. if (track.editListDurations != null && track.editListDurations.length == 1 && track.editListDurations[0] == 0) { - edtsOffsetUs = - Util.scaleLargeTimestamp( - castNonNull(track.editListMediaTimes)[0], C.MICROS_PER_SECOND, track.timescale); + edtsOffset = castNonNull(track.editListMediaTimes)[0]; } int[] sampleSizeTable = fragment.sampleSizeTable; - int[] sampleCompositionTimeOffsetUsTable = fragment.sampleCompositionTimeOffsetUsTable; - long[] sampleDecodingTimeUsTable = fragment.sampleDecodingTimeUsTable; + long[] samplePresentationTimesUs = fragment.samplePresentationTimesUs; boolean[] sampleIsSyncFrameTable = fragment.sampleIsSyncFrameTable; boolean workaroundEveryVideoFrameIsSyncFrame = @@ -1033,22 +1030,20 @@ public class FragmentedMp4Extractor implements Extractor { sampleFlagsPresent ? trun.readInt() : (i == 0 && firstSampleFlagsPresent) ? firstSampleFlags : defaultSampleValues.flags; + int sampleCompositionTimeOffset = 0; if (sampleCompositionTimeOffsetsPresent) { // The BMFF spec (ISO 14496-12) states that sample offsets should be unsigned integers in // version 0 trun boxes, however a significant number of streams violate the spec and use // signed integers instead. It's safe to always decode sample offsets as signed integers // here, because unsigned integers will still be parsed correctly (unless their top bit is // set, which is never true in practice because sample offsets are always small). - int sampleOffset = trun.readInt(); - sampleCompositionTimeOffsetUsTable[i] = - (int) ((sampleOffset * C.MICROS_PER_SECOND) / timescale); - } else { - sampleCompositionTimeOffsetUsTable[i] = 0; + sampleCompositionTimeOffset = trun.readInt(); } - sampleDecodingTimeUsTable[i] = - Util.scaleLargeTimestamp(cumulativeTime, C.MICROS_PER_SECOND, timescale) - edtsOffsetUs; + long samplePresentationTime = cumulativeTime + sampleCompositionTimeOffset - edtsOffset; + samplePresentationTimesUs[i] = + Util.scaleLargeTimestamp(samplePresentationTime, C.MICROS_PER_SECOND, timescale); if (!fragment.nextFragmentDecodeTimeIncludesMoov) { - sampleDecodingTimeUsTable[i] += trackBundle.moovSampleTable.durationUs; + samplePresentationTimesUs[i] += trackBundle.moovSampleTable.durationUs; } sampleSizeTable[i] = sampleSize; sampleIsSyncFrameTable[i] = diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/TrackFragment.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/TrackFragment.java index 5a1fc6e0d8..d87f7ba443 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/TrackFragment.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/TrackFragment.java @@ -42,10 +42,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; public int[] trunLength; /** The size of each sample in the fragment. */ public int[] sampleSizeTable; - /** The composition time offset of each sample in the fragment, in microseconds. */ - public int[] sampleCompositionTimeOffsetUsTable; - /** The decoding time of each sample in the fragment, in microseconds. */ - public long[] sampleDecodingTimeUsTable; + /** The presentation time of each sample in the fragment, in microseconds. */ + public long[] samplePresentationTimesUs; /** Indicates which samples are sync frames. */ public boolean[] sampleIsSyncFrameTable; /** Whether the fragment defines encryption data. */ @@ -80,8 +78,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; trunDataPosition = new long[0]; trunLength = new int[0]; sampleSizeTable = new int[0]; - sampleCompositionTimeOffsetUsTable = new int[0]; - sampleDecodingTimeUsTable = new long[0]; + samplePresentationTimesUs = new long[0]; sampleIsSyncFrameTable = new boolean[0]; sampleHasSubsampleEncryptionTable = new boolean[0]; sampleEncryptionData = new ParsableByteArray(); @@ -123,8 +120,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // likely. The choice of 25% is relatively arbitrary. int tableSize = (sampleCount * 125) / 100; sampleSizeTable = new int[tableSize]; - sampleCompositionTimeOffsetUsTable = new int[tableSize]; - sampleDecodingTimeUsTable = new long[tableSize]; + samplePresentationTimesUs = new long[tableSize]; sampleIsSyncFrameTable = new boolean[tableSize]; sampleHasSubsampleEncryptionTable = new boolean[tableSize]; } @@ -173,7 +169,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * @return The presentation timestamps of this sample in microseconds. */ public long getSamplePresentationTimeUs(int index) { - return sampleDecodingTimeUsTable[index] + sampleCompositionTimeOffsetUsTable[index]; + return samplePresentationTimesUs[index]; } /** Returns whether the sample at the given index has a subsample encryption table. */ diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.0.dump index 3bb4239d8f..1fca581047 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.0.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.0.dump @@ -20,7 +20,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -32,7 +32,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.unknown_length.dump index 3bb4239d8f..1fca581047 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.unknown_length.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented.mp4.unknown_length.dump @@ -20,7 +20,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -32,7 +32,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.0.dump index d6ff4a544c..b96cd5335f 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.0.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.0.dump @@ -23,7 +23,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -35,7 +35,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -51,7 +51,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -59,7 +59,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -71,7 +71,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -83,7 +83,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -99,7 +99,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -107,7 +107,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -119,7 +119,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -131,7 +131,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.1.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.1.dump index 4d5f324b4a..508eb65d16 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.1.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.1.dump @@ -23,7 +23,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -35,7 +35,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -51,7 +51,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -59,7 +59,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -71,7 +71,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -83,7 +83,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -99,7 +99,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -107,7 +107,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -119,7 +119,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -131,7 +131,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.2.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.2.dump index 4b23814b0a..4aa40d6145 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.2.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.2.dump @@ -23,7 +23,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -35,7 +35,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -51,7 +51,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -59,7 +59,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -71,7 +71,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -83,7 +83,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -99,7 +99,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -107,7 +107,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -119,7 +119,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -131,7 +131,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.3.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.3.dump index d234a0f03f..5196703b22 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.3.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.3.dump @@ -23,7 +23,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -35,7 +35,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -51,7 +51,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -59,7 +59,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -71,7 +71,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -83,7 +83,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -99,7 +99,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -107,7 +107,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -119,7 +119,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -131,7 +131,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.unknown_length.dump index d6ff4a544c..b96cd5335f 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.unknown_length.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_seekable.mp4.unknown_length.dump @@ -23,7 +23,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -35,7 +35,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -51,7 +51,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -59,7 +59,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -71,7 +71,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -83,7 +83,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -99,7 +99,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -107,7 +107,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -119,7 +119,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -131,7 +131,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.0.dump index dbcfe75f35..91376322a8 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.0.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.0.dump @@ -20,7 +20,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -32,7 +32,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.unknown_length.dump index dbcfe75f35..91376322a8 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.unknown_length.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sei.mp4.unknown_length.dump @@ -20,7 +20,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -32,7 +32,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump index f90492cfa1..c1b45465ee 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.0.dump @@ -13,7 +13,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -25,7 +25,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -41,7 +41,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -49,7 +49,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -61,7 +61,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -73,7 +73,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -89,7 +89,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -97,7 +97,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -109,7 +109,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -121,7 +121,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.unknown_length.dump index f90492cfa1..c1b45465ee 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.unknown_length.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_fragmented_sideloaded_track.mp4.unknown_length.dump @@ -13,7 +13,7 @@ track 0: flags = 1 data = length 38070, hash B58E1AEE sample 1: - time = 200199 + time = 200200 flags = 0 data = length 8340, hash 8AC449FF sample 2: @@ -25,7 +25,7 @@ track 0: flags = 0 data = length 469, hash D6E0A200 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 564, hash E5F56C5B sample 5: @@ -41,7 +41,7 @@ track 0: flags = 0 data = length 455, hash B9CCE047 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 467, hash 69806D94 sample 9: @@ -49,7 +49,7 @@ track 0: flags = 0 data = length 4549, hash 3944F501 sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1087, hash 491BF106 sample 11: @@ -61,7 +61,7 @@ track 0: flags = 0 data = length 455, hash 8A0610 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5190, hash B9031D8 sample 14: @@ -73,7 +73,7 @@ track 0: flags = 0 data = length 653, hash 8494F326 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 485, hash 2CCC85F4 sample 17: @@ -89,7 +89,7 @@ track 0: flags = 0 data = length 640, hash F664125B sample 20: - time = 700699 + time = 700700 flags = 0 data = length 491, hash B5930C7C sample 21: @@ -97,7 +97,7 @@ track 0: flags = 0 data = length 2989, hash 92CF4FCF sample 22: - time = 800799 + time = 800800 flags = 0 data = length 838, hash 294A3451 sample 23: @@ -109,7 +109,7 @@ track 0: flags = 0 data = length 329, hash A654FFA1 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1517, hash 5F7EBF8B sample 26: @@ -121,7 +121,7 @@ track 0: flags = 0 data = length 415, hash B31BBC3B sample 28: - time = 967632 + time = 967633 flags = 0 data = length 415, hash 850DFEA3 sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.0.dump index 5bb4411a69..9e58eea933 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.0.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.0.dump @@ -32,7 +32,7 @@ track 0: flags = 536870912 data = length 5867, hash 56F9EE87 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 570, hash 984421BD sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 4310, hash 291E6161 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 497, hash 398CBFAA sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4449, hash 322CAA2B sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1076, hash B479B634 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 463, hash A85F9769 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5339, hash F232195D sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 689, hash 3EB753A3 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 516, hash E6DF9C1C sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 625, hash ED1C8EF1 sample 20: - time = 700699 + time = 700700 flags = 0 data = length 492, hash E6E066EA sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2973, hash A3C54C3B sample 22: - time = 800799 + time = 800800 flags = 0 data = length 833, hash 41CA807D sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 384, hash A0E8FA50 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1450, hash 92741C3B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 413, hash 886904C sample 28: - time = 967632 + time = 967633 flags = 0 data = length 427, hash FC2FA8CC sample 29: diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.unknown_length.dump index 5bb4411a69..9e58eea933 100644 --- a/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.unknown_length.dump +++ b/testdata/src/test/assets/extractordumps/mp4/sample_partially_fragmented.mp4.unknown_length.dump @@ -32,7 +32,7 @@ track 0: flags = 536870912 data = length 5867, hash 56F9EE87 sample 4: - time = 166832 + time = 166833 flags = 0 data = length 570, hash 984421BD sample 5: @@ -48,7 +48,7 @@ track 0: flags = 0 data = length 4310, hash 291E6161 sample 8: - time = 300299 + time = 300300 flags = 0 data = length 497, hash 398CBFAA sample 9: @@ -56,7 +56,7 @@ track 0: flags = 0 data = length 4449, hash 322CAA2B sample 10: - time = 400399 + time = 400400 flags = 0 data = length 1076, hash B479B634 sample 11: @@ -68,7 +68,7 @@ track 0: flags = 0 data = length 463, hash A85F9769 sample 13: - time = 600599 + time = 600600 flags = 0 data = length 5339, hash F232195D sample 14: @@ -80,7 +80,7 @@ track 0: flags = 0 data = length 689, hash 3EB753A3 sample 16: - time = 567232 + time = 567233 flags = 0 data = length 516, hash E6DF9C1C sample 17: @@ -96,7 +96,7 @@ track 0: flags = 0 data = length 625, hash ED1C8EF1 sample 20: - time = 700699 + time = 700700 flags = 0 data = length 492, hash E6E066EA sample 21: @@ -104,7 +104,7 @@ track 0: flags = 0 data = length 2973, hash A3C54C3B sample 22: - time = 800799 + time = 800800 flags = 0 data = length 833, hash 41CA807D sample 23: @@ -116,7 +116,7 @@ track 0: flags = 0 data = length 384, hash A0E8FA50 sample 25: - time = 1000999 + time = 1001000 flags = 0 data = length 1450, hash 92741C3B sample 26: @@ -128,7 +128,7 @@ track 0: flags = 0 data = length 413, hash 886904C sample 28: - time = 967632 + time = 967633 flags = 0 data = length 427, hash FC2FA8CC sample 29: From f45a8bc4f41ec1f6b4128c9fa2cd7f359823a35e Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 13:57:42 +0000 Subject: [PATCH 417/441] Suppress lint warning about wrong IntDef usage in media2 Utils AudioAttributesCompat.AttributeUsage and C.AudioUsage use equivalent values and can be directly assigned. PiperOrigin-RevId: 406815447 --- .../java/com/google/android/exoplayer2/ext/media2/Utils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/Utils.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/Utils.java index 87b52f3598..70f984016e 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/Utils.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/Utils.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.ext.media2; +import android.annotation.SuppressLint; import androidx.media.AudioAttributesCompat; import androidx.media2.common.SessionPlayer; import com.google.android.exoplayer2.Player; @@ -24,6 +25,7 @@ import com.google.android.exoplayer2.audio.AudioAttributes; /* package */ final class Utils { /** Returns ExoPlayer audio attributes for the given audio attributes. */ + @SuppressLint("WrongConstant") // AudioAttributesCompat.AttributeUsage is equal to C.AudioUsage public static AudioAttributes getAudioAttributes(AudioAttributesCompat audioAttributesCompat) { return new AudioAttributes.Builder() .setContentType(audioAttributesCompat.getContentType()) From eeaa61716087e7cd446eebc076bc02d2dfb58eac Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 1 Nov 2021 14:00:45 +0000 Subject: [PATCH 418/441] Rename MediaFormatUtil constants PiperOrigin-RevId: 406816023 --- .../exoplayer2/util/MediaFormatUtil.java | 18 ++++++++++-------- .../exoplayer2/util/MediaFormatUtilTest.java | 10 +++++----- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java index 653a1e3a99..45b2293c24 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MediaFormatUtil.java @@ -32,17 +32,19 @@ public final class MediaFormatUtil { * Custom {@link MediaFormat} key associated with a float representing the ratio between a pixel's * width and height. */ - public static final String KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT = + // The constant value must not be changed, because it's also set by the framework MediaParser API. + public static final String KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT = "exo-pixel-width-height-ratio-float"; /** * Custom {@link MediaFormat} key associated with an integer representing the PCM encoding. * - *

                  Equivalent to {@link MediaFormat#KEY_PCM_ENCODING}, except it allows additional - * ExoPlayer-specific values including {@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link + *

                  Equivalent to {@link MediaFormat#KEY_PCM_ENCODING}, except it allows additional values + * defined by {@link C.PcmEncoding}, including {@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link * C#ENCODING_PCM_24BIT}, and {@link C#ENCODING_PCM_32BIT}. */ - public static final String KEY_EXO_PCM_ENCODING = "exo-pcm-encoding-int"; + // The constant value must not be changed, because it's also set by the framework MediaParser API. + public static final String KEY_PCM_ENCODING_EXTENDED = "exo-pcm-encoding-int"; private static final int MAX_POWER_OF_TWO_INT = 1 << 30; @@ -52,8 +54,8 @@ public final class MediaFormatUtil { *

                  May include the following custom keys: * *

                    - *
                  • {@link #KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT}. - *
                  • {@link #KEY_EXO_PCM_ENCODING}. + *
                  • {@link #KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT}. + *
                  • {@link #KEY_PCM_ENCODING_EXTENDED}. *
                  */ @SuppressLint("InlinedApi") // Inlined MediaFormat keys. @@ -184,7 +186,7 @@ public final class MediaFormatUtil { @SuppressLint("InlinedApi") private static void maybeSetPixelAspectRatio( MediaFormat mediaFormat, float pixelWidthHeightRatio) { - mediaFormat.setFloat(KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT, pixelWidthHeightRatio); + mediaFormat.setFloat(KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT, pixelWidthHeightRatio); int pixelAspectRatioWidth = 1; int pixelAspectRatioHeight = 1; // ExoPlayer extractors output the pixel aspect ratio as a float. Do our best to recreate the @@ -207,7 +209,7 @@ public final class MediaFormatUtil { return; } int mediaFormatPcmEncoding; - maybeSetInteger(mediaFormat, KEY_EXO_PCM_ENCODING, exoPcmEncoding); + maybeSetInteger(mediaFormat, KEY_PCM_ENCODING_EXTENDED, exoPcmEncoding); switch (exoPcmEncoding) { case C.ENCODING_PCM_8BIT: mediaFormatPcmEncoding = AudioFormat.ENCODING_PCM_8BIT; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java index 959b1279a0..d35cbe5853 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/MediaFormatUtilTest.java @@ -37,7 +37,7 @@ public class MediaFormatUtilTest { // Assert that no invalid keys are accidentally being populated. assertThat(mediaFormat.getKeys()) .containsExactly( - MediaFormatUtil.KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT, + MediaFormatUtil.KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT, MediaFormat.KEY_ENCODER_DELAY, MediaFormat.KEY_ENCODER_PADDING, MediaFormat.KEY_PIXEL_ASPECT_RATIO_WIDTH, @@ -46,7 +46,7 @@ public class MediaFormatUtilTest { MediaFormat.KEY_IS_FORCED_SUBTITLE, MediaFormat.KEY_IS_AUTOSELECT, MediaFormat.KEY_ROTATION); - assertThat(mediaFormat.getFloat(MediaFormatUtil.KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT)) + assertThat(mediaFormat.getFloat(MediaFormatUtil.KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT)) .isEqualTo(1.f); assertThat(mediaFormat.getInteger(MediaFormat.KEY_ENCODER_DELAY)).isEqualTo(0); assertThat(mediaFormat.getInteger(MediaFormat.KEY_ENCODER_PADDING)).isEqualTo(0); @@ -116,7 +116,7 @@ public class MediaFormatUtilTest { .isEqualTo(format.initializationData.get(1)); assertThat(mediaFormat.getInteger(MediaFormat.KEY_PCM_ENCODING)).isEqualTo(format.pcmEncoding); - assertThat(mediaFormat.getInteger(MediaFormatUtil.KEY_EXO_PCM_ENCODING)) + assertThat(mediaFormat.getInteger(MediaFormatUtil.KEY_PCM_ENCODING_EXTENDED)) .isEqualTo(format.pcmEncoding); assertThat(mediaFormat.getString(MediaFormat.KEY_LANGUAGE)).isEqualTo(format.language); @@ -140,7 +140,7 @@ public class MediaFormatUtilTest { (float) mediaFormat.getInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_WIDTH) / mediaFormat.getInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_HEIGHT); assertThat(calculatedPixelAspectRatio).isWithin(.0001f).of(format.pixelWidthHeightRatio); - assertThat(mediaFormat.getFloat(MediaFormatUtil.KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT)) + assertThat(mediaFormat.getFloat(MediaFormatUtil.KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT)) .isEqualTo(format.pixelWidthHeightRatio); } @@ -148,7 +148,7 @@ public class MediaFormatUtilTest { public void createMediaFormatFromFormat_withPcmEncoding_setsCustomPcmEncodingEntry() { Format format = new Format.Builder().setPcmEncoding(C.ENCODING_PCM_32BIT).build(); MediaFormat mediaFormat = MediaFormatUtil.createMediaFormatFromFormat(format); - assertThat(mediaFormat.getInteger(MediaFormatUtil.KEY_EXO_PCM_ENCODING)) + assertThat(mediaFormat.getInteger(MediaFormatUtil.KEY_PCM_ENCODING_EXTENDED)) .isEqualTo(C.ENCODING_PCM_32BIT); assertThat(mediaFormat.containsKey(MediaFormat.KEY_PCM_ENCODING)).isFalse(); } From f382ef0ae23c71a7af45c76eb73da388b5bdc24e Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 14:08:07 +0000 Subject: [PATCH 419/441] Suppress lint warning about wrong IntDef assignment. The return values of AudioManager.getPlaybackOffloadSupport are the same as the values defined in C.AudioManagerOffloadMode. PiperOrigin-RevId: 406817413 --- .../com/google/android/exoplayer2/audio/DefaultAudioSink.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 5687282fae..5d2c7947d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.audio; import static java.lang.Math.max; import static java.lang.Math.min; +import android.annotation.SuppressLint; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; @@ -1634,6 +1635,8 @@ public final class DefaultAudioSink implements AudioSink { } @RequiresApi(29) + // Return values of AudioManager.getPlaybackOffloadSupport are equal to C.AudioManagerOffloadMode. + @SuppressLint("WrongConstant") @C.AudioManagerOffloadMode private int getOffloadedPlaybackSupport( AudioFormat audioFormat, android.media.AudioAttributes audioAttributes) { From 3ecf882c345543184370ba70ec81f93d94fa6682 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 14:28:22 +0000 Subject: [PATCH 420/441] Remove wrong IntDef usage. The variable is storing OpenGL's draw mode, which is different from Projection.DrawMode. PiperOrigin-RevId: 406820812 --- .../android/exoplayer2/video/spherical/ProjectionRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java index 692b7e687e..c52e5ddd57 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionRenderer.java @@ -207,7 +207,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final int vertexCount; private final FloatBuffer vertexBuffer; private final FloatBuffer textureBuffer; - @Projection.DrawMode private final int drawMode; + private final int drawMode; public MeshData(Projection.SubMesh subMesh) { vertexCount = subMesh.getVertexCount(); From 45ef34eb2f62c2ba21e2f9b00210b711bb54d6d7 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 15:09:25 +0000 Subject: [PATCH 421/441] Add missing import for gradle build PiperOrigin-RevId: 406827799 --- .../exoplayer2/trackselection/TrackSelectionOverridesTest.java | 1 + .../exoplayer2/trackselection/TrackSelectionParametersTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java index ba04f73429..d96e497b1f 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionOverridesTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertThrows; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java index 7fab202421..f1271ecf7a 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectionParametersTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; From f67ec8973cc981cf759856d981e142a810c03501 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 15:46:37 +0000 Subject: [PATCH 422/441] Add missing IntDef constant. The video scaling mode and stream type defines a default constant that needs to be added to the IntDef definition to be assignable. PiperOrigin-RevId: 406835696 --- .../java/com/google/android/exoplayer2/C.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 7c26b57600..2c2548468b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -21,6 +21,7 @@ import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE_USE; +import android.annotation.SuppressLint; import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFormat; @@ -274,8 +275,10 @@ public final class C { /** * Stream types for an {@link android.media.AudioTrack}. One of {@link #STREAM_TYPE_ALARM}, {@link * #STREAM_TYPE_DTMF}, {@link #STREAM_TYPE_MUSIC}, {@link #STREAM_TYPE_NOTIFICATION}, {@link - * #STREAM_TYPE_RING}, {@link #STREAM_TYPE_SYSTEM} or {@link #STREAM_TYPE_VOICE_CALL}. + * #STREAM_TYPE_RING}, {@link #STREAM_TYPE_SYSTEM}, {@link #STREAM_TYPE_VOICE_CALL} or {@link + * #STREAM_TYPE_DEFAULT}. */ + @SuppressLint("UniqueConstants") // Intentional duplication to set STREAM_TYPE_DEFAULT. @Documented @Retention(RetentionPolicy.SOURCE) @IntDef({ @@ -285,7 +288,8 @@ public final class C { STREAM_TYPE_NOTIFICATION, STREAM_TYPE_RING, STREAM_TYPE_SYSTEM, - STREAM_TYPE_VOICE_CALL + STREAM_TYPE_VOICE_CALL, + STREAM_TYPE_DEFAULT }) public @interface StreamType {} /** @see AudioManager#STREAM_ALARM */ @@ -537,11 +541,17 @@ public final class C { /** * Video scaling modes for {@link MediaCodec}-based renderers. One of {@link - * #VIDEO_SCALING_MODE_SCALE_TO_FIT} or {@link #VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}. + * #VIDEO_SCALING_MODE_SCALE_TO_FIT}, {@link #VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING} or + * {@link #VIDEO_SCALING_MODE_DEFAULT}. */ + @SuppressLint("UniqueConstants") // Intentional duplication to set VIDEO_SCALING_MODE_DEFAULT. @Documented @Retention(RetentionPolicy.SOURCE) - @IntDef(value = {VIDEO_SCALING_MODE_SCALE_TO_FIT, VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}) + @IntDef({ + VIDEO_SCALING_MODE_SCALE_TO_FIT, + VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING, + VIDEO_SCALING_MODE_DEFAULT + }) public @interface VideoScalingMode {} /** See {@link MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}. */ public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = From 8cefb845df6d3a6eeb91387fa1097aa5ac15c0ab Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 17:16:56 +0000 Subject: [PATCH 423/441] Merge pull request #9576 from TiVo:p-fix-duration-round PiperOrigin-RevId: 406839109 --- .../hls/playlist/HlsPlaylistParser.java | 10 ++++++++-- .../playlist/HlsMediaPlaylistParserTest.java | 19 +++++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 863ea198bb..4a445c54e4 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -48,6 +48,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.math.BigDecimal; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; @@ -759,8 +760,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser segments = mediaPlaylist.segments; assertThat(segments).isNotNull(); - assertThat(segments).hasSize(5); + assertThat(segments).hasSize(6); Segment segment = segments.get(0); assertThat(mediaPlaylist.discontinuitySequence + segment.relativeDiscontinuitySequence) @@ -152,6 +156,9 @@ public class HlsMediaPlaylistParserTest { assertThat(segment.byteRangeLength).isEqualTo(C.LENGTH_UNSET); assertThat(segment.byteRangeOffset).isEqualTo(0); assertThat(segment.url).isEqualTo("https://priv.example.com/fileSequence2683.ts"); + + segment = segments.get(5); + assertThat(segment.durationUs).isEqualTo(2002000); } @Test @@ -389,7 +396,7 @@ public class HlsMediaPlaylistParserTest { .parse(playlistUri, inputStream); assertThat(playlist.segments).hasSize(3); - assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000079); + assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000080); assertThat(previousPlaylist.segments.get(0).relativeDiscontinuitySequence).isEqualTo(0); assertThat(previousPlaylist.segments.get(1).relativeDiscontinuitySequence).isEqualTo(1); assertThat(previousPlaylist.segments.get(2).relativeDiscontinuitySequence).isEqualTo(1); @@ -448,12 +455,12 @@ public class HlsMediaPlaylistParserTest { assertThat(playlist.segments.get(0).parts.get(0).relativeDiscontinuitySequence).isEqualTo(1); assertThat(playlist.segments.get(0).parts.get(1).relativeStartTimeUs).isEqualTo(2000000); assertThat(playlist.segments.get(0).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1); - assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000079); - assertThat(playlist.segments.get(1).parts.get(0).relativeStartTimeUs).isEqualTo(4000079); + assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000080); + assertThat(playlist.segments.get(1).parts.get(0).relativeStartTimeUs).isEqualTo(4000080); assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1); - assertThat(playlist.segments.get(1).parts.get(1).relativeStartTimeUs).isEqualTo(6000079); + assertThat(playlist.segments.get(1).parts.get(1).relativeStartTimeUs).isEqualTo(6000080); assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1); - assertThat(playlist.trailingParts.get(0).relativeStartTimeUs).isEqualTo(8000158); + assertThat(playlist.trailingParts.get(0).relativeStartTimeUs).isEqualTo(8000160); assertThat(playlist.trailingParts.get(0).relativeDiscontinuitySequence).isEqualTo(1); } From 455fb89cd42a72eec65656ad274b92933c0507dc Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 1 Nov 2021 16:03:06 +0000 Subject: [PATCH 424/441] Suppress lint warning about wrong IntDef in FrameworkMuxer The values are equivalent and we can suppress the warning. PiperOrigin-RevId: 406839242 --- .../google/android/exoplayer2/transformer/FrameworkMuxer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java index fc5b65891d..182f34e114 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FrameworkMuxer.java @@ -19,6 +19,7 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.SDK_INT; import static com.google.android.exoplayer2.util.Util.castNonNull; +import android.annotation.SuppressLint; import android.media.MediaCodec; import android.media.MediaFormat; import android.media.MediaMuxer; @@ -122,6 +123,7 @@ import java.nio.ByteBuffer; return mediaMuxer.addTrack(mediaFormat); } + @SuppressLint("WrongConstant") // C.BUFFER_FLAG_KEY_FRAME equals MediaCodec.BUFFER_FLAG_KEY_FRAME. @Override public void writeSampleData( int trackIndex, ByteBuffer data, boolean isKeyFrame, long presentationTimeUs) { From 58f36fb854d040253a66448a291492efbba29325 Mon Sep 17 00:00:00 2001 From: bachinger Date: Mon, 1 Nov 2021 16:07:05 +0000 Subject: [PATCH 425/441] Fix rewriting upstream/crypto package in lib-datasource PiperOrigin-RevId: 406840246 --- .../exoplayer2/upstream/{ => crypto}/AesCipherDataSink.java | 4 +++- .../upstream/{ => crypto}/AesCipherDataSource.java | 5 ++++- .../exoplayer2/upstream/{ => crypto}/AesFlushingCipher.java | 2 +- .../android/exoplayer2/upstream/crypto/package-info.java | 0 .../upstream/{ => crypto}/AesFlushingCipherTest.java | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) rename library/datasource/src/main/java/com/google/android/exoplayer2/upstream/{ => crypto}/AesCipherDataSink.java (95%) rename library/datasource/src/main/java/com/google/android/exoplayer2/upstream/{ => crypto}/AesCipherDataSource.java (91%) rename library/datasource/src/main/java/com/google/android/exoplayer2/upstream/{ => crypto}/AesFlushingCipher.java (99%) rename library/{common => datasource}/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java (100%) rename library/datasource/src/test/java/com/google/android/exoplayer2/upstream/{ => crypto}/AesFlushingCipherTest.java (99%) diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java similarity index 95% rename from library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java index 5d84485e24..4e5b9f2b8e 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSink.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSink.java @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream; +package com.google.android.exoplayer2.upstream.crypto; import static com.google.android.exoplayer2.util.Util.castNonNull; import static java.lang.Math.min; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.upstream.DataSink; +import com.google.android.exoplayer2.upstream.DataSpec; import java.io.IOException; import javax.crypto.Cipher; diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java similarity index 91% rename from library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java index 77126904bb..98ec914fa0 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesCipherDataSource.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream; +package com.google.android.exoplayer2.upstream.crypto; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; @@ -21,6 +21,9 @@ import static com.google.android.exoplayer2.util.Util.castNonNull; import android.net.Uri; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DataSpec; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java similarity index 99% rename from library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java index 5a60a985db..96cb13604e 100644 --- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AesFlushingCipher.java +++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipher.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream; +package com.google.android.exoplayer2.upstream.crypto; import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java similarity index 100% rename from library/common/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java rename to library/datasource/src/main/java/com/google/android/exoplayer2/upstream/crypto/package-info.java diff --git a/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java similarity index 99% rename from library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java rename to library/datasource/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java index b6cdb61ba0..2811b0eada 100644 --- a/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/AesFlushingCipherTest.java +++ b/library/datasource/src/test/java/com/google/android/exoplayer2/upstream/crypto/AesFlushingCipherTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.upstream; +package com.google.android.exoplayer2.upstream.crypto; import static com.google.common.truth.Truth.assertThat; import static java.lang.Math.min; From 2c2705aa6b06982e246f0660f31c8fc106b7301e Mon Sep 17 00:00:00 2001 From: samrobinson Date: Mon, 1 Nov 2021 16:49:44 +0000 Subject: [PATCH 426/441] Allow remove video transformer option. PiperOrigin-RevId: 406849436 --- .../android/exoplayer2/transformer/TranscodingTransformer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 348f3dac04..4b01c191a7 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -481,7 +481,6 @@ public final class TranscodingTransformer { checkState( !transformation.removeAudio || !transformation.removeVideo, "Audio and video cannot both be removed."); - checkState(!(transformation.removeVideo)); this.context = context; this.mediaSourceFactory = mediaSourceFactory; this.muxerFactory = muxerFactory; From 14eba83df6de32cfe030951e070e61b19b05b221 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 1 Nov 2021 17:26:35 +0000 Subject: [PATCH 427/441] Transformer GL: Undo accidental setResolution changes(). Accidental changes were introduced in http://https://github.com/google/ExoPlayer/commit/c53924326dd100874d080c55812659a3cb9e843a PiperOrigin-RevId: 406858888 --- .../transformer/TranscodingTransformer.java | 28 ------------------- .../transformer/Transformation.java | 3 -- .../exoplayer2/transformer/Transformer.java | 2 -- 3 files changed, 33 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java index 4b01c191a7..6f58812be4 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TranscodingTransformer.java @@ -55,7 +55,6 @@ import com.google.android.exoplayer2.source.MediaSourceFactory; import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.util.Clock; -import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoRendererEventListener; @@ -92,16 +91,12 @@ public final class TranscodingTransformer { /** A builder for {@link TranscodingTransformer} instances. */ public static final class Builder { - // Mandatory field. private @MonotonicNonNull Context context; - - // Optional fields. private @MonotonicNonNull MediaSourceFactory mediaSourceFactory; private Muxer.Factory muxerFactory; private boolean removeAudio; private boolean removeVideo; private boolean flattenForSlowMotion; - private int outputHeight; private String outputMimeType; @Nullable private String audioMimeType; @Nullable private String videoMimeType; @@ -126,7 +121,6 @@ public final class TranscodingTransformer { this.removeAudio = transcodingTransformer.transformation.removeAudio; this.removeVideo = transcodingTransformer.transformation.removeVideo; this.flattenForSlowMotion = transcodingTransformer.transformation.flattenForSlowMotion; - this.outputHeight = transcodingTransformer.transformation.outputHeight; this.outputMimeType = transcodingTransformer.transformation.outputMimeType; this.audioMimeType = transcodingTransformer.transformation.audioMimeType; this.videoMimeType = transcodingTransformer.transformation.videoMimeType; @@ -219,21 +213,6 @@ public final class TranscodingTransformer { return this; } - /** - * Sets the output resolution for the video, using the output height. The default value is to - * use the same height as the input. Output width will scale to preserve the input video's - * aspect ratio. - * - *

                  For example, a 1920x1440 video can be scaled to 640x480 by calling setResolution(480). - * - * @param outputHeight The output height for the video, in pixels. - * @return This builder. - */ - public Builder setResolution(int outputHeight) { - this.outputHeight = outputHeight; - return this; - } - /** * Sets the MIME type of the output. The default value is {@link MimeTypes#VIDEO_MP4}. Supported * values are: @@ -377,12 +356,6 @@ public final class TranscodingTransformer { checkState( muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); - // TODO(ME): Test with values of 10, 100, 1000). - Log.e("TranscodingTransformer", "outputHeight = " + outputHeight); - if (outputHeight == 0) { - // TODO(ME): get output height from input video. - outputHeight = 480; - } if (audioMimeType != null) { checkSampleMimeType(audioMimeType); } @@ -394,7 +367,6 @@ public final class TranscodingTransformer { removeAudio, removeVideo, flattenForSlowMotion, - outputHeight, outputMimeType, audioMimeType, videoMimeType); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java index ed8bf64bf3..e273c1fde5 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformation.java @@ -24,7 +24,6 @@ import androidx.annotation.Nullable; public final boolean removeAudio; public final boolean removeVideo; public final boolean flattenForSlowMotion; - public final int outputHeight; public final String outputMimeType; @Nullable public final String audioMimeType; @Nullable public final String videoMimeType; @@ -33,14 +32,12 @@ import androidx.annotation.Nullable; boolean removeAudio, boolean removeVideo, boolean flattenForSlowMotion, - int outputHeight, String outputMimeType, @Nullable String audioMimeType, @Nullable String videoMimeType) { this.removeAudio = removeAudio; this.removeVideo = removeVideo; this.flattenForSlowMotion = flattenForSlowMotion; - this.outputHeight = outputHeight; this.outputMimeType = outputMimeType; this.audioMimeType = audioMimeType; this.videoMimeType = videoMimeType; diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java index 093f63caeb..0fd763ad26 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java @@ -297,13 +297,11 @@ public final class Transformer { checkState( muxerFactory.supportsOutputMimeType(outputMimeType), "Unsupported output MIME type: " + outputMimeType); - int outputHeight = 0; // TODO(ME): How do we get the input height here? Transformation transformation = new Transformation( removeAudio, removeVideo, flattenForSlowMotion, - outputHeight, outputMimeType, /* audioMimeType= */ null, /* videoMimeType= */ null); From f5cdf1657a853697815161187e7ec3b522bb6e1d Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 2 Nov 2021 11:57:30 +0000 Subject: [PATCH 428/441] Remove FfmpegVideoRenderer from 2.16.0 release --- .../exoplayer2/ext/ffmpeg/FfmpegLibrary.java | 6 +- .../ext/ffmpeg/FfmpegVideoRenderer.java | 135 ------------------ .../ffmpeg/DefaultRenderersFactoryTest.java | 9 +- library/core/proguard-rules.txt | 4 - .../exoplayer2/DefaultRenderersFactory.java | 26 ---- 5 files changed, 2 insertions(+), 178 deletions(-) delete mode 100644 extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java index 97f11225bb..abd184b59e 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java @@ -42,7 +42,7 @@ public final class FfmpegLibrary { /** * Override the names of the FFmpeg native libraries. If an application wishes to call this * method, it must do so before calling any other method defined by this class, and before - * instantiating a {@link FfmpegAudioRenderer} or {@link FfmpegVideoRenderer} instance. + * instantiating a {@link FfmpegAudioRenderer} instance. * * @param libraries The names of the FFmpeg native libraries. */ @@ -140,10 +140,6 @@ public final class FfmpegLibrary { return "pcm_mulaw"; case MimeTypes.AUDIO_ALAW: return "pcm_alaw"; - case MimeTypes.VIDEO_H264: - return "h264"; - case MimeTypes.VIDEO_H265: - return "hevc"; default: return null; } diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java deleted file mode 100644 index e074b87a21..0000000000 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegVideoRenderer.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.google.android.exoplayer2.ext.ffmpeg; - -import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.DISCARD_REASON_MIME_TYPE_CHANGED; -import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.REUSE_RESULT_NO; -import static com.google.android.exoplayer2.decoder.DecoderReuseEvaluation.REUSE_RESULT_YES_WITHOUT_RECONFIGURATION; - -import android.os.Handler; -import android.view.Surface; -import androidx.annotation.Nullable; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.RendererCapabilities; -import com.google.android.exoplayer2.decoder.CryptoConfig; -import com.google.android.exoplayer2.decoder.Decoder; -import com.google.android.exoplayer2.decoder.DecoderInputBuffer; -import com.google.android.exoplayer2.decoder.DecoderReuseEvaluation; -import com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer; -import com.google.android.exoplayer2.util.TraceUtil; -import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.video.DecoderVideoRenderer; -import com.google.android.exoplayer2.video.VideoRendererEventListener; - -// TODO: Remove the NOTE below. -/** - * NOTE: This class if under development and is not yet functional. - * - *

                  Decodes and renders video using FFmpeg. - */ -public final class FfmpegVideoRenderer extends DecoderVideoRenderer { - - private static final String TAG = "FfmpegVideoRenderer"; - - /** - * Creates a new instance. - * - * @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer - * can attempt to seamlessly join an ongoing playback. - * @param eventHandler A handler to use when delivering events to {@code eventListener}. May be - * null if delivery of events is not required. - * @param eventListener A listener of events. May be null if delivery of events is not required. - * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between - * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. - */ - public FfmpegVideoRenderer( - long allowedJoiningTimeMs, - @Nullable Handler eventHandler, - @Nullable VideoRendererEventListener eventListener, - int maxDroppedFramesToNotify) { - super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify); - // TODO: Implement. - } - - @Override - public String getName() { - return TAG; - } - - @Override - @RendererCapabilities.Capabilities - public final int supportsFormat(Format format) { - // TODO: Remove this line and uncomment the implementation below. - return C.FORMAT_UNSUPPORTED_TYPE; - /* - String mimeType = Assertions.checkNotNull(format.sampleMimeType); - if (!FfmpegLibrary.isAvailable() || !MimeTypes.isVideo(mimeType)) { - return FORMAT_UNSUPPORTED_TYPE; - } else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType)) { - return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE); - } else if (format.exoMediaCryptoType != null) { - return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); - } else { - return RendererCapabilities.create( - FORMAT_HANDLED, - ADAPTIVE_SEAMLESS, - TUNNELING_NOT_SUPPORTED); - } - */ - } - - @SuppressWarnings("nullness:return") - @Override - protected Decoder - createDecoder(Format format, @Nullable CryptoConfig cryptoConfig) - throws FfmpegDecoderException { - TraceUtil.beginSection("createFfmpegVideoDecoder"); - // TODO: Implement, remove the SuppressWarnings annotation, and update the return type to use - // the concrete type of the decoder (probably FfmepgVideoDecoder). - TraceUtil.endSection(); - return null; - } - - @Override - protected void renderOutputBufferToSurface(VideoDecoderOutputBuffer outputBuffer, Surface surface) - throws FfmpegDecoderException { - // TODO: Implement. - } - - @Override - protected void setDecoderOutputMode(@C.VideoOutputMode int outputMode) { - // TODO: Uncomment the implementation below. - /* - if (decoder != null) { - decoder.setOutputMode(outputMode); - } - */ - } - - @Override - protected DecoderReuseEvaluation canReuseDecoder( - String decoderName, Format oldFormat, Format newFormat) { - boolean sameMimeType = Util.areEqual(oldFormat.sampleMimeType, newFormat.sampleMimeType); - // TODO: Ability to reuse the decoder may be MIME type dependent. - return new DecoderReuseEvaluation( - decoderName, - oldFormat, - newFormat, - sameMimeType ? REUSE_RESULT_YES_WITHOUT_RECONFIGURATION : REUSE_RESULT_NO, - sameMimeType ? 0 : DISCARD_REASON_MIME_TYPE_CHANGED); - } -} diff --git a/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java b/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java index cc8ca5487e..fa4c6809aa 100644 --- a/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java +++ b/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java @@ -22,8 +22,7 @@ import org.junit.Test; import org.junit.runner.RunWith; /** - * Unit test for {@link DefaultRenderersFactoryTest} with {@link FfmpegAudioRenderer} and {@link - * FfmpegVideoRenderer}. + * Unit test for {@link DefaultRenderersFactoryTest} with {@link FfmpegAudioRenderer}. */ @RunWith(AndroidJUnit4.class) public final class DefaultRenderersFactoryTest { @@ -33,10 +32,4 @@ public final class DefaultRenderersFactoryTest { DefaultRenderersFactoryAsserts.assertExtensionRendererCreated( FfmpegAudioRenderer.class, C.TRACK_TYPE_AUDIO); } - - @Test - public void createRenderers_instantiatesFfmpegVideoRenderer() { - DefaultRenderersFactoryAsserts.assertExtensionRendererCreated( - FfmpegVideoRenderer.class, C.TRACK_TYPE_VIDEO); - } } diff --git a/library/core/proguard-rules.txt b/library/core/proguard-rules.txt index fc6787e09d..ebe0c271ef 100644 --- a/library/core/proguard-rules.txt +++ b/library/core/proguard-rules.txt @@ -9,10 +9,6 @@ -keepclassmembers class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer { (long, android.os.Handler, com.google.android.exoplayer2.video.VideoRendererEventListener, int); } --dontnote com.google.android.exoplayer2.ext.ffmpeg.FfmpegVideoRenderer --keepclassmembers class com.google.android.exoplayer2.ext.ffmpeg.FfmpegVideoRenderer { - (long, android.os.Handler, com.google.android.exoplayer2.video.VideoRendererEventListener, int); -} -dontnote com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer -keepclassmembers class com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer { (android.os.Handler, com.google.android.exoplayer2.audio.AudioRendererEventListener, com.google.android.exoplayer2.audio.AudioSink); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java index 03ccc297a8..b9895d60ae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java @@ -434,32 +434,6 @@ public class DefaultRenderersFactory implements RenderersFactory { // The extension is present, but instantiation failed. throw new RuntimeException("Error instantiating AV1 extension", e); } - - try { - // Full class names used for constructor args so the LINT rule triggers if any of them move. - Class clazz = - Class.forName("com.google.android.exoplayer2.ext.ffmpeg.FfmpegVideoRenderer"); - Constructor constructor = - clazz.getConstructor( - long.class, - android.os.Handler.class, - com.google.android.exoplayer2.video.VideoRendererEventListener.class, - int.class); - Renderer renderer = - (Renderer) - constructor.newInstance( - allowedVideoJoiningTimeMs, - eventHandler, - eventListener, - MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY); - out.add(extensionRendererIndex++, renderer); - Log.i(TAG, "Loaded FfmpegVideoRenderer."); - } catch (ClassNotFoundException e) { - // Expected if the app was built without the extension. - } catch (Exception e) { - // The extension is present, but instantiation failed. - throw new RuntimeException("Error instantiating FFmpeg extension", e); - } } /** From 16548420507b92255a775685c0237612321b0856 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 2 Nov 2021 10:27:56 +0000 Subject: [PATCH 429/441] Migrate usages of Window-based Player methods Where this introduced an inconsistency (e.g. assigning to something called `windowIndex`), I generally renamed the transitive closure of identifiers to maintain consistency (meaning this change is quite large). The exception is code that interacts with Timeline and Window directly, where sometimes I kept the 'window' nomenclature. #minor-release PiperOrigin-RevId: 407040052 --- RELEASENOTES.md | 4 + .../exoplayer2/castdemo/PlayerManager.java | 12 +- .../exoplayer2/demo/PlayerActivity.java | 16 +- .../exoplayer2/ext/cast/CastPlayer.java | 18 +- .../exoplayer2/ext/ima/FakeExoPlayer.java | 2 +- .../ext/leanback/LeanbackPlayerAdapter.java | 2 +- .../exoplayer2/ext/media2/PlayerWrapper.java | 16 +- .../mediasession/MediaSessionConnector.java | 29 +- .../mediasession/TimelineQueueNavigator.java | 38 +- .../google/android/exoplayer2/BasePlayer.java | 49 +- .../google/android/exoplayer2/ExoPlayer.java | 23 +- .../android/exoplayer2/ExoPlayerImpl.java | 43 +- .../exoplayer2/ExoPlayerImplInternal.java | 2 +- .../android/exoplayer2/PlayerMessage.java | 49 +- .../android/exoplayer2/SimpleExoPlayer.java | 6 +- .../analytics/AnalyticsCollector.java | 6 +- .../analytics/AnalyticsListener.java | 10 +- .../exoplayer2/util/DebugTextViewHelper.java | 4 +- .../android/exoplayer2/ExoPlayerTest.java | 1003 +++++++++-------- .../exoplayer2/ui/PlayerControlView.java | 6 +- .../ui/PlayerNotificationManager.java | 10 +- .../android/exoplayer2/ui/PlayerView.java | 4 +- .../ui/StyledPlayerControlView.java | 7 +- .../exoplayer2/ui/StyledPlayerView.java | 4 +- .../robolectric/TestPlayerRunHelper.java | 17 +- .../android/exoplayer2/testutil/Action.java | 61 +- .../exoplayer2/testutil/ActionSchedule.java | 67 +- .../testutil/ExoPlayerTestRunner.java | 22 +- .../exoplayer2/testutil/StubExoPlayer.java | 2 +- 29 files changed, 788 insertions(+), 744 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bf708bfa32..0d8bf3fdb5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -85,6 +85,10 @@ * RTMP extension: * Upgrade to `io.antmedia:rtmp_client`, which does not rely on `jcenter()` ([#9591](https://github.com/google/ExoPlayer/issues/9591)). +* MediaSession extension: + * Rename + `MediaSessionConnector.QueueNavigator#onCurrentWindowIndexChanged` to + `onCurrentMediaItemIndexChanged`. * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 9e66c823a0..54174b0c53 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -261,7 +261,7 @@ import java.util.ArrayList; int playbackState = currentPlayer.getPlaybackState(); maybeSetCurrentItemAndNotify( playbackState != Player.STATE_IDLE && playbackState != Player.STATE_ENDED - ? currentPlayer.getCurrentWindowIndex() + ? currentPlayer.getCurrentMediaItemIndex() : C.INDEX_UNSET); } @@ -281,7 +281,7 @@ import java.util.ArrayList; // Player state management. long playbackPositionMs = C.TIME_UNSET; - int windowIndex = C.INDEX_UNSET; + int currentItemIndex = C.INDEX_UNSET; boolean playWhenReady = false; Player previousPlayer = this.currentPlayer; @@ -291,10 +291,10 @@ import java.util.ArrayList; if (playbackState != Player.STATE_ENDED) { playbackPositionMs = previousPlayer.getCurrentPosition(); playWhenReady = previousPlayer.getPlayWhenReady(); - windowIndex = previousPlayer.getCurrentWindowIndex(); - if (windowIndex != currentItemIndex) { + currentItemIndex = previousPlayer.getCurrentMediaItemIndex(); + if (currentItemIndex != this.currentItemIndex) { playbackPositionMs = C.TIME_UNSET; - windowIndex = currentItemIndex; + currentItemIndex = this.currentItemIndex; } } previousPlayer.stop(); @@ -304,7 +304,7 @@ import java.util.ArrayList; this.currentPlayer = currentPlayer; // Media queue management. - currentPlayer.setMediaItems(mediaQueue, windowIndex, playbackPositionMs); + currentPlayer.setMediaItems(mediaQueue, currentItemIndex, playbackPositionMs); currentPlayer.setPlayWhenReady(playWhenReady); currentPlayer.prepare(); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index e080c23f99..ca9fd45d42 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -65,7 +65,7 @@ public class PlayerActivity extends AppCompatActivity // Saved instance state keys. private static final String KEY_TRACK_SELECTION_PARAMETERS = "track_selection_parameters"; - private static final String KEY_WINDOW = "window"; + private static final String KEY_ITEM_INDEX = "item_index"; private static final String KEY_POSITION = "position"; private static final String KEY_AUTO_PLAY = "auto_play"; @@ -83,7 +83,7 @@ public class PlayerActivity extends AppCompatActivity private DebugTextViewHelper debugViewHelper; private TracksInfo lastSeenTracksInfo; private boolean startAutoPlay; - private int startWindow; + private int startItemIndex; private long startPosition; // For ad playback only. @@ -114,7 +114,7 @@ public class PlayerActivity extends AppCompatActivity DefaultTrackSelector.Parameters.CREATOR.fromBundle( savedInstanceState.getBundle(KEY_TRACK_SELECTION_PARAMETERS)); startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY); - startWindow = savedInstanceState.getInt(KEY_WINDOW); + startItemIndex = savedInstanceState.getInt(KEY_ITEM_INDEX); startPosition = savedInstanceState.getLong(KEY_POSITION); } else { trackSelectionParameters = @@ -206,7 +206,7 @@ public class PlayerActivity extends AppCompatActivity updateStartPosition(); outState.putBundle(KEY_TRACK_SELECTION_PARAMETERS, trackSelectionParameters.toBundle()); outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay); - outState.putInt(KEY_WINDOW, startWindow); + outState.putInt(KEY_ITEM_INDEX, startItemIndex); outState.putLong(KEY_POSITION, startPosition); } @@ -282,9 +282,9 @@ public class PlayerActivity extends AppCompatActivity debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper.start(); } - boolean haveStartPosition = startWindow != C.INDEX_UNSET; + boolean haveStartPosition = startItemIndex != C.INDEX_UNSET; if (haveStartPosition) { - player.seekTo(startWindow, startPosition); + player.seekTo(startItemIndex, startPosition); } player.setMediaItems(mediaItems, /* resetPosition= */ !haveStartPosition); player.prepare(); @@ -382,14 +382,14 @@ public class PlayerActivity extends AppCompatActivity private void updateStartPosition() { if (player != null) { startAutoPlay = player.getPlayWhenReady(); - startWindow = player.getCurrentWindowIndex(); + startItemIndex = player.getCurrentMediaItemIndex(); startPosition = Math.max(0, player.getContentPosition()); } } protected void clearStartPosition() { startAutoPlay = true; - startWindow = C.INDEX_UNSET; + startItemIndex = C.INDEX_UNSET; startPosition = C.TIME_UNSET; } diff --git a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java index 1bf2cd410b..0054378727 100644 --- a/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java +++ b/extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java @@ -318,9 +318,9 @@ public final class CastPlayer extends BasePlayer { @Override public void setMediaItems(List mediaItems, boolean resetPosition) { - int windowIndex = resetPosition ? 0 : getCurrentWindowIndex(); + int mediaItemIndex = resetPosition ? 0 : getCurrentMediaItemIndex(); long startPositionMs = resetPosition ? C.TIME_UNSET : getContentPosition(); - setMediaItems(mediaItems, windowIndex, startPositionMs); + setMediaItems(mediaItems, mediaItemIndex, startPositionMs); } @Override @@ -443,7 +443,7 @@ public final class CastPlayer extends BasePlayer { // in RemoteMediaClient. positionMs = positionMs != C.TIME_UNSET ? positionMs : 0; if (mediaStatus != null) { - if (getCurrentWindowIndex() != mediaItemIndex) { + if (getCurrentMediaItemIndex() != mediaItemIndex) { remoteMediaClient .queueJumpToItem( (int) currentTimeline.getPeriod(mediaItemIndex, period).uid, positionMs, null) @@ -636,7 +636,7 @@ public final class CastPlayer extends BasePlayer { @Override public int getCurrentPeriodIndex() { - return getCurrentWindowIndex(); + return getCurrentMediaItemIndex(); } @Override @@ -1103,15 +1103,15 @@ public final class CastPlayer extends BasePlayer { @Nullable private PendingResult setMediaItemsInternal( MediaQueueItem[] mediaQueueItems, - int startWindowIndex, + int startIndex, long startPositionMs, @RepeatMode int repeatMode) { if (remoteMediaClient == null || mediaQueueItems.length == 0) { return null; } startPositionMs = startPositionMs == C.TIME_UNSET ? 0 : startPositionMs; - if (startWindowIndex == C.INDEX_UNSET) { - startWindowIndex = getCurrentWindowIndex(); + if (startIndex == C.INDEX_UNSET) { + startIndex = getCurrentMediaItemIndex(); startPositionMs = getCurrentPosition(); } Timeline currentTimeline = getCurrentTimeline(); @@ -1120,7 +1120,7 @@ public final class CastPlayer extends BasePlayer { } return remoteMediaClient.queueLoad( mediaQueueItems, - min(startWindowIndex, mediaQueueItems.length - 1), + min(startIndex, mediaQueueItems.length - 1), getCastRepeatMode(repeatMode), startPositionMs, /* customData= */ null); @@ -1180,7 +1180,7 @@ public final class CastPlayer extends BasePlayer { } return new PositionInfo( newWindowUid, - getCurrentWindowIndex(), + getCurrentMediaItemIndex(), newMediaItem, newPeriodUid, getCurrentPeriodIndex(), diff --git a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java index fb2975920d..90e2087389 100644 --- a/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java +++ b/extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java @@ -279,7 +279,7 @@ import com.google.android.exoplayer2.util.Util; timeline.getPeriod(0, period).getAdDurationUs(adGroupIndex, adIndexInAdGroup); return Util.usToMs(adDurationUs); } else { - return timeline.getWindow(getCurrentWindowIndex(), window).getDurationMs(); + return timeline.getWindow(getCurrentMediaItemIndex(), window).getDurationMs(); } } diff --git a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java index a914869f8f..bd70d14394 100644 --- a/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java +++ b/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java @@ -141,7 +141,7 @@ public final class LeanbackPlayerAdapter extends PlayerAdapter implements Runnab if (player.getPlaybackState() == Player.STATE_IDLE) { player.prepare(); } else if (player.getPlaybackState() == Player.STATE_ENDED) { - player.seekToDefaultPosition(player.getCurrentWindowIndex()); + player.seekToDefaultPosition(player.getCurrentMediaItemIndex()); } if (player.isCommandAvailable(Player.COMMAND_PLAY_PAUSE)) { player.play(); diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java index 7891bc47f3..f69f725edb 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java @@ -253,8 +253,8 @@ import java.util.List; // checkIndex() throws IndexOutOfBoundsException which maps the RESULT_ERROR_BAD_VALUE // but RESULT_ERROR_INVALID_STATE with IllegalStateException is expected here. Assertions.checkState(0 <= index && index < timeline.getWindowCount()); - int windowIndex = player.getCurrentWindowIndex(); - if (windowIndex == index || !player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)) { + int currentIndex = player.getCurrentMediaItemIndex(); + if (currentIndex == index || !player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)) { return false; } player.seekToDefaultPosition(index); @@ -301,7 +301,7 @@ import java.util.List; } public int getCurrentMediaItemIndex() { - return media2Playlist.isEmpty() ? C.INDEX_UNSET : player.getCurrentWindowIndex(); + return media2Playlist.isEmpty() ? C.INDEX_UNSET : player.getCurrentMediaItemIndex(); } public int getPreviousMediaItemIndex() { @@ -331,7 +331,7 @@ import java.util.List; if (!player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)) { return false; } - player.seekTo(player.getCurrentWindowIndex(), /* positionMs= */ 0); + player.seekTo(player.getCurrentMediaItemIndex(), /* positionMs= */ 0); } boolean playWhenReady = player.getPlayWhenReady(); int suppressReason = player.getPlaybackSuppressionReason(); @@ -358,7 +358,7 @@ import java.util.List; if (!player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)) { return false; } - player.seekTo(player.getCurrentWindowIndex(), position); + player.seekTo(player.getCurrentMediaItemIndex(), position); return true; } @@ -493,7 +493,7 @@ import java.util.List; public boolean isCurrentMediaItemSeekable() { return getCurrentMediaItem() != null && !player.isPlayingAd() - && player.isCurrentWindowSeekable(); + && player.isCurrentMediaItemSeekable(); } public boolean canSkipToPlaylistItem() { @@ -502,11 +502,11 @@ import java.util.List; } public boolean canSkipToPreviousPlaylistItem() { - return player.hasPreviousWindow(); + return player.hasPreviousMediaItem(); } public boolean canSkipToNextPlaylistItem() { - return player.hasNextWindow(); + return player.hasNextMediaItem(); } public boolean hasError() { diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index b823d0f90f..cfda09ff0a 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -263,12 +263,13 @@ public final class MediaSessionConnector { * @param player The player connected to the media session. */ void onTimelineChanged(Player player); + /** - * Called when the current window index changed. + * Called when the current media item index changed. * * @param player The player connected to the media session. */ - void onCurrentWindowIndexChanged(Player player); + default void onCurrentMediaItemIndexChanged(Player player) {} /** * Gets the id of the currently active queue item, or {@link * MediaSessionCompat.QueueItem#UNKNOWN_ID} if the active item is unknown. @@ -969,8 +970,8 @@ public final class MediaSessionConnector { return player != null && mediaButtonEventHandler != null; } - private void seekTo(Player player, int windowIndex, long positionMs) { - player.seekTo(windowIndex, positionMs); + private void seekTo(Player player, int mediaItemIndex, long positionMs) { + player.seekTo(mediaItemIndex, positionMs); } private static int getMediaSessionPlaybackState( @@ -1023,7 +1024,7 @@ public final class MediaSessionConnector { } builder.putLong( MediaMetadataCompat.METADATA_KEY_DURATION, - player.isCurrentWindowDynamic() || player.getDuration() == C.TIME_UNSET + player.isCurrentMediaItemDynamic() || player.getDuration() == C.TIME_UNSET ? -1 : player.getDuration()); long activeQueueItemId = mediaController.getPlaybackState().getActiveQueueItemId(); @@ -1097,7 +1098,7 @@ public final class MediaSessionConnector { private class ComponentListener extends MediaSessionCompat.Callback implements Player.Listener { - private int currentWindowIndex; + private int currentMediaItemIndex; private int currentWindowCount; // Player.Listener implementation. @@ -1107,9 +1108,9 @@ public final class MediaSessionConnector { boolean invalidatePlaybackState = false; boolean invalidateMetadata = false; if (events.contains(Player.EVENT_POSITION_DISCONTINUITY)) { - if (currentWindowIndex != player.getCurrentWindowIndex()) { + if (currentMediaItemIndex != player.getCurrentMediaItemIndex()) { if (queueNavigator != null) { - queueNavigator.onCurrentWindowIndexChanged(player); + queueNavigator.onCurrentMediaItemIndexChanged(player); } invalidateMetadata = true; } @@ -1118,11 +1119,11 @@ public final class MediaSessionConnector { if (events.contains(Player.EVENT_TIMELINE_CHANGED)) { int windowCount = player.getCurrentTimeline().getWindowCount(); - int windowIndex = player.getCurrentWindowIndex(); + int mediaItemIndex = player.getCurrentMediaItemIndex(); if (queueNavigator != null) { queueNavigator.onTimelineChanged(player); invalidatePlaybackState = true; - } else if (currentWindowCount != windowCount || currentWindowIndex != windowIndex) { + } else if (currentWindowCount != windowCount || currentMediaItemIndex != mediaItemIndex) { // active queue item and queue navigation actions may need to be updated invalidatePlaybackState = true; } @@ -1130,8 +1131,8 @@ public final class MediaSessionConnector { invalidateMetadata = true; } - // Update currentWindowIndex after comparisons above. - currentWindowIndex = player.getCurrentWindowIndex(); + // Update currentMediaItemIndex after comparisons above. + currentMediaItemIndex = player.getCurrentMediaItemIndex(); if (events.containsAny( EVENT_PLAYBACK_STATE_CHANGED, @@ -1170,7 +1171,7 @@ public final class MediaSessionConnector { player.prepare(); } } else if (player.getPlaybackState() == Player.STATE_ENDED) { - seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentMediaItemIndex(), C.TIME_UNSET); } Assertions.checkNotNull(player).play(); } @@ -1186,7 +1187,7 @@ public final class MediaSessionConnector { @Override public void onSeekTo(long positionMs) { if (canDispatchPlaybackAction(PlaybackStateCompat.ACTION_SEEK_TO)) { - seekTo(player, player.getCurrentWindowIndex(), positionMs); + seekTo(player, player.getCurrentMediaItemIndex(), positionMs); } } diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java index 90db27e458..4277de3c32 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.java @@ -98,7 +98,7 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu boolean enableNext = false; Timeline timeline = player.getCurrentTimeline(); if (!timeline.isEmpty() && !player.isPlayingAd()) { - timeline.getWindow(player.getCurrentWindowIndex(), window); + timeline.getWindow(player.getCurrentMediaItemIndex(), window); enableSkipTo = timeline.getWindowCount() > 1; enablePrevious = player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM) @@ -128,12 +128,12 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu } @Override - public final void onCurrentWindowIndexChanged(Player player) { + public final void onCurrentMediaItemIndexChanged(Player player) { if (activeQueueItemId == MediaSessionCompat.QueueItem.UNKNOWN_ID || player.getCurrentTimeline().getWindowCount() > maxQueueSize) { publishFloatingQueueWindow(player); } else if (!player.getCurrentTimeline().isEmpty()) { - activeQueueItemId = player.getCurrentWindowIndex(); + activeQueueItemId = player.getCurrentMediaItemIndex(); } } @@ -185,40 +185,40 @@ public abstract class TimelineQueueNavigator implements MediaSessionConnector.Qu int queueSize = min(maxQueueSize, timeline.getWindowCount()); // Add the active queue item. - int currentWindowIndex = player.getCurrentWindowIndex(); + int currentMediaItemIndex = player.getCurrentMediaItemIndex(); queue.add( new MediaSessionCompat.QueueItem( - getMediaDescription(player, currentWindowIndex), currentWindowIndex)); + getMediaDescription(player, currentMediaItemIndex), currentMediaItemIndex)); // Fill queue alternating with next and/or previous queue items. - int firstWindowIndex = currentWindowIndex; - int lastWindowIndex = currentWindowIndex; + int firstMediaItemIndex = currentMediaItemIndex; + int lastMediaItemIndex = currentMediaItemIndex; boolean shuffleModeEnabled = player.getShuffleModeEnabled(); - while ((firstWindowIndex != C.INDEX_UNSET || lastWindowIndex != C.INDEX_UNSET) + while ((firstMediaItemIndex != C.INDEX_UNSET || lastMediaItemIndex != C.INDEX_UNSET) && queue.size() < queueSize) { // Begin with next to have a longer tail than head if an even sized queue needs to be trimmed. - if (lastWindowIndex != C.INDEX_UNSET) { - lastWindowIndex = + if (lastMediaItemIndex != C.INDEX_UNSET) { + lastMediaItemIndex = timeline.getNextWindowIndex( - lastWindowIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled); - if (lastWindowIndex != C.INDEX_UNSET) { + lastMediaItemIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled); + if (lastMediaItemIndex != C.INDEX_UNSET) { queue.add( new MediaSessionCompat.QueueItem( - getMediaDescription(player, lastWindowIndex), lastWindowIndex)); + getMediaDescription(player, lastMediaItemIndex), lastMediaItemIndex)); } } - if (firstWindowIndex != C.INDEX_UNSET && queue.size() < queueSize) { - firstWindowIndex = + if (firstMediaItemIndex != C.INDEX_UNSET && queue.size() < queueSize) { + firstMediaItemIndex = timeline.getPreviousWindowIndex( - firstWindowIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled); - if (firstWindowIndex != C.INDEX_UNSET) { + firstMediaItemIndex, Player.REPEAT_MODE_OFF, shuffleModeEnabled); + if (firstMediaItemIndex != C.INDEX_UNSET) { queue.addFirst( new MediaSessionCompat.QueueItem( - getMediaDescription(player, firstWindowIndex), firstWindowIndex)); + getMediaDescription(player, firstMediaItemIndex), firstMediaItemIndex)); } } } mediaSession.setQueue(new ArrayList<>(queue)); - activeQueueItemId = currentWindowIndex; + activeQueueItemId = currentMediaItemIndex; } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java index b60e4a3a7e..2209803f3e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java @@ -118,7 +118,7 @@ public abstract class BasePlayer implements Player { @Override public final void seekToDefaultPosition() { - seekToDefaultPosition(getCurrentWindowIndex()); + seekToDefaultPosition(getCurrentMediaItemIndex()); } @Override @@ -128,7 +128,7 @@ public abstract class BasePlayer implements Player { @Override public final void seekTo(long positionMs) { - seekTo(getCurrentWindowIndex(), positionMs); + seekTo(getCurrentMediaItemIndex(), positionMs); } @Override @@ -184,13 +184,13 @@ public abstract class BasePlayer implements Player { if (timeline.isEmpty() || isPlayingAd()) { return; } - boolean hasPreviousWindow = hasPreviousWindow(); - if (isCurrentWindowLive() && !isCurrentWindowSeekable()) { - if (hasPreviousWindow) { - seekToPreviousWindow(); + boolean hasPreviousMediaItem = hasPreviousMediaItem(); + if (isCurrentMediaItemLive() && !isCurrentMediaItemSeekable()) { + if (hasPreviousMediaItem) { + seekToPreviousMediaItem(); } - } else if (hasPreviousWindow && getCurrentPosition() <= getMaxSeekToPreviousPosition()) { - seekToPreviousWindow(); + } else if (hasPreviousMediaItem && getCurrentPosition() <= getMaxSeekToPreviousPosition()) { + seekToPreviousMediaItem(); } else { seekTo(/* positionMs= */ 0); } @@ -239,9 +239,9 @@ public abstract class BasePlayer implements Player { if (timeline.isEmpty() || isPlayingAd()) { return; } - if (hasNextWindow()) { - seekToNextWindow(); - } else if (isCurrentWindowLive() && isCurrentWindowDynamic()) { + if (hasNextMediaItem()) { + seekToNextMediaItem(); + } else if (isCurrentMediaItemLive() && isCurrentMediaItemDynamic()) { seekToDefaultPosition(); } } @@ -293,7 +293,7 @@ public abstract class BasePlayer implements Player { Timeline timeline = getCurrentTimeline(); return timeline.isEmpty() ? null - : timeline.getWindow(getCurrentWindowIndex(), window).mediaItem; + : timeline.getWindow(getCurrentMediaItemIndex(), window).mediaItem; } @Override @@ -310,7 +310,9 @@ public abstract class BasePlayer implements Player { @Nullable public final Object getCurrentManifest() { Timeline timeline = getCurrentTimeline(); - return timeline.isEmpty() ? null : timeline.getWindow(getCurrentWindowIndex(), window).manifest; + return timeline.isEmpty() + ? null + : timeline.getWindow(getCurrentMediaItemIndex(), window).manifest; } @Override @@ -352,7 +354,8 @@ public abstract class BasePlayer implements Player { if (timeline.isEmpty()) { return C.TIME_UNSET; } - long windowStartTimeMs = timeline.getWindow(getCurrentWindowIndex(), window).windowStartTimeMs; + long windowStartTimeMs = + timeline.getWindow(getCurrentMediaItemIndex(), window).windowStartTimeMs; if (windowStartTimeMs == C.TIME_UNSET) { return C.TIME_UNSET; } @@ -376,7 +379,7 @@ public abstract class BasePlayer implements Player { Timeline timeline = getCurrentTimeline(); return timeline.isEmpty() ? C.TIME_UNSET - : timeline.getWindow(getCurrentWindowIndex(), window).getDurationMs(); + : timeline.getWindow(getCurrentMediaItemIndex(), window).getDurationMs(); } /** @@ -389,22 +392,24 @@ public abstract class BasePlayer implements Player { return new Commands.Builder() .addAll(permanentAvailableCommands) .addIf(COMMAND_SEEK_TO_DEFAULT_POSITION, !isPlayingAd()) - .addIf(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, isCurrentWindowSeekable() && !isPlayingAd()) - .addIf(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, hasPreviousWindow() && !isPlayingAd()) + .addIf(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, isCurrentMediaItemSeekable() && !isPlayingAd()) + .addIf(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, hasPreviousMediaItem() && !isPlayingAd()) .addIf( COMMAND_SEEK_TO_PREVIOUS, !getCurrentTimeline().isEmpty() - && (hasPreviousWindow() || !isCurrentWindowLive() || isCurrentWindowSeekable()) + && (hasPreviousMediaItem() + || !isCurrentMediaItemLive() + || isCurrentMediaItemSeekable()) && !isPlayingAd()) - .addIf(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, hasNextWindow() && !isPlayingAd()) + .addIf(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, hasNextMediaItem() && !isPlayingAd()) .addIf( COMMAND_SEEK_TO_NEXT, !getCurrentTimeline().isEmpty() - && (hasNextWindow() || (isCurrentWindowLive() && isCurrentWindowDynamic())) + && (hasNextMediaItem() || (isCurrentMediaItemLive() && isCurrentMediaItemDynamic())) && !isPlayingAd()) .addIf(COMMAND_SEEK_TO_MEDIA_ITEM, !isPlayingAd()) - .addIf(COMMAND_SEEK_BACK, isCurrentWindowSeekable() && !isPlayingAd()) - .addIf(COMMAND_SEEK_FORWARD, isCurrentWindowSeekable() && !isPlayingAd()) + .addIf(COMMAND_SEEK_BACK, isCurrentMediaItemSeekable() && !isPlayingAd()) + .addIf(COMMAND_SEEK_FORWARD, isCurrentMediaItemSeekable() && !isPlayingAd()) .build(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index e594883c72..2143d2a1fb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -1126,7 +1126,7 @@ public interface ExoPlayer extends Player { * @param mediaSources The new {@link MediaSource MediaSources}. * @param resetPosition Whether the playback position should be reset to the default position in * the first {@link Timeline.Window}. If false, playback will start from the position defined - * by {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}. + * by {@link #getCurrentMediaItemIndex()} and {@link #getCurrentPosition()}. */ void setMediaSources(List mediaSources, boolean resetPosition); @@ -1134,14 +1134,15 @@ public interface ExoPlayer extends Player { * Clears the playlist and adds the specified {@link MediaSource MediaSources}. * * @param mediaSources The new {@link MediaSource MediaSources}. - * @param startWindowIndex The window index to start playback from. If {@link C#INDEX_UNSET} is - * passed, the current position is not reset. + * @param startMediaItemIndex The media item index to start playback from. If {@link + * C#INDEX_UNSET} is passed, the current position is not reset. * @param startPositionMs The position in milliseconds to start playback from. If {@link - * C#TIME_UNSET} is passed, the default position of the given window is used. In any case, if - * {@code startWindowIndex} is set to {@link C#INDEX_UNSET}, this parameter is ignored and the - * position is not reset at all. + * C#TIME_UNSET} is passed, the default position of the given media item is used. In any case, + * if {@code startMediaItemIndex} is set to {@link C#INDEX_UNSET}, this parameter is ignored + * and the position is not reset at all. */ - void setMediaSources(List mediaSources, int startWindowIndex, long startPositionMs); + void setMediaSources( + List mediaSources, int startMediaItemIndex, long startPositionMs); /** * Clears the playlist, adds the specified {@link MediaSource} and resets the position to the @@ -1164,7 +1165,7 @@ public interface ExoPlayer extends Player { * * @param mediaSource The new {@link MediaSource}. * @param resetPosition Whether the playback position should be reset to the default position. If - * false, playback will start from the position defined by {@link #getCurrentWindowIndex()} + * false, playback will start from the position defined by {@link #getCurrentMediaItemIndex()} * and {@link #getCurrentPosition()}. */ void setMediaSource(MediaSource mediaSource, boolean resetPosition); @@ -1331,9 +1332,9 @@ public interface ExoPlayer extends Player { * will be delivered immediately without blocking on the playback thread. The default {@link * PlayerMessage#getType()} is 0 and the default {@link PlayerMessage#getPayload()} is null. If a * position is specified with {@link PlayerMessage#setPosition(long)}, the message will be - * delivered at this position in the current window defined by {@link #getCurrentWindowIndex()}. - * Alternatively, the message can be sent at a specific window using {@link - * PlayerMessage#setPosition(int, long)}. + * delivered at this position in the current media item defined by {@link + * #getCurrentMediaItemIndex()}. Alternatively, the message can be sent at a specific mediaItem + * using {@link PlayerMessage#setPosition(int, long)}. */ PlayerMessage createMessage(PlayerMessage.Target target); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 653135e59c..61a1d41b82 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -537,7 +537,7 @@ import java.util.concurrent.CopyOnWriteArraySet; playbackInfo, timeline, getPeriodPositionOrMaskWindowPosition( - timeline, getCurrentWindowIndex(), getCurrentPosition())); + timeline, getCurrentMediaItemIndex(), getCurrentPosition())); pendingOperationAcks++; this.shuffleOrder = shuffleOrder; internalPlayer.setShuffleOrder(shuffleOrder); @@ -662,7 +662,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @Player.State int newPlaybackState = getPlaybackState() == Player.STATE_IDLE ? Player.STATE_IDLE : Player.STATE_BUFFERING; - int oldMaskingWindowIndex = getCurrentWindowIndex(); + int oldMaskingMediaItemIndex = getCurrentMediaItemIndex(); PlaybackInfo newPlaybackInfo = playbackInfo.copyWithPlaybackState(newPlaybackState); newPlaybackInfo = maskTimelineAndPosition( @@ -678,7 +678,7 @@ import java.util.concurrent.CopyOnWriteArraySet; /* positionDiscontinuity= */ true, /* positionDiscontinuityReason= */ DISCONTINUITY_REASON_SEEK, /* discontinuityWindowStartPositionUs= */ getCurrentPositionUsInternal(newPlaybackInfo), - oldMaskingWindowIndex); + oldMaskingMediaItemIndex); } @Override @@ -839,7 +839,7 @@ import java.util.concurrent.CopyOnWriteArraySet; internalPlayer, target, playbackInfo.timeline, - getCurrentWindowIndex(), + getCurrentMediaItemIndex(), clock, internalPlayer.getPlaybackLooper()); } @@ -910,7 +910,10 @@ import java.util.concurrent.CopyOnWriteArraySet; if (isPlayingAd()) { playbackInfo.timeline.getPeriodByUid(playbackInfo.periodId.periodUid, period); return playbackInfo.requestedContentPositionUs == C.TIME_UNSET - ? playbackInfo.timeline.getWindow(getCurrentWindowIndex(), window).getDefaultPositionMs() + ? playbackInfo + .timeline + .getWindow(getCurrentMediaItemIndex(), window) + .getDefaultPositionMs() : period.getPositionInWindowMs() + Util.usToMs(playbackInfo.requestedContentPositionUs); } else { return getCurrentPosition(); @@ -924,7 +927,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } if (playbackInfo.loadingMediaPeriodId.windowSequenceNumber != playbackInfo.periodId.windowSequenceNumber) { - return playbackInfo.timeline.getWindow(getCurrentWindowIndex(), window).getDurationMs(); + return playbackInfo.timeline.getWindow(getCurrentMediaItemIndex(), window).getDurationMs(); } long contentBufferedPositionUs = playbackInfo.bufferedPositionUs; if (playbackInfo.loadingMediaPeriodId.isAd()) { @@ -1218,7 +1221,7 @@ import java.util.concurrent.CopyOnWriteArraySet; boolean positionDiscontinuity, @DiscontinuityReason int positionDiscontinuityReason, long discontinuityWindowStartPositionUs, - int oldMaskingWindowIndex) { + int oldMaskingMediaItemIndex) { // Assign playback info immediately such that all getters return the right values, but keep // snapshot of previous and new state so that listener invocations are triggered correctly. @@ -1267,7 +1270,7 @@ import java.util.concurrent.CopyOnWriteArraySet; if (positionDiscontinuity) { PositionInfo previousPositionInfo = getPreviousPositionInfo( - positionDiscontinuityReason, previousPlaybackInfo, oldMaskingWindowIndex); + positionDiscontinuityReason, previousPlaybackInfo, oldMaskingMediaItemIndex); PositionInfo positionInfo = getPositionInfo(discontinuityWindowStartPositionUs); listeners.queueEvent( Player.EVENT_POSITION_DISCONTINUITY, @@ -1378,19 +1381,19 @@ import java.util.concurrent.CopyOnWriteArraySet; private PositionInfo getPreviousPositionInfo( @DiscontinuityReason int positionDiscontinuityReason, PlaybackInfo oldPlaybackInfo, - int oldMaskingWindowIndex) { + int oldMaskingMediaItemIndex) { @Nullable Object oldWindowUid = null; @Nullable Object oldPeriodUid = null; - int oldWindowIndex = oldMaskingWindowIndex; + int oldMediaItemIndex = oldMaskingMediaItemIndex; int oldPeriodIndex = C.INDEX_UNSET; @Nullable MediaItem oldMediaItem = null; Timeline.Period oldPeriod = new Timeline.Period(); if (!oldPlaybackInfo.timeline.isEmpty()) { oldPeriodUid = oldPlaybackInfo.periodId.periodUid; oldPlaybackInfo.timeline.getPeriodByUid(oldPeriodUid, oldPeriod); - oldWindowIndex = oldPeriod.windowIndex; + oldMediaItemIndex = oldPeriod.windowIndex; oldPeriodIndex = oldPlaybackInfo.timeline.getIndexOfPeriod(oldPeriodUid); - oldWindowUid = oldPlaybackInfo.timeline.getWindow(oldWindowIndex, window).uid; + oldWindowUid = oldPlaybackInfo.timeline.getWindow(oldMediaItemIndex, window).uid; oldMediaItem = window.mediaItem; } long oldPositionUs; @@ -1421,7 +1424,7 @@ import java.util.concurrent.CopyOnWriteArraySet; } return new PositionInfo( oldWindowUid, - oldWindowIndex, + oldMediaItemIndex, oldMediaItem, oldPeriodUid, oldPeriodIndex, @@ -1434,20 +1437,20 @@ import java.util.concurrent.CopyOnWriteArraySet; private PositionInfo getPositionInfo(long discontinuityWindowStartPositionUs) { @Nullable Object newWindowUid = null; @Nullable Object newPeriodUid = null; - int newWindowIndex = getCurrentWindowIndex(); + int newMediaItemIndex = getCurrentMediaItemIndex(); int newPeriodIndex = C.INDEX_UNSET; @Nullable MediaItem newMediaItem = null; if (!playbackInfo.timeline.isEmpty()) { newPeriodUid = playbackInfo.periodId.periodUid; playbackInfo.timeline.getPeriodByUid(newPeriodUid, period); newPeriodIndex = playbackInfo.timeline.getIndexOfPeriod(newPeriodUid); - newWindowUid = playbackInfo.timeline.getWindow(newWindowIndex, window).uid; + newWindowUid = playbackInfo.timeline.getWindow(newMediaItemIndex, window).uid; newMediaItem = window.mediaItem; } long positionMs = Util.usToMs(discontinuityWindowStartPositionUs); return new PositionInfo( newWindowUid, - newWindowIndex, + newMediaItemIndex, newMediaItem, newPeriodUid, newPeriodIndex, @@ -1601,7 +1604,7 @@ import java.util.concurrent.CopyOnWriteArraySet; private PlaybackInfo removeMediaItemsInternal(int fromIndex, int toIndex) { Assertions.checkArgument( fromIndex >= 0 && toIndex >= fromIndex && toIndex <= mediaSourceHolderSnapshots.size()); - int currentWindowIndex = getCurrentWindowIndex(); + int currentIndex = getCurrentMediaItemIndex(); Timeline oldTimeline = getCurrentTimeline(); int currentMediaSourceCount = mediaSourceHolderSnapshots.size(); pendingOperationAcks++; @@ -1618,7 +1621,7 @@ import java.util.concurrent.CopyOnWriteArraySet; && newPlaybackInfo.playbackState != STATE_ENDED && fromIndex < toIndex && toIndex == currentMediaSourceCount - && currentWindowIndex >= newPlaybackInfo.timeline.getWindowCount(); + && currentIndex >= newPlaybackInfo.timeline.getWindowCount(); if (transitionsToEnded) { newPlaybackInfo = newPlaybackInfo.copyWithPlaybackState(STATE_ENDED); } @@ -1753,11 +1756,11 @@ import java.util.concurrent.CopyOnWriteArraySet; isCleared ? C.INDEX_UNSET : getCurrentWindowIndexInternal(), isCleared ? C.TIME_UNSET : currentPositionMs); } - int currentWindowIndex = getCurrentWindowIndex(); + int currentMediaItemIndex = getCurrentMediaItemIndex(); @Nullable Pair oldPeriodPosition = oldTimeline.getPeriodPosition( - window, period, currentWindowIndex, Util.msToUs(currentPositionMs)); + window, period, currentMediaItemIndex, Util.msToUs(currentPositionMs)); Object periodUid = castNonNull(oldPeriodPosition).first; if (newTimeline.getIndexOfPeriod(periodUid) != C.INDEX_UNSET) { // The old period position is still available in the new timeline. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 9fadb56a79..d6f1e1f73a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -2718,7 +2718,7 @@ import java.util.concurrent.atomic.AtomicBoolean; newTimeline, new SeekPosition( pendingMessageInfo.message.getTimeline(), - pendingMessageInfo.message.getWindowIndex(), + pendingMessageInfo.message.getMediaItemIndex(), requestPositionUs), /* trySubsequentPeriods= */ false, repeatMode, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java index 0d591ee9f6..cc7e749fa0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/PlayerMessage.java @@ -63,7 +63,7 @@ public final class PlayerMessage { private int type; @Nullable private Object payload; private Looper looper; - private int windowIndex; + private int mediaItemIndex; private long positionMs; private boolean deleteAfterDelivery; private boolean isSent; @@ -78,8 +78,8 @@ public final class PlayerMessage { * @param target The {@link Target} the message is sent to. * @param timeline The timeline used when setting the position with {@link #setPosition(long)}. If * set to {@link Timeline#EMPTY}, any position can be specified. - * @param defaultWindowIndex The default window index in the {@code timeline} when no other window - * index is specified. + * @param defaultMediaItemIndex The default media item index in the {@code timeline} when no other + * media item index is specified. * @param clock The {@link Clock}. * @param defaultLooper The default {@link Looper} to send the message on when no other looper is * specified. @@ -88,7 +88,7 @@ public final class PlayerMessage { Sender sender, Target target, Timeline timeline, - int defaultWindowIndex, + int defaultMediaItemIndex, Clock clock, Looper defaultLooper) { this.sender = sender; @@ -96,7 +96,7 @@ public final class PlayerMessage { this.timeline = timeline; this.looper = defaultLooper; this.clock = clock; - this.windowIndex = defaultWindowIndex; + this.mediaItemIndex = defaultMediaItemIndex; this.positionMs = C.TIME_UNSET; this.deleteAfterDelivery = true; } @@ -173,21 +173,21 @@ public final class PlayerMessage { } /** - * Returns position in window at {@link #getWindowIndex()} at which the message will be delivered, - * in milliseconds. If {@link C#TIME_UNSET}, the message will be delivered immediately. If {@link - * C#TIME_END_OF_SOURCE}, the message will be delivered at the end of the window at {@link - * #getWindowIndex()}. + * Returns position in the media item at {@link #getMediaItemIndex()} at which the message will be + * delivered, in milliseconds. If {@link C#TIME_UNSET}, the message will be delivered immediately. + * If {@link C#TIME_END_OF_SOURCE}, the message will be delivered at the end of the media item at + * {@link #getMediaItemIndex()}. */ public long getPositionMs() { return positionMs; } /** - * Sets a position in the current window at which the message will be delivered. + * Sets a position in the current media item at which the message will be delivered. * - * @param positionMs The position in the current window at which the message will be sent, in + * @param positionMs The position in the current media item at which the message will be sent, in * milliseconds, or {@link C#TIME_END_OF_SOURCE} to deliver the message at the end of the - * current window. + * current media item. * @return This message. * @throws IllegalStateException If {@link #send()} has already been called. */ @@ -198,31 +198,32 @@ public final class PlayerMessage { } /** - * Sets a position in a window at which the message will be delivered. + * Sets a position in a media item at which the message will be delivered. * - * @param windowIndex The index of the window at which the message will be sent. - * @param positionMs The position in the window with index {@code windowIndex} at which the + * @param mediaItemIndex The index of the media item at which the message will be sent. + * @param positionMs The position in the media item with index {@code mediaItemIndex} at which the * message will be sent, in milliseconds, or {@link C#TIME_END_OF_SOURCE} to deliver the - * message at the end of the window with index {@code windowIndex}. + * message at the end of the media item with index {@code mediaItemIndex}. * @return This message. * @throws IllegalSeekPositionException If the timeline returned by {@link #getTimeline()} is not - * empty and the provided window index is not within the bounds of the timeline. + * empty and the provided media item index is not within the bounds of the timeline. * @throws IllegalStateException If {@link #send()} has already been called. */ - public PlayerMessage setPosition(int windowIndex, long positionMs) { + public PlayerMessage setPosition(int mediaItemIndex, long positionMs) { Assertions.checkState(!isSent); Assertions.checkArgument(positionMs != C.TIME_UNSET); - if (windowIndex < 0 || (!timeline.isEmpty() && windowIndex >= timeline.getWindowCount())) { - throw new IllegalSeekPositionException(timeline, windowIndex, positionMs); + if (mediaItemIndex < 0 + || (!timeline.isEmpty() && mediaItemIndex >= timeline.getWindowCount())) { + throw new IllegalSeekPositionException(timeline, mediaItemIndex, positionMs); } - this.windowIndex = windowIndex; + this.mediaItemIndex = mediaItemIndex; this.positionMs = positionMs; return this; } - /** Returns window index at which the message will be delivered. */ - public int getWindowIndex() { - return windowIndex; + /** Returns media item index at which the message will be delivered. */ + public int getMediaItemIndex() { + return mediaItemIndex; } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 3c6607611e..83067a500c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -1110,9 +1110,9 @@ public class SimpleExoPlayer extends BasePlayer @Override public void setMediaSources( - List mediaSources, int startWindowIndex, long startPositionMs) { + List mediaSources, int startMediaItemIndex, long startPositionMs) { verifyApplicationThread(); - player.setMediaSources(mediaSources, startWindowIndex, startPositionMs); + player.setMediaSources(mediaSources, startMediaItemIndex, startPositionMs); } @Override @@ -1419,7 +1419,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public int getCurrentMediaItemIndex() { verifyApplicationThread(); - return player.getCurrentWindowIndex(); + return player.getCurrentMediaItemIndex(); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index ae22609e29..63e87a5539 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -914,7 +914,7 @@ public class AnalyticsCollector long eventPositionMs; boolean isInCurrentWindow = timeline.equals(player.getCurrentTimeline()) - && windowIndex == player.getCurrentWindowIndex(); + && windowIndex == player.getCurrentMediaItemIndex(); if (mediaPeriodId != null && mediaPeriodId.isAd()) { boolean isCurrentAd = isInCurrentWindow @@ -939,7 +939,7 @@ public class AnalyticsCollector mediaPeriodId, eventPositionMs, player.getCurrentTimeline(), - player.getCurrentWindowIndex(), + player.getCurrentMediaItemIndex(), currentMediaPeriodId, player.getCurrentPosition(), player.getTotalBufferedDuration()); @@ -962,7 +962,7 @@ public class AnalyticsCollector ? null : mediaPeriodQueueTracker.getMediaPeriodIdTimeline(mediaPeriodId); if (mediaPeriodId == null || knownTimeline == null) { - int windowIndex = player.getCurrentWindowIndex(); + int windowIndex = player.getCurrentMediaItemIndex(); Timeline timeline = player.getCurrentTimeline(); boolean windowIsInTimeline = windowIndex < timeline.getWindowCount(); return generateEventTime( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index 9887f397ea..df73a1f7f4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -382,7 +382,7 @@ public interface AnalyticsListener { /** * The current window index in {@link #currentTimeline} at the time of the event, or the * prospective window index if the timeline is not yet known and empty (equivalent to {@link - * Player#getCurrentWindowIndex()}). + * Player#getCurrentMediaItemIndex()}). */ public final int currentWindowIndex; @@ -419,7 +419,7 @@ public interface AnalyticsListener { * {@link Player#getCurrentTimeline()}). * @param currentWindowIndex The current window index in {@code currentTimeline} at the time of * the event, or the prospective window index if the timeline is not yet known and empty - * (equivalent to {@link Player#getCurrentWindowIndex()}). + * (equivalent to {@link Player#getCurrentMediaItemIndex()}). * @param currentMediaPeriodId {@link MediaPeriodId Media period identifier} for the currently * playing media period at the time of the event, or {@code null} if no current media period * identifier is available. @@ -1204,9 +1204,9 @@ public interface AnalyticsListener { * {@link Player#seekTo(long)} after a {@link * AnalyticsListener#onMediaItemTransition(EventTime, MediaItem, int)}). *

                • They intend to use multiple state values together or in combination with {@link Player} - * getter methods. For example using {@link Player#getCurrentWindowIndex()} with the {@code - * timeline} provided in {@link #onTimelineChanged(EventTime, int)} is only safe from within - * this method. + * getter methods. For example using {@link Player#getCurrentMediaItemIndex()} with the + * {@code timeline} provided in {@link #onTimelineChanged(EventTime, int)} is only safe from + * within this method. *
                • They are interested in events that logically happened together (e.g {@link * #onPlaybackStateChanged(EventTime, int)} to {@link Player#STATE_BUFFERING} because of * {@link #onMediaItemTransition(EventTime, MediaItem, int)}). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java index 5eeaa060bc..77fb5c048e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/DebugTextViewHelper.java @@ -138,8 +138,8 @@ public class DebugTextViewHelper implements Player.Listener, Runnable { break; } return String.format( - "playWhenReady:%s playbackState:%s window:%s", - player.getPlayWhenReady(), playbackStateString, player.getCurrentWindowIndex()); + "playWhenReady:%s playbackState:%s item:%s", + player.getPlayWhenReady(), playbackStateString, player.getCurrentMediaItemIndex()); } /** Returns a string containing video debugging information. */ diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 64044b2a3f..886d3c8ed9 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -48,7 +48,7 @@ import static com.google.android.exoplayer2.Player.COMMAND_STOP; import static com.google.android.exoplayer2.Player.STATE_ENDED; import static com.google.android.exoplayer2.robolectric.RobolectricUtil.runMainLooperUntil; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilPosition; -import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilStartOfWindow; +import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.playUntilStartOfMediaItem; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilPlaybackState; import static com.google.android.exoplayer2.robolectric.TestPlayerRunHelper.runUntilPositionDiscontinuity; @@ -381,7 +381,7 @@ public final class ExoPlayerTest { player.play(); runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); player.setForegroundMode(/* foregroundMode= */ true); - // Only the video renderer that is disabled in the second window has been reset. + // Only the video renderer that is disabled in the second media item has been reset. assertThat(audioRenderer.resetCount).isEqualTo(0); assertThat(videoRenderer.resetCount).isEqualTo(1); @@ -460,7 +460,7 @@ public final class ExoPlayerTest { // Disable text renderer by selecting a language that is not available. player.setTrackSelectionParameters( player.getTrackSelectionParameters().buildUpon().setPreferredTextLanguage("de").build()); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 1000); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 1000); runUntilPlaybackState(player, Player.STATE_READY); // Expect formerly enabled renderers to be reset after seek. assertThat(textRenderer.resetCount).isEqualTo(1); @@ -647,21 +647,21 @@ public final class ExoPlayerTest { player.setMediaSource(new FakeMediaSource(timeline, ExoPlayerTestRunner.VIDEO_FORMAT)); player.prepare(); runUntilTimelineChanged(player); - playUntilStartOfWindow(player, /* windowIndex= */ 1); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 1); player.setRepeatMode(Player.REPEAT_MODE_ONE); - playUntilStartOfWindow(player, /* windowIndex= */ 1); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 1); player.setRepeatMode(Player.REPEAT_MODE_OFF); - playUntilStartOfWindow(player, /* windowIndex= */ 2); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 2); player.setRepeatMode(Player.REPEAT_MODE_ONE); - playUntilStartOfWindow(player, /* windowIndex= */ 2); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 2); player.setRepeatMode(Player.REPEAT_MODE_ALL); - playUntilStartOfWindow(player, /* windowIndex= */ 0); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 0); player.setRepeatMode(Player.REPEAT_MODE_ONE); - playUntilStartOfWindow(player, /* windowIndex= */ 0); - playUntilStartOfWindow(player, /* windowIndex= */ 0); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 0); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 0); player.setRepeatMode(Player.REPEAT_MODE_OFF); - playUntilStartOfWindow(player, /* windowIndex= */ 1); - playUntilStartOfWindow(player, /* windowIndex= */ 2); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 1); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 2); player.play(); runUntilPlaybackState(player, Player.STATE_ENDED); @@ -694,9 +694,9 @@ public final class ExoPlayerTest { .pause() .waitForPlaybackState(Player.STATE_READY) .setRepeatMode(Player.REPEAT_MODE_ALL) - .playUntilStartOfWindow(/* windowIndex= */ 1) + .playUntilStartOfMediaItem(/* mediaItemIndex= */ 1) .setShuffleModeEnabled(true) - .playUntilStartOfWindow(/* windowIndex= */ 1) + .playUntilStartOfMediaItem(/* mediaItemIndex= */ 1) .setShuffleModeEnabled(false) .setRepeatMode(Player.REPEAT_MODE_OFF) .play() @@ -806,7 +806,7 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { try { - player.seekTo(/* windowIndex= */ 100, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 100, /* positionMs= */ 0); } catch (IllegalSeekPositionException e) { exception[0] = e; } @@ -1281,7 +1281,7 @@ public final class ExoPlayerTest { .play() .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 0, /* positionMs= */ 2000) + .initialSeek(/* mediaItemIndex= */ 0, /* positionMs= */ 2000) .setMediaSources(mediaSource) .setActionSchedule(actionSchedule) .build() @@ -1293,7 +1293,7 @@ public final class ExoPlayerTest { @Test public void stop_withoutReset_doesNotResetPosition_correctMasking() throws Exception { - int[] currentWindowIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + int[] currentMediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; long[] currentPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] bufferedPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] totalBufferedDuration = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; @@ -1302,18 +1302,18 @@ public final class ExoPlayerTest { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() - .seek(/* windowIndex= */ 1, /* positionMs= */ 1000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 1000) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[0] = player.getCurrentWindowIndex(); + currentMediaItemIndex[0] = player.getCurrentMediaItemIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); totalBufferedDuration[0] = player.getTotalBufferedDuration(); player.stop(/* reset= */ false); - currentWindowIndex[1] = player.getCurrentWindowIndex(); + currentMediaItemIndex[1] = player.getCurrentMediaItemIndex(); currentPosition[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); totalBufferedDuration[1] = player.getTotalBufferedDuration(); @@ -1324,7 +1324,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[2] = player.getCurrentWindowIndex(); + currentMediaItemIndex[2] = player.getCurrentMediaItemIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); totalBufferedDuration[2] = player.getTotalBufferedDuration(); @@ -1345,17 +1345,17 @@ public final class ExoPlayerTest { Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); testRunner.assertPositionDiscontinuityReasonsEqual(Player.DISCONTINUITY_REASON_SEEK); - assertThat(currentWindowIndex[0]).isEqualTo(1); + assertThat(currentMediaItemIndex[0]).isEqualTo(1); assertThat(currentPosition[0]).isEqualTo(1000); assertThat(bufferedPosition[0]).isEqualTo(10000); assertThat(totalBufferedDuration[0]).isEqualTo(9000); - assertThat(currentWindowIndex[1]).isEqualTo(1); + assertThat(currentMediaItemIndex[1]).isEqualTo(1); assertThat(currentPosition[1]).isEqualTo(1000); assertThat(bufferedPosition[1]).isEqualTo(1000); assertThat(totalBufferedDuration[1]).isEqualTo(0); - assertThat(currentWindowIndex[2]).isEqualTo(1); + assertThat(currentMediaItemIndex[2]).isEqualTo(1); assertThat(currentPosition[2]).isEqualTo(1000); assertThat(bufferedPosition[2]).isEqualTo(1000); assertThat(totalBufferedDuration[2]).isEqualTo(0); @@ -1385,7 +1385,7 @@ public final class ExoPlayerTest { @Test public void stop_withReset_doesResetPosition_correctMasking() throws Exception { - int[] currentWindowIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + int[] currentMediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; long[] currentPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] bufferedPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] totalBufferedDuration = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; @@ -1394,18 +1394,18 @@ public final class ExoPlayerTest { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() - .seek(/* windowIndex= */ 1, /* positionMs= */ 1000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 1000) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[0] = player.getCurrentWindowIndex(); + currentMediaItemIndex[0] = player.getCurrentMediaItemIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); totalBufferedDuration[0] = player.getTotalBufferedDuration(); player.stop(/* reset= */ true); - currentWindowIndex[1] = player.getCurrentWindowIndex(); + currentMediaItemIndex[1] = player.getCurrentMediaItemIndex(); currentPosition[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); totalBufferedDuration[1] = player.getTotalBufferedDuration(); @@ -1416,7 +1416,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[2] = player.getCurrentWindowIndex(); + currentMediaItemIndex[2] = player.getCurrentMediaItemIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); totalBufferedDuration[2] = player.getTotalBufferedDuration(); @@ -1439,17 +1439,17 @@ public final class ExoPlayerTest { testRunner.assertPositionDiscontinuityReasonsEqual( Player.DISCONTINUITY_REASON_SEEK, Player.DISCONTINUITY_REASON_REMOVE); - assertThat(currentWindowIndex[0]).isEqualTo(1); + assertThat(currentMediaItemIndex[0]).isEqualTo(1); assertThat(currentPosition[0]).isGreaterThan(0); assertThat(bufferedPosition[0]).isEqualTo(10000); assertThat(totalBufferedDuration[0]).isEqualTo(10000 - currentPosition[0]); - assertThat(currentWindowIndex[1]).isEqualTo(0); + assertThat(currentMediaItemIndex[1]).isEqualTo(0); assertThat(currentPosition[1]).isEqualTo(0); assertThat(bufferedPosition[1]).isEqualTo(0); assertThat(totalBufferedDuration[1]).isEqualTo(0); - assertThat(currentWindowIndex[2]).isEqualTo(0); + assertThat(currentMediaItemIndex[2]).isEqualTo(0); assertThat(currentPosition[2]).isEqualTo(0); assertThat(bufferedPosition[2]).isEqualTo(0); assertThat(totalBufferedDuration[2]).isEqualTo(0); @@ -1479,7 +1479,7 @@ public final class ExoPlayerTest { @Test public void release_correctMasking() throws Exception { - int[] currentWindowIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + int[] currentMediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; long[] currentPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] bufferedPosition = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; long[] totalBufferedDuration = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; @@ -1488,18 +1488,18 @@ public final class ExoPlayerTest { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() - .seek(/* windowIndex= */ 1, /* positionMs= */ 1000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 1000) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[0] = player.getCurrentWindowIndex(); + currentMediaItemIndex[0] = player.getCurrentMediaItemIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); totalBufferedDuration[0] = player.getTotalBufferedDuration(); player.release(); - currentWindowIndex[1] = player.getCurrentWindowIndex(); + currentMediaItemIndex[1] = player.getCurrentMediaItemIndex(); currentPosition[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); totalBufferedDuration[1] = player.getTotalBufferedDuration(); @@ -1510,7 +1510,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndex[2] = player.getCurrentWindowIndex(); + currentMediaItemIndex[2] = player.getCurrentMediaItemIndex(); currentPosition[2] = player.getCurrentPosition(); bufferedPosition[2] = player.getBufferedPosition(); totalBufferedDuration[2] = player.getTotalBufferedDuration(); @@ -1525,17 +1525,17 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS); - assertThat(currentWindowIndex[0]).isEqualTo(1); + assertThat(currentMediaItemIndex[0]).isEqualTo(1); assertThat(currentPosition[0]).isGreaterThan(0); assertThat(bufferedPosition[0]).isEqualTo(10000); assertThat(totalBufferedDuration[0]).isEqualTo(10000 - currentPosition[0]); - assertThat(currentWindowIndex[1]).isEqualTo(1); + assertThat(currentMediaItemIndex[1]).isEqualTo(1); assertThat(currentPosition[1]).isEqualTo(currentPosition[0]); assertThat(bufferedPosition[1]).isEqualTo(1000); assertThat(totalBufferedDuration[1]).isEqualTo(0); - assertThat(currentWindowIndex[2]).isEqualTo(1); + assertThat(currentMediaItemIndex[2]).isEqualTo(1); assertThat(currentPosition[2]).isEqualTo(currentPosition[0]); assertThat(bufferedPosition[2]).isEqualTo(1000); assertThat(totalBufferedDuration[2]).isEqualTo(0); @@ -1547,21 +1547,21 @@ public final class ExoPlayerTest { Timeline secondTimeline = new FakeTimeline(/* windowCount= */ 2); MediaSource secondSource = new FakeMediaSource(secondTimeline, ExoPlayerTestRunner.VIDEO_FORMAT); - AtomicInteger windowIndexAfterStop = new AtomicInteger(); + AtomicInteger mediaItemIndexAfterStop = new AtomicInteger(); AtomicLong positionAfterStop = new AtomicLong(); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_READY) .stop(/* reset= */ true) .waitForPlaybackState(Player.STATE_IDLE) - .seek(/* windowIndex= */ 1, /* positionMs= */ 1000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 1000) .setMediaSources(secondSource) .prepare() .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndexAfterStop.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterStop.set(player.getCurrentMediaItemIndex()); positionAfterStop.set(player.getCurrentPosition()); } }) @@ -1594,7 +1594,7 @@ public final class ExoPlayerTest { Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, // stop(true) Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); - assertThat(windowIndexAfterStop.get()).isEqualTo(1); + assertThat(mediaItemIndexAfterStop.get()).isEqualTo(1); assertThat(positionAfterStop.get()).isAtLeast(1000L); testRunner.assertPlayedPeriodIndices(0, 1); } @@ -1621,8 +1621,8 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) - .setMediaSources(/* windowIndex= */ 0, /* positionMs= */ 2000, secondSource) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 2000) + .setMediaSources(/* mediaItemIndex= */ 0, /* positionMs= */ 2000, secondSource) .waitForTimelineChanged( secondTimeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) .executeRunnable( @@ -1675,7 +1675,7 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 2000) .setMediaSources(/* resetPosition= */ true, secondSource) .waitForTimelineChanged( secondTimeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) @@ -1732,7 +1732,7 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 2000) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 2000) .setMediaSources(secondSource) .waitForTimelineChanged( secondTimeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) @@ -1892,7 +1892,7 @@ public final class ExoPlayerTest { throws Exception { ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(/* isAtomic= */ false, new FakeShuffleOrder(0)); - AtomicInteger windowIndexAfterAddingSources = new AtomicInteger(); + AtomicInteger mediaItemIndexAfterAddingSources = new AtomicInteger(); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .setShuffleModeEnabled(true) @@ -1909,7 +1909,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndexAfterAddingSources.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterAddingSources.set(player.getCurrentMediaItemIndex()); } }) .build(); @@ -1920,20 +1920,20 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(windowIndexAfterAddingSources.get()).isEqualTo(1); + assertThat(mediaItemIndexAfterAddingSources.get()).isEqualTo(1); } @Test public void playbackErrorAndReprepareDoesNotResetPosition() throws Exception { final Timeline timeline = new FakeTimeline(/* windowCount= */ 2); final long[] positionHolder = new long[3]; - final int[] windowIndexHolder = new int[3]; + final int[] mediaItemIndexHolder = new int[3]; final FakeMediaSource firstMediaSource = new FakeMediaSource(timeline); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 500) + .playUntilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 500) .throwPlaybackException( ExoPlaybackException.createForSource( new IOException(), PlaybackException.ERROR_CODE_IO_UNSPECIFIED)) @@ -1944,7 +1944,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position while in error state positionHolder[0] = player.getCurrentPosition(); - windowIndexHolder[0] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[0] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -1954,7 +1954,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position while repreparing. positionHolder[1] = player.getCurrentPosition(); - windowIndexHolder[1] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[1] = player.getCurrentMediaItemIndex(); } }) .waitForPlaybackState(Player.STATE_READY) @@ -1964,7 +1964,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position after repreparation finished. positionHolder[2] = player.getCurrentPosition(); - windowIndexHolder[2] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[2] = player.getCurrentMediaItemIndex(); } }) .play() @@ -1983,22 +1983,22 @@ public final class ExoPlayerTest { assertThat(positionHolder[0]).isAtLeast(500L); assertThat(positionHolder[1]).isEqualTo(positionHolder[0]); assertThat(positionHolder[2]).isEqualTo(positionHolder[0]); - assertThat(windowIndexHolder[0]).isEqualTo(1); - assertThat(windowIndexHolder[1]).isEqualTo(1); - assertThat(windowIndexHolder[2]).isEqualTo(1); + assertThat(mediaItemIndexHolder[0]).isEqualTo(1); + assertThat(mediaItemIndexHolder[1]).isEqualTo(1); + assertThat(mediaItemIndexHolder[2]).isEqualTo(1); } @Test public void seekAfterPlaybackError() throws Exception { final Timeline timeline = new FakeTimeline(/* windowCount= */ 2); final long[] positionHolder = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; - final int[] windowIndexHolder = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndexHolder = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; final FakeMediaSource firstMediaSource = new FakeMediaSource(timeline); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 500) + .playUntilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 500) .throwPlaybackException( ExoPlaybackException.createForSource( new IOException(), PlaybackException.ERROR_CODE_IO_UNSPECIFIED)) @@ -2009,10 +2009,10 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position while in error state positionHolder[0] = player.getCurrentPosition(); - windowIndexHolder[0] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[0] = player.getCurrentMediaItemIndex(); } }) - .seek(/* windowIndex= */ 0, /* positionMs= */ C.TIME_UNSET) + .seek(/* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_UNSET) .waitForPendingPlayerCommands() .executeRunnable( new PlayerRunnable() { @@ -2020,7 +2020,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position while in error state positionHolder[1] = player.getCurrentPosition(); - windowIndexHolder[1] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -2030,7 +2030,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Position after prepare. positionHolder[2] = player.getCurrentPosition(); - windowIndexHolder[2] = player.getCurrentWindowIndex(); + mediaItemIndexHolder[2] = player.getCurrentMediaItemIndex(); } }) .play() @@ -2051,9 +2051,9 @@ public final class ExoPlayerTest { assertThat(positionHolder[0]).isAtLeast(500L); assertThat(positionHolder[1]).isEqualTo(0L); assertThat(positionHolder[2]).isEqualTo(0L); - assertThat(windowIndexHolder[0]).isEqualTo(1); - assertThat(windowIndexHolder[1]).isEqualTo(0); - assertThat(windowIndexHolder[2]).isEqualTo(0); + assertThat(mediaItemIndexHolder[0]).isEqualTo(1); + assertThat(mediaItemIndexHolder[1]).isEqualTo(0); + assertThat(mediaItemIndexHolder[2]).isEqualTo(0); } @Test @@ -2216,7 +2216,7 @@ public final class ExoPlayerTest { .pause() .sendMessage( (messageType, payload) -> counter.getAndIncrement(), - /* windowIndex= */ 0, + /* mediaItemIndex= */ 0, /* positionMs= */ 2000, /* deleteAfterDelivery= */ false) .seek(/* positionMs= */ 2000) @@ -2290,23 +2290,23 @@ public final class ExoPlayerTest { long duration2Ms = timeline.getWindow(1, new Window()).getDurationMs(); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) - .sendMessage(targetStartFirstPeriod, /* windowIndex= */ 0, /* positionMs= */ 0) + .sendMessage(targetStartFirstPeriod, /* mediaItemIndex= */ 0, /* positionMs= */ 0) .sendMessage( targetEndMiddlePeriodResolved, - /* windowIndex= */ 0, + /* mediaItemIndex= */ 0, /* positionMs= */ duration1Ms - 1) .sendMessage( targetEndMiddlePeriodUnresolved, - /* windowIndex= */ 0, + /* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_END_OF_SOURCE) - .sendMessage(targetStartMiddlePeriod, /* windowIndex= */ 1, /* positionMs= */ 0) + .sendMessage(targetStartMiddlePeriod, /* mediaItemIndex= */ 1, /* positionMs= */ 0) .sendMessage( targetEndLastPeriodResolved, - /* windowIndex= */ 1, + /* mediaItemIndex= */ 1, /* positionMs= */ duration2Ms - 1) .sendMessage( targetEndLastPeriodUnresolved, - /* windowIndex= */ 1, + /* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_END_OF_SOURCE) .waitForMessage(targetEndLastPeriodUnresolved) .build(); @@ -2317,19 +2317,19 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(targetStartFirstPeriod.windowIndex).isEqualTo(0); + assertThat(targetStartFirstPeriod.mediaItemIndex).isEqualTo(0); assertThat(targetStartFirstPeriod.positionMs).isAtLeast(0L); - assertThat(targetEndMiddlePeriodResolved.windowIndex).isEqualTo(0); + assertThat(targetEndMiddlePeriodResolved.mediaItemIndex).isEqualTo(0); assertThat(targetEndMiddlePeriodResolved.positionMs).isAtLeast(duration1Ms - 1); - assertThat(targetEndMiddlePeriodUnresolved.windowIndex).isEqualTo(0); + assertThat(targetEndMiddlePeriodUnresolved.mediaItemIndex).isEqualTo(0); assertThat(targetEndMiddlePeriodUnresolved.positionMs).isAtLeast(duration1Ms - 1); assertThat(targetEndMiddlePeriodResolved.positionMs) .isEqualTo(targetEndMiddlePeriodUnresolved.positionMs); - assertThat(targetStartMiddlePeriod.windowIndex).isEqualTo(1); + assertThat(targetStartMiddlePeriod.mediaItemIndex).isEqualTo(1); assertThat(targetStartMiddlePeriod.positionMs).isAtLeast(0L); - assertThat(targetEndLastPeriodResolved.windowIndex).isEqualTo(1); + assertThat(targetEndLastPeriodResolved.mediaItemIndex).isEqualTo(1); assertThat(targetEndLastPeriodResolved.positionMs).isAtLeast(duration2Ms - 1); - assertThat(targetEndLastPeriodUnresolved.windowIndex).isEqualTo(1); + assertThat(targetEndLastPeriodUnresolved.mediaItemIndex).isEqualTo(1); assertThat(targetEndLastPeriodUnresolved.positionMs).isAtLeast(duration2Ms - 1); assertThat(targetEndLastPeriodResolved.positionMs) .isEqualTo(targetEndLastPeriodUnresolved.positionMs); @@ -2445,12 +2445,12 @@ public final class ExoPlayerTest { .waitForPlaybackState(Player.STATE_BUFFERING) .sendMessage( target, - /* windowIndex= */ 0, + /* mediaItemIndex= */ 0, /* positionMs= */ 50, /* deleteAfterDelivery= */ false) .setRepeatMode(Player.REPEAT_MODE_ALL) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 1) - .playUntilStartOfWindow(/* windowIndex= */ 0) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 1) + .playUntilStartOfMediaItem(/* mediaItemIndex= */ 0) .setRepeatMode(Player.REPEAT_MODE_OFF) .play() .build(); @@ -2464,7 +2464,7 @@ public final class ExoPlayerTest { } @Test - public void sendMessagesMoveCurrentWindowIndex() throws Exception { + public void sendMessagesMoveCurrentMediaItemIndex() throws Exception { Timeline timeline = new FakeTimeline(new TimelineWindowDefinition(/* periodCount= */ 1, /* id= */ 0)); final Timeline secondTimeline = @@ -2492,7 +2492,7 @@ public final class ExoPlayerTest { .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); - assertThat(target.windowIndex).isEqualTo(1); + assertThat(target.mediaItemIndex).isEqualTo(1); } @Test @@ -2503,7 +2503,7 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForTimelineChanged(timeline, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) - .sendMessage(target, /* windowIndex = */ 2, /* positionMs= */ 50) + .sendMessage(target, /* mediaItemIndex = */ 2, /* positionMs= */ 50) .play() .build(); new ExoPlayerTestRunner.Builder(context) @@ -2512,7 +2512,7 @@ public final class ExoPlayerTest { .build() .start() .blockUntilEnded(TIMEOUT_MS); - assertThat(target.windowIndex).isEqualTo(2); + assertThat(target.mediaItemIndex).isEqualTo(2); assertThat(target.positionMs).isAtLeast(50L); } @@ -2525,7 +2525,7 @@ public final class ExoPlayerTest { .pause() .waitForTimelineChanged( timeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) - .sendMessage(target, /* windowIndex = */ 2, /* positionMs= */ 50) + .sendMessage(target, /* mediaItemIndex = */ 2, /* positionMs= */ 50) .play() .build(); new ExoPlayerTestRunner.Builder(context) @@ -2534,12 +2534,12 @@ public final class ExoPlayerTest { .build() .start() .blockUntilEnded(TIMEOUT_MS); - assertThat(target.windowIndex).isEqualTo(2); + assertThat(target.mediaItemIndex).isEqualTo(2); assertThat(target.positionMs).isAtLeast(50L); } @Test - public void sendMessagesMoveWindowIndex() throws Exception { + public void sendMessagesMoveMediaItemIndex() throws Exception { Timeline timeline = new FakeTimeline( new TimelineWindowDefinition(/* periodCount= */ 1, /* id= */ 0), @@ -2556,11 +2556,11 @@ public final class ExoPlayerTest { .pause() .waitForTimelineChanged( timeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) - .sendMessage(target, /* windowIndex = */ 1, /* positionMs= */ 50) + .sendMessage(target, /* mediaItemIndex = */ 1, /* positionMs= */ 50) .executeRunnable(() -> mediaSource.setNewSourceInfo(secondTimeline)) .waitForTimelineChanged( secondTimeline, /* expectedReason */ Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) - .seek(/* windowIndex= */ 0, /* positionMs= */ 0) + .seek(/* mediaItemIndex= */ 0, /* positionMs= */ 0) .play() .build(); new ExoPlayerTestRunner.Builder(context) @@ -2570,7 +2570,7 @@ public final class ExoPlayerTest { .start() .blockUntilEnded(TIMEOUT_MS); assertThat(target.positionMs).isAtLeast(50L); - assertThat(target.windowIndex).isEqualTo(0); + assertThat(target.mediaItemIndex).isEqualTo(0); } @Test @@ -2590,11 +2590,11 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .sendMessage(target1, /* windowIndex = */ 0, /* positionMs= */ 50) - .sendMessage(target2, /* windowIndex = */ 1, /* positionMs= */ 50) - .sendMessage(target3, /* windowIndex = */ 2, /* positionMs= */ 50) + .sendMessage(target1, /* mediaItemIndex = */ 0, /* positionMs= */ 50) + .sendMessage(target2, /* mediaItemIndex = */ 1, /* positionMs= */ 50) + .sendMessage(target3, /* mediaItemIndex = */ 2, /* positionMs= */ 50) .setShuffleModeEnabled(true) - .seek(/* windowIndex= */ 2, /* positionMs= */ 0) + .seek(/* mediaItemIndex= */ 2, /* positionMs= */ 0) .play() .build(); new ExoPlayerTestRunner.Builder(context) @@ -2603,9 +2603,9 @@ public final class ExoPlayerTest { .build() .start() .blockUntilEnded(TIMEOUT_MS); - assertThat(target1.windowIndex).isEqualTo(0); - assertThat(target2.windowIndex).isEqualTo(1); - assertThat(target3.windowIndex).isEqualTo(2); + assertThat(target1.mediaItemIndex).isEqualTo(0); + assertThat(target2.mediaItemIndex).isEqualTo(1); + assertThat(target3.mediaItemIndex).isEqualTo(2); } @Test @@ -2625,7 +2625,7 @@ public final class ExoPlayerTest { } }) // Play a bit to ensure message arrived in internal player. - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 30) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 30) .executeRunnable(() -> message.get().cancel()) .play() .build(); @@ -2659,7 +2659,7 @@ public final class ExoPlayerTest { } }) // Play until the message has been delivered. - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 51) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 51) // Seek back, cancel the message, and play past the same position again. .seek(/* positionMs= */ 0) .executeRunnable(() -> message.get().cancel()) @@ -2681,13 +2681,13 @@ public final class ExoPlayerTest { player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource())); player .createMessage((messageType, payload) -> {}) - .setPosition(/* windowIndex= */ 0, /* positionMs= */ 0) + .setPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 0) .setDeleteAfterDelivery(false) .send(); PlayerMessage.Target secondMediaItemTarget = mock(PlayerMessage.Target.class); player .createMessage(secondMediaItemTarget) - .setPosition(/* windowIndex= */ 1, /* positionMs= */ 0) + .setPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 0) .setDeleteAfterDelivery(false) .send(); @@ -2765,7 +2765,7 @@ public final class ExoPlayerTest { .waitForPlaybackState(Player.STATE_READY) // Ensure next period is pre-buffered by playing until end of first period. .playUntilPosition( - /* windowIndex= */ 0, + /* mediaItemIndex= */ 0, /* positionMs= */ Util.usToMs(TimelineWindowDefinition.DEFAULT_WINDOW_DURATION_US)) .executeRunnable(() -> mediaSource.setNewSourceInfo(timeline2)) .waitForTimelineChanged( @@ -2921,12 +2921,12 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .seek(/* windowIndex= */ 0, /* positionMs= */ 9999) + .seek(/* mediaItemIndex= */ 0, /* positionMs= */ 9999) // Wait after each seek until the internal player has updated its state. .waitForPendingPlayerCommands() - .seek(/* windowIndex= */ 0, /* positionMs= */ 1) + .seek(/* mediaItemIndex= */ 0, /* positionMs= */ 1) .waitForPendingPlayerCommands() - .seek(/* windowIndex= */ 0, /* positionMs= */ 9999) + .seek(/* mediaItemIndex= */ 0, /* positionMs= */ 9999) .waitForPendingPlayerCommands() .play() .build(); @@ -2988,7 +2988,7 @@ public final class ExoPlayerTest { } catch (InterruptedException e) { throw new IllegalStateException(e); } - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 1000L); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 1000L); } }) .waitForPendingPlayerCommands() @@ -3254,8 +3254,8 @@ public final class ExoPlayerTest { .setRepeatMode(Player.REPEAT_MODE_ALL) .waitForPlaybackState(Player.STATE_READY) // Play until the media repeats once. - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 1) - .playUntilStartOfWindow(/* windowIndex= */ 0) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 1) + .playUntilStartOfMediaItem(/* mediaItemIndex= */ 0) .setRepeatMode(Player.REPEAT_MODE_OFF) .play() .build(); @@ -3289,7 +3289,7 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_READY) - .seek(/* windowIndex= */ 1, /* positionMs= */ 0) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 0) .waitForPendingPlayerCommands() .play() .build(); @@ -3337,7 +3337,7 @@ public final class ExoPlayerTest { .pause() .waitForPlaybackState(Player.STATE_READY) // Play almost to end to ensure the current period is fully buffered. - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 90) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 90) // Enable repeat mode to trigger the creation of new media periods. .setRepeatMode(Player.REPEAT_MODE_ALL) // Remove the media source. @@ -3852,20 +3852,20 @@ public final class ExoPlayerTest { return Timeline.EMPTY; } }; - int[] currentWindowIndices = new int[1]; + int[] currentMediaItemIndices = new int[1]; long[] currentPlaybackPositions = new long[1]; long[] windowCounts = new long[1]; - int seekToWindowIndex = 1; + int seekToMediaItemIndex = 1; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) - .seek(/* windowIndex= */ 1, /* positionMs= */ 5000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 5000) .waitForTimelineChanged( /* expectedTimeline= */ null, Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); } @@ -3882,23 +3882,23 @@ public final class ExoPlayerTest { exoPlayerTestRunner.assertTimelineChangeReasonsEqual( Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE); assertArrayEquals(new long[] {2}, windowCounts); - assertArrayEquals(new int[] {seekToWindowIndex}, currentWindowIndices); + assertArrayEquals(new int[] {seekToMediaItemIndex}, currentMediaItemIndices); assertArrayEquals(new long[] {5_000}, currentPlaybackPositions); } @SuppressWarnings("deprecation") @Test - public void seekTo_windowIndexIsReset_deprecated() throws Exception { + public void seekTo_mediaItemIndexIsReset_deprecated() throws Exception { FakeTimeline fakeTimeline = new FakeTimeline(); FakeMediaSource mediaSource = new FakeMediaSource(fakeTimeline); - final int[] windowIndex = {C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET}; final long[] positionMs = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() - .seek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 3000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .playUntilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 3000) .executeRunnable( new PlayerRunnable() { @Override @@ -3917,7 +3917,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[0] = player.getCurrentWindowIndex(); + mediaItemIndex[0] = player.getCurrentMediaItemIndex(); positionMs[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); } @@ -3930,7 +3930,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(3000L); assertThat(positionMs[1]).isEqualTo(7000L); assertThat(positionMs[2]).isEqualTo(7000L); @@ -3941,17 +3941,17 @@ public final class ExoPlayerTest { } @Test - public void seekTo_windowIndexIsReset() throws Exception { + public void seekTo_mediaItemIndexIsReset() throws Exception { FakeTimeline fakeTimeline = new FakeTimeline(); FakeMediaSource mediaSource = new FakeMediaSource(fakeTimeline); - final int[] windowIndex = {C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET}; final long[] positionMs = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .pause() - .seek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 3000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .playUntilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 3000) .pause() .executeRunnable( new PlayerRunnable() { @@ -3970,7 +3970,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[0] = player.getCurrentWindowIndex(); + mediaItemIndex[0] = player.getCurrentMediaItemIndex(); positionMs[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); } @@ -3983,7 +3983,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(3000); assertThat(positionMs[1]).isEqualTo(7000); assertThat(positionMs[2]).isEqualTo(7000); @@ -3995,7 +3995,7 @@ public final class ExoPlayerTest { @Test public void seekTo_singlePeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4007,19 +4007,19 @@ public final class ExoPlayerTest { player.seekTo(9000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 9200)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(9000); assertThat(bufferedPositions[0]).isEqualTo(9200); assertThat(totalBufferedDuration[0]).isEqualTo(200); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(9200); assertThat(totalBufferedDuration[1]).isEqualTo(200); @@ -4027,7 +4027,7 @@ public final class ExoPlayerTest { @Test public void seekTo_singlePeriod_beyondBufferedData_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4039,19 +4039,19 @@ public final class ExoPlayerTest { player.seekTo(9200); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 9200)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(9200); assertThat(bufferedPositions[0]).isEqualTo(9200); assertThat(totalBufferedDuration[0]).isEqualTo(0); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(9200); assertThat(totalBufferedDuration[1]).isEqualTo(0); @@ -4059,7 +4059,7 @@ public final class ExoPlayerTest { @Test public void seekTo_backwardsSinglePeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4071,14 +4071,14 @@ public final class ExoPlayerTest { player.seekTo(1000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 9200)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(1000); assertThat(bufferedPositions[0]).isEqualTo(1000); assertThat(totalBufferedDuration[0]).isEqualTo(0); @@ -4086,7 +4086,7 @@ public final class ExoPlayerTest { @Test public void seekTo_backwardsMultiplePeriods_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4098,8 +4098,8 @@ public final class ExoPlayerTest { player.seekTo(0, 1000); } }, - /* pauseWindowIndex= */ 1, - windowIndex, + /* pauseMediaItemIndex= */ 1, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4107,7 +4107,7 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 9200)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(1000); assertThat(bufferedPositions[0]).isEqualTo(1000); assertThat(totalBufferedDuration[0]).isEqualTo(0); @@ -4115,7 +4115,7 @@ public final class ExoPlayerTest { @Test public void seekTo_toUnbufferedPeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4127,8 +4127,8 @@ public final class ExoPlayerTest { player.seekTo(2, 1000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4136,12 +4136,12 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 0)); - assertThat(windowIndex[0]).isEqualTo(2); + assertThat(mediaItemIndex[0]).isEqualTo(2); assertThat(positionMs[0]).isEqualTo(1000); assertThat(bufferedPositions[0]).isEqualTo(1000); assertThat(totalBufferedDuration[0]).isEqualTo(0); - assertThat(windowIndex[1]).isEqualTo(2); + assertThat(mediaItemIndex[1]).isEqualTo(2); assertThat(positionMs[1]).isEqualTo(1000); assertThat(bufferedPositions[1]).isEqualTo(1000); assertThat(totalBufferedDuration[1]).isEqualTo(0); @@ -4149,7 +4149,7 @@ public final class ExoPlayerTest { @Test public void seekTo_toLoadingPeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4161,22 +4161,22 @@ public final class ExoPlayerTest { player.seekTo(1, 1000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, new FakeMediaSource(), new FakeMediaSource()); - assertThat(windowIndex[0]).isEqualTo(1); + assertThat(mediaItemIndex[0]).isEqualTo(1); assertThat(positionMs[0]).isEqualTo(1000); // TODO(b/160450903): Verify masking of buffering properties when behaviour in EPII is fully // covered. // assertThat(bufferedPositions[0]).isEqualTo(10_000); // assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4185,7 +4185,7 @@ public final class ExoPlayerTest { @Test public void seekTo_toLoadingPeriod_withinPartiallyBufferedData_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4197,22 +4197,22 @@ public final class ExoPlayerTest { player.seekTo(1, 1000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(1); + assertThat(mediaItemIndex[0]).isEqualTo(1); assertThat(positionMs[0]).isEqualTo(1000); // TODO(b/160450903): Verify masking of buffering properties when behaviour in EPII is fully // covered. // assertThat(bufferedPositions[0]).isEqualTo(1000); // assertThat(totalBufferedDuration[0]).isEqualTo(0); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(4000); assertThat(totalBufferedDuration[1]).isEqualTo(3000); @@ -4220,7 +4220,7 @@ public final class ExoPlayerTest { @Test public void seekTo_toLoadingPeriod_beyondBufferedData_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4232,20 +4232,20 @@ public final class ExoPlayerTest { player.seekTo(1, 5000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(1); + assertThat(mediaItemIndex[0]).isEqualTo(1); assertThat(positionMs[0]).isEqualTo(5000); assertThat(bufferedPositions[0]).isEqualTo(5000); assertThat(totalBufferedDuration[0]).isEqualTo(0); - assertThat(windowIndex[1]).isEqualTo(1); + assertThat(mediaItemIndex[1]).isEqualTo(1); assertThat(positionMs[1]).isEqualTo(5000); assertThat(bufferedPositions[1]).isEqualTo(5000); assertThat(totalBufferedDuration[1]).isEqualTo(0); @@ -4253,7 +4253,7 @@ public final class ExoPlayerTest { @Test public void seekTo_toInnerFullyBufferedPeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4265,8 +4265,8 @@ public final class ExoPlayerTest { player.seekTo(1, 5000); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4274,14 +4274,14 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(1); + assertThat(mediaItemIndex[0]).isEqualTo(1); assertThat(positionMs[0]).isEqualTo(5000); // TODO(b/160450903): Verify masking of buffering properties when behaviour in EPII is fully // covered. // assertThat(bufferedPositions[0]).isEqualTo(10_000); // assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4289,7 +4289,7 @@ public final class ExoPlayerTest { @Test public void addMediaSource_withinBufferedPeriods_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4302,20 +4302,20 @@ public final class ExoPlayerTest { /* index= */ 1, createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 0)); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(8000); assertThat(bufferedPositions[0]).isEqualTo(10_000); assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4323,7 +4323,7 @@ public final class ExoPlayerTest { @Test public void moveMediaItem_behindLoadingPeriod_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4335,8 +4335,8 @@ public final class ExoPlayerTest { player.moveMediaItem(/* currentIndex= */ 1, /* newIndex= */ 2); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4344,12 +4344,12 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(8000); assertThat(bufferedPositions[0]).isEqualTo(10_000); assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4357,7 +4357,7 @@ public final class ExoPlayerTest { @Test public void moveMediaItem_undloadedBehindPlaying_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4369,8 +4369,8 @@ public final class ExoPlayerTest { player.moveMediaItem(/* currentIndex= */ 3, /* newIndex= */ 1); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4379,12 +4379,12 @@ public final class ExoPlayerTest { createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 0)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(8000); assertThat(bufferedPositions[0]).isEqualTo(10_000); assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4392,7 +4392,7 @@ public final class ExoPlayerTest { @Test public void removeMediaItem_removePlayingWindow_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4404,22 +4404,22 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 0); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(0); // TODO(b/160450903): Verify masking of buffering properties when behaviour in EPII is fully // covered. // assertThat(bufferedPositions[0]).isEqualTo(4000); // assertThat(totalBufferedDuration[0]).isEqualTo(4000); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(4000); assertThat(totalBufferedDuration[1]).isEqualTo(4000); @@ -4427,7 +4427,7 @@ public final class ExoPlayerTest { @Test public void removeMediaItem_removeLoadingWindow_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4439,8 +4439,8 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 2); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4448,12 +4448,12 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isAtLeast(8000); assertThat(bufferedPositions[0]).isEqualTo(10_000); assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[1]); @@ -4462,7 +4462,7 @@ public final class ExoPlayerTest { @Test public void removeMediaItem_removeInnerFullyBufferedWindow_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4474,8 +4474,8 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 1); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4483,12 +4483,12 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(8000); assertThat(bufferedPositions[0]).isEqualTo(10_000); assertThat(totalBufferedDuration[0]).isEqualTo(10_000 - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(0); + assertThat(mediaItemIndex[1]).isEqualTo(0); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(10_000); assertThat(totalBufferedDuration[1]).isEqualTo(10_000 - positionMs[0]); @@ -4496,7 +4496,7 @@ public final class ExoPlayerTest { @Test public void clearMediaItems_correctMaskingPosition() throws Exception { - final int[] windowIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] mediaItemIndex = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] positionMs = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] bufferedPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] totalBufferedDuration = {C.INDEX_UNSET, C.INDEX_UNSET}; @@ -4508,8 +4508,8 @@ public final class ExoPlayerTest { player.clearMediaItems(); } }, - /* pauseWindowIndex= */ 0, - windowIndex, + /* pauseMediaItemIndex= */ 0, + mediaItemIndex, positionMs, bufferedPositions, totalBufferedDuration, @@ -4517,12 +4517,12 @@ public final class ExoPlayerTest { new FakeMediaSource(), createPartiallyBufferedMediaSource(/* maxBufferedPositionMs= */ 4000)); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(positionMs[0]).isEqualTo(0); assertThat(bufferedPositions[0]).isEqualTo(0); assertThat(totalBufferedDuration[0]).isEqualTo(0); - assertThat(windowIndex[1]).isEqualTo(windowIndex[0]); + assertThat(mediaItemIndex[1]).isEqualTo(mediaItemIndex[0]); assertThat(positionMs[1]).isEqualTo(positionMs[0]); assertThat(bufferedPositions[1]).isEqualTo(bufferedPositions[0]); assertThat(totalBufferedDuration[1]).isEqualTo(totalBufferedDuration[0]); @@ -4530,8 +4530,8 @@ public final class ExoPlayerTest { private void runPositionMaskingCapturingActionSchedule( PlayerRunnable actionRunnable, - int pauseWindowIndex, - int[] windowIndex, + int pauseMediaItemIndex, + int[] mediaItemIndex, long[] positionMs, long[] bufferedPosition, long[] totalBufferedDuration, @@ -4539,13 +4539,13 @@ public final class ExoPlayerTest { throws Exception { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) - .playUntilPosition(pauseWindowIndex, /* positionMs= */ 8000) + .playUntilPosition(pauseMediaItemIndex, /* positionMs= */ 8000) .executeRunnable(actionRunnable) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[0] = player.getCurrentWindowIndex(); + mediaItemIndex[0] = player.getCurrentMediaItemIndex(); positionMs[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); totalBufferedDuration[0] = player.getTotalBufferedDuration(); @@ -4556,7 +4556,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[1] = player.getCurrentWindowIndex(); + mediaItemIndex[1] = player.getCurrentMediaItemIndex(); positionMs[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); totalBufferedDuration[1] = player.getTotalBufferedDuration(); @@ -4637,7 +4637,7 @@ public final class ExoPlayerTest { /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); - int[] windowIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + int[] mediaItemIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; long[] positionMs = new long[] {C.TIME_UNSET, C.TIME_UNSET, C.INDEX_UNSET}; long[] bufferedPositionMs = new long[] {C.TIME_UNSET, C.TIME_UNSET, C.INDEX_UNSET}; long[] totalBufferedDurationMs = new long[] {C.TIME_UNSET, C.TIME_UNSET, C.INDEX_UNSET}; @@ -4653,7 +4653,7 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { player.addMediaSource(/* index= */ 1, new FakeMediaSource()); - windowIndex[0] = player.getCurrentWindowIndex(); + mediaItemIndex[0] = player.getCurrentMediaItemIndex(); isPlayingAd[0] = player.isPlayingAd(); positionMs[0] = player.getCurrentPosition(); bufferedPositionMs[0] = player.getBufferedPosition(); @@ -4665,21 +4665,21 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[1] = player.getCurrentWindowIndex(); + mediaItemIndex[1] = player.getCurrentMediaItemIndex(); isPlayingAd[1] = player.isPlayingAd(); positionMs[1] = player.getCurrentPosition(); bufferedPositionMs[1] = player.getBufferedPosition(); totalBufferedDurationMs[1] = player.getTotalBufferedDuration(); } }) - .playUntilPosition(/* windowIndex= */ 0, /* positionMs= */ 8000) + .playUntilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 8000) .waitForPendingPlayerCommands() .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { player.addMediaSource(new FakeMediaSource()); - windowIndex[2] = player.getCurrentWindowIndex(); + mediaItemIndex[2] = player.getCurrentMediaItemIndex(); isPlayingAd[2] = player.isPlayingAd(); positionMs[2] = player.getCurrentPosition(); bufferedPositionMs[2] = player.getBufferedPosition(); @@ -4697,19 +4697,19 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(isPlayingAd[0]).isTrue(); assertThat(positionMs[0]).isAtMost(adDurationMs); assertThat(bufferedPositionMs[0]).isEqualTo(adDurationMs); assertThat(totalBufferedDurationMs[0]).isAtLeast(adDurationMs - positionMs[0]); - assertThat(windowIndex[1]).isEqualTo(0); + assertThat(mediaItemIndex[1]).isEqualTo(0); assertThat(isPlayingAd[1]).isTrue(); assertThat(positionMs[1]).isAtMost(adDurationMs); assertThat(bufferedPositionMs[1]).isEqualTo(adDurationMs); assertThat(totalBufferedDurationMs[1]).isAtLeast(adDurationMs - positionMs[1]); - assertThat(windowIndex[2]).isEqualTo(0); + assertThat(mediaItemIndex[2]).isEqualTo(0); assertThat(isPlayingAd[2]).isFalse(); assertThat(positionMs[2]).isEqualTo(8000); assertThat(bufferedPositionMs[2]).isEqualTo(contentDurationMs); @@ -4738,7 +4738,7 @@ public final class ExoPlayerTest { /* durationUs= */ Util.msToUs(contentDurationMs), adPlaybackState)); FakeMediaSource adsMediaSource = new FakeMediaSource(adTimeline); - int[] windowIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET}; + int[] mediaItemIndex = new int[] {C.INDEX_UNSET, C.INDEX_UNSET}; long[] positionMs = new long[] {C.TIME_UNSET, C.TIME_UNSET}; long[] bufferedPositionMs = new long[] {C.TIME_UNSET, C.TIME_UNSET}; long[] totalBufferedDurationMs = new long[] {C.TIME_UNSET, C.TIME_UNSET}; @@ -4753,8 +4753,8 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 8000); - windowIndex[0] = player.getCurrentWindowIndex(); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 8000); + mediaItemIndex[0] = player.getCurrentMediaItemIndex(); isPlayingAd[0] = player.isPlayingAd(); positionMs[0] = player.getCurrentPosition(); bufferedPositionMs[0] = player.getBufferedPosition(); @@ -4766,7 +4766,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndex[1] = player.getCurrentWindowIndex(); + mediaItemIndex[1] = player.getCurrentMediaItemIndex(); isPlayingAd[1] = player.isPlayingAd(); positionMs[1] = player.getCurrentPosition(); bufferedPositionMs[1] = player.getBufferedPosition(); @@ -4784,13 +4784,13 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(windowIndex[0]).isEqualTo(0); + assertThat(mediaItemIndex[0]).isEqualTo(0); assertThat(isPlayingAd[0]).isTrue(); assertThat(positionMs[0]).isEqualTo(0); assertThat(bufferedPositionMs[0]).isEqualTo(adDurationMs); assertThat(totalBufferedDurationMs[0]).isEqualTo(adDurationMs); - assertThat(windowIndex[1]).isEqualTo(0); + assertThat(mediaItemIndex[1]).isEqualTo(0); assertThat(isPlayingAd[1]).isTrue(); assertThat(positionMs[1]).isEqualTo(0); assertThat(bufferedPositionMs[1]).isEqualTo(adDurationMs); @@ -5332,7 +5332,7 @@ public final class ExoPlayerTest { .addMediaSources(new FakeMediaSource()) .executeRunnable( new PlaybackStateCollector(/* index= */ 3, playbackStates, timelineWindowCounts)) - .seek(/* windowIndex= */ 1, /* positionMs= */ 2000) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ 2000) .prepare() // The first expected buffering state arrives after prepare but not before. .waitForPlaybackState(Player.STATE_BUFFERING) @@ -5502,7 +5502,7 @@ public final class ExoPlayerTest { @Test public void prepareWithInvalidInitialSeek_expectEndedImmediately() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_ENDED) @@ -5510,7 +5510,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -5518,7 +5518,7 @@ public final class ExoPlayerTest { ExoPlayerTestRunner exoPlayerTestRunner = new ExoPlayerTestRunner.Builder(context) .skipSettingMediaSources() - .initialSeek(/* windowIndex= */ 1, C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, C.TIME_UNSET) .setActionSchedule(actionSchedule) .build() .start() @@ -5528,7 +5528,7 @@ public final class ExoPlayerTest { exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); exoPlayerTestRunner.assertTimelinesSame(); exoPlayerTestRunner.assertTimelineChangeReasonsEqual(); - assertArrayEquals(new int[] {1}, currentWindowIndices); + assertArrayEquals(new int[] {1}, currentMediaItemIndices); } @Test @@ -5564,9 +5564,9 @@ public final class ExoPlayerTest { /* isAtomic= */ false, new FakeMediaSource(fakeTimeline, ExoPlayerTestRunner.VIDEO_FORMAT), new FakeMediaSource(fakeTimeline, ExoPlayerTestRunner.VIDEO_FORMAT)); - int[] currentWindowIndices = new int[1]; + int[] currentMediaItemIndices = new int[1]; long[] currentPlaybackPositions = new long[1]; - int seekToWindowIndex = 1; + int seekToMediaItemIndex = 1; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_BUFFERING) @@ -5575,21 +5575,21 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); } }) .build(); new ExoPlayerTestRunner.Builder(context) .setMediaSources(concatenatingMediaSource) - .initialSeek(seekToWindowIndex, 5000) + .initialSeek(seekToMediaItemIndex, 5000) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); assertArrayEquals(new long[] {5_000}, currentPlaybackPositions); - assertArrayEquals(new int[] {seekToWindowIndex}, currentWindowIndices); + assertArrayEquals(new int[] {seekToMediaItemIndex}, currentMediaItemIndices); } @Test @@ -5600,10 +5600,10 @@ public final class ExoPlayerTest { /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(/* isAtomic= */ false); - int[] currentWindowIndices = new int[2]; + int[] currentMediaItemIndices = new int[2]; long[] currentPlaybackPositions = new long[2]; long[] windowCounts = new long[2]; - int seekToWindowIndex = 1; + int seekToMediaItemIndex = 1; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_ENDED) @@ -5611,7 +5611,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); } @@ -5627,7 +5627,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[1] = player.getCurrentPosition(); windowCounts[1] = player.getCurrentTimeline().getWindowCount(); } @@ -5635,14 +5635,15 @@ public final class ExoPlayerTest { .build(); new ExoPlayerTestRunner.Builder(context) .setMediaSources(concatenatingMediaSource) - .initialSeek(seekToWindowIndex, 5000) + .initialSeek(seekToMediaItemIndex, 5000) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); assertArrayEquals(new long[] {0, 2}, windowCounts); - assertArrayEquals(new int[] {seekToWindowIndex, seekToWindowIndex}, currentWindowIndices); + assertArrayEquals( + new int[] {seekToMediaItemIndex, seekToMediaItemIndex}, currentMediaItemIndices); assertArrayEquals(new long[] {5_000, 5_000}, currentPlaybackPositions); } @@ -5671,10 +5672,10 @@ public final class ExoPlayerTest { /* isSeekable= */ true, /* isDynamic= */ false, /* durationUs= */ 10_000_000)); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(/* isAtomic= */ false); - int[] currentWindowIndices = new int[2]; + int[] currentMediaItemIndices = new int[2]; long[] currentPlaybackPositions = new long[2]; long[] windowCounts = new long[2]; - int seekToWindowIndex = 1; + int seekToMediaItemIndex = 1; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_ENDED) @@ -5682,7 +5683,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[0] = player.getCurrentPosition(); windowCounts[0] = player.getCurrentTimeline().getWindowCount(); } @@ -5698,7 +5699,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPlaybackPositions[1] = player.getCurrentPosition(); windowCounts[1] = player.getCurrentTimeline().getWindowCount(); } @@ -5707,14 +5708,15 @@ public final class ExoPlayerTest { new ExoPlayerTestRunner.Builder(context) .setMediaSources(concatenatingMediaSource) .setUseLazyPreparation(/* useLazyPreparation= */ true) - .initialSeek(seekToWindowIndex, 5000) + .initialSeek(seekToMediaItemIndex, 5000) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); assertArrayEquals(new long[] {0, 2}, windowCounts); - assertArrayEquals(new int[] {seekToWindowIndex, seekToWindowIndex}, currentWindowIndices); + assertArrayEquals( + new int[] {seekToMediaItemIndex, seekToMediaItemIndex}, currentMediaItemIndices); assertArrayEquals(new long[] {5_000, 5_000}, currentPlaybackPositions); } @@ -5875,19 +5877,19 @@ public final class ExoPlayerTest { } @Test - public void setMediaSources_empty_whenEmpty_correctMaskingWindowIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + public void setMediaSources_empty_whenEmpty_correctMaskingMediaItemIndex() throws Exception { + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); player.addMediaSources(/* index= */ 0, listOfTwo); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -5896,7 +5898,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); @@ -5907,12 +5909,12 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {0, 0, 0}, currentWindowIndices); + assertArrayEquals(new int[] {0, 0, 0}, currentMediaItemIndices); } @Test public void setMediaItems_resetPosition_resetsPosition() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] currentPositions = {C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) @@ -5921,14 +5923,14 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 1000); - currentWindowIndices[0] = player.getCurrentWindowIndex(); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 1000); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPositions[0] = player.getCurrentPosition(); List listOfTwo = ImmutableList.of( MediaItem.fromUri(Uri.EMPTY), MediaItem.fromUri(Uri.EMPTY)); player.setMediaItems(listOfTwo, /* resetPosition= */ true); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPositions[1] = player.getCurrentPosition(); } }) @@ -5942,14 +5944,14 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0}, currentMediaItemIndices); assertArrayEquals(new long[] {1000, 0}, currentPositions); } @Test - public void setMediaSources_empty_whenEmpty_validInitialSeek_correctMaskingWindowIndex() + public void setMediaSources_empty_whenEmpty_validInitialSeek_correctMaskingMediaItemIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) // Wait for initial seek to be fully handled by internal player. @@ -5959,11 +5961,11 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); player.addMediaSources(/* index= */ 0, listOfTwo); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -5972,25 +5974,25 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, C.TIME_UNSET) .setMediaSources(new ConcatenatingMediaSource()) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 1, 1}, currentWindowIndices); + assertArrayEquals(new int[] {1, 1, 1}, currentMediaItemIndices); } @Test - public void setMediaSources_empty_whenEmpty_invalidInitialSeek_correctMaskingWindowIndex() + public void setMediaSources_empty_whenEmpty_invalidInitialSeek_correctMaskingMediaItemIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) // Wait for initial seek to be fully handled by internal player. @@ -6000,11 +6002,11 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); List listOfTwo = ImmutableList.of(new FakeMediaSource(), new FakeMediaSource()); player.addMediaSources(/* index= */ 0, listOfTwo); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -6013,24 +6015,26 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 4, C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 4, C.TIME_UNSET) .setMediaSources(new ConcatenatingMediaSource()) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {4, 0, 0}, currentWindowIndices); + assertArrayEquals(new int[] {4, 0, 0}, currentMediaItemIndices); } @Test - public void setMediaSources_whenEmpty_correctMaskingWindowIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + public void setMediaSources_whenEmpty_correctMaskingMediaItemIndex() throws Exception { + final int[] currentMediaItemIndices = { + C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET + }; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_READY) @@ -6038,18 +6042,18 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Increase current window index. + // Increase current media item index. player.addMediaSource(/* index= */ 0, new FakeMediaSource()); - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Current window index is unchanged. + // Current media item index is unchanged. player.addMediaSource(/* index= */ 2, new FakeMediaSource()); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( @@ -6059,9 +6063,9 @@ public final class ExoPlayerTest { MediaSource mediaSource = new FakeMediaSource(); ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(mediaSource, mediaSource, mediaSource); - // Increase current window with multi window source. + // Increase current media item with multi media item source. player.addMediaSource(/* index= */ 0, concatenatingMediaSource); - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( @@ -6070,9 +6074,9 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(); - // Current window index is unchanged when adding empty source. + // Current media item index is unchanged when adding empty source. player.addMediaSource(/* index= */ 0, concatenatingMediaSource); - currentWindowIndices[3] = player.getCurrentWindowIndex(); + currentMediaItemIndices[3] = player.getCurrentMediaItemIndex(); } }) .build(); @@ -6083,7 +6087,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 1, 4, 4}, currentWindowIndices); + assertArrayEquals(new int[] {1, 1, 4, 4}, currentMediaItemIndices); } @Test @@ -6092,7 +6096,7 @@ public final class ExoPlayerTest { MediaSource firstMediaSource = new FakeMediaSource(firstTimeline); Timeline secondTimeline = new FakeTimeline(/* windowCount= */ 1, new Object()); MediaSource secondMediaSource = new FakeMediaSource(secondTimeline); - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; final long[] currentPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; ActionSchedule actionSchedule = @@ -6104,12 +6108,12 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); - // Increase current window index. + // Increase current media item index. player.addMediaSource(/* index= */ 0, secondMediaSource); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPositions[1] = player.getCurrentPosition(); bufferedPositions[1] = player.getBufferedPosition(); } @@ -6120,28 +6124,28 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); currentPositions[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); } }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, 2000) + .initialSeek(/* mediaItemIndex= */ 1, 2000) .setMediaSources(firstMediaSource) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 2, 2}, currentWindowIndices); + assertArrayEquals(new int[] {1, 2, 2}, currentMediaItemIndices); assertArrayEquals(new long[] {2000, 2000, 2000}, currentPositions); assertArrayEquals(new long[] {2000, 2000, 2000}, bufferedPositions); } @Test public void setMediaSources_whenEmpty_invalidInitialSeek_correctMasking() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; final long[] currentPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPositions = {C.TIME_UNSET, C.TIME_UNSET, C.TIME_UNSET}; ActionSchedule actionSchedule = @@ -6153,12 +6157,12 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); - // Increase current window index. + // Increase current media item index. player.addMediaSource(/* index= */ 0, new FakeMediaSource()); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPositions[1] = player.getCurrentPosition(); bufferedPositions[1] = player.getBufferedPosition(); } @@ -6169,7 +6173,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); currentPositions[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); } @@ -6177,21 +6181,21 @@ public final class ExoPlayerTest { .waitForPlaybackState(Player.STATE_ENDED) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, 2000) + .initialSeek(/* mediaItemIndex= */ 1, 2000) .setMediaSources(new FakeMediaSource()) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {0, 1, 1}, currentWindowIndices); + assertArrayEquals(new int[] {0, 1, 1}, currentMediaItemIndices); assertArrayEquals(new long[] {0, 0, 0}, currentPositions); assertArrayEquals(new long[] {0, 0, 0}, bufferedPositions); } @Test - public void setMediaSources_correctMaskingWindowIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + public void setMediaSources_correctMaskingMediaItemIndex() throws Exception { + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForTimelineChanged() @@ -6199,10 +6203,10 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); - // Increase current window index. + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); + // Increase current media item index. player.addMediaSource(/* index= */ 0, new FakeMediaSource()); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .waitForTimelineChanged() @@ -6210,7 +6214,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); @@ -6221,7 +6225,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {0, 1, 1}, currentWindowIndices); + assertArrayEquals(new int[] {0, 1, 1}, currentMediaItemIndices); } @Test @@ -6278,7 +6282,7 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); assertArrayEquals( new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_IDLE}, @@ -6314,14 +6318,14 @@ public final class ExoPlayerTest { .build(); ExoPlayerTestRunner exoPlayerTestRunner = new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new ConcatenatingMediaSource()) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); @@ -6356,7 +6360,7 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); @@ -6392,7 +6396,7 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_IDLE}, maskingPlaybackStates); @@ -6464,7 +6468,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_ENDED, Player.STATE_BUFFERING, @@ -6509,14 +6513,14 @@ public final class ExoPlayerTest { .build(); ExoPlayerTestRunner exoPlayerTestRunner = new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new ConcatenatingMediaSource()) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual(Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); exoPlayerTestRunner.assertTimelineChangeReasonsEqual( @@ -6552,7 +6556,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); @@ -6591,7 +6595,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackStates); @@ -6625,7 +6629,8 @@ public final class ExoPlayerTest { } }) .waitForPlaybackState(Player.STATE_ENDED) - .setMediaSources(/* windowIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) + .setMediaSources( + /* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @@ -6639,7 +6644,8 @@ public final class ExoPlayerTest { } }) .waitForPlaybackState(Player.STATE_ENDED) - .setMediaSources(/* windowIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) + .setMediaSources( + /* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @@ -6652,7 +6658,8 @@ public final class ExoPlayerTest { } }) .waitForPlaybackState(Player.STATE_READY) - .setMediaSources(/* windowIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) + .setMediaSources( + /* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) .waitForPlaybackState(Player.STATE_READY) .executeRunnable( new PlayerRunnable() { @@ -6676,7 +6683,7 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, // Ready after initial prepare. @@ -6737,7 +6744,8 @@ public final class ExoPlayerTest { } }) .waitForTimelineChanged() - .setMediaSources(/* windowIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) + .setMediaSources( + /* mediaItemIndex= */ 0, /* positionMs= */ C.TIME_UNSET, firstMediaSource) .waitForPlaybackState(Player.STATE_READY) .play() .waitForPlaybackState(Player.STATE_ENDED) @@ -6745,14 +6753,14 @@ public final class ExoPlayerTest { ExoPlayerTestRunner exoPlayerTestRunner = new ExoPlayerTestRunner.Builder(context) .setExpectedPlayerEndedCount(/* expectedPlayerEndedCount= */ 2) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new ConcatenatingMediaSource()) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_ENDED, // Empty source has been prepared. Player.STATE_BUFFERING, // After setting another source. @@ -6788,7 +6796,7 @@ public final class ExoPlayerTest { .build(); new ExoPlayerTestRunner.Builder(context) .skipSettingMediaSources() - .initialSeek(/* windowIndex= */ 0, /* positionMs= */ 2000) + .initialSeek(/* mediaItemIndex= */ 0, /* positionMs= */ 2000) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) @@ -6800,8 +6808,8 @@ public final class ExoPlayerTest { @Test public void addMediaSources_skipSettingMediaItems_validInitialSeek_correctMasking() throws Exception { - final int[] currentWindowIndices = new int[5]; - Arrays.fill(currentWindowIndices, C.INDEX_UNSET); + final int[] currentMediaItemIndices = new int[5]; + Arrays.fill(currentMediaItemIndices, C.INDEX_UNSET); final long[] currentPositions = new long[3]; Arrays.fill(currentPositions, C.TIME_UNSET); final long[] bufferedPositions = new long[3]; @@ -6815,18 +6823,18 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); // If the timeline is empty masking variables are used. currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); player.addMediaSource(/* index= */ 0, new ConcatenatingMediaSource()); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); player.addMediaSource( /* index= */ 0, new FakeMediaSource(new FakeTimeline(/* windowCount= */ 2))); - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); player.addMediaSource(/* index= */ 0, new FakeMediaSource()); - currentWindowIndices[3] = player.getCurrentWindowIndex(); + currentMediaItemIndices[3] = player.getCurrentMediaItemIndex(); // With a non-empty timeline, we mask the periodId in the playback info. currentPositions[1] = player.getCurrentPosition(); bufferedPositions[1] = player.getBufferedPosition(); @@ -6838,7 +6846,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[4] = player.getCurrentWindowIndex(); + currentMediaItemIndices[4] = player.getCurrentMediaItemIndex(); // Finally original playbackInfo coming from EPII is used. currentPositions[2] = player.getCurrentPosition(); bufferedPositions[2] = player.getBufferedPosition(); @@ -6847,13 +6855,13 @@ public final class ExoPlayerTest { .build(); new ExoPlayerTestRunner.Builder(context) .skipSettingMediaSources() - .initialSeek(/* windowIndex= */ 1, 2000) + .initialSeek(/* mediaItemIndex= */ 1, 2000) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 1, 1, 2, 2}, currentWindowIndices); + assertArrayEquals(new int[] {1, 1, 1, 2, 2}, currentMediaItemIndices); assertThat(currentPositions[0]).isEqualTo(2000); assertThat(currentPositions[1]).isEqualTo(2000); assertThat(currentPositions[2]).isAtLeast(2000); @@ -6864,9 +6872,9 @@ public final class ExoPlayerTest { @Test public void - testAddMediaSources_skipSettingMediaItems_invalidInitialSeek_correctMaskingWindowIndex() + testAddMediaSources_skipSettingMediaItems_invalidInitialSeek_correctMaskingMediaItemIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) // Wait for initial seek to be fully handled by internal player. @@ -6876,9 +6884,9 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); player.addMediaSource(new FakeMediaSource()); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -6887,28 +6895,28 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); new ExoPlayerTestRunner.Builder(context) .skipSettingMediaSources() - .initialSeek(/* windowIndex= */ 1, C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, C.TIME_UNSET) .setActionSchedule(actionSchedule) .build() .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 0, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0, 0}, currentMediaItemIndices); } @Test - public void moveMediaItems_correctMaskingWindowIndex() throws Exception { + public void moveMediaItems_correctMaskingMediaItemIndex() throws Exception { Timeline timeline = new FakeTimeline(); MediaSource firstMediaSource = new FakeMediaSource(timeline); MediaSource secondMediaSource = new FakeMediaSource(timeline); MediaSource thirdMediaSource = new FakeMediaSource(timeline); - final int[] currentWindowIndices = { + final int[] currentMediaItemIndices = { C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET }; ActionSchedule actionSchedule = @@ -6920,7 +6928,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Move the current item down in the playlist. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 2, /* newIndex= */ 1); - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( @@ -6929,17 +6937,17 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Move the current item up in the playlist. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 3, /* newIndex= */ 0); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) - .seek(/* windowIndex= */ 2, C.TIME_UNSET) + .seek(/* mediaItemIndex= */ 2, C.TIME_UNSET) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { // Move items from before to behind the current item. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 2, /* newIndex= */ 1); - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( @@ -6948,7 +6956,7 @@ public final class ExoPlayerTest { public void run(ExoPlayer player) { // Move items from behind to before the current item. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 3, /* newIndex= */ 0); - currentWindowIndices[3] = player.getCurrentWindowIndex(); + currentMediaItemIndices[3] = player.getCurrentMediaItemIndex(); } }) .executeRunnable( @@ -6956,20 +6964,20 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { // Move items from before to before the current item. - // No change in currentWindowIndex. + // No change in currentMediaItemIndex. player.moveMediaItems(/* fromIndex= */ 0, /* toIndex= */ 1, /* newIndex= */ 1); - currentWindowIndices[4] = player.getCurrentWindowIndex(); + currentMediaItemIndices[4] = player.getCurrentMediaItemIndex(); } }) - .seek(/* windowIndex= */ 0, C.TIME_UNSET) + .seek(/* mediaItemIndex= */ 0, C.TIME_UNSET) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { // Move items from behind to behind the current item. - // No change in currentWindowIndex. + // No change in currentMediaItemIndex. player.moveMediaItems(/* fromIndex= */ 1, /* toIndex= */ 2, /* newIndex= */ 2); - currentWindowIndices[5] = player.getCurrentWindowIndex(); + currentMediaItemIndices[5] = player.getCurrentMediaItemIndex(); } }) .build(); @@ -6980,12 +6988,12 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 0, 0, 2, 2, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0, 0, 2, 2, 0}, currentMediaItemIndices); } @Test - public void moveMediaItems_unprepared_correctMaskingWindowIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; + public void moveMediaItems_unprepared_correctMaskingMediaItemIndex() throws Exception { + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForTimelineChanged() @@ -6993,10 +7001,10 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Increase current window index. - currentWindowIndices[0] = player.getCurrentWindowIndex(); + // Increase current media item index. + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); player.moveMediaItem(/* currentIndex= */ 0, /* newIndex= */ 1); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .prepare() @@ -7005,7 +7013,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[2] = player.getCurrentWindowIndex(); + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); } }) .build(); @@ -7016,12 +7024,12 @@ public final class ExoPlayerTest { .start(/* doPrepare= */ false) .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {0, 1, 1}, currentWindowIndices); + assertArrayEquals(new int[] {0, 1, 1}, currentMediaItemIndices); } @Test - public void removeMediaItems_correctMaskingWindowIndex() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + public void removeMediaItems_correctMaskingMediaItemIndex() throws Exception { + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_BUFFERING) @@ -7029,27 +7037,27 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Decrease current window index. - currentWindowIndices[0] = player.getCurrentWindowIndex(); + // Decrease current media item index. + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); player.removeMediaItem(/* index= */ 0); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); } }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new FakeMediaSource(), new FakeMediaSource()) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0}, currentMediaItemIndices); } @Test public void removeMediaItems_currentItemRemoved_correctMasking() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; final long[] currentPositions = {C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPositions = {C.TIME_UNSET, C.TIME_UNSET}; ActionSchedule actionSchedule = @@ -7060,25 +7068,25 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { // Remove the current item. - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); player.removeMediaItem(/* index= */ 1); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPositions[1] = player.getCurrentPosition(); bufferedPositions[1] = player.getBufferedPosition(); } }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ 5000) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ 5000) .setMediaSources(new FakeMediaSource(), new FakeMediaSource(), new FakeMediaSource()) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 1}, currentWindowIndices); + assertArrayEquals(new int[] {1, 1}, currentMediaItemIndices); assertThat(currentPositions[0]).isAtLeast(5000L); assertThat(bufferedPositions[0]).isAtLeast(5000L); assertThat(currentPositions[1]).isEqualTo(0); @@ -7095,8 +7103,8 @@ public final class ExoPlayerTest { MediaSource thirdMediaSource = new FakeMediaSource(thirdTimeline); Timeline fourthTimeline = new FakeTimeline(/* windowCount= */ 1, 3L); MediaSource fourthMediaSource = new FakeMediaSource(fourthTimeline); - final int[] currentWindowIndices = new int[9]; - Arrays.fill(currentWindowIndices, C.INDEX_UNSET); + final int[] currentMediaItemIndices = new int[9]; + Arrays.fill(currentMediaItemIndices, C.INDEX_UNSET); final int[] maskingPlaybackStates = new int[4]; Arrays.fill(maskingPlaybackStates, C.INDEX_UNSET); final long[] currentPositions = new long[3]; @@ -7111,14 +7119,14 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Expect the current window index to be 2 after seek. - currentWindowIndices[0] = player.getCurrentWindowIndex(); + // Expect the current media item index to be 2 after seek. + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPositions[0] = player.getCurrentPosition(); bufferedPositions[0] = player.getBufferedPosition(); player.removeMediaItem(/* index= */ 2); - // Expect the current window index to be 0 + // Expect the current media item index to be 0 // (default position of timeline after not finding subsequent period). - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); // Transition to ENDED. maskingPlaybackStates[0] = player.getPlaybackState(); currentPositions[1] = player.getCurrentPosition(); @@ -7130,12 +7138,12 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Expects the current window index still on 0. - currentWindowIndices[2] = player.getCurrentWindowIndex(); + // Expects the current media item index still on 0. + currentMediaItemIndices[2] = player.getCurrentMediaItemIndex(); // Insert an item at begin when the playlist is not empty. player.addMediaSource(/* index= */ 0, thirdMediaSource); - // Expects the current window index to be (0 + 1) after insertion at begin. - currentWindowIndices[3] = player.getCurrentWindowIndex(); + // Expects the current media item index to be (0 + 1) after insertion at begin. + currentMediaItemIndices[3] = player.getCurrentMediaItemIndex(); // Remains in ENDED. maskingPlaybackStates[1] = player.getPlaybackState(); currentPositions[2] = player.getCurrentPosition(); @@ -7147,12 +7155,12 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[4] = player.getCurrentWindowIndex(); - // Implicit seek to the current window index, which is out of bounds in new + currentMediaItemIndices[4] = player.getCurrentMediaItemIndex(); + // Implicit seek to the current media item index, which is out of bounds in new // timeline. player.setMediaSource(fourthMediaSource, /* resetPosition= */ false); // 0 after reset. - currentWindowIndices[5] = player.getCurrentWindowIndex(); + currentMediaItemIndices[5] = player.getCurrentMediaItemIndex(); // Invalid seek, so we remain in ENDED. maskingPlaybackStates[2] = player.getPlaybackState(); } @@ -7162,11 +7170,11 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[6] = player.getCurrentWindowIndex(); + currentMediaItemIndices[6] = player.getCurrentMediaItemIndex(); // Explicit seek to (0, C.TIME_UNSET). Player transitions to BUFFERING. player.setMediaSource(fourthMediaSource, /* startPositionMs= */ 5000); // 0 after explicit seek. - currentWindowIndices[7] = player.getCurrentWindowIndex(); + currentMediaItemIndices[7] = player.getCurrentMediaItemIndex(); // Transitions from ENDED to BUFFERING after explicit seek. maskingPlaybackStates[3] = player.getPlaybackState(); } @@ -7176,14 +7184,14 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - // Check whether actual window index is equal masking index from above. - currentWindowIndices[8] = player.getCurrentWindowIndex(); + // Check whether actual media item index is equal masking index from above. + currentMediaItemIndices[8] = player.getCurrentMediaItemIndex(); } }) .build(); ExoPlayerTestRunner exoPlayerTestRunner = new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 2, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 2, /* positionMs= */ C.TIME_UNSET) .setExpectedPlayerEndedCount(2) .setMediaSources(firstMediaSource, secondMediaSource, thirdMediaSource) .setActionSchedule(actionSchedule) @@ -7191,23 +7199,23 @@ public final class ExoPlayerTest { .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - // Expect reset of masking to first window. + // Expect reset of masking to first media item. exoPlayerTestRunner.assertPlaybackStatesEqual( Player.STATE_BUFFERING, Player.STATE_READY, // Ready after initial prepare. - Player.STATE_ENDED, // ended after removing current window index + Player.STATE_ENDED, // ended after removing current media item index Player.STATE_BUFFERING, // buffers after set items with seek Player.STATE_READY, Player.STATE_ENDED); assertArrayEquals( new int[] { - Player.STATE_ENDED, // ended after removing current window index + Player.STATE_ENDED, // ended after removing current media item index Player.STATE_ENDED, // adding items does not change state Player.STATE_ENDED, // set items with seek to current position. Player.STATE_BUFFERING }, // buffers after set items with seek maskingPlaybackStates); - assertArrayEquals(new int[] {2, 0, 0, 1, 1, 0, 0, 0, 0}, currentWindowIndices); + assertArrayEquals(new int[] {2, 0, 0, 1, 1, 0, 0, 0, 0}, currentMediaItemIndices); assertThat(currentPositions[0]).isEqualTo(0); assertThat(currentPositions[1]).isEqualTo(0); assertThat(currentPositions[2]).isEqualTo(0); @@ -7221,7 +7229,7 @@ public final class ExoPlayerTest { throws Exception { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) - .seek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .seek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .waitForPendingPlayerCommands() .removeMediaItem(/* index= */ 1) .prepare() @@ -7241,7 +7249,7 @@ public final class ExoPlayerTest { @Test public void clearMediaItems_correctMasking() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; final int[] maskingPlaybackState = {C.INDEX_UNSET}; final long[] currentPosition = {C.TIME_UNSET, C.TIME_UNSET}; final long[] bufferedPosition = {C.TIME_UNSET, C.TIME_UNSET}; @@ -7249,16 +7257,16 @@ public final class ExoPlayerTest { new ActionSchedule.Builder(TAG) .pause() .waitForPlaybackState(Player.STATE_BUFFERING) - .playUntilPosition(/* windowIndex= */ 1, /* positionMs= */ 150) + .playUntilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 150) .executeRunnable( new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentPosition[0] = player.getCurrentPosition(); bufferedPosition[0] = player.getBufferedPosition(); player.clearMediaItems(); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentPosition[1] = player.getCurrentPosition(); bufferedPosition[1] = player.getBufferedPosition(); maskingPlaybackState[0] = player.getPlaybackState(); @@ -7266,25 +7274,25 @@ public final class ExoPlayerTest { }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new FakeMediaSource(), new FakeMediaSource()) .setActionSchedule(actionSchedule) .build() .start() .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0}, currentMediaItemIndices); assertThat(currentPosition[0]).isAtLeast(150); assertThat(currentPosition[1]).isEqualTo(0); assertThat(bufferedPosition[0]).isAtLeast(150); assertThat(bufferedPosition[1]).isEqualTo(0); - assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0}, currentMediaItemIndices); assertArrayEquals(new int[] {Player.STATE_ENDED}, maskingPlaybackState); } @Test - public void clearMediaItems_unprepared_correctMaskingWindowIndex_notEnded() throws Exception { - final int[] currentWindowIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; + public void clearMediaItems_unprepared_correctMaskingMediaItemIndex_notEnded() throws Exception { + final int[] currentMediaItemIndices = {C.INDEX_UNSET, C.INDEX_UNSET}; final int[] currentStates = {C.INDEX_UNSET, C.INDEX_UNSET, C.INDEX_UNSET}; ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) @@ -7295,10 +7303,10 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - currentWindowIndices[0] = player.getCurrentWindowIndex(); + currentMediaItemIndices[0] = player.getCurrentMediaItemIndex(); currentStates[0] = player.getPlaybackState(); player.clearMediaItems(); - currentWindowIndices[1] = player.getCurrentWindowIndex(); + currentMediaItemIndices[1] = player.getCurrentMediaItemIndex(); currentStates[1] = player.getPlaybackState(); } }) @@ -7313,7 +7321,7 @@ public final class ExoPlayerTest { }) .build(); new ExoPlayerTestRunner.Builder(context) - .initialSeek(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET) + .initialSeek(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET) .setMediaSources(new FakeMediaSource(), new FakeMediaSource()) .setActionSchedule(actionSchedule) .build() @@ -7322,7 +7330,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); assertArrayEquals( new int[] {Player.STATE_IDLE, Player.STATE_IDLE, Player.STATE_ENDED}, currentStates); - assertArrayEquals(new int[] {1, 0}, currentWindowIndices); + assertArrayEquals(new int[] {1, 0}, currentMediaItemIndices); } @Test @@ -7351,7 +7359,7 @@ public final class ExoPlayerTest { AtomicReference timelineAfterError = new AtomicReference<>(); AtomicReference trackInfosAfterError = new AtomicReference<>(); AtomicReference trackSelectionsAfterError = new AtomicReference<>(); - AtomicInteger windowIndexAfterError = new AtomicInteger(); + AtomicInteger mediaItemIndexAfterError = new AtomicInteger(); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .executeRunnable( @@ -7365,7 +7373,7 @@ public final class ExoPlayerTest { timelineAfterError.set(player.getCurrentTimeline()); trackInfosAfterError.set(player.getCurrentTracksInfo()); trackSelectionsAfterError.set(player.getCurrentTrackSelections()); - windowIndexAfterError.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterError.set(player.getCurrentMediaItemIndex()); } }); } @@ -7392,7 +7400,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS)); assertThat(timelineAfterError.get().getWindowCount()).isEqualTo(1); - assertThat(windowIndexAfterError.get()).isEqualTo(0); + assertThat(mediaItemIndexAfterError.get()).isEqualTo(0); assertThat(trackInfosAfterError.get().getTrackGroupInfos()).hasSize(1); assertThat(trackInfosAfterError.get().getTrackGroupInfos().get(0).getTrackGroup().getFormat(0)) .isEqualTo(ExoPlayerTestRunner.AUDIO_FORMAT); @@ -7404,7 +7412,7 @@ public final class ExoPlayerTest { public void seekToCurrentPosition_inEndedState_switchesToBufferingStateAndContinuesPlayback() throws Exception { MediaSource mediaSource = new FakeMediaSource(new FakeTimeline(/* windowCount = */ 1)); - AtomicInteger windowIndexAfterFinalEndedState = new AtomicInteger(); + AtomicInteger mediaItemIndexAfterFinalEndedState = new AtomicInteger(); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_ENDED) @@ -7422,7 +7430,7 @@ public final class ExoPlayerTest { new PlayerRunnable() { @Override public void run(ExoPlayer player) { - windowIndexAfterFinalEndedState.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterFinalEndedState.set(player.getCurrentMediaItemIndex()); } }) .build(); @@ -7434,7 +7442,7 @@ public final class ExoPlayerTest { .blockUntilActionScheduleFinished(TIMEOUT_MS) .blockUntilEnded(TIMEOUT_MS); - assertThat(windowIndexAfterFinalEndedState.get()).isEqualTo(1); + assertThat(mediaItemIndexAfterFinalEndedState.get()).isEqualTo(1); } @Test @@ -7448,7 +7456,7 @@ public final class ExoPlayerTest { MediaSource mediaSource = new FakeMediaSource(new FakeTimeline(timelineWindowDefinition)); AtomicInteger playbackStateAfterPause = new AtomicInteger(C.INDEX_UNSET); AtomicLong positionAfterPause = new AtomicLong(C.TIME_UNSET); - AtomicInteger windowIndexAfterPause = new AtomicInteger(C.INDEX_UNSET); + AtomicInteger mediaItemIndexAfterPause = new AtomicInteger(C.INDEX_UNSET); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlayWhenReady(true) @@ -7458,7 +7466,7 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { playbackStateAfterPause.set(player.getPlaybackState()); - windowIndexAfterPause.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterPause.set(player.getCurrentMediaItemIndex()); positionAfterPause.set(player.getContentPosition()); } }) @@ -7473,7 +7481,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); assertThat(playbackStateAfterPause.get()).isEqualTo(Player.STATE_READY); - assertThat(windowIndexAfterPause.get()).isEqualTo(0); + assertThat(mediaItemIndexAfterPause.get()).isEqualTo(0); assertThat(positionAfterPause.get()).isEqualTo(10_000); } @@ -7487,7 +7495,7 @@ public final class ExoPlayerTest { MediaSource mediaSource = new FakeMediaSource(new FakeTimeline(timelineWindowDefinition)); AtomicInteger playbackStateAfterPause = new AtomicInteger(C.INDEX_UNSET); AtomicLong positionAfterPause = new AtomicLong(C.TIME_UNSET); - AtomicInteger windowIndexAfterPause = new AtomicInteger(C.INDEX_UNSET); + AtomicInteger mediaItemIndexAfterPause = new AtomicInteger(C.INDEX_UNSET); ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlayWhenReady(true) @@ -7497,7 +7505,7 @@ public final class ExoPlayerTest { @Override public void run(ExoPlayer player) { playbackStateAfterPause.set(player.getPlaybackState()); - windowIndexAfterPause.set(player.getCurrentWindowIndex()); + mediaItemIndexAfterPause.set(player.getCurrentMediaItemIndex()); positionAfterPause.set(player.getContentPosition()); } }) @@ -7512,7 +7520,7 @@ public final class ExoPlayerTest { .blockUntilEnded(TIMEOUT_MS); assertThat(playbackStateAfterPause.get()).isEqualTo(Player.STATE_ENDED); - assertThat(windowIndexAfterPause.get()).isEqualTo(0); + assertThat(mediaItemIndexAfterPause.get()).isEqualTo(0); assertThat(positionAfterPause.get()).isEqualTo(10_000); } @@ -7846,7 +7854,7 @@ public final class ExoPlayerTest { firstMediaSource.setNewSourceInfo(timelineWithOffsets); // Wait until player transitions to second source (which also has non-zero offsets). runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); player.release(); assertThat(rendererStreamOffsetsUs).hasSize(2); @@ -8102,7 +8110,7 @@ public final class ExoPlayerTest { player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 2000); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 2000); assertThat(reportedMediaItems) .containsExactly(mediaSource1.getMediaItem(), mediaSource2.getMediaItem()) @@ -8134,7 +8142,7 @@ public final class ExoPlayerTest { player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 2000); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 2000); assertThat(reportedMediaItems).containsExactly(mediaSource1.getMediaItem()).inOrder(); assertThat(reportedTransitionReasons) @@ -8371,7 +8379,7 @@ public final class ExoPlayerTest { player.addMediaSources( ImmutableList.of( new FakeMediaSource(), new FakeMediaSource(adTimeline), new FakeMediaSource())); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 0); player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); @@ -8451,7 +8459,7 @@ public final class ExoPlayerTest { ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addMediaSource(new FakeMediaSource(timelineWithUnseekableLiveWindow)); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 0); player.prepare(); runUntilPlaybackState(player, Player.STATE_READY); @@ -8507,14 +8515,14 @@ public final class ExoPlayerTest { // Check that there were no other calls to onAvailableCommandsChanged. verify(mockListener).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousAndNextWindow); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 2, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 2, /* positionMs= */ 0); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 3, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 3, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousWindow); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); } @@ -8534,7 +8542,7 @@ public final class ExoPlayerTest { ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); - player.seekTo(/* windowIndex= */ 3, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 3, /* positionMs= */ 0); player.addMediaSources( ImmutableList.of( new FakeMediaSource(), @@ -8545,14 +8553,14 @@ public final class ExoPlayerTest { // Check that there were no other calls to onAvailableCommandsChanged. verify(mockListener).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 2, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 2, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousAndNextWindow); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 0); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToNextWindow); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); } @@ -8567,8 +8575,8 @@ public final class ExoPlayerTest { player.addMediaSources(ImmutableList.of(new FakeMediaSource())); verify(mockListener).onAvailableCommandsChanged(defaultCommands); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 200); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 100); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 200); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 100); // Check that there were no other calls to onAvailableCommandsChanged. verify(mockListener).onAvailableCommandsChanged(any()); } @@ -8617,12 +8625,12 @@ public final class ExoPlayerTest { verify(mockListener).onAvailableCommandsChanged(commandsWithSeekInCurrentAndToNextWindow); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); - playUntilStartOfWindow(player, /* windowIndex= */ 1); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 1); runUntilPendingCommandsAreFullyHandled(player); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekAnywhere); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); - playUntilStartOfWindow(player, /* windowIndex= */ 2); + playUntilStartOfMediaItem(player, /* mediaItemIndex= */ 2); runUntilPendingCommandsAreFullyHandled(player); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); @@ -8714,7 +8722,7 @@ public final class ExoPlayerTest { ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addListener(mockListener); - player.seekTo(/* windowIndex= */ 2, /* positionMs= */ 0); + player.seekTo(/* mediaItemIndex= */ 2, /* positionMs= */ 0); player.addMediaSources( ImmutableList.of(new FakeMediaSource(), new FakeMediaSource(), new FakeMediaSource())); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousWindow); @@ -8838,7 +8846,7 @@ public final class ExoPlayerTest { .getPeriod(/* periodIndex= */ 1, new Timeline.Period(), /* setIds= */ true) .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); } @Test @@ -8884,7 +8892,7 @@ public final class ExoPlayerTest { .getPeriod(/* periodIndex= */ 1, new Timeline.Period(), /* setIds= */ true) .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); } @Test @@ -8947,7 +8955,7 @@ public final class ExoPlayerTest { .getPeriod(/* periodIndex= */ 1, new Timeline.Period(), /* setIds= */ true) .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); } @Test @@ -8988,7 +8996,7 @@ public final class ExoPlayerTest { .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); // Verify test setup by checking that playing period was indeed different. - assertThat(player.getCurrentWindowIndex()).isEqualTo(0); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(0); } @Test @@ -9127,7 +9135,8 @@ public final class ExoPlayerTest { assertThat(liveOffsetAtStart).isIn(Range.closed(11_900L, 12_100L)); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9173,7 +9182,8 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); long liveOffsetAtStart = player.getCurrentLiveOffset(); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9221,7 +9231,8 @@ public final class ExoPlayerTest { // Seek to a live offset of 2 seconds. player.seekTo(18_000); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9285,11 +9296,13 @@ public final class ExoPlayerTest { assertThat(liveOffsetAtStart).isIn(Range.closed(11_900L, 12_100L)); // Play a bit and update configuration. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 55_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 55_000); fakeMediaSource.setNewSourceInfo(updatedTimeline); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9351,7 +9364,8 @@ public final class ExoPlayerTest { player.setPlaybackParameters(new PlaybackParameters(/* speed */ 2.0f)); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9399,7 +9413,8 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 1, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 1, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9463,9 +9478,10 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); // Seek to default position in second stream. - player.seekToNextWindow(); + player.seekToNextMediaItem(); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 1, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 1, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9529,9 +9545,10 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); // Seek to specific position in second stream (at 2 seconds live offset). - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 18_000); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 18_000); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 1, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 1, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9572,7 +9589,8 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); long playbackStartTimeMs = fakeClock.elapsedRealtime(); - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long playbackEndTimeMs = fakeClock.elapsedRealtime(); player.release(); @@ -9613,7 +9631,8 @@ public final class ExoPlayerTest { assertThat(liveOffsetAtStart).isIn(Range.closed(11_900L, 12_100L)); // Play until close to the end of the available live window. - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 999_000); + TestPlayerRunHelper.playUntilPosition( + player, /* mediaItemIndex= */ 0, /* positionMs= */ 999_000); long liveOffsetAtEnd = player.getCurrentLiveOffset(); player.release(); @@ -9751,7 +9770,7 @@ public final class ExoPlayerTest { TestPlayerRunHelper.runUntilPositionDiscontinuity( player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); player.addMediaSource(secondMediaSource); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ C.TIME_UNSET); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ C.TIME_UNSET); player.play(); TestPlayerRunHelper.runUntilPositionDiscontinuity( player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); @@ -9828,7 +9847,7 @@ public final class ExoPlayerTest { inOrder .verify(listener) .onMediaItemTransition(any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); - // Last auto transition from window 0 to window 1 not caused by repeat mode. + // Last auto transition from media item 0 to media item 1 not caused by repeat mode. inOrder .verify(listener) .onPositionDiscontinuity(any(), any(), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION)); @@ -10004,7 +10023,7 @@ public final class ExoPlayerTest { player.setMediaSource(new FakeMediaSource(new FakeTimeline(adTimeline))); player.prepare(); - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 1000); + TestPlayerRunHelper.playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 1000); player.seekTo(/* positionMs= */ 8_000); player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); @@ -10128,7 +10147,7 @@ public final class ExoPlayerTest { ArgumentCaptor.forClass(Player.PositionInfo.class); Window window = new Window(); InOrder inOrder = Mockito.inOrder(listener); - // from first to second window + // from first to second media item inOrder .verify(listener) .onPositionDiscontinuity( @@ -10154,7 +10173,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1); - // from second window to third + // from second media item to third inOrder .verify(listener) .onPositionDiscontinuity( @@ -10180,7 +10199,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1); - // from third window content to post roll ad + // from third media item content to post roll ad @Nullable Object lastNewWindowUid = newPosition.getValue().windowUid; inOrder .verify(listener) @@ -10201,7 +10220,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().contentPositionMs).isEqualTo(20_000); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(0); - // from third window post roll to third window content end + // from third media item post roll to third media item content end lastNewWindowUid = newPosition.getValue().windowUid; inOrder .verify(listener) @@ -10223,7 +10242,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().contentPositionMs).isEqualTo(19_999); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(-1); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(-1); - // from third window content end to fourth window pre roll ad + // from third media item content end to fourth media item pre roll ad lastNewWindowUid = newPosition.getValue().windowUid; inOrder .verify(listener) @@ -10248,7 +10267,7 @@ public final class ExoPlayerTest { assertThat(newPosition.getValue().contentPositionMs).isEqualTo(0); assertThat(newPosition.getValue().adGroupIndex).isEqualTo(0); assertThat(newPosition.getValue().adIndexInAdGroup).isEqualTo(0); - // from fourth window pre roll ad to fourth window content + // from fourth media item pre roll ad to fourth media item content lastNewWindowUid = newPosition.getValue().windowUid; inOrder .verify(listener) @@ -10306,7 +10325,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.setMediaSources(ImmutableList.of(secondMediaSource, secondMediaSource)); player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); @@ -10428,11 +10447,11 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.removeMediaItem(/* index= */ 1); player.seekTo(/* positionMs= */ 0); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 2 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 2 * C.MILLIS_PER_SECOND); // Removing the last item resets the position to 0 with an empty timeline. player.removeMediaItem(0); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); @@ -10517,7 +10536,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); concatenatingMediaSource.removeMediaSource(1); TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled(player); concatenatingMediaSource.removeMediaSource(1); @@ -10590,9 +10609,9 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 1, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); concatenatingMediaSource.removeMediaSource(1); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 1234); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 1234); TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled(player); concatenatingMediaSource.removeMediaSource(0); player.play(); @@ -10708,9 +10727,9 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.seekTo(/* positionMs= */ 7 * C.MILLIS_PER_SECOND); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ C.MILLIS_PER_SECOND); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ C.MILLIS_PER_SECOND); player.play(); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); @@ -10753,7 +10772,7 @@ public final class ExoPlayerTest { player.addListener(listener); player.seekTo(/* positionMs= */ 7 * C.MILLIS_PER_SECOND); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ C.MILLIS_PER_SECOND); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ C.MILLIS_PER_SECOND); player.seekTo(/* positionMs= */ 5 * C.MILLIS_PER_SECOND); ArgumentCaptor oldPosition = @@ -10787,7 +10806,7 @@ public final class ExoPlayerTest { assertThat(newPositions.get(1).mediaItemIndex).isEqualTo(1); assertThat(newPositions.get(1).positionMs).isEqualTo(1_000); assertThat(newPositions.get(1).contentPositionMs).isEqualTo(1_000); - // a seek from masked seek position to another masked position within window + // a seek from masked seek position to another masked position within media item assertThat(oldPositions.get(2).windowUid).isNull(); assertThat(oldPositions.get(2).mediaItemIndex).isEqualTo(1); assertThat(oldPositions.get(2).mediaItem).isNull(); @@ -10815,7 +10834,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 2 * C.DEFAULT_SEEK_BACK_INCREMENT_MS); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 2 * C.DEFAULT_SEEK_BACK_INCREMENT_MS); player.seekBack(); ArgumentCaptor oldPosition = @@ -10862,7 +10881,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ C.DEFAULT_SEEK_BACK_INCREMENT_MS / 2); + player, /* mediaItemIndex= */ 0, /* positionMs= */ C.DEFAULT_SEEK_BACK_INCREMENT_MS / 2); player.seekBack(); assertThat(player.getCurrentPosition()).isEqualTo(0); @@ -10933,11 +10952,11 @@ public final class ExoPlayerTest { public void seekToPrevious_withPreviousWindowAndCloseToStart_seeksToPreviousWindow() { ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource())); - player.seekTo(/* windowIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS); + player.seekTo(/* mediaItemIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS); player.seekToPrevious(); - assertThat(player.getCurrentWindowIndex()).isEqualTo(0); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(0); assertThat(player.getCurrentPosition()).isEqualTo(0); player.release(); @@ -10947,11 +10966,11 @@ public final class ExoPlayerTest { public void seekToPrevious_notCloseToStart_seeksToZero() { ExoPlayer player = new TestExoPlayerBuilder(context).build(); player.addMediaSources(ImmutableList.of(new FakeMediaSource(), new FakeMediaSource())); - player.seekTo(/* windowIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS + 1); + player.seekTo(/* mediaItemIndex= */ 1, C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS + 1); player.seekToPrevious(); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); assertThat(player.getCurrentPosition()).isEqualTo(0); player.release(); @@ -10964,7 +10983,7 @@ public final class ExoPlayerTest { player.seekToNext(); - assertThat(player.getCurrentWindowIndex()).isEqualTo(1); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); assertThat(player.getCurrentPosition()).isEqualTo(0); player.release(); @@ -10994,7 +11013,7 @@ public final class ExoPlayerTest { player.seekTo(/* positionMs = */ 0); player.seekToNext(); - assertThat(player.getCurrentWindowIndex()).isEqualTo(0); + assertThat(player.getCurrentMediaItemIndex()).isEqualTo(0); assertThat(player.getCurrentPosition()).isEqualTo(500); player.release(); @@ -11009,7 +11028,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.stop(); verify(listener, never()).onPositionDiscontinuity(any(), any(), anyInt()); @@ -11027,7 +11046,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.stop(/* reset= */ true); ArgumentCaptor oldPosition = @@ -11071,13 +11090,13 @@ public final class ExoPlayerTest { player.setMediaSource(mediaSource); player.prepare(); - TestPlayerRunHelper.playUntilPosition(player, /* windowIndex= */ 1, /* positionMs= */ 2000); - player.seekTo(/* windowIndex= */ 1, /* positionMs= */ 2122); + TestPlayerRunHelper.playUntilPosition(player, /* mediaItemIndex= */ 1, /* positionMs= */ 2000); + player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 2122); // This causes a DISCONTINUITY_REASON_REMOVE between pending operations that needs to be // cancelled by the seek below. mediaSource.setNewSourceInfo(timeline2); player.play(); - player.seekTo(/* windowIndex= */ 0, /* positionMs= */ 2222); + player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 2222); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED); ArgumentCaptor oldPosition = @@ -11176,7 +11195,7 @@ public final class ExoPlayerTest { .send(); player.setMediaSource(mediaSource); player.prepare(); - playUntilPosition(player, /* windowIndex= */ 0, /* positionMs= */ 40_000); + playUntilPosition(player, /* mediaItemIndex= */ 0, /* positionMs= */ 40_000); player.release(); // Assert that the renderer hasn't been reset despite the inserted ad group. @@ -11215,7 +11234,7 @@ public final class ExoPlayerTest { player.prepare(); TestPlayerRunHelper.playUntilPosition( - player, /* windowIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); + player, /* mediaItemIndex= */ 0, /* positionMs= */ 5 * C.MILLIS_PER_SECOND); player.stop(); shadowOf(Looper.getMainLooper()).idle(); @@ -11360,18 +11379,18 @@ public final class ExoPlayerTest { private static final class PositionGrabbingMessageTarget extends PlayerTarget { - public int windowIndex; + public int mediaItemIndex; public long positionMs; public int messageCount; public PositionGrabbingMessageTarget() { - windowIndex = C.INDEX_UNSET; + mediaItemIndex = C.INDEX_UNSET; positionMs = C.POSITION_UNSET; } @Override public void handleMessage(ExoPlayer player, int messageType, @Nullable Object message) { - windowIndex = player.getCurrentWindowIndex(); + mediaItemIndex = player.getCurrentMediaItemIndex(); positionMs = player.getCurrentPosition(); messageCount++; } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java index 6adfe54b4f..a7838377bf 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java @@ -950,7 +950,7 @@ public class PlayerControlView extends FrameLayout { int adGroupCount = 0; Timeline timeline = player.getCurrentTimeline(); if (!timeline.isEmpty()) { - int currentWindowIndex = player.getCurrentWindowIndex(); + int currentWindowIndex = player.getCurrentMediaItemIndex(); int firstWindowIndex = multiWindowTimeBar ? 0 : currentWindowIndex; int lastWindowIndex = multiWindowTimeBar ? timeline.getWindowCount() - 1 : currentWindowIndex; for (int i = firstWindowIndex; i <= lastWindowIndex; i++) { @@ -1110,7 +1110,7 @@ public class PlayerControlView extends FrameLayout { windowIndex++; } } else { - windowIndex = player.getCurrentWindowIndex(); + windowIndex = player.getCurrentMediaItemIndex(); } seekTo(player, windowIndex, positionMs); updateProgress(); @@ -1228,7 +1228,7 @@ public class PlayerControlView extends FrameLayout { if (state == Player.STATE_IDLE) { player.prepare(); } else if (state == Player.STATE_ENDED) { - seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentMediaItemIndex(), C.TIME_UNSET); } player.play(); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java index 26075126d0..682483cd4e 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java @@ -605,9 +605,9 @@ public class PlayerNotificationManager { public static final String ACTION_PLAY = "com.google.android.exoplayer.play"; /** The action which pauses playback. */ public static final String ACTION_PAUSE = "com.google.android.exoplayer.pause"; - /** The action which skips to the previous window. */ + /** The action which skips to the previous media item. */ public static final String ACTION_PREVIOUS = "com.google.android.exoplayer.prev"; - /** The action which skips to the next window. */ + /** The action which skips to the next media item. */ public static final String ACTION_NEXT = "com.google.android.exoplayer.next"; /** The action which fast forwards. */ public static final String ACTION_FAST_FORWARD = "com.google.android.exoplayer.ffwd"; @@ -1095,7 +1095,7 @@ public class PlayerNotificationManager { * *
                    *
                  • The media is {@link Player#isPlaying() actively playing}. - *
                  • The media is not {@link Player#isCurrentWindowDynamic() dynamically changing its + *
                  • The media is not {@link Player#isCurrentMediaItemDynamic() dynamically changing its * duration} (like for example a live stream). *
                  • The media is not {@link Player#isPlayingAd() interrupted by an ad}. *
                  • The media is played at {@link Player#getPlaybackParameters() regular speed}. @@ -1253,7 +1253,7 @@ public class PlayerNotificationManager { && useChronometer && player.isPlaying() && !player.isPlayingAd() - && !player.isCurrentWindowDynamic() + && !player.isCurrentMediaItemDynamic() && player.getPlaybackParameters().speed == 1f) { builder .setWhen(System.currentTimeMillis() - player.getContentPosition()) @@ -1531,7 +1531,7 @@ public class PlayerNotificationManager { if (player.getPlaybackState() == Player.STATE_IDLE) { player.prepare(); } else if (player.getPlaybackState() == Player.STATE_ENDED) { - player.seekToDefaultPosition(player.getCurrentWindowIndex()); + player.seekToDefaultPosition(player.getCurrentMediaItemIndex()); } player.play(); } else if (ACTION_PAUSE.equals(action)) { diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index 4836774bb2..30533dcd19 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -1501,8 +1501,8 @@ public class PlayerView extends FrameLayout implements AdViewProvider { if (lastPeriodIndexWithTracks != C.INDEX_UNSET) { int lastWindowIndexWithTracks = timeline.getPeriod(lastPeriodIndexWithTracks, period).windowIndex; - if (player.getCurrentWindowIndex() == lastWindowIndexWithTracks) { - // We're in the same window. Suppress the update. + if (player.getCurrentMediaItemIndex() == lastWindowIndexWithTracks) { + // We're in the same media item. Suppress the update. return; } } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 279e907476..c6e0aadad0 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -1269,7 +1269,7 @@ public class StyledPlayerControlView extends FrameLayout { int adGroupCount = 0; Timeline timeline = player.getCurrentTimeline(); if (!timeline.isEmpty()) { - int currentWindowIndex = player.getCurrentWindowIndex(); + int currentWindowIndex = player.getCurrentMediaItemIndex(); int firstWindowIndex = multiWindowTimeBar ? 0 : currentWindowIndex; int lastWindowIndex = multiWindowTimeBar ? timeline.getWindowCount() - 1 : currentWindowIndex; for (int i = firstWindowIndex; i <= lastWindowIndex; i++) { @@ -1453,7 +1453,7 @@ public class StyledPlayerControlView extends FrameLayout { windowIndex++; } } else { - windowIndex = player.getCurrentWindowIndex(); + windowIndex = player.getCurrentMediaItemIndex(); } seekTo(player, windowIndex, positionMs); updateProgress(); @@ -1616,13 +1616,12 @@ public class StyledPlayerControlView extends FrameLayout { } } - @SuppressWarnings("deprecation") private void dispatchPlay(Player player) { @State int state = player.getPlaybackState(); if (state == Player.STATE_IDLE) { player.prepare(); } else if (state == Player.STATE_ENDED) { - seekTo(player, player.getCurrentWindowIndex(), C.TIME_UNSET); + seekTo(player, player.getCurrentMediaItemIndex(), C.TIME_UNSET); } player.play(); } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 4434aef516..b8907094fd 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -1540,8 +1540,8 @@ public class StyledPlayerView extends FrameLayout implements AdViewProvider { if (lastPeriodIndexWithTracks != C.INDEX_UNSET) { int lastWindowIndexWithTracks = timeline.getPeriod(lastPeriodIndexWithTracks, period).windowIndex; - if (player.getCurrentWindowIndex() == lastWindowIndexWithTracks) { - // We're in the same window. Suppress the update. + if (player.getCurrentMediaItemIndex() == lastWindowIndexWithTracks) { + // We're in the same media item. Suppress the update. return; } } diff --git a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java index efcb290579..58ed22f289 100644 --- a/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java +++ b/robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java @@ -284,12 +284,12 @@ public class TestPlayerRunHelper { *

                    If a playback error occurs it will be thrown wrapped in an {@link IllegalStateException}. * * @param player The {@link Player}. - * @param windowIndex The window. - * @param positionMs The position within the window, in milliseconds. + * @param mediaItemIndex The index of the media item. + * @param positionMs The position within the media item, in milliseconds. * @throws TimeoutException If the {@link RobolectricUtil#DEFAULT_TIMEOUT_MS default timeout} is * exceeded. */ - public static void playUntilPosition(ExoPlayer player, int windowIndex, long positionMs) + public static void playUntilPosition(ExoPlayer player, int mediaItemIndex, long positionMs) throws TimeoutException { verifyMainTestThread(player); Looper applicationLooper = Util.getCurrentOrMainLooper(); @@ -315,7 +315,7 @@ public class TestPlayerRunHelper { // Ignore. } }) - .setPosition(windowIndex, positionMs) + .setPosition(mediaItemIndex, positionMs) .send(); player.play(); runMainLooperUntil(() -> messageHandled.get() || player.getPlayerError() != null); @@ -326,18 +326,19 @@ public class TestPlayerRunHelper { /** * Calls {@link Player#play()}, runs tasks of the main {@link Looper} until the {@code player} - * reaches the specified window or a playback error occurs, and then pauses the {@code player}. + * reaches the specified media item or a playback error occurs, and then pauses the {@code + * player}. * *

                    If a playback error occurs it will be thrown wrapped in an {@link IllegalStateException}. * * @param player The {@link Player}. - * @param windowIndex The window. + * @param mediaItemIndex The index of the media item. * @throws TimeoutException If the {@link RobolectricUtil#DEFAULT_TIMEOUT_MS default timeout} is * exceeded. */ - public static void playUntilStartOfWindow(ExoPlayer player, int windowIndex) + public static void playUntilStartOfMediaItem(ExoPlayer player, int mediaItemIndex) throws TimeoutException { - playUntilPosition(player, windowIndex, /* positionMs= */ 0); + playUntilPosition(player, mediaItemIndex, /* positionMs= */ 0); } /** 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 43d5162bd3..b5cdf77d5c 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 @@ -121,7 +121,7 @@ public abstract class Action { /** Calls {@link Player#seekTo(long)} or {@link Player#seekTo(int, long)}. */ public static final class Seek extends Action { - @Nullable private final Integer windowIndex; + @Nullable private final Integer mediaItemIndex; private final long positionMs; private final boolean catchIllegalSeekException; @@ -133,7 +133,7 @@ public abstract class Action { */ public Seek(String tag, long positionMs) { super(tag, "Seek:" + positionMs); - this.windowIndex = null; + this.mediaItemIndex = null; this.positionMs = positionMs; catchIllegalSeekException = false; } @@ -142,14 +142,15 @@ public abstract class Action { * Action calls {@link Player#seekTo(int, long)}. * * @param tag A tag to use for logging. - * @param windowIndex The window to seek to. + * @param mediaItemIndex The media item to seek to. * @param positionMs The seek position. * @param catchIllegalSeekException Whether {@link IllegalSeekPositionException} should be * silently caught or not. */ - public Seek(String tag, int windowIndex, long positionMs, boolean catchIllegalSeekException) { + public Seek( + String tag, int mediaItemIndex, long positionMs, boolean catchIllegalSeekException) { super(tag, "Seek:" + positionMs); - this.windowIndex = windowIndex; + this.mediaItemIndex = mediaItemIndex; this.positionMs = positionMs; this.catchIllegalSeekException = catchIllegalSeekException; } @@ -158,10 +159,10 @@ public abstract class Action { protected void doActionImpl( ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { try { - if (windowIndex == null) { + if (mediaItemIndex == null) { player.seekTo(positionMs); } else { - player.seekTo(windowIndex, positionMs); + player.seekTo(mediaItemIndex, positionMs); } } catch (IllegalSeekPositionException e) { if (!catchIllegalSeekException) { @@ -174,20 +175,20 @@ public abstract class Action { /** Calls {@link ExoPlayer#setMediaSources(List, int, long)}. */ public static final class SetMediaItems extends Action { - private final int windowIndex; + private final int mediaItemIndex; private final long positionMs; private final MediaSource[] mediaSources; /** * @param tag A tag to use for logging. - * @param windowIndex The window index to start playback from. + * @param mediaItemIndex The media item index to start playback from. * @param positionMs The position in milliseconds to start playback from. * @param mediaSources The media sources to populate the playlist with. */ public SetMediaItems( - String tag, int windowIndex, long positionMs, MediaSource... mediaSources) { + String tag, int mediaItemIndex, long positionMs, MediaSource... mediaSources) { super(tag, "SetMediaItems"); - this.windowIndex = windowIndex; + this.mediaItemIndex = mediaItemIndex; this.positionMs = positionMs; this.mediaSources = mediaSources; } @@ -195,7 +196,7 @@ public abstract class Action { @Override protected void doActionImpl( ExoPlayer player, DefaultTrackSelector trackSelector, @Nullable Surface surface) { - player.setMediaSources(Arrays.asList(mediaSources), windowIndex, positionMs); + player.setMediaSources(Arrays.asList(mediaSources), mediaItemIndex, positionMs); } } @@ -553,7 +554,7 @@ public abstract class Action { public static final class SendMessages extends Action { private final Target target; - private final int windowIndex; + private final int mediaItemIndex; private final long positionMs; private final boolean deleteAfterDelivery; @@ -566,7 +567,7 @@ public abstract class Action { this( tag, target, - /* windowIndex= */ C.INDEX_UNSET, + /* mediaItemIndex= */ C.INDEX_UNSET, positionMs, /* deleteAfterDelivery= */ true); } @@ -574,16 +575,20 @@ public abstract class Action { /** * @param tag A tag to use for logging. * @param target A message target. - * @param windowIndex The window index at which the message should be sent, or {@link - * C#INDEX_UNSET} for the current window. + * @param mediaItemIndex The media item index at which the message should be sent, or {@link + * C#INDEX_UNSET} for the current media item. * @param positionMs The position at which the message should be sent, in milliseconds. * @param deleteAfterDelivery Whether the message will be deleted after delivery. */ public SendMessages( - String tag, Target target, int windowIndex, long positionMs, boolean deleteAfterDelivery) { + String tag, + Target target, + int mediaItemIndex, + long positionMs, + boolean deleteAfterDelivery) { super(tag, "SendMessages"); this.target = target; - this.windowIndex = windowIndex; + this.mediaItemIndex = mediaItemIndex; this.positionMs = positionMs; this.deleteAfterDelivery = deleteAfterDelivery; } @@ -595,8 +600,8 @@ public abstract class Action { ((PlayerTarget) target).setPlayer(player); } PlayerMessage message = player.createMessage(target); - if (windowIndex != C.INDEX_UNSET) { - message.setPosition(windowIndex, positionMs); + if (mediaItemIndex != C.INDEX_UNSET) { + message.setPosition(mediaItemIndex, positionMs); } else { message.setPosition(positionMs); } @@ -661,17 +666,17 @@ public abstract class Action { */ public static final class PlayUntilPosition extends Action { - private final int windowIndex; + private final int mediaItemIndex; private final long positionMs; /** * @param tag A tag to use for logging. - * @param windowIndex The window index at which the player should be paused again. - * @param positionMs The position in that window at which the player should be paused again. + * @param mediaItemIndex The media item index at which the player should be paused again. + * @param positionMs The position in that media item at which the player should be paused again. */ - public PlayUntilPosition(String tag, int windowIndex, long positionMs) { - super(tag, "PlayUntilPosition:" + windowIndex + ":" + positionMs); - this.windowIndex = windowIndex; + public PlayUntilPosition(String tag, int mediaItemIndex, long positionMs) { + super(tag, "PlayUntilPosition:" + mediaItemIndex + ":" + positionMs); + this.mediaItemIndex = mediaItemIndex; this.positionMs = positionMs; } @@ -704,7 +709,7 @@ public abstract class Action { // Ignore. } }) - .setPosition(windowIndex, positionMs) + .setPosition(mediaItemIndex, positionMs) .send(); if (nextAction != null) { // Schedule another message on this test thread to continue action schedule. @@ -712,7 +717,7 @@ public abstract class Action { .createMessage( (messageType, payload) -> nextAction.schedule(player, trackSelector, surface, handler)) - .setPosition(windowIndex, positionMs) + .setPosition(mediaItemIndex, positionMs) .setLooper(applicationLooper) .send(); } 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 4590d5fd6b..0282e57a8c 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 @@ -161,24 +161,25 @@ public final class ActionSchedule { /** * Schedules a seek action. * - * @param windowIndex The window to seek to. + * @param mediaItemIndex The media item to seek to. * @param positionMs The seek position. * @return The builder, for convenience. */ - public Builder seek(int windowIndex, long positionMs) { - return apply(new Seek(tag, windowIndex, positionMs, /* catchIllegalSeekException= */ false)); + public Builder seek(int mediaItemIndex, long positionMs) { + return apply( + new Seek(tag, mediaItemIndex, positionMs, /* catchIllegalSeekException= */ false)); } /** * Schedules a seek action to be executed. * - * @param windowIndex The window to seek to. + * @param mediaItemIndex The media item to seek to. * @param positionMs The seek position. * @param catchIllegalSeekException Whether an illegal seek position should be caught or not. * @return The builder, for convenience. */ - public Builder seek(int windowIndex, long positionMs, boolean catchIllegalSeekException) { - return apply(new Seek(tag, windowIndex, positionMs, catchIllegalSeekException)); + public Builder seek(int mediaItemIndex, long positionMs, boolean catchIllegalSeekException) { + return apply(new Seek(tag, mediaItemIndex, positionMs, catchIllegalSeekException)); } /** @@ -247,23 +248,23 @@ public final class ActionSchedule { * Schedules a play action, waits until the player reaches the specified position, and pauses * the player again. * - * @param windowIndex The window index at which the player should be paused again. - * @param positionMs The position in that window at which the player should be paused again. + * @param mediaItemIndex The media item index at which the player should be paused again. + * @param positionMs The position in that media item at which the player should be paused again. * @return The builder, for convenience. */ - public Builder playUntilPosition(int windowIndex, long positionMs) { - return apply(new PlayUntilPosition(tag, windowIndex, positionMs)); + public Builder playUntilPosition(int mediaItemIndex, long positionMs) { + return apply(new PlayUntilPosition(tag, mediaItemIndex, positionMs)); } /** - * Schedules a play action, waits until the player reaches the start of the specified window, - * and pauses the player again. + * Schedules a play action, waits until the player reaches the start of the specified media + * item, and pauses the player again. * - * @param windowIndex The window index at which the player should be paused again. + * @param mediaItemIndex The media item index at which the player should be paused again. * @return The builder, for convenience. */ - public Builder playUntilStartOfWindow(int windowIndex) { - return apply(new PlayUntilPosition(tag, windowIndex, /* positionMs= */ 0)); + public Builder playUntilStartOfMediaItem(int mediaItemIndex) { + return apply(new PlayUntilPosition(tag, mediaItemIndex, /* positionMs= */ 0)); } /** @@ -323,16 +324,16 @@ public final class ActionSchedule { /** * Schedules a set media items action to be executed. * - * @param windowIndex The window index to start playback from or {@link C#INDEX_UNSET} if the - * playback position should not be reset. + * @param mediaItemIndex The media item index to start playback from or {@link C#INDEX_UNSET} if + * the playback position should not be reset. * @param positionMs The position in milliseconds from where playback should start. If {@link - * C#TIME_UNSET} is passed the default position is used. In any case, if {@code windowIndex} - * is set to {@link C#INDEX_UNSET} the position is not reset at all and this parameter is - * ignored. + * 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. * @return The builder, for convenience. */ - public Builder setMediaSources(int windowIndex, long positionMs, MediaSource... sources) { - return apply(new Action.SetMediaItems(tag, windowIndex, positionMs, sources)); + public Builder setMediaSources(int mediaItemIndex, long positionMs, MediaSource... sources) { + return apply(new Action.SetMediaItems(tag, mediaItemIndex, positionMs, sources)); } /** @@ -354,7 +355,10 @@ public final class ActionSchedule { public Builder setMediaSources(MediaSource... mediaSources) { return apply( new Action.SetMediaItems( - tag, /* windowIndex= */ C.INDEX_UNSET, /* positionMs= */ C.TIME_UNSET, mediaSources)); + tag, + /* mediaItemIndex= */ C.INDEX_UNSET, + /* positionMs= */ C.TIME_UNSET, + mediaSources)); } /** * Schedules a add media items action to be executed. @@ -447,8 +451,8 @@ public final class ActionSchedule { /** * Schedules sending a {@link PlayerMessage}. * - * @param positionMs The position in the current window at which the message should be sent, in - * milliseconds. + * @param positionMs The position in the current media item at which the message should be sent, + * in milliseconds. * @return The builder, for convenience. */ public Builder sendMessage(Target target, long positionMs) { @@ -459,27 +463,28 @@ public final class ActionSchedule { * Schedules sending a {@link PlayerMessage}. * * @param target A message target. - * @param windowIndex The window index at which the message should be sent. + * @param mediaItemIndex The media item index at which the message should be sent. * @param positionMs The position at which the message should be sent, in milliseconds. * @return The builder, for convenience. */ - public Builder sendMessage(Target target, int windowIndex, long positionMs) { + public Builder sendMessage(Target target, int mediaItemIndex, long positionMs) { return apply( - new SendMessages(tag, target, windowIndex, positionMs, /* deleteAfterDelivery= */ true)); + new SendMessages( + tag, target, mediaItemIndex, positionMs, /* deleteAfterDelivery= */ true)); } /** * Schedules to send a {@link PlayerMessage}. * * @param target A message target. - * @param windowIndex The window index at which the message should be sent. + * @param mediaItemIndex The media item index at which the message should be sent. * @param positionMs The position at which the message should be sent, in milliseconds. * @param deleteAfterDelivery Whether the message will be deleted after delivery. * @return The builder, for convenience. */ public Builder sendMessage( - Target target, int windowIndex, long positionMs, boolean deleteAfterDelivery) { - return apply(new SendMessages(tag, target, windowIndex, positionMs, deleteAfterDelivery)); + Target target, int mediaItemIndex, long positionMs, boolean deleteAfterDelivery) { + return apply(new SendMessages(tag, target, mediaItemIndex, positionMs, deleteAfterDelivery)); } /** diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java index 6df171442d..1a305f0e35 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java @@ -85,7 +85,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul private AnalyticsListener analyticsListener; private Integer expectedPlayerEndedCount; private boolean pauseAtEndOfMediaItems; - private int initialWindowIndex; + private int initialMediaItemIndex; private long initialPositionMs; private boolean skipSettingMediaSources; @@ -93,7 +93,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul testPlayerBuilder = new TestExoPlayerBuilder(context); mediaSources = new ArrayList<>(); supportedFormats = new Format[] {VIDEO_FORMAT}; - initialWindowIndex = C.INDEX_UNSET; + initialMediaItemIndex = C.INDEX_UNSET; initialPositionMs = C.TIME_UNSET; } @@ -133,12 +133,12 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul /** * Seeks before setting the media sources and preparing the player. * - * @param windowIndex The window index to seek to. + * @param mediaItemIndex The media item index to seek to. * @param positionMs The position in milliseconds to seek to. * @return This builder. */ - public Builder initialSeek(int windowIndex, long positionMs) { - this.initialWindowIndex = windowIndex; + public Builder initialSeek(int mediaItemIndex, long positionMs) { + this.initialMediaItemIndex = mediaItemIndex; this.initialPositionMs = positionMs; return this; } @@ -343,7 +343,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul testPlayerBuilder, mediaSources, skipSettingMediaSources, - initialWindowIndex, + initialMediaItemIndex, initialPositionMs, surface, actionSchedule, @@ -357,7 +357,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul private final TestExoPlayerBuilder playerBuilder; private final List mediaSources; private final boolean skipSettingMediaSources; - private final int initialWindowIndex; + private final int initialMediaItemIndex; private final long initialPositionMs; @Nullable private final Surface surface; @Nullable private final ActionSchedule actionSchedule; @@ -386,7 +386,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul TestExoPlayerBuilder playerBuilder, List mediaSources, boolean skipSettingMediaSources, - int initialWindowIndex, + int initialMediaItemIndex, long initialPositionMs, @Nullable Surface surface, @Nullable ActionSchedule actionSchedule, @@ -397,7 +397,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul this.playerBuilder = playerBuilder; this.mediaSources = mediaSources; this.skipSettingMediaSources = skipSettingMediaSources; - this.initialWindowIndex = initialWindowIndex; + this.initialMediaItemIndex = initialMediaItemIndex; this.initialPositionMs = initialPositionMs; this.surface = surface; this.actionSchedule = actionSchedule; @@ -466,8 +466,8 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul handler, /* callback= */ ExoPlayerTestRunner.this); } - if (initialWindowIndex != C.INDEX_UNSET) { - player.seekTo(initialWindowIndex, initialPositionMs); + if (initialMediaItemIndex != C.INDEX_UNSET) { + player.seekTo(initialMediaItemIndex, initialPositionMs); } if (!skipSettingMediaSources) { player.setMediaSources(mediaSources, /* resetPosition= */ false); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index c0acae1da6..136327739f 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -162,7 +162,7 @@ public class StubExoPlayer extends StubPlayer implements ExoPlayer { @Override public void setMediaSources( - List mediaSources, int startWindowIndex, long startPositionMs) { + List mediaSources, int startMediaItemIndex, long startPositionMs) { throw new UnsupportedOperationException(); } From e246eccc1069974e0d2aa890798872915664208f Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 2 Nov 2021 10:49:18 +0000 Subject: [PATCH 430/441] Replace map with a switch statement in bandwidth meter implementations #minor-release PiperOrigin-RevId: 407042882 --- .../upstream/DefaultBandwidthMeter.java | 713 +++++++++++------- 1 file changed, 438 insertions(+), 275 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java index 07b3185b43..2db19fb6a7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java @@ -26,10 +26,8 @@ import com.google.android.exoplayer2.util.NetworkTypeObserver; import com.google.android.exoplayer2.util.Util; import com.google.common.base.Ascii; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -42,13 +40,6 @@ import java.util.Map; */ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferListener { - /** - * Country groups used to determine the default initial bitrate estimate. The group assignment for - * each country is a list for [Wifi, 2G, 3G, 4G, 5G_NSA, 5G_SA]. - */ - public static final ImmutableListMultimap - DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS = createInitialBitrateCountryGroupAssignment(); - /** Default initial Wifi bitrate estimate in bits per second. */ public static final ImmutableList DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI = ImmutableList.of(5_400_000L, 3_300_000L, 2_000_000L, 1_300_000L, 760_000L); @@ -82,17 +73,35 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList /** Default maximum weight for the sliding window. */ public static final int DEFAULT_SLIDING_WINDOW_MAX_WEIGHT = 2000; - /** Index for the Wifi group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the Wifi group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_WIFI = 0; - /** Index for the 2G group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the 2G group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_2G = 1; - /** Index for the 3G group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the 3G group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_3G = 2; - /** Index for the 4G group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the 4G group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_4G = 3; - /** Index for the 5G-NSA group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the 5G-NSA group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_5G_NSA = 4; - /** Index for the 5G-SA group index in {@link #DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS}. */ + /** + * Index for the 5G-SA group index in the array returned by {@link + * #getInitialBitrateCountryGroupAssignment}. + */ private static final int COUNTRY_GROUP_INDEX_5G_SA = 5; @Nullable private static DefaultBandwidthMeter singletonInstance; @@ -212,40 +221,33 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList } private static Map getInitialBitrateEstimatesForCountry(String countryCode) { - List groupIndices = getCountryGroupIndices(countryCode); + int[] groupIndices = getInitialBitrateCountryGroupAssignment(countryCode); Map result = new HashMap<>(/* initialCapacity= */ 8); result.put(C.NETWORK_TYPE_UNKNOWN, DEFAULT_INITIAL_BITRATE_ESTIMATE); result.put( C.NETWORK_TYPE_WIFI, - DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI.get(groupIndices.get(COUNTRY_GROUP_INDEX_WIFI))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI.get(groupIndices[COUNTRY_GROUP_INDEX_WIFI])); result.put( C.NETWORK_TYPE_2G, - DEFAULT_INITIAL_BITRATE_ESTIMATES_2G.get(groupIndices.get(COUNTRY_GROUP_INDEX_2G))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_2G.get(groupIndices[COUNTRY_GROUP_INDEX_2G])); result.put( C.NETWORK_TYPE_3G, - DEFAULT_INITIAL_BITRATE_ESTIMATES_3G.get(groupIndices.get(COUNTRY_GROUP_INDEX_3G))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_3G.get(groupIndices[COUNTRY_GROUP_INDEX_3G])); result.put( C.NETWORK_TYPE_4G, - DEFAULT_INITIAL_BITRATE_ESTIMATES_4G.get(groupIndices.get(COUNTRY_GROUP_INDEX_4G))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_4G.get(groupIndices[COUNTRY_GROUP_INDEX_4G])); result.put( C.NETWORK_TYPE_5G_NSA, - DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA.get( - groupIndices.get(COUNTRY_GROUP_INDEX_5G_NSA))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA.get(groupIndices[COUNTRY_GROUP_INDEX_5G_NSA])); result.put( C.NETWORK_TYPE_5G_SA, - DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA.get(groupIndices.get(COUNTRY_GROUP_INDEX_5G_SA))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA.get(groupIndices[COUNTRY_GROUP_INDEX_5G_SA])); // Assume default Wifi speed for Ethernet to prevent using the slower fallback. result.put( C.NETWORK_TYPE_ETHERNET, - DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI.get(groupIndices.get(COUNTRY_GROUP_INDEX_WIFI))); + DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI.get(groupIndices[COUNTRY_GROUP_INDEX_WIFI])); return result; } - - private static ImmutableList getCountryGroupIndices(String countryCode) { - ImmutableList groupIndices = DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS.get(countryCode); - // Assume median group if not found. - return groupIndices.isEmpty() ? ImmutableList.of(2, 2, 2, 2, 2, 2) : groupIndices; - } } /** @@ -461,250 +463,411 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList return isNetwork && !dataSpec.isFlagSet(DataSpec.FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED); } - private static ImmutableListMultimap - createInitialBitrateCountryGroupAssignment() { - return ImmutableListMultimap.builder() - .putAll("AD", 1, 2, 0, 0, 2, 2) - .putAll("AE", 1, 4, 4, 4, 3, 2) - .putAll("AF", 4, 4, 4, 4, 2, 2) - .putAll("AG", 2, 3, 1, 2, 2, 2) - .putAll("AI", 1, 2, 2, 2, 2, 2) - .putAll("AL", 1, 2, 0, 1, 2, 2) - .putAll("AM", 2, 3, 2, 4, 2, 2) - .putAll("AO", 3, 4, 3, 2, 2, 2) - .putAll("AQ", 4, 2, 2, 2, 2, 2) - .putAll("AR", 2, 4, 1, 1, 2, 2) - .putAll("AS", 2, 2, 2, 3, 2, 2) - .putAll("AT", 0, 0, 0, 0, 0, 2) - .putAll("AU", 0, 1, 0, 1, 2, 2) - .putAll("AW", 1, 2, 4, 4, 2, 2) - .putAll("AX", 0, 2, 2, 2, 2, 2) - .putAll("AZ", 3, 2, 4, 4, 2, 2) - .putAll("BA", 1, 2, 0, 1, 2, 2) - .putAll("BB", 0, 2, 0, 0, 2, 2) - .putAll("BD", 2, 1, 3, 3, 2, 2) - .putAll("BE", 0, 0, 3, 3, 2, 2) - .putAll("BF", 4, 3, 4, 3, 2, 2) - .putAll("BG", 0, 0, 0, 0, 1, 2) - .putAll("BH", 1, 2, 2, 4, 4, 2) - .putAll("BI", 4, 3, 4, 4, 2, 2) - .putAll("BJ", 4, 4, 3, 4, 2, 2) - .putAll("BL", 1, 2, 2, 2, 2, 2) - .putAll("BM", 1, 2, 0, 0, 2, 2) - .putAll("BN", 3, 2, 1, 1, 2, 2) - .putAll("BO", 1, 3, 3, 2, 2, 2) - .putAll("BQ", 1, 2, 2, 0, 2, 2) - .putAll("BR", 2, 3, 2, 2, 2, 2) - .putAll("BS", 4, 2, 2, 3, 2, 2) - .putAll("BT", 3, 1, 3, 2, 2, 2) - .putAll("BW", 3, 4, 1, 0, 2, 2) - .putAll("BY", 0, 1, 1, 3, 2, 2) - .putAll("BZ", 2, 4, 2, 2, 2, 2) - .putAll("CA", 0, 2, 1, 2, 4, 1) - .putAll("CD", 4, 2, 3, 1, 2, 2) - .putAll("CF", 4, 2, 3, 2, 2, 2) - .putAll("CG", 2, 4, 3, 4, 2, 2) - .putAll("CH", 0, 0, 0, 0, 0, 2) - .putAll("CI", 3, 3, 3, 4, 2, 2) - .putAll("CK", 2, 2, 2, 1, 2, 2) - .putAll("CL", 1, 1, 2, 2, 3, 2) - .putAll("CM", 3, 4, 3, 2, 2, 2) - .putAll("CN", 2, 0, 2, 2, 3, 1) - .putAll("CO", 2, 2, 4, 2, 2, 2) - .putAll("CR", 2, 2, 4, 4, 2, 2) - .putAll("CU", 4, 4, 3, 2, 2, 2) - .putAll("CV", 2, 3, 1, 0, 2, 2) - .putAll("CW", 2, 2, 0, 0, 2, 2) - .putAll("CX", 1, 2, 2, 2, 2, 2) - .putAll("CY", 1, 0, 0, 0, 1, 2) - .putAll("CZ", 0, 0, 0, 0, 1, 2) - .putAll("DE", 0, 0, 2, 2, 1, 2) - .putAll("DJ", 4, 1, 4, 4, 2, 2) - .putAll("DK", 0, 0, 1, 0, 0, 2) - .putAll("DM", 1, 2, 2, 2, 2, 2) - .putAll("DO", 3, 4, 4, 4, 2, 2) - .putAll("DZ", 4, 3, 4, 4, 2, 2) - .putAll("EC", 2, 4, 2, 1, 2, 2) - .putAll("EE", 0, 0, 0, 0, 2, 2) - .putAll("EG", 3, 4, 2, 3, 2, 2) - .putAll("EH", 2, 2, 2, 2, 2, 2) - .putAll("ER", 4, 2, 2, 2, 2, 2) - .putAll("ES", 0, 1, 1, 1, 2, 2) - .putAll("ET", 4, 4, 3, 1, 2, 2) - .putAll("FI", 0, 0, 0, 1, 0, 2) - .putAll("FJ", 3, 1, 3, 3, 2, 2) - .putAll("FK", 3, 2, 2, 2, 2, 2) - .putAll("FM", 3, 2, 4, 2, 2, 2) - .putAll("FO", 0, 2, 0, 0, 2, 2) - .putAll("FR", 1, 1, 2, 1, 1, 1) - .putAll("GA", 2, 3, 1, 1, 2, 2) - .putAll("GB", 0, 0, 1, 1, 2, 3) - .putAll("GD", 1, 2, 2, 2, 2, 2) - .putAll("GE", 1, 1, 1, 3, 2, 2) - .putAll("GF", 2, 1, 2, 3, 2, 2) - .putAll("GG", 0, 2, 0, 0, 2, 2) - .putAll("GH", 3, 2, 3, 2, 2, 2) - .putAll("GI", 0, 2, 2, 2, 2, 2) - .putAll("GL", 1, 2, 0, 0, 2, 2) - .putAll("GM", 4, 2, 2, 4, 2, 2) - .putAll("GN", 4, 3, 4, 2, 2, 2) - .putAll("GP", 2, 1, 2, 3, 2, 2) - .putAll("GQ", 4, 2, 3, 4, 2, 2) - .putAll("GR", 1, 0, 0, 0, 2, 2) - .putAll("GT", 2, 3, 2, 1, 2, 2) - .putAll("GU", 1, 2, 4, 4, 2, 2) - .putAll("GW", 3, 4, 3, 3, 2, 2) - .putAll("GY", 3, 4, 1, 0, 2, 2) - .putAll("HK", 0, 1, 2, 3, 2, 0) - .putAll("HN", 3, 2, 3, 3, 2, 2) - .putAll("HR", 1, 0, 0, 0, 2, 2) - .putAll("HT", 4, 4, 4, 4, 2, 2) - .putAll("HU", 0, 0, 0, 1, 3, 2) - .putAll("ID", 3, 2, 3, 3, 3, 2) - .putAll("IE", 0, 1, 1, 1, 2, 2) - .putAll("IL", 1, 1, 2, 3, 4, 2) - .putAll("IM", 0, 2, 0, 1, 2, 2) - .putAll("IN", 1, 1, 3, 2, 4, 3) - .putAll("IO", 4, 2, 2, 2, 2, 2) - .putAll("IQ", 3, 3, 3, 3, 2, 2) - .putAll("IR", 3, 0, 1, 1, 3, 0) - .putAll("IS", 0, 0, 0, 0, 0, 2) - .putAll("IT", 0, 1, 0, 1, 1, 2) - .putAll("JE", 3, 2, 1, 2, 2, 2) - .putAll("JM", 3, 4, 4, 4, 2, 2) - .putAll("JO", 1, 0, 0, 1, 2, 2) - .putAll("JP", 0, 1, 0, 1, 1, 1) - .putAll("KE", 3, 3, 2, 2, 2, 2) - .putAll("KG", 2, 1, 1, 1, 2, 2) - .putAll("KH", 1, 1, 4, 2, 2, 2) - .putAll("KI", 4, 2, 4, 3, 2, 2) - .putAll("KM", 4, 2, 4, 3, 2, 2) - .putAll("KN", 2, 2, 2, 2, 2, 2) - .putAll("KP", 3, 2, 2, 2, 2, 2) - .putAll("KR", 0, 0, 1, 3, 4, 4) - .putAll("KW", 1, 1, 0, 0, 0, 2) - .putAll("KY", 1, 2, 0, 1, 2, 2) - .putAll("KZ", 1, 1, 2, 2, 2, 2) - .putAll("LA", 2, 2, 1, 2, 2, 2) - .putAll("LB", 3, 2, 1, 4, 2, 2) - .putAll("LC", 1, 2, 0, 0, 2, 2) - .putAll("LI", 0, 2, 2, 2, 2, 2) - .putAll("LK", 3, 1, 3, 4, 4, 2) - .putAll("LR", 3, 4, 4, 3, 2, 2) - .putAll("LS", 3, 3, 4, 3, 2, 2) - .putAll("LT", 0, 0, 0, 0, 2, 2) - .putAll("LU", 1, 0, 2, 2, 2, 2) - .putAll("LV", 0, 0, 0, 0, 2, 2) - .putAll("LY", 4, 2, 4, 3, 2, 2) - .putAll("MA", 3, 2, 2, 2, 2, 2) - .putAll("MC", 0, 2, 2, 0, 2, 2) - .putAll("MD", 1, 0, 0, 0, 2, 2) - .putAll("ME", 1, 0, 0, 1, 2, 2) - .putAll("MF", 1, 2, 1, 0, 2, 2) - .putAll("MG", 3, 4, 2, 2, 2, 2) - .putAll("MH", 3, 2, 2, 4, 2, 2) - .putAll("MK", 1, 0, 0, 0, 2, 2) - .putAll("ML", 4, 3, 3, 1, 2, 2) - .putAll("MM", 2, 4, 3, 3, 2, 2) - .putAll("MN", 2, 0, 1, 2, 2, 2) - .putAll("MO", 0, 2, 4, 4, 2, 2) - .putAll("MP", 0, 2, 2, 2, 2, 2) - .putAll("MQ", 2, 1, 2, 3, 2, 2) - .putAll("MR", 4, 1, 3, 4, 2, 2) - .putAll("MS", 1, 2, 2, 2, 2, 2) - .putAll("MT", 0, 0, 0, 0, 2, 2) - .putAll("MU", 3, 1, 1, 2, 2, 2) - .putAll("MV", 3, 4, 1, 4, 2, 2) - .putAll("MW", 4, 2, 1, 0, 2, 2) - .putAll("MX", 2, 4, 3, 4, 2, 2) - .putAll("MY", 2, 1, 3, 3, 2, 2) - .putAll("MZ", 3, 2, 2, 2, 2, 2) - .putAll("NA", 4, 3, 2, 2, 2, 2) - .putAll("NC", 3, 2, 4, 4, 2, 2) - .putAll("NE", 4, 4, 4, 4, 2, 2) - .putAll("NF", 2, 2, 2, 2, 2, 2) - .putAll("NG", 3, 4, 1, 1, 2, 2) - .putAll("NI", 2, 3, 4, 3, 2, 2) - .putAll("NL", 0, 0, 3, 2, 0, 4) - .putAll("NO", 0, 0, 2, 0, 0, 2) - .putAll("NP", 2, 1, 4, 3, 2, 2) - .putAll("NR", 3, 2, 2, 0, 2, 2) - .putAll("NU", 4, 2, 2, 2, 2, 2) - .putAll("NZ", 1, 0, 1, 2, 4, 2) - .putAll("OM", 2, 3, 1, 3, 4, 2) - .putAll("PA", 1, 3, 3, 3, 2, 2) - .putAll("PE", 2, 3, 4, 4, 4, 2) - .putAll("PF", 2, 3, 3, 1, 2, 2) - .putAll("PG", 4, 4, 3, 2, 2, 2) - .putAll("PH", 2, 2, 3, 3, 3, 2) - .putAll("PK", 3, 2, 3, 3, 2, 2) - .putAll("PL", 1, 1, 2, 2, 3, 2) - .putAll("PM", 0, 2, 2, 2, 2, 2) - .putAll("PR", 2, 3, 2, 2, 3, 3) - .putAll("PS", 3, 4, 1, 2, 2, 2) - .putAll("PT", 0, 1, 0, 0, 2, 2) - .putAll("PW", 2, 2, 4, 1, 2, 2) - .putAll("PY", 2, 2, 3, 2, 2, 2) - .putAll("QA", 2, 4, 2, 4, 4, 2) - .putAll("RE", 1, 1, 1, 2, 2, 2) - .putAll("RO", 0, 0, 1, 1, 1, 2) - .putAll("RS", 1, 0, 0, 0, 2, 2) - .putAll("RU", 0, 0, 0, 1, 2, 2) - .putAll("RW", 3, 4, 3, 0, 2, 2) - .putAll("SA", 2, 2, 1, 1, 2, 2) - .putAll("SB", 4, 2, 4, 3, 2, 2) - .putAll("SC", 4, 3, 0, 2, 2, 2) - .putAll("SD", 4, 4, 4, 4, 2, 2) - .putAll("SE", 0, 0, 0, 0, 0, 2) - .putAll("SG", 1, 1, 2, 3, 1, 4) - .putAll("SH", 4, 2, 2, 2, 2, 2) - .putAll("SI", 0, 0, 0, 0, 1, 2) - .putAll("SJ", 0, 2, 2, 2, 2, 2) - .putAll("SK", 0, 0, 0, 0, 0, 2) - .putAll("SL", 4, 3, 4, 1, 2, 2) - .putAll("SM", 0, 2, 2, 2, 2, 2) - .putAll("SN", 4, 4, 4, 4, 2, 2) - .putAll("SO", 3, 2, 3, 3, 2, 2) - .putAll("SR", 2, 3, 2, 2, 2, 2) - .putAll("SS", 4, 2, 2, 2, 2, 2) - .putAll("ST", 3, 2, 2, 2, 2, 2) - .putAll("SV", 2, 2, 3, 3, 2, 2) - .putAll("SX", 2, 2, 1, 0, 2, 2) - .putAll("SY", 4, 3, 4, 4, 2, 2) - .putAll("SZ", 4, 3, 2, 4, 2, 2) - .putAll("TC", 2, 2, 1, 0, 2, 2) - .putAll("TD", 4, 4, 4, 4, 2, 2) - .putAll("TG", 3, 3, 2, 0, 2, 2) - .putAll("TH", 0, 3, 2, 3, 3, 0) - .putAll("TJ", 4, 2, 4, 4, 2, 2) - .putAll("TL", 4, 3, 4, 4, 2, 2) - .putAll("TM", 4, 2, 4, 2, 2, 2) - .putAll("TN", 2, 2, 1, 1, 2, 2) - .putAll("TO", 4, 2, 3, 3, 2, 2) - .putAll("TR", 1, 1, 0, 1, 2, 2) - .putAll("TT", 1, 4, 1, 1, 2, 2) - .putAll("TV", 4, 2, 2, 2, 2, 2) - .putAll("TW", 0, 0, 0, 0, 0, 0) - .putAll("TZ", 3, 4, 3, 3, 2, 2) - .putAll("UA", 0, 3, 1, 1, 2, 2) - .putAll("UG", 3, 3, 3, 3, 2, 2) - .putAll("US", 1, 1, 2, 2, 3, 2) - .putAll("UY", 2, 2, 1, 2, 2, 2) - .putAll("UZ", 2, 2, 3, 4, 2, 2) - .putAll("VC", 1, 2, 2, 2, 2, 2) - .putAll("VE", 4, 4, 4, 4, 2, 2) - .putAll("VG", 2, 2, 1, 1, 2, 2) - .putAll("VI", 1, 2, 1, 3, 2, 2) - .putAll("VN", 0, 3, 3, 4, 2, 2) - .putAll("VU", 4, 2, 2, 1, 2, 2) - .putAll("WF", 4, 2, 2, 4, 2, 2) - .putAll("WS", 3, 1, 2, 1, 2, 2) - .putAll("XK", 1, 1, 1, 1, 2, 2) - .putAll("YE", 4, 4, 4, 4, 2, 2) - .putAll("YT", 4, 1, 1, 1, 2, 2) - .putAll("ZA", 3, 3, 1, 1, 1, 2) - .putAll("ZM", 3, 3, 4, 2, 2, 2) - .putAll("ZW", 3, 2, 4, 3, 2, 2) - .build(); + /** + * Returns initial bitrate group assignments for a {@code country}. The initial bitrate is a list + * of indexes for [Wifi, 2G, 3G, 4G, 5G_NSA, 5G_SA]. + */ + private static int[] getInitialBitrateCountryGroupAssignment(String country) { + switch (country) { + case "AE": + return new int[] {1, 4, 4, 4, 3, 2}; + case "AG": + return new int[] {2, 3, 1, 2, 2, 2}; + case "AM": + return new int[] {2, 3, 2, 4, 2, 2}; + case "AR": + return new int[] {2, 4, 1, 1, 2, 2}; + case "AS": + return new int[] {2, 2, 2, 3, 2, 2}; + case "AU": + return new int[] {0, 1, 0, 1, 2, 2}; + case "BE": + return new int[] {0, 0, 3, 3, 2, 2}; + case "BF": + return new int[] {4, 3, 4, 3, 2, 2}; + case "BH": + return new int[] {1, 2, 2, 4, 4, 2}; + case "BJ": + return new int[] {4, 4, 3, 4, 2, 2}; + case "BN": + return new int[] {3, 2, 1, 1, 2, 2}; + case "BO": + return new int[] {1, 3, 3, 2, 2, 2}; + case "BQ": + return new int[] {1, 2, 2, 0, 2, 2}; + case "BS": + return new int[] {4, 2, 2, 3, 2, 2}; + case "BT": + return new int[] {3, 1, 3, 2, 2, 2}; + case "BY": + return new int[] {0, 1, 1, 3, 2, 2}; + case "BZ": + return new int[] {2, 4, 2, 2, 2, 2}; + case "CA": + return new int[] {0, 2, 1, 2, 4, 1}; + case "CD": + return new int[] {4, 2, 3, 1, 2, 2}; + case "CF": + return new int[] {4, 2, 3, 2, 2, 2}; + case "CI": + return new int[] {3, 3, 3, 4, 2, 2}; + case "CK": + return new int[] {2, 2, 2, 1, 2, 2}; + case "AO": + case "CM": + return new int[] {3, 4, 3, 2, 2, 2}; + case "CN": + return new int[] {2, 0, 2, 2, 3, 1}; + case "CO": + return new int[] {2, 2, 4, 2, 2, 2}; + case "CR": + return new int[] {2, 2, 4, 4, 2, 2}; + case "CV": + return new int[] {2, 3, 1, 0, 2, 2}; + case "CW": + return new int[] {2, 2, 0, 0, 2, 2}; + case "CY": + return new int[] {1, 0, 0, 0, 1, 2}; + case "DE": + return new int[] {0, 0, 2, 2, 1, 2}; + case "DJ": + return new int[] {4, 1, 4, 4, 2, 2}; + case "DK": + return new int[] {0, 0, 1, 0, 0, 2}; + case "EC": + return new int[] {2, 4, 2, 1, 2, 2}; + case "EG": + return new int[] {3, 4, 2, 3, 2, 2}; + case "ET": + return new int[] {4, 4, 3, 1, 2, 2}; + case "FI": + return new int[] {0, 0, 0, 1, 0, 2}; + case "FJ": + return new int[] {3, 1, 3, 3, 2, 2}; + case "FM": + return new int[] {3, 2, 4, 2, 2, 2}; + case "FR": + return new int[] {1, 1, 2, 1, 1, 1}; + case "GA": + return new int[] {2, 3, 1, 1, 2, 2}; + case "GB": + return new int[] {0, 0, 1, 1, 2, 3}; + case "GE": + return new int[] {1, 1, 1, 3, 2, 2}; + case "BB": + case "FO": + case "GG": + return new int[] {0, 2, 0, 0, 2, 2}; + case "GH": + return new int[] {3, 2, 3, 2, 2, 2}; + case "GN": + return new int[] {4, 3, 4, 2, 2, 2}; + case "GQ": + return new int[] {4, 2, 3, 4, 2, 2}; + case "GT": + return new int[] {2, 3, 2, 1, 2, 2}; + case "AW": + case "GU": + return new int[] {1, 2, 4, 4, 2, 2}; + case "BW": + case "GY": + return new int[] {3, 4, 1, 0, 2, 2}; + case "HK": + return new int[] {0, 1, 2, 3, 2, 0}; + case "HU": + return new int[] {0, 0, 0, 1, 3, 2}; + case "ID": + return new int[] {3, 2, 3, 3, 3, 2}; + case "ES": + case "IE": + return new int[] {0, 1, 1, 1, 2, 2}; + case "IL": + return new int[] {1, 1, 2, 3, 4, 2}; + case "IM": + return new int[] {0, 2, 0, 1, 2, 2}; + case "IN": + return new int[] {1, 1, 3, 2, 4, 3}; + case "IR": + return new int[] {3, 0, 1, 1, 3, 0}; + case "IT": + return new int[] {0, 1, 0, 1, 1, 2}; + case "JE": + return new int[] {3, 2, 1, 2, 2, 2}; + case "DO": + case "JM": + return new int[] {3, 4, 4, 4, 2, 2}; + case "JP": + return new int[] {0, 1, 0, 1, 1, 1}; + case "KE": + return new int[] {3, 3, 2, 2, 2, 2}; + case "KG": + return new int[] {2, 1, 1, 1, 2, 2}; + case "KH": + return new int[] {1, 1, 4, 2, 2, 2}; + case "KR": + return new int[] {0, 0, 1, 3, 4, 4}; + case "KW": + return new int[] {1, 1, 0, 0, 0, 2}; + case "AL": + case "BA": + case "KY": + return new int[] {1, 2, 0, 1, 2, 2}; + case "KZ": + return new int[] {1, 1, 2, 2, 2, 2}; + case "LB": + return new int[] {3, 2, 1, 4, 2, 2}; + case "AD": + case "BM": + case "GL": + case "LC": + return new int[] {1, 2, 0, 0, 2, 2}; + case "LK": + return new int[] {3, 1, 3, 4, 4, 2}; + case "LR": + return new int[] {3, 4, 4, 3, 2, 2}; + case "LS": + return new int[] {3, 3, 4, 3, 2, 2}; + case "LU": + return new int[] {1, 0, 2, 2, 2, 2}; + case "MC": + return new int[] {0, 2, 2, 0, 2, 2}; + case "JO": + case "ME": + return new int[] {1, 0, 0, 1, 2, 2}; + case "MF": + return new int[] {1, 2, 1, 0, 2, 2}; + case "MG": + return new int[] {3, 4, 2, 2, 2, 2}; + case "MH": + return new int[] {3, 2, 2, 4, 2, 2}; + case "ML": + return new int[] {4, 3, 3, 1, 2, 2}; + case "MM": + return new int[] {2, 4, 3, 3, 2, 2}; + case "MN": + return new int[] {2, 0, 1, 2, 2, 2}; + case "MO": + return new int[] {0, 2, 4, 4, 2, 2}; + case "GF": + case "GP": + case "MQ": + return new int[] {2, 1, 2, 3, 2, 2}; + case "MR": + return new int[] {4, 1, 3, 4, 2, 2}; + case "EE": + case "LT": + case "LV": + case "MT": + return new int[] {0, 0, 0, 0, 2, 2}; + case "MU": + return new int[] {3, 1, 1, 2, 2, 2}; + case "MV": + return new int[] {3, 4, 1, 4, 2, 2}; + case "MW": + return new int[] {4, 2, 1, 0, 2, 2}; + case "CG": + case "MX": + return new int[] {2, 4, 3, 4, 2, 2}; + case "BD": + case "MY": + return new int[] {2, 1, 3, 3, 2, 2}; + case "NA": + return new int[] {4, 3, 2, 2, 2, 2}; + case "AZ": + case "NC": + return new int[] {3, 2, 4, 4, 2, 2}; + case "NG": + return new int[] {3, 4, 1, 1, 2, 2}; + case "NI": + return new int[] {2, 3, 4, 3, 2, 2}; + case "NL": + return new int[] {0, 0, 3, 2, 0, 4}; + case "NO": + return new int[] {0, 0, 2, 0, 0, 2}; + case "NP": + return new int[] {2, 1, 4, 3, 2, 2}; + case "NR": + return new int[] {3, 2, 2, 0, 2, 2}; + case "NZ": + return new int[] {1, 0, 1, 2, 4, 2}; + case "OM": + return new int[] {2, 3, 1, 3, 4, 2}; + case "PA": + return new int[] {1, 3, 3, 3, 2, 2}; + case "PE": + return new int[] {2, 3, 4, 4, 4, 2}; + case "PF": + return new int[] {2, 3, 3, 1, 2, 2}; + case "CU": + case "PG": + return new int[] {4, 4, 3, 2, 2, 2}; + case "PH": + return new int[] {2, 2, 3, 3, 3, 2}; + case "PR": + return new int[] {2, 3, 2, 2, 3, 3}; + case "PS": + return new int[] {3, 4, 1, 2, 2, 2}; + case "PT": + return new int[] {0, 1, 0, 0, 2, 2}; + case "PW": + return new int[] {2, 2, 4, 1, 2, 2}; + case "PY": + return new int[] {2, 2, 3, 2, 2, 2}; + case "QA": + return new int[] {2, 4, 2, 4, 4, 2}; + case "RE": + return new int[] {1, 1, 1, 2, 2, 2}; + case "RO": + return new int[] {0, 0, 1, 1, 1, 2}; + case "GR": + case "HR": + case "MD": + case "MK": + case "RS": + return new int[] {1, 0, 0, 0, 2, 2}; + case "RU": + return new int[] {0, 0, 0, 1, 2, 2}; + case "RW": + return new int[] {3, 4, 3, 0, 2, 2}; + case "KI": + case "KM": + case "LY": + case "SB": + return new int[] {4, 2, 4, 3, 2, 2}; + case "SC": + return new int[] {4, 3, 0, 2, 2, 2}; + case "SG": + return new int[] {1, 1, 2, 3, 1, 4}; + case "BG": + case "CZ": + case "SI": + return new int[] {0, 0, 0, 0, 1, 2}; + case "AT": + case "CH": + case "IS": + case "SE": + case "SK": + return new int[] {0, 0, 0, 0, 0, 2}; + case "SL": + return new int[] {4, 3, 4, 1, 2, 2}; + case "AX": + case "GI": + case "LI": + case "MP": + case "PM": + case "SJ": + case "SM": + return new int[] {0, 2, 2, 2, 2, 2}; + case "HN": + case "PK": + case "SO": + return new int[] {3, 2, 3, 3, 2, 2}; + case "BR": + case "SR": + return new int[] {2, 3, 2, 2, 2, 2}; + case "FK": + case "KP": + case "MA": + case "MZ": + case "ST": + return new int[] {3, 2, 2, 2, 2, 2}; + case "SV": + return new int[] {2, 2, 3, 3, 2, 2}; + case "SZ": + return new int[] {4, 3, 2, 4, 2, 2}; + case "SX": + case "TC": + return new int[] {2, 2, 1, 0, 2, 2}; + case "TG": + return new int[] {3, 3, 2, 0, 2, 2}; + case "TH": + return new int[] {0, 3, 2, 3, 3, 0}; + case "TJ": + return new int[] {4, 2, 4, 4, 2, 2}; + case "BI": + case "DZ": + case "SY": + case "TL": + return new int[] {4, 3, 4, 4, 2, 2}; + case "TM": + return new int[] {4, 2, 4, 2, 2, 2}; + case "TO": + return new int[] {4, 2, 3, 3, 2, 2}; + case "TR": + return new int[] {1, 1, 0, 1, 2, 2}; + case "TT": + return new int[] {1, 4, 1, 1, 2, 2}; + case "AQ": + case "ER": + case "IO": + case "NU": + case "SH": + case "SS": + case "TV": + return new int[] {4, 2, 2, 2, 2, 2}; + case "TW": + return new int[] {0, 0, 0, 0, 0, 0}; + case "GW": + case "TZ": + return new int[] {3, 4, 3, 3, 2, 2}; + case "UA": + return new int[] {0, 3, 1, 1, 2, 2}; + case "IQ": + case "UG": + return new int[] {3, 3, 3, 3, 2, 2}; + case "CL": + case "PL": + case "US": + return new int[] {1, 1, 2, 2, 3, 2}; + case "LA": + case "UY": + return new int[] {2, 2, 1, 2, 2, 2}; + case "UZ": + return new int[] {2, 2, 3, 4, 2, 2}; + case "AI": + case "BL": + case "CX": + case "DM": + case "GD": + case "MS": + case "VC": + return new int[] {1, 2, 2, 2, 2, 2}; + case "SA": + case "TN": + case "VG": + return new int[] {2, 2, 1, 1, 2, 2}; + case "VI": + return new int[] {1, 2, 1, 3, 2, 2}; + case "VN": + return new int[] {0, 3, 3, 4, 2, 2}; + case "VU": + return new int[] {4, 2, 2, 1, 2, 2}; + case "GM": + case "WF": + return new int[] {4, 2, 2, 4, 2, 2}; + case "WS": + return new int[] {3, 1, 2, 1, 2, 2}; + case "XK": + return new int[] {1, 1, 1, 1, 2, 2}; + case "AF": + case "HT": + case "NE": + case "SD": + case "SN": + case "TD": + case "VE": + case "YE": + return new int[] {4, 4, 4, 4, 2, 2}; + case "YT": + return new int[] {4, 1, 1, 1, 2, 2}; + case "ZA": + return new int[] {3, 3, 1, 1, 1, 2}; + case "ZM": + return new int[] {3, 3, 4, 2, 2, 2}; + case "ZW": + return new int[] {3, 2, 4, 3, 2, 2}; + default: + return new int[] {2, 2, 2, 2, 2, 2}; + } } } From 368f4d675457946568558b6b1fba96a177adbd71 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 2 Nov 2021 11:28:50 +0000 Subject: [PATCH 431/441] Suppress lint warning about IntDef assignment. The values returned by the framework method are equivalent to the local IntDef values. PiperOrigin-RevId: 407048748 --- .../com/google/android/exoplayer2/drm/FrameworkMediaDrm.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java index e4ccaf1853..9cc9910443 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java @@ -182,6 +182,8 @@ public final class FrameworkMediaDrm implements ExoMediaDrm { mediaDrm.closeSession(sessionId); } + // Return values of MediaDrm.KeyRequest.getRequestType are equal to KeyRequest.RequestType. + @SuppressLint("WrongConstant") @Override public KeyRequest getKeyRequest( byte[] scope, From 5a98c823fcf46699dd9757bdc4ac0f0d28a321d2 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Tue, 2 Nov 2021 15:18:29 +0000 Subject: [PATCH 432/441] Update the TransformerMediaClock trackTime before deducting the offset. #minor-release PiperOrigin-RevId: 407086818 --- .../exoplayer2/transformer/TransformerAudioRenderer.java | 2 +- .../exoplayer2/transformer/TransformerBaseRenderer.java | 3 +-- .../exoplayer2/transformer/TransformerMuxingVideoRenderer.java | 2 +- .../transformer/TransformerTranscodingVideoRenderer.java | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index 8da9dcd2e1..f20915c120 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -279,8 +279,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; int result = readSource(getFormatHolder(), decoderInputBuffer, /* readFlags= */ 0); switch (result) { case C.RESULT_BUFFER_READ: - decoderInputBuffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), decoderInputBuffer.timeUs); + decoderInputBuffer.timeUs -= streamOffsetUs; decoderInputBuffer.flip(); decoder.queueInputBuffer(decoderInputBuffer); return !decoderInputBuffer.isEndOfStream(); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java index 6e19f0b9f9..d3fe72d65b 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerBaseRenderer.java @@ -48,8 +48,7 @@ import com.google.android.exoplayer2.util.MimeTypes; } @Override - protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) - throws ExoPlaybackException { + protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs) { this.streamOffsetUs = offsetUs; } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java index d14378754e..4692a6ca81 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerMuxingVideoRenderer.java @@ -117,8 +117,8 @@ import java.nio.ByteBuffer; muxerWrapper.endTrack(getTrackType()); return false; } - buffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), buffer.timeUs); + buffer.timeUs -= streamOffsetUs; ByteBuffer data = checkNotNull(buffer.data); data.flip(); if (sampleTransformer != null) { diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 931e985a5d..f4836e49df 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -320,8 +320,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; case C.RESULT_FORMAT_READ: throw new IllegalStateException("Format changes are not supported."); case C.RESULT_BUFFER_READ: - decoderInputBuffer.timeUs -= streamOffsetUs; mediaClock.updateTimeForTrackType(getTrackType(), decoderInputBuffer.timeUs); + decoderInputBuffer.timeUs -= streamOffsetUs; ByteBuffer data = checkNotNull(decoderInputBuffer.data); data.flip(); decoder.queueInputBuffer(decoderInputBuffer); From cddebdcf0313d901ac29b5524fcc7fd0a0bf7566 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 2 Nov 2021 17:01:13 +0000 Subject: [PATCH 433/441] Suppress lint warnings in leanback module. These warnings are caused by the fact that this is a library and the lint check doesn't see any app using the library in a TV context. PiperOrigin-RevId: 407110725 --- extensions/leanback/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/leanback/src/main/AndroidManifest.xml b/extensions/leanback/src/main/AndroidManifest.xml index e385551143..1649d3c386 100644 --- a/extensions/leanback/src/main/AndroidManifest.xml +++ b/extensions/leanback/src/main/AndroidManifest.xml @@ -14,6 +14,8 @@ limitations under the License. --> - + From be4ea151c445ed1f778f60cf8c2b6e7ead2e03de Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Tue, 2 Nov 2021 18:36:26 +0000 Subject: [PATCH 434/441] Parse HDR static metadata from MP4 files #minor-release PiperOrigin-RevId: 407136922 --- RELEASENOTES.md | 1 + .../exoplayer2/extractor/mp4/Atom.java | 6 + .../exoplayer2/extractor/mp4/AtomParsers.java | 87 +++- .../extractor/mp4/Mp4ExtractorTest.java | 6 + .../sample_with_colr_mdcv_and_clli.mp4.0.dump | 454 ++++++++++++++++++ .../sample_with_colr_mdcv_and_clli.mp4.1.dump | 398 +++++++++++++++ .../sample_with_colr_mdcv_and_clli.mp4.2.dump | 338 +++++++++++++ .../sample_with_colr_mdcv_and_clli.mp4.3.dump | 282 +++++++++++ ...colr_mdcv_and_clli.mp4.unknown_length.dump | 454 ++++++++++++++++++ .../mp4/sample_with_colr_mdcv_and_clli.mp4 | Bin 0 -> 285393 bytes 10 files changed, 2015 insertions(+), 11 deletions(-) create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.unknown_length.dump create mode 100644 testdata/src/test/assets/media/mp4/sample_with_colr_mdcv_and_clli.mp4 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0d8bf3fdb5..586144ca28 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -64,6 +64,7 @@ * MP4: Avoid throwing `ArrayIndexOutOfBoundsException` when parsing invalid `colr` boxes produced by some device cameras ([#9332](https://github.com/google/ExoPlayer/issues/9332)). + * MP4: Parse HDR static metadata from the `clli` and `mdcv` boxes. * TS: Correctly handle HEVC tracks with pixel aspect ratios other than 1. * TS: Map stream type 0x80 to H262 ([#9472](https://github.com/google/ExoPlayer/issues/9472)). diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java index bc8633acc8..9c5de24b70 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java @@ -410,6 +410,12 @@ import java.util.List; @SuppressWarnings("ConstantCaseForConstants") public static final int TYPE_twos = 0x74776f73; + @SuppressWarnings("ConstantCaseForConstants") + public static final int TYPE_clli = 0x636c6c69; + + @SuppressWarnings("ConstantCaseForConstants") + public static final int TYPE_mdcv = 0x6d646376; + public final int type; public Atom(int type) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java index bc5fa10fe3..442758716a 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java @@ -45,6 +45,8 @@ import com.google.android.exoplayer2.video.DolbyVisionConfig; import com.google.android.exoplayer2.video.HevcConfig; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -1061,6 +1063,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; .build(); } + // hdrStaticInfo is allocated using allocate() in allocateHdrStaticInfo(). + @SuppressWarnings("ByteBufferBackingArray") private static void parseVideoSampleEntry( ParsableByteArray parent, int atomType, @@ -1112,7 +1116,14 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; @Nullable String codecs = null; @Nullable byte[] projectionData = null; @C.StereoMode int stereoMode = Format.NO_VALUE; - @Nullable ColorInfo colorInfo = null; + + // HDR related metadata. + @C.ColorSpace int colorSpace = Format.NO_VALUE; + @C.ColorRange int colorRange = Format.NO_VALUE; + @C.ColorTransfer int colorTransfer = Format.NO_VALUE; + // The format of HDR static info is defined in CTA-861-G:2017, Table 45. + @Nullable ByteBuffer hdrStaticInfo = null; + while (childPosition - position < size) { parent.setPosition(childPosition); int childStartPosition = parent.getPosition(); @@ -1157,6 +1168,43 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } else if (childAtomType == Atom.TYPE_av1C) { ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null); mimeType = MimeTypes.VIDEO_AV1; + } else if (childAtomType == Atom.TYPE_clli) { + if (hdrStaticInfo == null) { + hdrStaticInfo = allocateHdrStaticInfo(); + } + // The contents of the clli box occupy the last 4 bytes of the HDR static info array. Note + // that each field is read in big endian and written in little endian. + hdrStaticInfo.position(21); + hdrStaticInfo.putShort(parent.readShort()); // max_content_light_level. + hdrStaticInfo.putShort(parent.readShort()); // max_pic_average_light_level. + } else if (childAtomType == Atom.TYPE_mdcv) { + if (hdrStaticInfo == null) { + hdrStaticInfo = allocateHdrStaticInfo(); + } + // The contents of the mdcv box occupy 20 bytes after the first byte of the HDR static info + // array. Note that each field is read in big endian and written in little endian. + short displayPrimariesGX = parent.readShort(); + short displayPrimariesGY = parent.readShort(); + short displayPrimariesBX = parent.readShort(); + short displayPrimariesBY = parent.readShort(); + short displayPrimariesRX = parent.readShort(); + short displayPrimariesRY = parent.readShort(); + short whitePointX = parent.readShort(); + short whitePointY = parent.readShort(); + long maxDisplayMasteringLuminance = parent.readUnsignedInt(); + long minDisplayMasteringLuminance = parent.readUnsignedInt(); + + hdrStaticInfo.position(1); + hdrStaticInfo.putShort(displayPrimariesRX); + hdrStaticInfo.putShort(displayPrimariesRY); + hdrStaticInfo.putShort(displayPrimariesGX); + hdrStaticInfo.putShort(displayPrimariesGY); + hdrStaticInfo.putShort(displayPrimariesBX); + hdrStaticInfo.putShort(displayPrimariesBY); + hdrStaticInfo.putShort(whitePointX); + hdrStaticInfo.putShort(whitePointY); + hdrStaticInfo.putShort((short) (maxDisplayMasteringLuminance / 10000)); + hdrStaticInfo.putShort((short) (minDisplayMasteringLuminance / 10000)); } else if (childAtomType == Atom.TYPE_d263) { ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null); mimeType = MimeTypes.VIDEO_H263; @@ -1211,12 +1259,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; // size=18): https://github.com/google/ExoPlayer/issues/9332 boolean fullRangeFlag = childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0; - colorInfo = - new ColorInfo( - ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries), - fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED, - ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics), - /* hdrStaticInfo= */ null); + colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries); + colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED; + colorTransfer = + ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics); } else { Log.w(TAG, "Unsupported color type: " + Atom.getAtomTypeString(colorType)); } @@ -1229,7 +1275,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; return; } - out.format = + Format.Builder formatBuilder = new Format.Builder() .setId(trackId) .setSampleMimeType(mimeType) @@ -1241,9 +1287,28 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; .setProjectionData(projectionData) .setStereoMode(stereoMode) .setInitializationData(initializationData) - .setDrmInitData(drmInitData) - .setColorInfo(colorInfo) - .build(); + .setDrmInitData(drmInitData); + if (colorSpace != Format.NO_VALUE + || colorRange != Format.NO_VALUE + || colorTransfer != Format.NO_VALUE + || hdrStaticInfo != null) { + // Note that if either mdcv or clli are missing, we leave the corresponding HDR static + // metadata bytes with value zero. See [Internal ref: b/194535665]. + formatBuilder.setColorInfo( + new ColorInfo( + colorSpace, + colorRange, + colorTransfer, + hdrStaticInfo != null ? hdrStaticInfo.array() : null)); + } + out.format = formatBuilder.build(); + } + + private static ByteBuffer allocateHdrStaticInfo() { + // For HDR static info, Android decoders expect a 25-byte array. The first byte is zero to + // represent Static Metadata Type 1, as per CTA-861-G:2017, Table 44. The following 24 bytes + // follow CTA-861-G:2017, Table 45. + return ByteBuffer.allocate(25).order(ByteOrder.LITTLE_ENDIAN); } private static void parseMetaDataSampleEntry( diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java index 911f3f477e..88aba133e3 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp4/Mp4ExtractorTest.java @@ -119,4 +119,10 @@ public final class Mp4ExtractorTest { ExtractorAsserts.assertBehavior( Mp4Extractor::new, "media/mp4/sample_dthd.mp4", simulationConfig); } + + @Test + public void mp4SampleWithColrMdcvAndClli() throws Exception { + ExtractorAsserts.assertBehavior( + Mp4Extractor::new, "media/mp4/sample_with_colr_mdcv_and_clli.mp4", simulationConfig); + } } diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.0.dump b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.0.dump new file mode 100644 index 0000000000..8ef4f19b16 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.0.dump @@ -0,0 +1,454 @@ +seekMap: + isSeekable = true + duration = 1022000 + getPosition(0) = [[timeUs=0, position=48]] + getPosition(1) = [[timeUs=0, position=48]] + getPosition(511000) = [[timeUs=0, position=48]] + getPosition(1022000) = [[timeUs=0, position=48]] +numberOfTracks = 2 +track 0: + total output bytes = 266091 + sample count = 60 + format 0: + id = 1 + sampleMimeType = video/av01 + maxInputSize = 144656 + width = 1920 + height = 1080 + frameRate = 59.940056 + colorInfo: + colorSpace = 6 + colorRange = 2 + colorTransfer = 6 + hdrStaticInfo = length 25, hash 423AFC35 + sample 0: + time = 0 + flags = 1 + data = length 144626, hash 7C021D5F + sample 1: + time = 16683 + flags = 0 + data = length 4018, hash FA5E79FA + sample 2: + time = 33366 + flags = 0 + data = length 3, hash D5E0 + sample 3: + time = 50050 + flags = 0 + data = length 144, hash 4A868A2F + sample 4: + time = 66733 + flags = 0 + data = length 3, hash D5D0 + sample 5: + time = 83416 + flags = 0 + data = length 342, hash 5A2E1C3C + sample 6: + time = 100100 + flags = 0 + data = length 3, hash D610 + sample 7: + time = 116783 + flags = 0 + data = length 173, hash CFE014B3 + sample 8: + time = 133466 + flags = 0 + data = length 3, hash D5C0 + sample 9: + time = 150150 + flags = 0 + data = length 655, hash 3A7738B6 + sample 10: + time = 166833 + flags = 0 + data = length 3, hash D5D0 + sample 11: + time = 183516 + flags = 0 + data = length 208, hash E7D2035A + sample 12: + time = 200200 + flags = 0 + data = length 3, hash D600 + sample 13: + time = 216883 + flags = 0 + data = length 385, hash 4D025B28 + sample 14: + time = 233566 + flags = 0 + data = length 3, hash D5E0 + sample 15: + time = 250250 + flags = 0 + data = length 192, hash CC0BD164 + sample 16: + time = 266933 + flags = 0 + data = length 3, hash D5B0 + sample 17: + time = 283616 + flags = 0 + data = length 36989, hash C213D35E + sample 18: + time = 300300 + flags = 0 + data = length 3, hash D5C0 + sample 19: + time = 316983 + flags = 0 + data = length 213, hash 2BBA39D3 + sample 20: + time = 333666 + flags = 0 + data = length 3, hash D600 + sample 21: + time = 350350 + flags = 0 + data = length 474, hash 83D66E3F + sample 22: + time = 367033 + flags = 0 + data = length 3, hash D5E0 + sample 23: + time = 383716 + flags = 0 + data = length 246, hash CF512AF0 + sample 24: + time = 400400 + flags = 0 + data = length 3, hash D610 + sample 25: + time = 417083 + flags = 0 + data = length 880, hash 8BFDE683 + sample 26: + time = 433766 + flags = 0 + data = length 3, hash D5C0 + sample 27: + time = 450450 + flags = 0 + data = length 246, hash 16B70503 + sample 28: + time = 467133 + flags = 0 + data = length 3, hash D600 + sample 29: + time = 483816 + flags = 0 + data = length 402, hash 51B5FAC9 + sample 30: + time = 500500 + flags = 0 + data = length 3, hash D610 + sample 31: + time = 517183 + flags = 0 + data = length 199, hash 12005069 + sample 32: + time = 533866 + flags = 0 + data = length 3, hash D5D0 + sample 33: + time = 550550 + flags = 0 + data = length 32362, hash F9FE31F7 + sample 34: + time = 567233 + flags = 0 + data = length 3, hash D5E0 + sample 35: + time = 583916 + flags = 0 + data = length 215, hash 2D4E3DC4 + sample 36: + time = 600600 + flags = 0 + data = length 3, hash D600 + sample 37: + time = 617283 + flags = 0 + data = length 450, hash C1A95E3 + sample 38: + time = 633966 + flags = 0 + data = length 3, hash D610 + sample 39: + time = 650650 + flags = 0 + data = length 221, hash 964386D9 + sample 40: + time = 667333 + flags = 0 + data = length 3, hash D5F0 + sample 41: + time = 684016 + flags = 0 + data = length 853, hash 2B9E0AAF + sample 42: + time = 700700 + flags = 0 + data = length 3, hash D5E0 + sample 43: + time = 717383 + flags = 0 + data = length 236, hash 7E84BBAE + sample 44: + time = 734066 + flags = 0 + data = length 3, hash D600 + sample 45: + time = 750750 + flags = 0 + data = length 419, hash 619235F2 + sample 46: + time = 767433 + flags = 0 + data = length 3, hash D5F0 + sample 47: + time = 784116 + flags = 0 + data = length 194, hash D386F352 + sample 48: + time = 800800 + flags = 0 + data = length 3, hash D5A0 + sample 49: + time = 817483 + flags = 0 + data = length 38679, hash 17E63FCD + sample 50: + time = 834166 + flags = 0 + data = length 3, hash D610 + sample 51: + time = 850850 + flags = 0 + data = length 183, hash C8DD98E2 + sample 52: + time = 867533 + flags = 0 + data = length 3, hash D600 + sample 53: + time = 884216 + flags = 0 + data = length 457, hash 2B4E3476 + sample 54: + time = 900900 + flags = 0 + data = length 3, hash D5F0 + sample 55: + time = 917583 + flags = 0 + data = length 216, hash 7233540A + sample 56: + time = 934266 + flags = 0 + data = length 3, hash D5C0 + sample 57: + time = 950950 + flags = 0 + data = length 894, hash 7319F313 + sample 58: + time = 967633 + flags = 0 + data = length 3, hash D610 + sample 59: + time = 984316 + flags = 536870912 + data = length 233, hash DE4DBE67 +track 1: + total output bytes = 16638 + sample count = 44 + format 0: + id = 2 + sampleMimeType = audio/mp4a-latm + codecs = mp4a.40.2 + maxInputSize = 441 + channelCount = 2 + sampleRate = 44100 + language = und + metadata = entries=[TSSE: description=null: value=Lavf58.76.100] + initializationData: + data = length 16, hash CAA21BBF + sample 0: + time = 0 + flags = 1 + data = length 393, hash 706D1B6F + sample 1: + time = 23219 + flags = 1 + data = length 400, hash B48107D1 + sample 2: + time = 46439 + flags = 1 + data = length 398, hash E5F4E9C1 + sample 3: + time = 69659 + flags = 1 + data = length 400, hash 4317B40D + sample 4: + time = 92879 + flags = 1 + data = length 403, hash CB949D88 + sample 5: + time = 116099 + flags = 1 + data = length 411, hash 616C8F82 + sample 6: + time = 139319 + flags = 1 + data = length 392, hash 3BA50F06 + sample 7: + time = 162539 + flags = 1 + data = length 401, hash 1C62F82C + sample 8: + time = 185759 + flags = 1 + data = length 400, hash 180FEA17 + sample 9: + time = 208979 + flags = 1 + data = length 378, hash 2F6B0AE6 + sample 10: + time = 232199 + flags = 1 + data = length 375, hash 6AE86D08 + sample 11: + time = 255419 + flags = 1 + data = length 375, hash EF2FD9CC + sample 12: + time = 278639 + flags = 1 + data = length 374, hash 97B83243 + sample 13: + time = 301859 + flags = 1 + data = length 382, hash 8BD6191C + sample 14: + time = 325079 + flags = 1 + data = length 393, hash D5F53221 + sample 15: + time = 348299 + flags = 1 + data = length 375, hash 2437C16B + sample 16: + time = 371519 + flags = 1 + data = length 372, hash EE50108B + sample 17: + time = 394739 + flags = 1 + data = length 364, hash 9952E0FE + sample 18: + time = 417959 + flags = 1 + data = length 387, hash C4EC0E45 + sample 19: + time = 441179 + flags = 1 + data = length 384, hash 7DFB424F + sample 20: + time = 464399 + flags = 1 + data = length 370, hash 28619E43 + sample 21: + time = 487619 + flags = 1 + data = length 373, hash 440EB9E8 + sample 22: + time = 510839 + flags = 1 + data = length 363, hash B7655913 + sample 23: + time = 534058 + flags = 1 + data = length 362, hash A0690E92 + sample 24: + time = 557278 + flags = 1 + data = length 377, hash 41BF1244 + sample 25: + time = 580498 + flags = 1 + data = length 371, hash EE4124CD + sample 26: + time = 603718 + flags = 1 + data = length 372, hash 7A512168 + sample 27: + time = 626938 + flags = 1 + data = length 370, hash ED00D55C + sample 28: + time = 650158 + flags = 1 + data = length 356, hash 43F4FFCA + sample 29: + time = 673378 + flags = 1 + data = length 373, hash 1950F38C + sample 30: + time = 696598 + flags = 1 + data = length 366, hash 5F426A7A + sample 31: + time = 719818 + flags = 1 + data = length 371, hash FCC286D2 + sample 32: + time = 743038 + flags = 1 + data = length 366, hash CF6F5DD9 + sample 33: + time = 766258 + flags = 1 + data = length 386, hash 83E3B1E6 + sample 34: + time = 789478 + flags = 1 + data = length 369, hash 5BDF670B + sample 35: + time = 812698 + flags = 1 + data = length 367, hash DC847E4D + sample 36: + time = 835918 + flags = 1 + data = length 366, hash 8AC0C55C + sample 37: + time = 859138 + flags = 1 + data = length 375, hash C0D4BF4 + sample 38: + time = 882358 + flags = 1 + data = length 367, hash 6C5284E2 + sample 39: + time = 905578 + flags = 1 + data = length 380, hash BDFAB187 + sample 40: + time = 928798 + flags = 1 + data = length 372, hash CEF87EB6 + sample 41: + time = 952018 + flags = 1 + data = length 369, hash B0FF049B + sample 42: + time = 975238 + flags = 1 + data = length 366, hash BADD46E6 + sample 43: + time = 998458 + flags = 536870913 + data = length 374, hash 6102A531 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.1.dump b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.1.dump new file mode 100644 index 0000000000..1e1023afb0 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.1.dump @@ -0,0 +1,398 @@ +seekMap: + isSeekable = true + duration = 1022000 + getPosition(0) = [[timeUs=0, position=48]] + getPosition(1) = [[timeUs=0, position=48]] + getPosition(511000) = [[timeUs=0, position=48]] + getPosition(1022000) = [[timeUs=0, position=48]] +numberOfTracks = 2 +track 0: + total output bytes = 266091 + sample count = 60 + format 0: + id = 1 + sampleMimeType = video/av01 + maxInputSize = 144656 + width = 1920 + height = 1080 + frameRate = 59.940056 + colorInfo: + colorSpace = 6 + colorRange = 2 + colorTransfer = 6 + hdrStaticInfo = length 25, hash 423AFC35 + sample 0: + time = 0 + flags = 1 + data = length 144626, hash 7C021D5F + sample 1: + time = 16683 + flags = 0 + data = length 4018, hash FA5E79FA + sample 2: + time = 33366 + flags = 0 + data = length 3, hash D5E0 + sample 3: + time = 50050 + flags = 0 + data = length 144, hash 4A868A2F + sample 4: + time = 66733 + flags = 0 + data = length 3, hash D5D0 + sample 5: + time = 83416 + flags = 0 + data = length 342, hash 5A2E1C3C + sample 6: + time = 100100 + flags = 0 + data = length 3, hash D610 + sample 7: + time = 116783 + flags = 0 + data = length 173, hash CFE014B3 + sample 8: + time = 133466 + flags = 0 + data = length 3, hash D5C0 + sample 9: + time = 150150 + flags = 0 + data = length 655, hash 3A7738B6 + sample 10: + time = 166833 + flags = 0 + data = length 3, hash D5D0 + sample 11: + time = 183516 + flags = 0 + data = length 208, hash E7D2035A + sample 12: + time = 200200 + flags = 0 + data = length 3, hash D600 + sample 13: + time = 216883 + flags = 0 + data = length 385, hash 4D025B28 + sample 14: + time = 233566 + flags = 0 + data = length 3, hash D5E0 + sample 15: + time = 250250 + flags = 0 + data = length 192, hash CC0BD164 + sample 16: + time = 266933 + flags = 0 + data = length 3, hash D5B0 + sample 17: + time = 283616 + flags = 0 + data = length 36989, hash C213D35E + sample 18: + time = 300300 + flags = 0 + data = length 3, hash D5C0 + sample 19: + time = 316983 + flags = 0 + data = length 213, hash 2BBA39D3 + sample 20: + time = 333666 + flags = 0 + data = length 3, hash D600 + sample 21: + time = 350350 + flags = 0 + data = length 474, hash 83D66E3F + sample 22: + time = 367033 + flags = 0 + data = length 3, hash D5E0 + sample 23: + time = 383716 + flags = 0 + data = length 246, hash CF512AF0 + sample 24: + time = 400400 + flags = 0 + data = length 3, hash D610 + sample 25: + time = 417083 + flags = 0 + data = length 880, hash 8BFDE683 + sample 26: + time = 433766 + flags = 0 + data = length 3, hash D5C0 + sample 27: + time = 450450 + flags = 0 + data = length 246, hash 16B70503 + sample 28: + time = 467133 + flags = 0 + data = length 3, hash D600 + sample 29: + time = 483816 + flags = 0 + data = length 402, hash 51B5FAC9 + sample 30: + time = 500500 + flags = 0 + data = length 3, hash D610 + sample 31: + time = 517183 + flags = 0 + data = length 199, hash 12005069 + sample 32: + time = 533866 + flags = 0 + data = length 3, hash D5D0 + sample 33: + time = 550550 + flags = 0 + data = length 32362, hash F9FE31F7 + sample 34: + time = 567233 + flags = 0 + data = length 3, hash D5E0 + sample 35: + time = 583916 + flags = 0 + data = length 215, hash 2D4E3DC4 + sample 36: + time = 600600 + flags = 0 + data = length 3, hash D600 + sample 37: + time = 617283 + flags = 0 + data = length 450, hash C1A95E3 + sample 38: + time = 633966 + flags = 0 + data = length 3, hash D610 + sample 39: + time = 650650 + flags = 0 + data = length 221, hash 964386D9 + sample 40: + time = 667333 + flags = 0 + data = length 3, hash D5F0 + sample 41: + time = 684016 + flags = 0 + data = length 853, hash 2B9E0AAF + sample 42: + time = 700700 + flags = 0 + data = length 3, hash D5E0 + sample 43: + time = 717383 + flags = 0 + data = length 236, hash 7E84BBAE + sample 44: + time = 734066 + flags = 0 + data = length 3, hash D600 + sample 45: + time = 750750 + flags = 0 + data = length 419, hash 619235F2 + sample 46: + time = 767433 + flags = 0 + data = length 3, hash D5F0 + sample 47: + time = 784116 + flags = 0 + data = length 194, hash D386F352 + sample 48: + time = 800800 + flags = 0 + data = length 3, hash D5A0 + sample 49: + time = 817483 + flags = 0 + data = length 38679, hash 17E63FCD + sample 50: + time = 834166 + flags = 0 + data = length 3, hash D610 + sample 51: + time = 850850 + flags = 0 + data = length 183, hash C8DD98E2 + sample 52: + time = 867533 + flags = 0 + data = length 3, hash D600 + sample 53: + time = 884216 + flags = 0 + data = length 457, hash 2B4E3476 + sample 54: + time = 900900 + flags = 0 + data = length 3, hash D5F0 + sample 55: + time = 917583 + flags = 0 + data = length 216, hash 7233540A + sample 56: + time = 934266 + flags = 0 + data = length 3, hash D5C0 + sample 57: + time = 950950 + flags = 0 + data = length 894, hash 7319F313 + sample 58: + time = 967633 + flags = 0 + data = length 3, hash D610 + sample 59: + time = 984316 + flags = 536870912 + data = length 233, hash DE4DBE67 +track 1: + total output bytes = 11156 + sample count = 30 + format 0: + id = 2 + sampleMimeType = audio/mp4a-latm + codecs = mp4a.40.2 + maxInputSize = 441 + channelCount = 2 + sampleRate = 44100 + language = und + metadata = entries=[TSSE: description=null: value=Lavf58.76.100] + initializationData: + data = length 16, hash CAA21BBF + sample 0: + time = 325079 + flags = 1 + data = length 393, hash D5F53221 + sample 1: + time = 348299 + flags = 1 + data = length 375, hash 2437C16B + sample 2: + time = 371519 + flags = 1 + data = length 372, hash EE50108B + sample 3: + time = 394739 + flags = 1 + data = length 364, hash 9952E0FE + sample 4: + time = 417959 + flags = 1 + data = length 387, hash C4EC0E45 + sample 5: + time = 441179 + flags = 1 + data = length 384, hash 7DFB424F + sample 6: + time = 464399 + flags = 1 + data = length 370, hash 28619E43 + sample 7: + time = 487619 + flags = 1 + data = length 373, hash 440EB9E8 + sample 8: + time = 510839 + flags = 1 + data = length 363, hash B7655913 + sample 9: + time = 534058 + flags = 1 + data = length 362, hash A0690E92 + sample 10: + time = 557278 + flags = 1 + data = length 377, hash 41BF1244 + sample 11: + time = 580498 + flags = 1 + data = length 371, hash EE4124CD + sample 12: + time = 603718 + flags = 1 + data = length 372, hash 7A512168 + sample 13: + time = 626938 + flags = 1 + data = length 370, hash ED00D55C + sample 14: + time = 650158 + flags = 1 + data = length 356, hash 43F4FFCA + sample 15: + time = 673378 + flags = 1 + data = length 373, hash 1950F38C + sample 16: + time = 696598 + flags = 1 + data = length 366, hash 5F426A7A + sample 17: + time = 719818 + flags = 1 + data = length 371, hash FCC286D2 + sample 18: + time = 743038 + flags = 1 + data = length 366, hash CF6F5DD9 + sample 19: + time = 766258 + flags = 1 + data = length 386, hash 83E3B1E6 + sample 20: + time = 789478 + flags = 1 + data = length 369, hash 5BDF670B + sample 21: + time = 812698 + flags = 1 + data = length 367, hash DC847E4D + sample 22: + time = 835918 + flags = 1 + data = length 366, hash 8AC0C55C + sample 23: + time = 859138 + flags = 1 + data = length 375, hash C0D4BF4 + sample 24: + time = 882358 + flags = 1 + data = length 367, hash 6C5284E2 + sample 25: + time = 905578 + flags = 1 + data = length 380, hash BDFAB187 + sample 26: + time = 928798 + flags = 1 + data = length 372, hash CEF87EB6 + sample 27: + time = 952018 + flags = 1 + data = length 369, hash B0FF049B + sample 28: + time = 975238 + flags = 1 + data = length 366, hash BADD46E6 + sample 29: + time = 998458 + flags = 536870913 + data = length 374, hash 6102A531 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.2.dump b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.2.dump new file mode 100644 index 0000000000..5b51396c83 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.2.dump @@ -0,0 +1,338 @@ +seekMap: + isSeekable = true + duration = 1022000 + getPosition(0) = [[timeUs=0, position=48]] + getPosition(1) = [[timeUs=0, position=48]] + getPosition(511000) = [[timeUs=0, position=48]] + getPosition(1022000) = [[timeUs=0, position=48]] +numberOfTracks = 2 +track 0: + total output bytes = 266091 + sample count = 60 + format 0: + id = 1 + sampleMimeType = video/av01 + maxInputSize = 144656 + width = 1920 + height = 1080 + frameRate = 59.940056 + colorInfo: + colorSpace = 6 + colorRange = 2 + colorTransfer = 6 + hdrStaticInfo = length 25, hash 423AFC35 + sample 0: + time = 0 + flags = 1 + data = length 144626, hash 7C021D5F + sample 1: + time = 16683 + flags = 0 + data = length 4018, hash FA5E79FA + sample 2: + time = 33366 + flags = 0 + data = length 3, hash D5E0 + sample 3: + time = 50050 + flags = 0 + data = length 144, hash 4A868A2F + sample 4: + time = 66733 + flags = 0 + data = length 3, hash D5D0 + sample 5: + time = 83416 + flags = 0 + data = length 342, hash 5A2E1C3C + sample 6: + time = 100100 + flags = 0 + data = length 3, hash D610 + sample 7: + time = 116783 + flags = 0 + data = length 173, hash CFE014B3 + sample 8: + time = 133466 + flags = 0 + data = length 3, hash D5C0 + sample 9: + time = 150150 + flags = 0 + data = length 655, hash 3A7738B6 + sample 10: + time = 166833 + flags = 0 + data = length 3, hash D5D0 + sample 11: + time = 183516 + flags = 0 + data = length 208, hash E7D2035A + sample 12: + time = 200200 + flags = 0 + data = length 3, hash D600 + sample 13: + time = 216883 + flags = 0 + data = length 385, hash 4D025B28 + sample 14: + time = 233566 + flags = 0 + data = length 3, hash D5E0 + sample 15: + time = 250250 + flags = 0 + data = length 192, hash CC0BD164 + sample 16: + time = 266933 + flags = 0 + data = length 3, hash D5B0 + sample 17: + time = 283616 + flags = 0 + data = length 36989, hash C213D35E + sample 18: + time = 300300 + flags = 0 + data = length 3, hash D5C0 + sample 19: + time = 316983 + flags = 0 + data = length 213, hash 2BBA39D3 + sample 20: + time = 333666 + flags = 0 + data = length 3, hash D600 + sample 21: + time = 350350 + flags = 0 + data = length 474, hash 83D66E3F + sample 22: + time = 367033 + flags = 0 + data = length 3, hash D5E0 + sample 23: + time = 383716 + flags = 0 + data = length 246, hash CF512AF0 + sample 24: + time = 400400 + flags = 0 + data = length 3, hash D610 + sample 25: + time = 417083 + flags = 0 + data = length 880, hash 8BFDE683 + sample 26: + time = 433766 + flags = 0 + data = length 3, hash D5C0 + sample 27: + time = 450450 + flags = 0 + data = length 246, hash 16B70503 + sample 28: + time = 467133 + flags = 0 + data = length 3, hash D600 + sample 29: + time = 483816 + flags = 0 + data = length 402, hash 51B5FAC9 + sample 30: + time = 500500 + flags = 0 + data = length 3, hash D610 + sample 31: + time = 517183 + flags = 0 + data = length 199, hash 12005069 + sample 32: + time = 533866 + flags = 0 + data = length 3, hash D5D0 + sample 33: + time = 550550 + flags = 0 + data = length 32362, hash F9FE31F7 + sample 34: + time = 567233 + flags = 0 + data = length 3, hash D5E0 + sample 35: + time = 583916 + flags = 0 + data = length 215, hash 2D4E3DC4 + sample 36: + time = 600600 + flags = 0 + data = length 3, hash D600 + sample 37: + time = 617283 + flags = 0 + data = length 450, hash C1A95E3 + sample 38: + time = 633966 + flags = 0 + data = length 3, hash D610 + sample 39: + time = 650650 + flags = 0 + data = length 221, hash 964386D9 + sample 40: + time = 667333 + flags = 0 + data = length 3, hash D5F0 + sample 41: + time = 684016 + flags = 0 + data = length 853, hash 2B9E0AAF + sample 42: + time = 700700 + flags = 0 + data = length 3, hash D5E0 + sample 43: + time = 717383 + flags = 0 + data = length 236, hash 7E84BBAE + sample 44: + time = 734066 + flags = 0 + data = length 3, hash D600 + sample 45: + time = 750750 + flags = 0 + data = length 419, hash 619235F2 + sample 46: + time = 767433 + flags = 0 + data = length 3, hash D5F0 + sample 47: + time = 784116 + flags = 0 + data = length 194, hash D386F352 + sample 48: + time = 800800 + flags = 0 + data = length 3, hash D5A0 + sample 49: + time = 817483 + flags = 0 + data = length 38679, hash 17E63FCD + sample 50: + time = 834166 + flags = 0 + data = length 3, hash D610 + sample 51: + time = 850850 + flags = 0 + data = length 183, hash C8DD98E2 + sample 52: + time = 867533 + flags = 0 + data = length 3, hash D600 + sample 53: + time = 884216 + flags = 0 + data = length 457, hash 2B4E3476 + sample 54: + time = 900900 + flags = 0 + data = length 3, hash D5F0 + sample 55: + time = 917583 + flags = 0 + data = length 216, hash 7233540A + sample 56: + time = 934266 + flags = 0 + data = length 3, hash D5C0 + sample 57: + time = 950950 + flags = 0 + data = length 894, hash 7319F313 + sample 58: + time = 967633 + flags = 0 + data = length 3, hash D610 + sample 59: + time = 984316 + flags = 536870912 + data = length 233, hash DE4DBE67 +track 1: + total output bytes = 5567 + sample count = 15 + format 0: + id = 2 + sampleMimeType = audio/mp4a-latm + codecs = mp4a.40.2 + maxInputSize = 441 + channelCount = 2 + sampleRate = 44100 + language = und + metadata = entries=[TSSE: description=null: value=Lavf58.76.100] + initializationData: + data = length 16, hash CAA21BBF + sample 0: + time = 673378 + flags = 1 + data = length 373, hash 1950F38C + sample 1: + time = 696598 + flags = 1 + data = length 366, hash 5F426A7A + sample 2: + time = 719818 + flags = 1 + data = length 371, hash FCC286D2 + sample 3: + time = 743038 + flags = 1 + data = length 366, hash CF6F5DD9 + sample 4: + time = 766258 + flags = 1 + data = length 386, hash 83E3B1E6 + sample 5: + time = 789478 + flags = 1 + data = length 369, hash 5BDF670B + sample 6: + time = 812698 + flags = 1 + data = length 367, hash DC847E4D + sample 7: + time = 835918 + flags = 1 + data = length 366, hash 8AC0C55C + sample 8: + time = 859138 + flags = 1 + data = length 375, hash C0D4BF4 + sample 9: + time = 882358 + flags = 1 + data = length 367, hash 6C5284E2 + sample 10: + time = 905578 + flags = 1 + data = length 380, hash BDFAB187 + sample 11: + time = 928798 + flags = 1 + data = length 372, hash CEF87EB6 + sample 12: + time = 952018 + flags = 1 + data = length 369, hash B0FF049B + sample 13: + time = 975238 + flags = 1 + data = length 366, hash BADD46E6 + sample 14: + time = 998458 + flags = 536870913 + data = length 374, hash 6102A531 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.3.dump b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.3.dump new file mode 100644 index 0000000000..d66f9234a1 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.3.dump @@ -0,0 +1,282 @@ +seekMap: + isSeekable = true + duration = 1022000 + getPosition(0) = [[timeUs=0, position=48]] + getPosition(1) = [[timeUs=0, position=48]] + getPosition(511000) = [[timeUs=0, position=48]] + getPosition(1022000) = [[timeUs=0, position=48]] +numberOfTracks = 2 +track 0: + total output bytes = 266091 + sample count = 60 + format 0: + id = 1 + sampleMimeType = video/av01 + maxInputSize = 144656 + width = 1920 + height = 1080 + frameRate = 59.940056 + colorInfo: + colorSpace = 6 + colorRange = 2 + colorTransfer = 6 + hdrStaticInfo = length 25, hash 423AFC35 + sample 0: + time = 0 + flags = 1 + data = length 144626, hash 7C021D5F + sample 1: + time = 16683 + flags = 0 + data = length 4018, hash FA5E79FA + sample 2: + time = 33366 + flags = 0 + data = length 3, hash D5E0 + sample 3: + time = 50050 + flags = 0 + data = length 144, hash 4A868A2F + sample 4: + time = 66733 + flags = 0 + data = length 3, hash D5D0 + sample 5: + time = 83416 + flags = 0 + data = length 342, hash 5A2E1C3C + sample 6: + time = 100100 + flags = 0 + data = length 3, hash D610 + sample 7: + time = 116783 + flags = 0 + data = length 173, hash CFE014B3 + sample 8: + time = 133466 + flags = 0 + data = length 3, hash D5C0 + sample 9: + time = 150150 + flags = 0 + data = length 655, hash 3A7738B6 + sample 10: + time = 166833 + flags = 0 + data = length 3, hash D5D0 + sample 11: + time = 183516 + flags = 0 + data = length 208, hash E7D2035A + sample 12: + time = 200200 + flags = 0 + data = length 3, hash D600 + sample 13: + time = 216883 + flags = 0 + data = length 385, hash 4D025B28 + sample 14: + time = 233566 + flags = 0 + data = length 3, hash D5E0 + sample 15: + time = 250250 + flags = 0 + data = length 192, hash CC0BD164 + sample 16: + time = 266933 + flags = 0 + data = length 3, hash D5B0 + sample 17: + time = 283616 + flags = 0 + data = length 36989, hash C213D35E + sample 18: + time = 300300 + flags = 0 + data = length 3, hash D5C0 + sample 19: + time = 316983 + flags = 0 + data = length 213, hash 2BBA39D3 + sample 20: + time = 333666 + flags = 0 + data = length 3, hash D600 + sample 21: + time = 350350 + flags = 0 + data = length 474, hash 83D66E3F + sample 22: + time = 367033 + flags = 0 + data = length 3, hash D5E0 + sample 23: + time = 383716 + flags = 0 + data = length 246, hash CF512AF0 + sample 24: + time = 400400 + flags = 0 + data = length 3, hash D610 + sample 25: + time = 417083 + flags = 0 + data = length 880, hash 8BFDE683 + sample 26: + time = 433766 + flags = 0 + data = length 3, hash D5C0 + sample 27: + time = 450450 + flags = 0 + data = length 246, hash 16B70503 + sample 28: + time = 467133 + flags = 0 + data = length 3, hash D600 + sample 29: + time = 483816 + flags = 0 + data = length 402, hash 51B5FAC9 + sample 30: + time = 500500 + flags = 0 + data = length 3, hash D610 + sample 31: + time = 517183 + flags = 0 + data = length 199, hash 12005069 + sample 32: + time = 533866 + flags = 0 + data = length 3, hash D5D0 + sample 33: + time = 550550 + flags = 0 + data = length 32362, hash F9FE31F7 + sample 34: + time = 567233 + flags = 0 + data = length 3, hash D5E0 + sample 35: + time = 583916 + flags = 0 + data = length 215, hash 2D4E3DC4 + sample 36: + time = 600600 + flags = 0 + data = length 3, hash D600 + sample 37: + time = 617283 + flags = 0 + data = length 450, hash C1A95E3 + sample 38: + time = 633966 + flags = 0 + data = length 3, hash D610 + sample 39: + time = 650650 + flags = 0 + data = length 221, hash 964386D9 + sample 40: + time = 667333 + flags = 0 + data = length 3, hash D5F0 + sample 41: + time = 684016 + flags = 0 + data = length 853, hash 2B9E0AAF + sample 42: + time = 700700 + flags = 0 + data = length 3, hash D5E0 + sample 43: + time = 717383 + flags = 0 + data = length 236, hash 7E84BBAE + sample 44: + time = 734066 + flags = 0 + data = length 3, hash D600 + sample 45: + time = 750750 + flags = 0 + data = length 419, hash 619235F2 + sample 46: + time = 767433 + flags = 0 + data = length 3, hash D5F0 + sample 47: + time = 784116 + flags = 0 + data = length 194, hash D386F352 + sample 48: + time = 800800 + flags = 0 + data = length 3, hash D5A0 + sample 49: + time = 817483 + flags = 0 + data = length 38679, hash 17E63FCD + sample 50: + time = 834166 + flags = 0 + data = length 3, hash D610 + sample 51: + time = 850850 + flags = 0 + data = length 183, hash C8DD98E2 + sample 52: + time = 867533 + flags = 0 + data = length 3, hash D600 + sample 53: + time = 884216 + flags = 0 + data = length 457, hash 2B4E3476 + sample 54: + time = 900900 + flags = 0 + data = length 3, hash D5F0 + sample 55: + time = 917583 + flags = 0 + data = length 216, hash 7233540A + sample 56: + time = 934266 + flags = 0 + data = length 3, hash D5C0 + sample 57: + time = 950950 + flags = 0 + data = length 894, hash 7319F313 + sample 58: + time = 967633 + flags = 0 + data = length 3, hash D610 + sample 59: + time = 984316 + flags = 536870912 + data = length 233, hash DE4DBE67 +track 1: + total output bytes = 374 + sample count = 1 + format 0: + id = 2 + sampleMimeType = audio/mp4a-latm + codecs = mp4a.40.2 + maxInputSize = 441 + channelCount = 2 + sampleRate = 44100 + language = und + metadata = entries=[TSSE: description=null: value=Lavf58.76.100] + initializationData: + data = length 16, hash CAA21BBF + sample 0: + time = 998458 + flags = 536870913 + data = length 374, hash 6102A531 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.unknown_length.dump b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.unknown_length.dump new file mode 100644 index 0000000000..8ef4f19b16 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mp4/sample_with_colr_mdcv_and_clli.mp4.unknown_length.dump @@ -0,0 +1,454 @@ +seekMap: + isSeekable = true + duration = 1022000 + getPosition(0) = [[timeUs=0, position=48]] + getPosition(1) = [[timeUs=0, position=48]] + getPosition(511000) = [[timeUs=0, position=48]] + getPosition(1022000) = [[timeUs=0, position=48]] +numberOfTracks = 2 +track 0: + total output bytes = 266091 + sample count = 60 + format 0: + id = 1 + sampleMimeType = video/av01 + maxInputSize = 144656 + width = 1920 + height = 1080 + frameRate = 59.940056 + colorInfo: + colorSpace = 6 + colorRange = 2 + colorTransfer = 6 + hdrStaticInfo = length 25, hash 423AFC35 + sample 0: + time = 0 + flags = 1 + data = length 144626, hash 7C021D5F + sample 1: + time = 16683 + flags = 0 + data = length 4018, hash FA5E79FA + sample 2: + time = 33366 + flags = 0 + data = length 3, hash D5E0 + sample 3: + time = 50050 + flags = 0 + data = length 144, hash 4A868A2F + sample 4: + time = 66733 + flags = 0 + data = length 3, hash D5D0 + sample 5: + time = 83416 + flags = 0 + data = length 342, hash 5A2E1C3C + sample 6: + time = 100100 + flags = 0 + data = length 3, hash D610 + sample 7: + time = 116783 + flags = 0 + data = length 173, hash CFE014B3 + sample 8: + time = 133466 + flags = 0 + data = length 3, hash D5C0 + sample 9: + time = 150150 + flags = 0 + data = length 655, hash 3A7738B6 + sample 10: + time = 166833 + flags = 0 + data = length 3, hash D5D0 + sample 11: + time = 183516 + flags = 0 + data = length 208, hash E7D2035A + sample 12: + time = 200200 + flags = 0 + data = length 3, hash D600 + sample 13: + time = 216883 + flags = 0 + data = length 385, hash 4D025B28 + sample 14: + time = 233566 + flags = 0 + data = length 3, hash D5E0 + sample 15: + time = 250250 + flags = 0 + data = length 192, hash CC0BD164 + sample 16: + time = 266933 + flags = 0 + data = length 3, hash D5B0 + sample 17: + time = 283616 + flags = 0 + data = length 36989, hash C213D35E + sample 18: + time = 300300 + flags = 0 + data = length 3, hash D5C0 + sample 19: + time = 316983 + flags = 0 + data = length 213, hash 2BBA39D3 + sample 20: + time = 333666 + flags = 0 + data = length 3, hash D600 + sample 21: + time = 350350 + flags = 0 + data = length 474, hash 83D66E3F + sample 22: + time = 367033 + flags = 0 + data = length 3, hash D5E0 + sample 23: + time = 383716 + flags = 0 + data = length 246, hash CF512AF0 + sample 24: + time = 400400 + flags = 0 + data = length 3, hash D610 + sample 25: + time = 417083 + flags = 0 + data = length 880, hash 8BFDE683 + sample 26: + time = 433766 + flags = 0 + data = length 3, hash D5C0 + sample 27: + time = 450450 + flags = 0 + data = length 246, hash 16B70503 + sample 28: + time = 467133 + flags = 0 + data = length 3, hash D600 + sample 29: + time = 483816 + flags = 0 + data = length 402, hash 51B5FAC9 + sample 30: + time = 500500 + flags = 0 + data = length 3, hash D610 + sample 31: + time = 517183 + flags = 0 + data = length 199, hash 12005069 + sample 32: + time = 533866 + flags = 0 + data = length 3, hash D5D0 + sample 33: + time = 550550 + flags = 0 + data = length 32362, hash F9FE31F7 + sample 34: + time = 567233 + flags = 0 + data = length 3, hash D5E0 + sample 35: + time = 583916 + flags = 0 + data = length 215, hash 2D4E3DC4 + sample 36: + time = 600600 + flags = 0 + data = length 3, hash D600 + sample 37: + time = 617283 + flags = 0 + data = length 450, hash C1A95E3 + sample 38: + time = 633966 + flags = 0 + data = length 3, hash D610 + sample 39: + time = 650650 + flags = 0 + data = length 221, hash 964386D9 + sample 40: + time = 667333 + flags = 0 + data = length 3, hash D5F0 + sample 41: + time = 684016 + flags = 0 + data = length 853, hash 2B9E0AAF + sample 42: + time = 700700 + flags = 0 + data = length 3, hash D5E0 + sample 43: + time = 717383 + flags = 0 + data = length 236, hash 7E84BBAE + sample 44: + time = 734066 + flags = 0 + data = length 3, hash D600 + sample 45: + time = 750750 + flags = 0 + data = length 419, hash 619235F2 + sample 46: + time = 767433 + flags = 0 + data = length 3, hash D5F0 + sample 47: + time = 784116 + flags = 0 + data = length 194, hash D386F352 + sample 48: + time = 800800 + flags = 0 + data = length 3, hash D5A0 + sample 49: + time = 817483 + flags = 0 + data = length 38679, hash 17E63FCD + sample 50: + time = 834166 + flags = 0 + data = length 3, hash D610 + sample 51: + time = 850850 + flags = 0 + data = length 183, hash C8DD98E2 + sample 52: + time = 867533 + flags = 0 + data = length 3, hash D600 + sample 53: + time = 884216 + flags = 0 + data = length 457, hash 2B4E3476 + sample 54: + time = 900900 + flags = 0 + data = length 3, hash D5F0 + sample 55: + time = 917583 + flags = 0 + data = length 216, hash 7233540A + sample 56: + time = 934266 + flags = 0 + data = length 3, hash D5C0 + sample 57: + time = 950950 + flags = 0 + data = length 894, hash 7319F313 + sample 58: + time = 967633 + flags = 0 + data = length 3, hash D610 + sample 59: + time = 984316 + flags = 536870912 + data = length 233, hash DE4DBE67 +track 1: + total output bytes = 16638 + sample count = 44 + format 0: + id = 2 + sampleMimeType = audio/mp4a-latm + codecs = mp4a.40.2 + maxInputSize = 441 + channelCount = 2 + sampleRate = 44100 + language = und + metadata = entries=[TSSE: description=null: value=Lavf58.76.100] + initializationData: + data = length 16, hash CAA21BBF + sample 0: + time = 0 + flags = 1 + data = length 393, hash 706D1B6F + sample 1: + time = 23219 + flags = 1 + data = length 400, hash B48107D1 + sample 2: + time = 46439 + flags = 1 + data = length 398, hash E5F4E9C1 + sample 3: + time = 69659 + flags = 1 + data = length 400, hash 4317B40D + sample 4: + time = 92879 + flags = 1 + data = length 403, hash CB949D88 + sample 5: + time = 116099 + flags = 1 + data = length 411, hash 616C8F82 + sample 6: + time = 139319 + flags = 1 + data = length 392, hash 3BA50F06 + sample 7: + time = 162539 + flags = 1 + data = length 401, hash 1C62F82C + sample 8: + time = 185759 + flags = 1 + data = length 400, hash 180FEA17 + sample 9: + time = 208979 + flags = 1 + data = length 378, hash 2F6B0AE6 + sample 10: + time = 232199 + flags = 1 + data = length 375, hash 6AE86D08 + sample 11: + time = 255419 + flags = 1 + data = length 375, hash EF2FD9CC + sample 12: + time = 278639 + flags = 1 + data = length 374, hash 97B83243 + sample 13: + time = 301859 + flags = 1 + data = length 382, hash 8BD6191C + sample 14: + time = 325079 + flags = 1 + data = length 393, hash D5F53221 + sample 15: + time = 348299 + flags = 1 + data = length 375, hash 2437C16B + sample 16: + time = 371519 + flags = 1 + data = length 372, hash EE50108B + sample 17: + time = 394739 + flags = 1 + data = length 364, hash 9952E0FE + sample 18: + time = 417959 + flags = 1 + data = length 387, hash C4EC0E45 + sample 19: + time = 441179 + flags = 1 + data = length 384, hash 7DFB424F + sample 20: + time = 464399 + flags = 1 + data = length 370, hash 28619E43 + sample 21: + time = 487619 + flags = 1 + data = length 373, hash 440EB9E8 + sample 22: + time = 510839 + flags = 1 + data = length 363, hash B7655913 + sample 23: + time = 534058 + flags = 1 + data = length 362, hash A0690E92 + sample 24: + time = 557278 + flags = 1 + data = length 377, hash 41BF1244 + sample 25: + time = 580498 + flags = 1 + data = length 371, hash EE4124CD + sample 26: + time = 603718 + flags = 1 + data = length 372, hash 7A512168 + sample 27: + time = 626938 + flags = 1 + data = length 370, hash ED00D55C + sample 28: + time = 650158 + flags = 1 + data = length 356, hash 43F4FFCA + sample 29: + time = 673378 + flags = 1 + data = length 373, hash 1950F38C + sample 30: + time = 696598 + flags = 1 + data = length 366, hash 5F426A7A + sample 31: + time = 719818 + flags = 1 + data = length 371, hash FCC286D2 + sample 32: + time = 743038 + flags = 1 + data = length 366, hash CF6F5DD9 + sample 33: + time = 766258 + flags = 1 + data = length 386, hash 83E3B1E6 + sample 34: + time = 789478 + flags = 1 + data = length 369, hash 5BDF670B + sample 35: + time = 812698 + flags = 1 + data = length 367, hash DC847E4D + sample 36: + time = 835918 + flags = 1 + data = length 366, hash 8AC0C55C + sample 37: + time = 859138 + flags = 1 + data = length 375, hash C0D4BF4 + sample 38: + time = 882358 + flags = 1 + data = length 367, hash 6C5284E2 + sample 39: + time = 905578 + flags = 1 + data = length 380, hash BDFAB187 + sample 40: + time = 928798 + flags = 1 + data = length 372, hash CEF87EB6 + sample 41: + time = 952018 + flags = 1 + data = length 369, hash B0FF049B + sample 42: + time = 975238 + flags = 1 + data = length 366, hash BADD46E6 + sample 43: + time = 998458 + flags = 536870913 + data = length 374, hash 6102A531 +tracksEnded = true diff --git a/testdata/src/test/assets/media/mp4/sample_with_colr_mdcv_and_clli.mp4 b/testdata/src/test/assets/media/mp4/sample_with_colr_mdcv_and_clli.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..608d6ec440cca8d7c74b8135723256c0925ab81a GIT binary patch literal 285393 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 R3mI@y@Dpx-h-GDW4x?ZGuP4m1 zy>9Em9Xn|V%fj~@pB=desmL0ZxS<4w#L2?z?pUy2zQ3h;>2DFbmF{p*< z6b3pNnJ1~UufbF5@&s6FT~_W__5{gY_g(xh*?PkpZL>^&R``r0R@N?|3V}TlR>?yM z1JWS`I;cwLC#TlE+9fd24ZZZJC&gc~Iu&v;1w0X9_1i$rNhq<+VN+#u~uV@T2O zU?A4aCW53;7;}KV?s}DMWEiINyh$RDVbktHgU5fDD`s-AgGe)K^5h%46mi=_cjY@` zJOWXDP+YG6X(2RQ69h~IA}b}u8+U^#o^cccFSDYHSXh`jN_1_ouXcteqcN zkBAJ2>r4Y5vXQ+GE#2`~64*&31+^`S4``})GV!zY^xc&d1>&dH4013-mWnm=R9&1$ z3um$!C}6Js7s=8$9zUg&MtGjfi!MtoEwf~ls1$6aVU|oFq_CV)XmctuCfY$F{Gj$G z8%my#&BrD@jqw=d~20d4G}&O9_119{pawKOx!)otMb}3hFn+`<1VC z3;|4rHqkcmadQ6(7e>RJ!T6Z=+Ty)_di)Yu^DBWdSnb%pwtptlB#eyR$f87ZY=+W) zlw5okJg8O|42JIO_J4ugxDq>%FsaEYhL6LAD=ruqY4KPNc zc$2hAI)XC0U7|Fx*t(oyvOvh!4H-J*PZ!|vT~k;0pb2`y&j(}+sY2a}l;lF(as9hm5VG8h`n!*G@;rCM^o~~>z>`Tk*l~h*kM@qc9pif+fg}x z`>qned!I(k(D>H4{Edfn2dT4QD3HnR`5n|#99G$th%?wm>jJ2bW{_A|!e$^54^(Wz5_SBQpa8*{CP1G!5Hvy5DI`fZ*DV}R zC58xh0@jRcY#(g@K6Uf-`$8iu1pan$em^_ZGpIOf*4~$AIf(3*qOx}~WS(*J^&`@!6Fmx4O zxX%)-(PvVmXE8SAs*=e3T0Xuc-sB29xjKQD$TF`<%q}N|3hV(Fp!<1N@Sduc}$=;Zn?Td* zKI)bz?_BOHyLFhxB7UUv>Kye+Bd|G1b#%nox#g7vDWYSWDpl$c;Z~{^u1fc@?Mw&S ze2TKVmBW*!&Ox&Jkv7rQHCBLeHz1UX^qLmbZtj^^ zA(LS?h@{^AXQ3BlU>%PHQEx#Kj!OvExuB3!nw}u9A8uRmygkJg3n5#&VdUggG=T4Z zdwsN+Nwh!HN4&vl4tZrU{m8YN-gOr6)=8?Qdm@F&+c7GQ;GZIF*R|&bErt8bH z1(Wj7Y*08nt~Jalo*5FTik)c@ZD&ya0<0}^47Lz2r$N_7D;vNFiGdd^i`qWmzA}pC>`+r-q zY)`=^EE#VPi-3jBJnRvuV%rW};-K-s8jhC0wv}id75Zy<+XjM<7w-mdYOl}_?KQyu z9XcC)3;~8yVVC_`iJ58A<%B;_R>$#3JFyL~CT7M=a?yW62`-`)qcd0FCks1kf|Fz@ z;J!n>jI*(f+~4GEhFi7!x}!tt)RwLz<56sLKl#mh7?#XiWaU6;9BtWH!KIK-PQ7lJSVnafU=1~REgw5+4z}RQPup&8USbxS z`N$ox%o$X_r!xrW905j9Bm-6=<4dG3oV0$05vae1zj~NP)AI$WG=cz#dmMk|{Ase; zj6VjxV3Z8dmpZ2D2SL%!bMoZSZ_6Y&FRR229qyDc^B0og3X5>ULS%mPGu=Xd1fm^Q z+%N+2d4Dr435|rN!}V17u#N;s3x4M~{QHYMJT~~G%~SNJ$>ZDg>0`wRR6&ABj~TLc4Ks-nzO~i^ zHVx(5Rljf_#s8}mDkC|g3aATJkulHl@Ns^=CIQ)s2uj;{7ON*vc zuA8P7sB9uvu+ko3pucndth~-0rGMC>DxtXbWgoURc->MF(Q#U#dn@_|M3Zbbhxx2> zMTzOez~NqJ_DJf3{VUAf^CAb$WPJ5V9y>$yv*!sC>!}E1O6r0KJ>ZPq)4z2AdVN;i z{&(QHEFZ)JKPu!mmLojVL*Hy#pT|XHL!r;|4*=I2f8LU81&CD+@7HG=+k1Lq9q%Iy zp(?Lsdb)(ZEt4)~qIDjbIa>DuIaF?UHc|f}6pi&2+bI|mdP!Vy{<)e89H!2pU&Q*< zq>jcXKr#|#pmhsw&}g1&W!2+P>qH9S@)Cn(@L9e(098N1iXymBLUZYGre&Gur_BkW z9Gka$#UyaN>+9<~Jy+J&E{y{}3UtLs&#@nn_?@-NPK=x-M?}FOIMlfsNJz4M|L}M8 zr?oalanP`G8s=g5k}|DZMl@mER9fLlS{W%mvv)Eeqo=I#jQ9g!yo9|@WdH&Y|MzEq z7wy2KDX=3t?ra_>Q91ohNdCqPu2WI~&teEx+vh-Y6$?2E(zJMeKxTAX^otoioAWqnR>Uup8m6;14?T+l|!65E{zSjC1_1luB6b zNzuu?;?R3lSkP>40<0#Pl7Rvu$O#QlSFl|PDKQ`|`KN7!;8-YtmE>4#~- z?9|moG#OMT%7D{U-Llt;!JH8DsS5J7<}tlRT>*@sQP@1?;GYep%d8a`m$xC-0Oa6= zkH+1Edw?MD+aVWSg9f(+0&?{Z0ofVffvcDs?IwEbRJx`C#-GFKVXk{&WsKXtg%Pxb zTlKn%`d^vlcjHF2<=S&Ql~VFahL(w^(TsV~#hTkm&ui@c6H{zfCMUH!{;!`$#jNmx z9DZn#UYxm@k7lwId_(drkPq@-#hrxha7^kVdE7?Z%W}yJlQmLc!&k|%5G>`@_hDtI zKl(R`2y1o=;D{O$bnexsLCpz69B?pd|LQEpr_Q~go#tAzXz zMSZ98Lh=zwan}iaf;aM|9Z2UPoe@MlWFguXF9L0T)V<4lIc*f83ixY^_4fb;?+bgAgoQxXmZU-hF~g0N3wG|%O6Poj z7?UpQD`P-aplYh7qZ(F|m<$03nK@OZVSi!nJ$Sb4HW}tua;6tHbcy>;#Pqa2fA;NV zaTYTAI9HRJ@C`2;j<(p^0AJQ|!;FE0OZRw-alL5*5S1PdL}BH2HZ5ot0z8SUOv?Dj zd8=#xhe=0Cc~0uvVr?^ccAdJCNKO~v_?S#7#8`}%iO!#3d^6b?l7>wVvq<}^n3rX4 zrIgW1UXyL`8-zU9d~k9#S;@T2f1gatNot-E=iq3VrdLvEmsROB#t<9Gg#*39*2ks> zg|N(u`781!lF&&!>CLdTffQtce$}K(vD)&nwpk()KWA%E1}b}Y##}Mes|b*#%3Muc zb2ptgO<`Uu(Uo%=oPak#-A58b2ZJ;qeRN+Fk@;4f_X1ito-r>}YIC6=iz$E(Pp*5I zUrY^equu4j);*}gRW-r3hcAU!{T&0(pYVRX7G&$z7TJA@!vvdCUZQo+yEB$jmnVe1 z%!_Q$GVc;7uiRYB34&$6)j4iAJQV8~(i?!!WVh8Y^T@*Osj3wM4`x!z9yh1G-Ga|W z4b{7^&cU$HDBslTI(ur#WA8rN=M&mrz7(VMk2-R8YoIS} zN3I6OiET7Q#A^Fz!aN_UHQLaSGc!SY5mU*Lsyb?6qL*(rIb&frjybW=e`xju#kO!} z7^ug`Y7H2S?eXsj4_YN=X{rAwvHuJ*TuSf3IAIAoPh&$Zx|o`D$Qri1G2`zD`=QtaodY$yRI$h`(uPXP@In$7iz96)sM?$?KmP5kO4NoHKr1uK() zkUYx{K-BptEA*ajL;Et@Xil&8aVn1bOc7ONeB|YZyn%MFZcs;AptXA%h_Db3q6GP) z2pITDY~Q31N@%U6Uc|N;`vB~=(!XKOByu*fFQ%Lu{$3*QE6GXpdK`6zOs{;b)R!3m zx-F+7{nHwAf%U{jy@xnc{B(2i;MVOiQ0-Dx994B6OA`x-MpM}uF(+RTaM`f`YV)vC znacwL#qMB!AG6Yhgf+=&m=MOqx7vk%9YJBDsL+jxL~rMTgHY^EYqu(6I8?v}!iMq+ z&6RuD6M39Dk62A88~!x(&sE{txV!A-7>{96;erQDryyWhGBPTV5>HFj#QRh8k!jey z|Dn4R6)QGXUXTJiy8pt|tV9L9C=InSg-^`H&{YF+fP>c*pJh!r2jis>rlPkvJck?r z%3{0Kgc2nDw_*|zrm{s2Jtu$+yifm^?~{ZI-sfcL;_mYBlXwrlG4p2?o8vER-60R@KNdx6`@ znktM&x*@Sv$p)U?Zkv%e1Lv?sUd8;KX~`QXA|oJ0ksKkovKkgPvVO-q)UgK1$WiM} zyF;WTgVe%H%}6qm4I|ft#80bUY>H%9?nk_fz2y@q6tl2d4qdpx?MGf5qsnh@EY)k{ z!V6Ta0?H7c;55dTHyCSHKH6 zIETh~)KA{aeFx@?gJm$9#k^a|Pk0A_Y@Go4orrjR;$7T(8zg`U1PXX`ex3JX9=v)0~$)a67}=FzYST( zRIV!tw&vm$XYTMEg*>#ms+DM}94eNY;z-3R>vH^g-pkphR^cv93EKirsKW)CA+M<_ zf|wY_5d?0m!bazyJscnPB$d)jb0h$kC%fD_W;c7IHS_=qTJ06O!ng?a^gpxx0DK$f zXNu-|rv<$@BeSDVMjt91`RypH1YD;&{##=}3XB%C41X_FcQqy`8wQo@VO{_o zE%EJZAH%nb8@5y7FnzEBVi&mh<@xoNTnaN=nY;1x6JRh*M3e_~%$gc-Zr^h|axvVzsyfAgCiGyO7^0CxXL?+9Yqd=|0-GP> zIWcB4zYhFx`3pACzIL5&y$`u zPDMYvii$F4)qftX2$9+XFU6%A?ElU^^TmR}vare+5uw z0lS;U*yG%HRbPEJwA6VZ+Z792u()vq?}ZTX@T*|-`XMaM&)Lt<5F!oTvy!|#m^<-eu*~&);{X>WE)H_XPRW|iZ$ZIacEC1;E$l2iWf85~@arZm+V3S%vaqp3` z7x|Y{dEVX*3-w@Y-3C^Tjs=I6N!o@4Pmn4L{eO4^vf76a>v~!K00xZCflwrq3u}9+ zw)RH6CofHz@9wJU#9TFS?m!X<3h1XkG<$myZw>M&hUBvd@0JEkMg&PtEK6-z|f=qque`ZT*X?fJBiKXO`lw7&q82p~XAqTP`sHC0AHj2cx+1yYnG8FvQ z5avoYz0xD4qQ(isU-{QXg_6TZE=Tp^@K7^D+kW_Rc`i+`?;E5S7wKya>Fk;hP&_4i zV9|&8m9Q{~UfSeHD$J6kd*zDw-FnrLjSG<>yO&OMcoFkTczV~PjoA`Xp8gu3vnrMB z{JvdPY=jfQpEN;}(MHa`Vh(!ikRCd%SOF}xSoR39US08swISg3V&zN*NF;Wz_z@tl z5Re^$ro&>1<$fjUqta6r>91SWR{WK8L22tQ`6@DeF1zNkJ;H%|jeG^~O3L zZd3g}mYY7_jZz9^A0Zl}9*w)r!|34fv-;lB`|^TS8%StUg&2P0Pevw_g^XP(kv4w+ zYwSXCcLTtXSzh>h!=$Uhn5m2(cd~raQZ$D;cc=skZ@5Cl1y_8x_q3q5bFBKI2rxws zJb*4)j4l1AX?Dr|zpiQ%=mC)OX|rPy;K8a$+}IzbAtgN|Xi!cDGUi2V#Y+HI0-_IU z$FOF`rkj$}P0jp6iznTi1%~gcZ3F-(27y0|e%C8`bg3gwngzW+ARvRgKFVtDOQ9x- z@wyx&EN~Z$RX^vaD+~0}N6m|w`8d6INhBU15#Tb(q0*#a&TE3j#r$$+CP_B^@78Md zeK}t)pByIGPB50pn)-P6^f&Qex!nOgheElC7wm5q%wJ6|dg-m(x-5Qh5V{o(1D>CNNHRck`mf=sK2@<4lB> zMl^rG(icB7uK*Tl9ENPTsv;l>E9=sWjwr!Sh=^s4hm89oKjCqLth6x}^4cyu!=()u zxi@FDD#JM@>0i3}>!zF*yc1)zz$P`Ar({4#i$1JO7Rsq80!iurqR3gZ+qU9MB(~?9qb%-Gk&M zhiH|3!3htoDlX{DlxA2n>+7Q_MtRfRFq`dF-|3KCTKp=MBSk#=+*PLLpme>FwPegs za|jq%%a!WfZAz8t{~H{d{hY)9*z`QG?;R=lE>LY`w}$yX8iLS#Kxb1@CgY>b3yDbD z<*r0lRBz^EeZ`7{^=la4xUWJK%uu0}Z1*x50gBq)=U;P-QLWdz6KS-D&b`V{PFL}x z?t?p5TJ;W51~;pZ?C%DwNd7iw-yxMc{rxY>=iFEf(YkO;(6D4&a4`oNJu z{tyewG%s(KZOH0@o06_)-b%c4jkXKxs#kqPsEd=(0`f;q5QiNz{6|M?aRK4EK5fKv zu89Tc(0{G-G~Odf5M;K#B!_O?5cL0y3+Q~e1b@(wtv()|gfkDajoLQ6cM40dR%p8x zxLTgBi3)k71&fP|9=5^+4q!9 z=6(5Zv+O?Tgm;MRE@=APyo^c>hMiRld_5H`A}`M|hx%%_DS2rrRPQ76A4)iMv~xk+{;9^VJcg% zL(>n`y8Ol<)J9m;7%!GaE-;5NT{wG>cZ9DeAn#Z9(v^LS1hSVVD>h#2%K z#-noHL?DiHakk~{Z)mkh@rM2;AEVDg4*-QN6S6aTJmxh!>{5|L=?47%N`m zQ||eWL3I;Vkq{@dOUtAL9AV>$_zl6R7VNkFl(8ROzsKbaJ?+yrgx#5yRTM9wxH&ar z$fZe;uzdBnetvx65D!X|Fqkm4LmeQ8D+?e4lI;v@p>T296!`#7xJHs?mwYWIbbeGU zvI3Z?!*;(LGdY3z1}u8Kp0wI1==}xFMPX-Q_QZi@9gPojiww%-3t0b48nQkK z;3W6Ske4n_CYsVE`{Ia^v%uX(eAU^z6w&|!$p04zx}BcS^_f>A<6iGlT9FI6$<=ST zY+nkkdA`wEp_U7TCC0nGo%FXKhh?W>f3;vTlz8&+VmW=mte&`1iS7m zK=GZ$4Ab_LvEW<3$m$`-bj7KwyR%@L%IODQ1+umMHZg?3)K)j=Zj~N0I4UcDlWN4F z8Q_AZd7?0{!@v|5avYOVT!Mxf{5L@4Fqr8PP>yybS`YMnMiJDA5gaO91B$~ z)`RnR2xZlMa+~Ship@POdg!#5ue*#*a*Kk_hH#)+l{>mI!86J1@gt(^`5K<_AHi5s z=!&p4LqpR~se`xv#!Sa+p$Eeg4$-WzoO{$aViw}{irRE2%Pv=p?^Wys%2xP z4U&ikW;QaL_HieIvS!Ah4m-!NzA}UC#OAaP$m*1_@(R28hN>)M1>+9F*F;l^1;S!S z8bMq-0c)YFWb#AiOn&{ND2b9Ch5Fz?7@O~hJ1Vcy(r-#+tIeC2zBkO*k!!R>`MZ|BI@7Rjs zCV&48c7a8OsEE~YKh;tP>1FVw5B#;qzNzH`9r~=45*5NAesTSdh9bu9`G`+qM8>5D zxh=glAhGa@fDxGS(zWz;4KTC()oowrm~3__+p&Fbu;~;@SboRULr5k4j+$8_ixLzF zf7fIUCci(1{Nk3wxJtDdX%na4RHkZ14`n`3z>SI7{0R)ETHoBjvM|?Dmz2SfuYLd1 zA)1)@ozKBD5yJu(gC>@r-)s0O9 zm_Gg#Z0bt4^g(vqVlA_uqGldS$R<$M(QJ`cMz8^b#SNl7S5%`xg;=99g_2Y|g2k~` zMRRKa8TqL_nj*-SKF!mtPW74902dF154#Xuq_5Xh4n|}3=&VUc{X7;eB<6Dfq8>=s zJ7Cf5uW<0k&~mQRX-jDnvI0;d7@_A-@7(q{8u2@MijrCVHE|!M&|!^5@>7z8{-}zc ztIlX>D*T3nwlV9bsFFwbS2Uu)$4=L%6wbm9+24GspLMfOF(7>?Z;HM=>H;poZ55a} zrZ5bbHxYXSeJxMF9MfCKb;;|FWlzqhOj7NP1#f=PyN8Rlcl@;78jfu*U7%DJt}o2} z6P@!aJ{UvUqM6J89LbzzaD0W>H|bGFjwH?B-}6g2t~P#YmM9AXX}lqNZHarIn!ghg z24_nCW#3<~GmNr}25i>Or)+|Y@<48kK=6S?t#PvL)7kZt^e$VR$?ac0Ip1Se6h`WS zjC`kB7^11Ubt`7M%V>d-*y-B`zzdEC1gN66F;t7u(j2^M-N-;m&k?oHRh@nJ4l+0T&R19vJusM$+kqH6C@ti?v?R%|nGV18I zs@uVJ9h+HM9aK=@t1LfQR`~<1?O0Jusg2^Lp*m-(C%?$<`2U`QP+H1`(AZ8;y1c?8 zp4mdMLcr>s`e!~yoAZJ{S_7X1>4V=;x0zHV(MV=Rnqyxi1ZWXdeYps^8#~6+X`Zis@UyKaV&Y|i}w5l`a-+gbQ)mN^( zUt9FQ0bHqqRUb{wF+XUp9r;)GajDa2#yAjKo^h7=sqOxL$xSorT z;jFuTJ`#qu+yg%R3Ou*%%=JkO*=%#Ay;+91*e~ntryC$~dn3>h3cQ zDHIO_;LhF~`TF-*Zxk_Vh+br;BW58xb3I>v$u0m4FDdw38(kmHu*y(I`w@zI8#7&=zzIg`ao?tnamvb@&SH zPTR!+LD|v&^xjdgaM8GBxJCx$*%`$}9Ik+>W~^a~1|;M=!0KgK&ZfWu^DW|3aK^ zyk*QavcKs`F=}2=88|h6_ zH?$*>A8P$ASn&$KCyy0pUN6x6hQ2=eeTn$z89N^U0BbW-MJuceB&m?fO>t^N4E6lg z^$D7mM`m2mvPlvw4lW7`WPN8}qZa$(`a245-Y%mZ?>-lTHK$Gu4l3)ddDb)bp2Au? z8m-I}ZfO<0j7;*$y#OHNvVjAmO0ONK{9NtT!B8=D_PzZ}>+%`&$?HcYnawmRUM33) zY0>#a`-bveRt5c4dg<1bp(pB`UzPc>3E0apS7pY{nA{1`MVjydh?c@F*QwkZhobkG zR9I|vR&7^Gv4bf7L=VGPKNE-`?M&K>3!|_P1T)p+f=o4a>-=DW#m6-TWc}Yo#i?K) zv>i#96$N0~JaVk045da1Mapf;X{D`+PZL&|yXw@%`94#X>U^3aYcUid${!xMn&)km zV?&%i%NZ3fIbHMfNjBh28`uE%H+r@=bpK0BX7=7KvWX@cM(5|<^4iM*q%@Y;of-F{BvuBVg}@6ey+7?&f~S-n zO6mLuYe2;!!k1x43_0uD#g&+PItfK}R|D!Uu4TAkMQ4^c;J;%QWuL43tV71Nz#d(M z|2mjtQ{WW^ZkEPhn%H$6{a}!;0rem9akd~BUQkQqV8YOw$G>k2ZnONZ9-h=35%)Xc^K;io_}n_4sf7#Wb2wzf$p(dd;LZSFLO{@DRdPS!pIQP;ip zr@(DX|Hp$z+20xvQ_Lcj!e)3~DD|~nGjaZfd$BXETfebL+MEFn=t;7PKv3RV+F>eU zC&!b8Ypn5w`cTLhXS$=*s~dtgj2m-2VIZHie^+MxXQd`u^DCN;Q#r`O!CARXO)<#q zG!55?Y3$&{>zE(c*(mxar3eWRb+WzokL~xb|8qc{9Br z^kWM2?Rt{6TcRzCJWDhQb+WS#xGso(0GCt$k{Da{+`RmMyD#P}B@h9cid^^%5LRSH z#4djKVVFgM^md0zyZ)p&w6HW2fJG?g5FwRo=_-n#AZttv5LPh;OPr@Vjv^dN%Rr+3{-$uw-)WKYY9u>jCIbe}$kD?tosP z4b0FWH(fkXMTYeQwwIBXS60pWtR+Tp)o?62NvQGKFPq`j;<($ZdZU!B5ZFJf=8soh zjh0d?2zl~4a=0lh>n19sB4qPiu$|HY3PFwm?Jb5zd#VAx`IH?6(n4qj#fNnw$D`1x z`$0f=M^%J?u}v(L=}<7B_PWX}l(OG|wFMBN|H#n5SZ|OL%E6^0p~^M|>9D1HlN}Z5 z_FOTRX^PrBPP#%hE_smWj(+ptCINs>un?;!{Jvy5=SM$~29e^Fr}*5z{>bZ!Q>yGO zLBVJ{PV%lJPymd1jV6=T0%zR~tF`_&Zdbz_LuD0Bz`)|(SG`kPK~1Q{2!wNZvFy#? z=5{IPOWLgt{2x6u!kuh!I)~@y1#sQ3SYuN87sKDj6aE<4)W@KC1Nv#dJnct1Z=kI zQ2&Td`PG)xQgA8jIEOKH&0>1%a-C9WXoJ4vf2T0&Hy#OEi|XYr*;KJH$q2zSZ(Phh zqp3N*)JqCsGxDTs+BBAt#?$Fsw^_tH;v(8y`n`J^g!#(pGxaiLJjZSo$vJG-7I91y zISTn)Bh-By-Orsz#VLjuxN3zG{1y7`w_UxIecMb1a@1iq> zp!9=};Cwn|MakfJ+B^_oym{f(vJ-d;tn{?2h+)eBCfqL2>UVj90WsusD>W((sOp<_ zi6KxHCL{&pH9p_Bh%_^Ja=(h-7fh7s;db=Z?*ukt_R!F)kiDfZMH&$u3jpp%DX zC#fTN8g*tm`smI4WBEfe`Wgrw8bQUP+#nC&a|9ka>|}5%tu&U){!0lzB?@Xb5LT{@ zeq0S7x-(d6t5OufrF?vw$TR<^$zc3u?@%}WeJ**+;*63z7u8R|=+AZ~{2zIZ0ct=! zZk??jMbfx>U%2CHmw3pI*GjU?M-OAy7T~l^`mT1IY&wWsS9m13@zlVMpp3 zCWEUUFFG7Io;G@2@YCa@mRiEkN=P)K7qw7Iky@Ef_8&nzK(eZ5ebu+G{Jz)2VAimb zgD$5MUIxKnrd$Y>3Db?4@}DJakMmM{U=Qo4`BZ{3~R<&Ez=yrSiQA^}U1s!6c{WCR<{U>fc&0hA6vk}E2 z;z1mUEQ8H2+NeBzbIPQ)3JT=6k;}Zrs)b zx&8k4yD)lBMuLW#SYboVvLi!L&pK6`G_?gDgJ7-L0f})(V*?E z0l!5Jf;y!M`*Zct@*X`9Me>}EbVtKd$`8fHLg1GKql6AKMT9p%}JSV$z(j!fEhO6XhL#T zn2Dv9tS_DOx~7Jps5;?wi$lLSZt{D5SW+agZh0tC?|pq&s10U3BU&(Pvtcn9NrKG_ zx6F-|_qAY^4yhT*Ae?U*IQ)4bgduw4G3Z4oftHHJy?QTdMJsa5m?{2cckXs(epf_9 z9+L6n4zzLiTa#eEfV-WmzkK>A?@GZ1CTZKFYJty-BI3<>(^Wml=4onhQ4vITXLwzD zo6W5a3rtJourM*b7x+{OJ!emgSAlF7BI}*zjr@dC|HR1}q!Q3O-lt;Os>*yh1x!g> z-jfLD*1XFAsS|5E=2a%kE(tlFZxqp}-*3$mDP-+;|GG)-xq6$UQo0_jgsk%k`wfZaAYs;KjYR`EX~uC7<7e5$gGpGH z?{pde)}e?P=wbVQc|-_G@Mz1jd~j96x%uPh==6i$(c9DDEw6$YGYv;2qkR1d^?&WE zcbv+bVAI3l9MTw-qerv485q z2^gn;MFxXchYQmxqHd{b=2h!}@%Drqn}V0K za>nO#FivCl(8n2NWQzf75^Z2MQoM{np_z^xsCSW^2J1qWXC{-=)h&8{oRgTdE$nF=73 zTAUw05R?lPet7rLm1k@0SfyCV@$v%OB|eKaFEZbf+g!VldwHD9cEk7qokUtEnYXyM z+qS?>mmuz-uQ;h%D0{5&cPPh0(G~_$OO8<{B29DA-3g>c^bA=!xUL*vPk^#7^S~~$ z`G$s`klkZ42fRB5E%y#r9@I>Z7`QWbht7d#n%6P+@^yii9mW#k)< zaKj|k1KqC6aLHVGBhM9Kxo(xwtpv58AiTM^d`MR+pf#w)+VJ_c4xZ zqpUn>W&d7{;*3EB$6h{aZ&GkZwJtG(#yOWI2EU%&nQigt`O zx&y0fDI_;_rMI$5`-qQZof^)u*5puc-?`)Cl7Y8sf4)H0DU!y8oL7$;z)~~Lh*HV~ zV{akvmxns~TmY@aNb_b(%St91$9Odg~^4;a8#fPC*{1wXN1ElmETJX%v;$hH>Qvn@#R6I`kqvG(?PA@>BZoFe$7M-jZ zZvDHGSM?@mKhMwRSj&4nZL_oaeuMU{mj zvzVE_qND2jNqL`tCI!^-n!7yjH7sX>qx(!B!uhXYfAyQ8Z|RGw z0x-ueN2405z)~~S{2nwKk4oQyY&vXDd}r)qD-`3NrD1ifCQfv z5}I_mAo#@50JSfdt<=N$w6VyOEU@)4(P+3KR_y==U2cSu=O2{u7HVY9-+>oD<`@Ag zR)pZY<<^dLW%y2E$3!|u`X;m40btQo5g^j{&mXeNsu+}t3;^6sR^7s-;Cn}=3L1g# zMKha75idJieWSk``{fWZ9_ahD;6d=xX15s$2_6twyXFFB`se*ArO?6706~<^-shPh zW;~lkVyZ?NN#ym{(D1b*PUF3 zCjgE1B4M=#p>3n1bP7=Js!`0{yI#H2URdO~3K#iZrx<*v>i}MI2LY}&j#f#MHJpM? zkep0ugim9p$lHG-XV~ehW|YYc@#kQ6Wej`N^|Q<{`b6tTK95zhFvwfrvSS~d%W9=E zoar)k$&IfYDS>C8Qo@In&o-kItsap1Rux=?V3oDK!7!2>qA~SeD{Y1tSpO8fKXh- zgV~5!Fsk+8ylcxmb)ujV8;1$>qx9u53xi7(5<$h{;WDK>0s}*yO1*j*w0El^!o|j( z`)>P#7CZ6npv?qfm`%(-ImtS6fSBwCyptAqw;qm~P%w0z+n;XnvzL&>)+VtM!~6%y z6(yc6I1b9nS&MC=KQPc*{5s)(Uy6)F+23SJMj?f6GE6vdEJtbEtse@+z55>w(VYQ) zzYgs9-(-AnrekDk9fJ-|CsSgv86lz_j=$Zr3b(0o7@Xl_@=|&EyjE7qiNHB2JwD37 zXJm3Oy4)8HG64jgCM^G0kaB!n?EXAN@Ow)QL&t4Ni7D|G3|@X5nFgwz@@3 zw~*|%g=FY()?MOEQmzO;CTdSU%l$|x2oz-J@eOl8*{qn{Fm6l=`Fpch`5(z1Y#L?Cb6<95wE zGD9nY)*JNxwU9n=(borCvc}?mhL3_Nvg^(OFcikLe8aN4Cj`D$FfJildTxdq5b69H zyO2QBdPhkhI)dYiU9H}qK0Kb^SgZeXu>Q*m1eg{k@{`Vd6VBS&SlV|^|8Z<)VK|Pv zRv9Ze@xl7XHsw0f1YenOI*OP-kLP>0kBa>TSA>KtIjZ#_( z>~GacwI4%6prUrIrRFv^syjX*V=V;&MW>cn`R! zutI!Y@PK^mef5rQFo*%TO6}IIXq|(dWVMz^=x)P1!{;hH397*Za#PloXGtl;6cu5@ z++k$t*f_i>On#isokx6NuZJPEG-*ecYfr0$g0ci!=xio*vRYyrMKRhC%buP!^7Cq% zYto@c$pa6*FCW10>!l}3QTlvGV+wb-Ww-GOv<}=Plqn%Fx0aSANfHh=dI_0BUF?(g zPRu>^TaH>hKyAziho%pVy)p?6sdZ_~z1RMO&uYQ9dijL8yWmE=r5;h~+~`gzW~P@X zNC}=&dPdCGc_!`Xk=RNk3Z0;KXCbBzENzCnP%pE<0aXT}GFxJhC$8MxnwEha%3?4F zg*=Fn)2?mCFk43-JTd}lpf%&=V^Y%!_kJpmWgF=4Pqgq=!?2n?wU(y_|L$0&R1`G+ zJh=qQ88=$+d?wsU`AmVcfL2MquVN^$%{=Uy3zALTumjqE_pSB~<9pH|`wsom}F3k78&{5mFfvJFshNajNbBL*L`t z>GKQ=UJA$GIp~4-l4cPOiV-a|O+<~nGdza(YM1AXhRj}h?H%PR6r+@dALaKu93DdU zSN%I>T@uDAHauFiU}l>T&|BrHmJhG1_XZx#E=#Acw|wvO0}$;L>I61k%051)WW^6I z{NywMeS>wClX0ddEa(cV)Mr*_T``B(z?(;HWN2Hn**o=()CK{g=iQ%h#_PrQAl9G_~Q__>loZ;Ok525?qkPi z=%Hy)-hTPasAC5n(eI4&c4l2AXQ@761KBwV_QL zstW`k>c49=Cq+b+2jE+ow1K|kqac?RDOI6ZUB97<3Nl+_9)X3K;fAQ%=+KuL*KZZ$ zUU&~2wr5q!+?5E6Ho#eH{v#Z;nQ-;(wUv^zk7;Tpel>Q6UUsGmYFA`LStw|1?f zIlM~LB6I9xX~n{0NOJRhA7euVff!YF zzfu)b>VdD!np;E?ZfL{r3X;D1e`iB^bcdl@rt_2+=*!qT=q6#p?Y+=-EPi;X0-~jQ zpf#)^FF5OKhlOp$YZ?vLZ^{yrznJipk6h8Br|iG2S-3?qsx+5;Ctx$eTCZX7-Ea(< zy=)I-GUl`?Ez9I)`Hi_*DckCh{-@&>`d9l8pd*C&^|9%Y?P7qFUT$2XRnnBoORcn9 zuID%8;_yP_bC0xYqjvfzpeC1R`DURr+^d|^`G{$%uX=fQ^kL;ju^K*PBeZR~4wq)R zpB$R=bpQet zX67h7$R)taqhxqcJXAutXWwXRd{6VEj3+tndfeA5g++(&Qc?|Mjwq*84`+#;Yphx>(iwrG@;8a~LYx5upKN3?9P+U>BKSkD(#32GW zf^OCx8Pw6GQ(+THL4shu&qhwLisxl&dm+M6+gt4Rf+Ow2ItPhbyv<5>H2^Z(SO=|n zi4=pX*WcB$iom-*tBQ>=9X2pUj_XI#V;=idL$$K1eu>E&@-Pk{MCkI0`@4Lno>c&^7T-~1wKQH|B(UZCg7f%{7*NZ+~ zy!GsQSITcyXB>T4C*X){6tdc9pUWd^d<-)J>1j*lTQ)u1s^*^y8xpP$f+gZG4#HoU zLJl#tXN?GHKVF$%cg_=Uha6x)Ib#t!I1S<#QfkCkU}c@3{_g>}99uio(yVXbjhqK0 z141ff>#H-N19=0|um2Q26+pujU@ZU@Mh_nr46a9c9uLtze|LFi?W%@S@5M}1(cZeX zLXPs(r4H+cXDFkc>B7snr!$%rt@8hDu>s$@X1MYB{crmfc_GH51FjH?=7^fNHIDg&TblsK9%G?R23Y$p=az= z&X@2|e@e={GJaG_bya$Gv@m6tTtoRlwTx%*!xs!;T-;UakWx6NTF1Ll#kQ{hUpJh2 zorJ;4KwX>odCDuVxBK!N#hJtZz*I*RlO5I~!YYm}zhBEJBJ{y8-(-j0)R+b&ZU`x# z#JP`b*;DolWN6q|)GqSFdf0uv+IHuTZ>I@AF$?|)BOiXgTmP}atln%E;oBv8SUKHvrm}p6$ZSik{en9)h@sS zgYCK->PjuB`pi!?SaviDt6x|S7$y@WRKP61gSu>dDhXwFKLKw3t*g@a`H?Ld1@ouo z)nmzM&9@6xwSN7*?6yX61M&4)Z~R}mI$b1yl&?RtE0}P!PuG*|k*@W|8fl204vk8pX_MXLjaqzm50B`m&r?2EL7!Dyf=ZDdU5+4eKg^|asrXp@On zq*+LWS|kGoQ1K*sOAlpgWy_WUF~F)wfc^Kser*`oS!cZ9XipcV%EZbjPbTKwm4spE zEY{)qDs^}fhzW#fUege0Y^rsFTfc=I+qg#~06Hv)Vw<}2NXY2C2$vxVoaVSKP8Y8e zZDflW>oHE}-H#_zO?9iA^a6BTjr}Vc_q%ZRU-dKx_-r!rU`hO0O-PuB$nz_|650Ux zY=nf;oUZniE6A44+t5D>7gU%YeQWA%gD-X?zkqP^UP}qVge)KcnL@z!=BHQ7Fnnv! z?VXEmeM{VD#x<24P*Y8*(d-Htz-T}M8!m24%eh4fZCRlh;mz&0W0R(bu>Q={F%vI+Q$;W5#g;wzlFu!Z462U-m1973hzlZL7m8i4D6Hi3%yN1P#z z*d>8SWWo@ZHHUdJvtPk*90Z2O52`!A=GYt@gkEJAwfjO-DBU!*=(MziAs$Y&V=CGr zz6urmQEw+GMs*=w*JGL;`=&{R<}hULUsUsjYDH=S(UANQAFP(HX)oAt4)X7ov}n*6 z;@jXSS#d|&hXfgH6BOm>Czbhfyf66O(k3jXkDu8>H1SE=ye;TReO0SjONqn3_K2Vv zwlo|t`-M@Lp{Xa|A_-K;&J16HYq7#|%2~TYF2kGS7o;TTx9%QQXs5F1$UoqbYGWNZ zShGT_6SglQC(0Z>6FmP})jR}QsLU&4f0zclHetV6<{Z~Eh(zsX`JIB3Q`qziNw<@$ za`+2tD6auCaV-Sx{Kg^(3&mQ3s@Chn3r!Xb>yer(E&cw40{=6if-&ynFb5N-7#BKS zyRus0Flj;I9}5-^FMj6Ygx0tX8lt~J8&sr+;317OsL0oN>D}j%hCuRD8Mvv>0#1)+ zEBvycp+(nK%SG}REYNTId7uYgXFsl*`q~z^h)5rJPK6$2wsE7S_7R2_IIV;UlL+r7 zvm)5~bujq(V^J3B3`p7|ZX{P}5y+L&@ty~zjS~*Hv@o*Z)7l@ct~jKkl+|JpIi0m5 zlRAiB`)r2lD<$?HoK8lPUyh=2PL%U+F86CFv@ano!J$B$(HGQO?G!(-q1Ql90=2zA zbF*Nt3K91PFsu5S0XX!e zVXu4iD3)+pbBrXDB-vpct*%VB$Y5H&f}AN`H_3&#OQCOZLBAg{s9K!V?v%f0>X^XL zNisn9t)2M%9K+m1Z2x?@-?aQ=r`FT{t`3i6)B z`FZ6D!-|JH91`e2=Wj*VUx!C!HwFPnXOiC`t>CVCSTHFC6S$;Cy)?f?>T1>P_kz9P zu+z}(TtcgWB3o{UNrrbIUZ#5E2I#dzPqYWkRFqxZm8BmP@#ZVF*>3)VNFqQ%S*YqS z>}l}Jz@m%~)wh97TAi=QBL6i8Y4~AHII#12;>SDBqPD8}1rgX-MVHI6@7|kfhwVT^ zcxJ^wvZUk3g{q^7@lxaTNav*76svq;|dc}si?s_KHqgsV`db9UCw@*Ka%Nu|zryl4`}$lg0o zFzJXOmE+=i&IzGF8ITqd=8!S54!ue~;?Ep}b^-*XYIO1QZX>@0;Z=wzW3>Uk4dwGDZ!M&P`OM@jwkdoSPwvoq%q!VQfbvQrgaq&>FPTwSnS@WyUj73ou5iO`c^LP z)E5SS`1Lgv@1O|N5)~=e)E9KG08e6`aU&3?Vg~xhm{KC&0HZ-fe~)OwCA*@T*NXM? zaH1X0tSf}K$&AtI6EJyt{)FfWg=lDe5lM=#Q86{53{jF<=wQb`14vHeb$u2z z9mVQ^2^#FfR$eL-(>|rvUZrk$ACq>)T#bevg{h?g82xw-S>#Q4s}$o7nsE`Ie_t2b z@wur9wt!43wd%__UJMQ}qSML)GHmww9TY4=#|E>1w@z2OJh5E42DU!KOdr>ulvtCW zX@==B_xo5hVz0;8UXMS-2|AVXAR(=$6JUs_VDAb`9kgzHE3gmyter5{Bl^b-=`Snt$1kA|LO|8vrp zs~s5Nl`BuSjKfx1VNQ+abLzLq3S2yKti>qaa?ruiioAkn?vyaa5~|-ky)3+1wHE|q z1ped2!)qoNX8MHVZ?$IBz)8mrhvhs=?OMm{JS~b+Xq&R+66rRoFUdY&1*Be614R6* z(NZH>0pAg1$6>jUisY(@fS<4?Rz2cYYcFeb?ePeG(9}ij!BC}ZD(0_EFhteHHss_y zpH8Gk`K&C&s?3WaZJ)D z+7$pWA5nzoyod7l7Sfrrm_!7E3iBwAQj;0X8k1JLckIhSXLk-)q1|b)Lk?QnXM;smTKNZ{*c_Y70}_@Ru=q*dq! z20ihUp!<%T)3f1+%(9DqzW?KlR`!f$vAd!Aq)?=OHXi!szsSG~pQq$fH>do&7u8mx zofgxiu-)~On$h$myv?RnOdGtLu+M3}ylb)3|Ebq=H; z{%Gy0ICA9`qD6s1rC92F{yE>i_+|_Rr2avb&Vnf>f;{+^x;nk0COTv144ZhF+Yssh;|i)pzY73vn***yOK9Ch*HH z{^P0vH~Pk6N9M(^ajp{v7w%-pP;m6}bqY#ry!S#OhXLO7#2=*LLsw-e24)^7?v97( zW-5XAy%y<1M8A{fw5j6iew^=pNWH|}I9}ADxg$>qBn_x7Zqc{SPs_vRD>>c>9Mi4z_k>uu{Y zC$?38cjUrl)qkLiKHj7|0@P;#O2AeZ6>B_AjMBBa(&d`MU5o!9)SO$- zbMzCAuCe;iXJ4~+ptZHQ#Nv#3Ubxk0DcLBtkh=a~-PBq+Y*iyk_ZWIn|1_mLOgohq z%4E6Y129tStrg$21Iw-5WPp_EX6^Vw9&GkIRR~5V9tr3k>%cRN>CW=<=58n_4InDw zB^Jkr;%D%JG+KY72n%n^@T9DXZ6>Y6M@*R;nVor^kq6@w_$J>CuDM z)onG4HtzEHF@wk{Cl7?b4G!P!;BXeVGfIc^*I6u*%hj8rnY?@EniY2JeVZOsSa91U zWtaGa-cj0+&yU*>8ntR%i)N~puVxyviViAVQuN{bqUSJjC6eGFkd-U}xPv!TL-Vch z8HP&Ix=a}EMtA^FNm(+V$GfRo@e))5qtxHvkF63&P{ub-S>s8t?R*-!19cG1@A+pw zqNhMi3Gd3;O5_zoDrOYb`5TN`%%l(ReX3bDi-%6bda-7n`n+I*~{ot3cyc@bM9o3)1%YC6_4(+(Po4WG8J#UGfB!8`xCWUQQf|TVR zVxyJ8{KRz+vKZDGjvUXmVtmOE{#ERTfX)B`j9lEJlK+%Q{0V@O5WMfgjxnPAcX`yz zwLJ>QQ6JrGiLl>$>!g#Ksp(H~5*02GG}u}x-(#B`GgC2UgMxMkn9kv;U=OBB`X`_}YfV;IJoF9n_w$`3|=Ey>aQ#ebU#6SM|P`W9$y=JsB8 zBTb0-b7T>8bih&)+g*8RmYs<}?j(UxaA6uNcV5L<@2*MRHYs6`lW$pm&I2sw9%l+fZA(YbY1pJsr`I?DKt+0x7Yr(| zQvW*mc*gWxAwEp+h zKeB9AGFx!`Y(4Vapyv?bPEojg^Y3^3_KhR_cAbcl; z{p5|=n8?mHD=w6KixU74EE7gRphAcG%1)7k4B7$FyHYJMDA=u^!U~{yq5oOVK1$N^ zk%ZU$3i?Ph(sA*Nq98%&cY(ohp@Kxuru}P9=?Xa;BXj^j#lP+93nv>C-skd# zU>v``L9W6eB)AZP9%h(cw&14TX|t)QPPIZF*&dA2aDH=rvw*kkAm;xlK>M4GLJ*M$ zZ}DG+_w`DIiRZ5)<8|;-l6zO1fUBqAM0Q*XCF?g2l!4@jq0w7z%v4@Oi*qwBs<$cM_c~4^5J$rtwDrRhm9Y3 zE8CHIFyDN8d|u^RJCA3uPdUU7LD8D327xOMW^vVbqO+6k=W>eWX6Q9b0$qhFD*EqN zK6$0?DCyEop62%C-CQmes=Hg(kNj2tjfkWcEmc*n;>+RWL8@40Pv8$YS**}GP^a8R zk-8U#Hc6B~KUZm_tIPI0I`nO8uhxd zH{F^dflHTaBBgzD8po+{tSkQ;^mi4t`Wes|%OY#qn@7n$o>xEIHD=!qeDgeV+B^Gp zDEMe#3jc5{=I^?(s6i2)l5GtI zSqBrfa`ge%MuXeH?O7@vBGKS)8;fQHFWlOi?JRr2zjX+xu`XxB4f=U31|)0}t8wDD zR#3HVT#TC2D&(USqiK9@RzZN~*&-!74AUntR08-o)4+xXu+EZp;s#35lFBYh2@ncP zp5tvq&tV=u5gI}h(aZsj2vVu8ja6v^l9h4`jsI2nNzR)SA8nyu1L*d#mIe0nC$?nI zWH#-yL0rR9-R{8@h|Za?pC6pOT>kThXOJD~FtqMMR2k^&{&Nc>OtJF}9$BRrfMI8M zr+qy%Rw!*ln0dyN7CF}Llbs;wo&W9^BZf;~G1IT^$^-o%BLEF%8|9K#;TUcqz7T?N zd)n}XTgq#GK>VEt{Pb(^vhbX>Vt2}M$}d(YA>>PZ~1x+^Ro zN9<-*qXXZrk6#0bX&~W}4?IpiaX2Aiu)@xMCKRfQM4@wn=LxkLW3v^=_)9f;5|H^K#plNb3p; zvD&XPy!40*^E{N}KL=&JMj6>Z#Oi|I8?rBZ;@y3D+V9nSN8K;Xvcs9-GD?58?_4Ua z2`j0|qBaD5BN(h`x~?NIjwn-TOE8N85-l~FqWMOt*X)iJJ#eIH&9oSfJDT_RhZcxf z(aDAnlDX?+o6#yctLt<%p>}mqT}EokAR(98Q@X7oG5j8$J<~kEnISHT?4%!OW6BGU z_D_epvR8Dk)Uk$ZRH5f5CzH9;q$tC#GzVjSt1rwC;bVjp&uG6g^qcL}NLhU3j6Y>fz%R3pjgvwvNm~O>S7|tC z@f9NBMh%zeAD(~#wU8F!9X2Obgg{>0JP3F{Xf{|zVIdI17W8-Ls!skhK0QT)c>tVL7I_G~MY@m!kLSuxRl$LI9|M z!1k9%;T-G-2GUSpS5;3Ouby>6#H+ua?#u*;UpsB)#%rAQ=P^lJHx$eX!=yx*wxXC@c6p5FYRB%7BqL2frh52RYCBJm4CBQiTkj5H=ZS# zWu(k`UmK@02yqKH*+@Q&6_+GvR<#LlK@QaOJ&BN}qZ@xkveIf36~-IQ8DYlC==Bfc zBSA)>IL8{5DgZ=>@-*P*`>Ciwke@O2vervzxIw4z|?C$K^~ffqMX!h7L7)zGTVNdtyKYZ6gI} zWJpy;%Y$I856e8PNuv?2)=fs8j(H7tdKcc3fdXa&JVs~?=T7n>$-2_14BCwfa4E_fh*8VgO>z0kp2xP7^usa%m6f>UHp;hbFl*7@SGI%8HFF)%%x+VeN@=*0 zwj6IbpYqgn&3@<9qz0Nbp5AwIl1HHusbL+nD{Q>6O7OIt>Fw#lD>QG%dKMD~T&qx5 zvi)-wT4v7$#`edZ;YwO2uA)RjQ8%z&FZk6P37QUXNW-xeutx7m~x?!7hUYAABLEF&WOfXOg3I?;7 zZ|=t7YJG(mh@r_kmNw4fQvOqTxL?7Dd3kap&@AQgP77rZ7(5wXEL7-z8%D5b9`!ZD zZu45oa`cJiVCxZzF6S-+4>0GT=@C>dri%{Y6boPAb zS!1L}ft!H)67&@ehoN(HUBPDYmL=+6mT1>b_$GC4;uHX$&dAz5FP5$|XrQedPA^W7n%eMNRSaNNC9Mr#1n&ct+|O%l<3(QnT3@_(8aS(7W~}S zF09S+oq;kAx*Jb-e+U8ZhLvU^-FKINd@n=3Hctp_m}LW0_= zij_Ox5RYsd`@HP|xv#_NKgBX&Sdy-D><3-)X9z%<>fTmno5R>zXl`soWPMpxV(2Pg zSo5|e+mh@=D^or5G_8VVR!foQ)YlrS+HjxmPH#SfxSIq+yE0;|v>^H1A{ahR-e8on zd;0@sdiGIWWi%o>_vSyrQrdQ=pT*^5%xu+X)hD1k`QUufNa_`l?ip|I_>GNSKxeozXVpgQbHy6#Qj8Um1DjU`4${<;SNCZg_J^AxG8juJJ5 z8lI$aF$EK+xqwAsS@T*cjb`0}bsUL1ThBmcZLO!{L=kT)h0SFOl|~Sv&AwHXlL?5d z-h_-z>0;-?ZW2#hoTl*d4m}W7itP>c;SDXx*>oIAcgD5=H$ce0gRM;9Ou7TPxaW}m zsfzHbL4ENqsxDIy6I zdF~s!56}od9;+{&9bv9gKLA+nW#n8#6@{Q8I@W#rZ*X{Ut$$ewHtF4q<0tfu?{WUE;BM-)sV95e~r%EOFoJTeZ>zufch3F0in8j}vwqd&$VKmF6cDPEmvK@BL#?O$Gk4qlU6 zRNR)PLfZ>qrk69i_ZN-C%9E35CU&XZ(D6EO8KAkBC-v%RcDXz0Ud==&d`XH#`_xF- zK8lw6BUmHzc$FKSIJXW)bS|G#)x@Lg25*JC)C=E58C#7WqEZb12Kx4E>@T>O1&uX! zoc4y+Y{^k^lt1V*o_Sn%9I^l@^oPz{8+6%81%c2icSq&hQF_!$Tkz)CrcklHR1f-~ z2#*|FIYau^U0T*(qEmDDDqan53$XODbnfMV<&`9d@;p!Hyqhed|I?l_Ct~C>G(2j@ zST`eVR;Ye0L1MUU$8Gfn5^(QQXI2vU5+j*Q{7%Q#N{j6qHvsIy0jD#O!C7w%BOh>( z~!-Px3N1Cg-EPXP-w089NMVeEp`KLk4ptH@j+1Dw~)#r;WFaqhIqsuZVB{bArvI zCmFf#nPxaqXemiIyT^0isSrNBV}Fs41LKlUVz6Rt-*_epZx-?~sT_~LdM$6rAP=62^Osy%aA-wv+36T81P(5R~M2HjR&}x`6IX0Os zJ*(HvwDu56BgDdmPc<@vt7d}(h@FgFiq*&*tiJzf4M1-rcu~iM--p7+H~v=Gd~34y zX>6qUZDIrOou$X9Iwu_|NAJ)U7kWa9rs{avi_T1{!P^H^wS>=KAo7PhMc&A>7^w3;joa^#zNhg}=8CofpmET>VAp(YIp9RllWDAW&XN6YN38pZO`}Az5#XOE$n#9Ey-Ny3l0=M9Ybc&@c`M+EQHOjx z6{E@3L}O^3n-khI#i$+fLA!9hJ)B1|YBua0`ukH~S{W0;F^LJC*-s$9Mk@11ADSq& zTGmlcC(^+)O-#;?Z(<>%OwqM8A2bAnbon77DHL)l`sN#7O+#RzD#Cl*+z-wl+EaeE zOqx`i-GVz3gB`vwEwVY0c+6H?5F?Vc>WB}Ps)H0<$^x~rL)7%RG8vQnzlzGPS})2L zfPbZ*?7w=28HjEYndt~0@aVjo$Ebyp)>sG9^r}rEUNS&YG+A8Ru=8;H+-D^Pb*I?| zt=LKUC4*hfSX#R9j>^<9(bO3ZqA80c7K=Yt%}mo>qbbDn8l6g);#%mf#*K-vXD)2S zzFj*e)9e(&V}84!wyP?b*iKq7>VVgOwwNi7!zWgh*zhHWigDTD298(GM96os^QPpA zAW}%XR5cNI%xq@z$IwFF49=igcXzfe5;{t=5R6v5kQUN!q;9@`5YpvygS zeu!Xx_)9UP_jXwGuA^@t$%F@@jV)BwcQfWDwmT`{k2KxXYzP1O@G)|oX=Hdw`M^r_Otd#q1FVa$8mzIR76?tU99SuA}aXmGf$y`e#)U2@0u=u?lMd?u;xPel~9(yV2|`Y8(SU= zh6_*>^AE7B@OD4e{$B)O$HUJ@|Nw5^VfeVrLY?Z(f^F&>*=L#YJ*g;L$1m8AbG8X2Wx>!7fJC8L=`^Gh2Y`+F zqZkiTm`uCkfU!e8P%fm)JVQ=f>GslFw+JqAD&2$*t#AZAX<<06)TOPk;#=w;M{?l8 zhdEJ1tdT*FMZ4~KYtWCNAUgAppzaa&rBPWZ*KjSoA(5}&RBVy;GnKv0wwCSq*HfHK zw{7vc=vi{&Bn00$@V+^Me_7J$mZ9s*eV`J?q>**|p>d8N$cfcD_K*WmNgZ7Qut89? zYhp0^V9l@~*y^8uPfd%Zo88`-fsPWcF5H z3FssGn_7LphAMh!psLzU3cFbRq^q(#n$@4}$GF{$ORlF4vbOJeoe567Qr6JJ3aKoF z|2Eb+&o{Tf8ART@fA%qzu`BX8FXLQV(@0@NfA|!4<*jsk>>yD8HWhoGgnoRivI}(2 z-UXJ*)Xfy=DU%g2ou~x<0y4?Vad+6P?g?}oTr>^CFm64OZ*xENK0{#Rb2(T30)>RCPtdKMF7YP<-;mh=`-X}II#)1^$ zIi>mh&To~+((Vf88=znpixexpT1sxMM^zbWCdoyDYyNrVDTc9z#RTvuCh82Vv;3bfx!ry?&rzotWjwvc3D14>aq*JTy%sj z+@rs~_)#HqJ;sxs zO9`7lDwQN^6$LVDURek?b${l^3Ibf8S=}IDi;^|l427B`8F5(|8UTAhAvQQjj z#qc3lEsk-IoO{XzEUPdg8O++KjJF+Jtv0NU$1)-dQ78ZOnxjXg!tpLh;5QN?=YFY- zLQ0rvkWZD|l0P5HW@&U@B^gU)B$5?el^M#?gVes5Vv&pif^;+ANs29pt&)14z!@oN zSxep55?}7^z_pyFpYscyg0zl|KcG#fOUg*$>YV6k+*4g@1)DTp;5RCfqleZRpvms1 zx^=2j?i?@Z0NZ4{@cV{*$TjO71#p9OQ#ltJL}lFON!L!HeDy;VE)LcOuqvw*TcY0XP~ZbTe+rituA{6 z3#V8RV#oE~9$s~I3pyK`{lW|LX5ADVNk0_1p?z#IW3?X1$e^o5Gqq6G#NI()j$+s| zNoUpa>EenGrMaRuf29(CJO_0nS4Q#gFJqSkGfS8>3pHF@e=Z1|q5|DCKNIb%Znv5M z*XnVB=&{62Ky3>EM$2^5={wAbB+4+}ueU?jLpv`I^_ay8n~f2W<$$;|`c^(5;k8#$ zoyIxb>UK5(#es9krT0NEm=hhrN^~iRv9om<N8}tGjQ|+C7?l9W)~3l&CKUW%JP(4q z@JnD&ZH;Vc6gRDAI6U;Uo6|g8B#!P0e~Nz$pouV)efjGInw7AA?}K%Apmj`NG~joG z4hhBj8?pV_09yd?ypx{$BZb61(bI5ed25sZ9T5tvlbLiuioTyt$z zu0Hv@s%Lpxht_{Z{L#URN{?}RS61egPX(+V!m3 zYwUA8J?FD<(l;#iG}Pz>5B^-lVLH{BW6qaEHC@0y}87|=s4$ftpOQrLW#zbhOl511ztCu_ML0y^vRJ*BeDeD zsBoK^1;b@b4qC<*V-bCuK^6n>Gg0pD`@gR4tdS5@a_7W2U7iwG$5c;CQ1ozY>*FmJ z454U)h{P8M!?(9{cF-+WI%<{P@$&HAYOE>|GFPOG<;^Gn^kdo7J@o{g3i$?NI3(mV4qDW6eEOF-l2Ne#S@+ByI3o$% zLmh@_{xh;(R6geDMC}Nfon)!+-(FzqM_UlC5M$lL3il)7Bj43pCdC6=jDluQs%L%y zU;RF6ng&xiBv171Bl}9ZyCr$blK+5bSYm4y2X2pTqs2L`=c8q%=t|}+Q6nQ8`*IBTn?CTLaybr(_ zj4H)_+~WcJOl$(!-l`=!r-)_Kmp-Hy(=~~)8rBbyg*q~#xFu!!X(0n^iZZv{rD{)b zG*gTL8vA|WWgebNa-K7k^3OT#*Xjqg6W(SuiTu6s%1%EduUO9V4()%UeYjRhK>8k# zBk1I_H|2)Giv_aaQ5lKV+_qFJctm~*)q|;yX-93~>;{$eRMFJ8h6T1ok3-$>60TsF z9Ke(Atq`Q^)B8V1Gy|?NDmKn*FCZVajOisZ7B%D7KWnobl=jmBXSkZgF37QxN(g16 zinrMmG(W*N3ES6y(>0X~@ec7?WJ2!-pxBhTsB+R`dgKO|T5G@CE727>`%EJ;>x3le z#PHCFcvH!cA4Mk`*nEdhwU9Mmf{)~0qkP28C zg8Gx{b#=^P@1%cGB&NvK>BWzUQJ@Whd|JKeK$)P=g#8e@ClgdoMT|?ye{;UiS_AzX zZ`$4;HS)k4_Sg6e)}n9N&$KxFoiJ3_%d%eQwT!*MvrFfs`zEV@p48jRAR86pz4lfd z%V{KJ_THNkGC-!{a@t26;}pL0ZEqM{*X6owP#dM1X5%(;Sw}}}ND09hd%J^IehYvL z{R3l`{n5*~9swI_JJqk6X^d?v$w@0N1jH_#h!?!UzI1K;9Z~O*KjeTT-#WK4&%%?> zL&EX~I5HrFZ-I-?bVQs>d!rx}%T^)!;xAC=-KqpW&y7AjBZN(Rb$MSw6|%Nc0uEGV zc2{zK_GdJ((x1g#gP)n&OCW-uucawUo$p`iE0>suBdwkGJWGQ1<075tuvH_Ejxb

                    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%0DT>fyB|HXxYtUeH);X0N&E=-m}t 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 Cke;Ui literal 0 HcmV?d00001 From ac66487013ba70d0ce39f952ecdbb6962b6c2e41 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 2 Nov 2021 20:21:34 +0000 Subject: [PATCH 435/441] Add missing RetentionPolicy for IntDef PiperOrigin-RevId: 407162673 --- .../android/exoplayer2/source/rtsp/RtspMessageChannel.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageChannel.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageChannel.java index 526f508953..a877d72b13 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageChannel.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageChannel.java @@ -39,6 +39,9 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.net.Socket; import java.nio.charset.Charset; import java.util.ArrayList; @@ -334,6 +337,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Processes RTSP messages line-by-line. */ private static final class MessageParser { + @Documented + @Retention(RetentionPolicy.SOURCE) @IntDef({STATE_READING_FIRST_LINE, STATE_READING_HEADER, STATE_READING_BODY}) @interface ReadingState {} From 9e247d287fc0798582af3149396a05f755dd8fef Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 3 Nov 2021 11:01:07 +0000 Subject: [PATCH 436/441] WavExtractor: split header reading state into 2 states This refactoring is the basis to support RF64 (see Issue: google/ExoPlayer#9543). #minor-release PiperOrigin-RevId: 407301056 --- .../extractor/wav/WavExtractor.java | 135 ++++++++++-------- .../wav/{WavHeader.java => WavFormat.java} | 8 +- .../extractor/wav/WavHeaderReader.java | 57 ++++---- .../exoplayer2/extractor/wav/WavSeekMap.java | 16 +-- 4 files changed, 121 insertions(+), 95 deletions(-) rename library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/{WavHeader.java => WavFormat.java} (91%) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java index 97d98b5fcc..6d3fc254b1 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavExtractor.java @@ -61,12 +61,18 @@ public final class WavExtractor implements Extractor { @Documented @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_USE}) - @IntDef({STATE_READING_HEADER, STATE_SKIPPING_TO_SAMPLE_DATA, STATE_READING_SAMPLE_DATA}) + @IntDef({ + STATE_READING_FILE_TYPE, + STATE_READING_FORMAT, + STATE_SKIPPING_TO_SAMPLE_DATA, + STATE_READING_SAMPLE_DATA + }) private @interface State {} - private static final int STATE_READING_HEADER = 0; - private static final int STATE_SKIPPING_TO_SAMPLE_DATA = 1; - private static final int STATE_READING_SAMPLE_DATA = 2; + private static final int STATE_READING_FILE_TYPE = 0; + private static final int STATE_READING_FORMAT = 1; + private static final int STATE_SKIPPING_TO_SAMPLE_DATA = 2; + private static final int STATE_READING_SAMPLE_DATA = 3; private @MonotonicNonNull ExtractorOutput extractorOutput; private @MonotonicNonNull TrackOutput trackOutput; @@ -76,14 +82,14 @@ public final class WavExtractor implements Extractor { private long dataEndPosition; public WavExtractor() { - state = STATE_READING_HEADER; + state = STATE_READING_FILE_TYPE; dataStartPosition = C.POSITION_UNSET; dataEndPosition = C.POSITION_UNSET; } @Override public boolean sniff(ExtractorInput input) throws IOException { - return WavHeaderReader.peek(input) != null; + return WavHeaderReader.checkFileType(input); } @Override @@ -95,7 +101,7 @@ public final class WavExtractor implements Extractor { @Override public void seek(long position, long timeUs) { - state = position == 0 ? STATE_READING_HEADER : STATE_READING_SAMPLE_DATA; + state = position == 0 ? STATE_READING_FILE_TYPE : STATE_READING_SAMPLE_DATA; if (outputWriter != null) { outputWriter.reset(timeUs); } @@ -111,8 +117,11 @@ public final class WavExtractor implements Extractor { public int read(ExtractorInput input, PositionHolder seekPosition) throws IOException { assertInitialized(); switch (state) { - case STATE_READING_HEADER: - readHeader(input); + case STATE_READING_FILE_TYPE: + readFileType(input); + return Extractor.RESULT_CONTINUE; + case STATE_READING_FORMAT: + readFormat(input); return Extractor.RESULT_CONTINUE; case STATE_SKIPPING_TO_SAMPLE_DATA: skipToSampleData(input); @@ -130,50 +139,54 @@ public final class WavExtractor implements Extractor { Util.castNonNull(extractorOutput); } - @RequiresNonNull({"extractorOutput", "trackOutput"}) - private void readHeader(ExtractorInput input) throws IOException { + private void readFileType(ExtractorInput input) throws IOException { Assertions.checkState(input.getPosition() == 0); if (dataStartPosition != C.POSITION_UNSET) { input.skipFully(dataStartPosition); state = STATE_READING_SAMPLE_DATA; return; } - WavHeader header = WavHeaderReader.peek(input); - if (header == null) { + if (!WavHeaderReader.checkFileType(input)) { // Should only happen if the media wasn't sniffed. throw ParserException.createForMalformedContainer( - "Unsupported or unrecognized wav header.", /* cause= */ null); + "Unsupported or unrecognized wav file type.", /* cause= */ null); } input.skipFully((int) (input.getPeekPosition() - input.getPosition())); + state = STATE_READING_FORMAT; + } - if (header.formatType == WavUtil.TYPE_IMA_ADPCM) { - outputWriter = new ImaAdPcmOutputWriter(extractorOutput, trackOutput, header); - } else if (header.formatType == WavUtil.TYPE_ALAW) { + @RequiresNonNull({"extractorOutput", "trackOutput"}) + private void readFormat(ExtractorInput input) throws IOException { + WavFormat wavFormat = WavHeaderReader.readFormat(input); + if (wavFormat.formatType == WavUtil.TYPE_IMA_ADPCM) { + outputWriter = new ImaAdPcmOutputWriter(extractorOutput, trackOutput, wavFormat); + } else if (wavFormat.formatType == WavUtil.TYPE_ALAW) { outputWriter = new PassthroughOutputWriter( extractorOutput, trackOutput, - header, + wavFormat, MimeTypes.AUDIO_ALAW, /* pcmEncoding= */ Format.NO_VALUE); - } else if (header.formatType == WavUtil.TYPE_MLAW) { + } else if (wavFormat.formatType == WavUtil.TYPE_MLAW) { outputWriter = new PassthroughOutputWriter( extractorOutput, trackOutput, - header, + wavFormat, MimeTypes.AUDIO_MLAW, /* pcmEncoding= */ Format.NO_VALUE); } else { @C.PcmEncoding - int pcmEncoding = WavUtil.getPcmEncodingForType(header.formatType, header.bitsPerSample); + int pcmEncoding = + WavUtil.getPcmEncodingForType(wavFormat.formatType, wavFormat.bitsPerSample); if (pcmEncoding == C.ENCODING_INVALID) { throw ParserException.createForUnsupportedContainerFeature( - "Unsupported WAV format type: " + header.formatType); + "Unsupported WAV format type: " + wavFormat.formatType); } outputWriter = new PassthroughOutputWriter( - extractorOutput, trackOutput, header, MimeTypes.AUDIO_RAW, pcmEncoding); + extractorOutput, trackOutput, wavFormat, MimeTypes.AUDIO_RAW, pcmEncoding); } state = STATE_SKIPPING_TO_SAMPLE_DATA; } @@ -234,7 +247,7 @@ public final class WavExtractor implements Extractor { private final ExtractorOutput extractorOutput; private final TrackOutput trackOutput; - private final WavHeader header; + private final WavFormat wavFormat; private final Format format; /** The target size of each output sample, in bytes. */ private final int targetSampleSizeBytes; @@ -256,33 +269,33 @@ public final class WavExtractor implements Extractor { public PassthroughOutputWriter( ExtractorOutput extractorOutput, TrackOutput trackOutput, - WavHeader header, + WavFormat wavFormat, String mimeType, @C.PcmEncoding int pcmEncoding) throws ParserException { this.extractorOutput = extractorOutput; this.trackOutput = trackOutput; - this.header = header; + this.wavFormat = wavFormat; - int bytesPerFrame = header.numChannels * header.bitsPerSample / 8; - // Validate the header. Blocks are expected to correspond to single frames. - if (header.blockSize != bytesPerFrame) { + int bytesPerFrame = wavFormat.numChannels * wavFormat.bitsPerSample / 8; + // Validate the WAV format. Blocks are expected to correspond to single frames. + if (wavFormat.blockSize != bytesPerFrame) { throw ParserException.createForMalformedContainer( - "Expected block size: " + bytesPerFrame + "; got: " + header.blockSize, + "Expected block size: " + bytesPerFrame + "; got: " + wavFormat.blockSize, /* cause= */ null); } - int constantBitrate = header.frameRateHz * bytesPerFrame * 8; + int constantBitrate = wavFormat.frameRateHz * bytesPerFrame * 8; targetSampleSizeBytes = - max(bytesPerFrame, header.frameRateHz * bytesPerFrame / TARGET_SAMPLES_PER_SECOND); + max(bytesPerFrame, wavFormat.frameRateHz * bytesPerFrame / TARGET_SAMPLES_PER_SECOND); format = new Format.Builder() .setSampleMimeType(mimeType) .setAverageBitrate(constantBitrate) .setPeakBitrate(constantBitrate) .setMaxInputSize(targetSampleSizeBytes) - .setChannelCount(header.numChannels) - .setSampleRate(header.frameRateHz) + .setChannelCount(wavFormat.numChannels) + .setSampleRate(wavFormat.frameRateHz) .setPcmEncoding(pcmEncoding) .build(); } @@ -297,7 +310,7 @@ public final class WavExtractor implements Extractor { @Override public void init(int dataStartPosition, long dataEndPosition) { extractorOutput.seekMap( - new WavSeekMap(header, /* framesPerBlock= */ 1, dataStartPosition, dataEndPosition)); + new WavSeekMap(wavFormat, /* framesPerBlock= */ 1, dataStartPosition, dataEndPosition)); trackOutput.format(format); } @@ -318,13 +331,13 @@ public final class WavExtractor implements Extractor { // Write the corresponding sample metadata. Samples must be a whole number of frames. It's // possible that the number of pending output bytes is not a whole number of frames if the // stream ended unexpectedly. - int bytesPerFrame = header.blockSize; + int bytesPerFrame = wavFormat.blockSize; int pendingFrames = pendingOutputBytes / bytesPerFrame; if (pendingFrames > 0) { long timeUs = startTimeUs + Util.scaleLargeTimestamp( - outputFrameCount, C.MICROS_PER_SECOND, header.frameRateHz); + outputFrameCount, C.MICROS_PER_SECOND, wavFormat.frameRateHz); int size = pendingFrames * bytesPerFrame; int offset = pendingOutputBytes - size; trackOutput.sampleMetadata( @@ -354,7 +367,7 @@ public final class WavExtractor implements Extractor { private final ExtractorOutput extractorOutput; private final TrackOutput trackOutput; - private final WavHeader header; + private final WavFormat wavFormat; /** Number of frames per block of the input (yet to be decoded) data. */ private final int framesPerBlock; @@ -384,23 +397,26 @@ public final class WavExtractor implements Extractor { private long outputFrameCount; public ImaAdPcmOutputWriter( - ExtractorOutput extractorOutput, TrackOutput trackOutput, WavHeader header) + ExtractorOutput extractorOutput, TrackOutput trackOutput, WavFormat wavFormat) throws ParserException { this.extractorOutput = extractorOutput; this.trackOutput = trackOutput; - this.header = header; - targetSampleSizeFrames = max(1, header.frameRateHz / TARGET_SAMPLES_PER_SECOND); + this.wavFormat = wavFormat; + targetSampleSizeFrames = max(1, wavFormat.frameRateHz / TARGET_SAMPLES_PER_SECOND); - ParsableByteArray scratch = new ParsableByteArray(header.extraData); + ParsableByteArray scratch = new ParsableByteArray(wavFormat.extraData); scratch.readLittleEndianUnsignedShort(); framesPerBlock = scratch.readLittleEndianUnsignedShort(); - int numChannels = header.numChannels; - // Validate the header. This calculation is defined in "Microsoft Multimedia Standards Update + int numChannels = wavFormat.numChannels; + // Validate the WAV format. This calculation is defined in "Microsoft Multimedia Standards + // Update // - New Multimedia Types and Data Techniques" (1994). See the "IMA ADPCM Wave Type" and "DVI // ADPCM Wave Type" sections, and the calculation of wSamplesPerBlock in the latter. int expectedFramesPerBlock = - (((header.blockSize - (4 * numChannels)) * 8) / (header.bitsPerSample * numChannels)) + 1; + (((wavFormat.blockSize - (4 * numChannels)) * 8) + / (wavFormat.bitsPerSample * numChannels)) + + 1; if (framesPerBlock != expectedFramesPerBlock) { throw ParserException.createForMalformedContainer( "Expected frames per block: " + expectedFramesPerBlock + "; got: " + framesPerBlock, @@ -410,22 +426,22 @@ public final class WavExtractor implements Extractor { // Calculate the number of blocks we'll need to decode to obtain an output sample of the // target sample size, and allocate suitably sized buffers for input and decoded data. int maxBlocksToDecode = Util.ceilDivide(targetSampleSizeFrames, framesPerBlock); - inputData = new byte[maxBlocksToDecode * header.blockSize]; + inputData = new byte[maxBlocksToDecode * wavFormat.blockSize]; decodedData = new ParsableByteArray( maxBlocksToDecode * numOutputFramesToBytes(framesPerBlock, numChannels)); // Create the format. We calculate the bitrate of the data before decoding, since this is the // bitrate of the stream itself. - int constantBitrate = header.frameRateHz * header.blockSize * 8 / framesPerBlock; + int constantBitrate = wavFormat.frameRateHz * wavFormat.blockSize * 8 / framesPerBlock; format = new Format.Builder() .setSampleMimeType(MimeTypes.AUDIO_RAW) .setAverageBitrate(constantBitrate) .setPeakBitrate(constantBitrate) .setMaxInputSize(numOutputFramesToBytes(targetSampleSizeFrames, numChannels)) - .setChannelCount(header.numChannels) - .setSampleRate(header.frameRateHz) + .setChannelCount(wavFormat.numChannels) + .setSampleRate(wavFormat.frameRateHz) .setPcmEncoding(C.ENCODING_PCM_16BIT) .build(); } @@ -441,7 +457,7 @@ public final class WavExtractor implements Extractor { @Override public void init(int dataStartPosition, long dataEndPosition) { extractorOutput.seekMap( - new WavSeekMap(header, framesPerBlock, dataStartPosition, dataEndPosition)); + new WavSeekMap(wavFormat, framesPerBlock, dataStartPosition, dataEndPosition)); trackOutput.format(format); } @@ -453,7 +469,7 @@ public final class WavExtractor implements Extractor { targetSampleSizeFrames - numOutputBytesToFrames(pendingOutputBytes); // Calculate the whole number of blocks that we need to decode to obtain this many frames. int blocksToDecode = Util.ceilDivide(targetFramesRemaining, framesPerBlock); - int targetReadBytes = blocksToDecode * header.blockSize; + int targetReadBytes = blocksToDecode * wavFormat.blockSize; // Read input data until we've reached the target number of blocks, or the end of the data. boolean endOfSampleData = bytesLeft == 0; @@ -467,11 +483,11 @@ public final class WavExtractor implements Extractor { } } - int pendingBlockCount = pendingInputBytes / header.blockSize; + int pendingBlockCount = pendingInputBytes / wavFormat.blockSize; if (pendingBlockCount > 0) { // We have at least one whole block to decode. decode(inputData, pendingBlockCount, decodedData); - pendingInputBytes -= pendingBlockCount * header.blockSize; + pendingInputBytes -= pendingBlockCount * wavFormat.blockSize; // Write all of the decoded data to the track output. int decodedDataSize = decodedData.limit(); @@ -499,7 +515,8 @@ public final class WavExtractor implements Extractor { private void writeSampleMetadata(int sampleFrames) { long timeUs = startTimeUs - + Util.scaleLargeTimestamp(outputFrameCount, C.MICROS_PER_SECOND, header.frameRateHz); + + Util.scaleLargeTimestamp( + outputFrameCount, C.MICROS_PER_SECOND, wavFormat.frameRateHz); int size = numOutputFramesToBytes(sampleFrames); int offset = pendingOutputBytes - size; trackOutput.sampleMetadata( @@ -517,7 +534,7 @@ public final class WavExtractor implements Extractor { */ private void decode(byte[] input, int blockCount, ParsableByteArray output) { for (int blockIndex = 0; blockIndex < blockCount; blockIndex++) { - for (int channelIndex = 0; channelIndex < header.numChannels; channelIndex++) { + for (int channelIndex = 0; channelIndex < wavFormat.numChannels; channelIndex++) { decodeBlockForChannel(input, blockIndex, channelIndex, output.getData()); } } @@ -528,8 +545,8 @@ public final class WavExtractor implements Extractor { private void decodeBlockForChannel( byte[] input, int blockIndex, int channelIndex, byte[] output) { - int blockSize = header.blockSize; - int numChannels = header.numChannels; + int blockSize = wavFormat.blockSize; + int numChannels = wavFormat.numChannels; // The input data consists for a four byte header [Ci] for each of the N channels, followed // by interleaved data segments [Ci-DATAj], each of which are four bytes long. @@ -590,11 +607,11 @@ public final class WavExtractor implements Extractor { } private int numOutputBytesToFrames(int bytes) { - return bytes / (2 * header.numChannels); + return bytes / (2 * wavFormat.numChannels); } private int numOutputFramesToBytes(int frames) { - return numOutputFramesToBytes(frames, header.numChannels); + return numOutputFramesToBytes(frames, wavFormat.numChannels); } private static int numOutputFramesToBytes(int frames, int numChannels) { diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavFormat.java similarity index 91% rename from library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeader.java rename to library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavFormat.java index ca34e32cc0..ca9e1d8dd7 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavFormat.java @@ -15,8 +15,8 @@ */ package com.google.android.exoplayer2.extractor.wav; -/** Header for a WAV file. */ -/* package */ final class WavHeader { +/** Format information for a WAV file. */ +/* package */ final class WavFormat { /** * The format type. Standard format types are the "WAVE form Registration Number" constants @@ -33,10 +33,10 @@ package com.google.android.exoplayer2.extractor.wav; public final int blockSize; /** Bits per sample for a single channel. */ public final int bitsPerSample; - /** Extra data appended to the format chunk of the header. */ + /** Extra data appended to the format chunk. */ public final byte[] extraData; - public WavHeader( + public WavFormat( int formatType, int numChannels, int frameRateHz, diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java index 147fba9c53..4541a305d6 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavHeaderReader.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.extractor.wav; import android.util.Pair; -import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.audio.WavUtil; @@ -27,45 +26,56 @@ import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.Util; import java.io.IOException; -/** Reads a {@code WavHeader} from an input stream; supports resuming from input failures. */ +/** Reads a WAV header from an input stream; supports resuming from input failures. */ /* package */ final class WavHeaderReader { private static final String TAG = "WavHeaderReader"; /** - * Peeks and returns a {@code WavHeader}. + * Returns whether the given {@code input} starts with a RIFF chunk header, followed by a WAVE + * tag. * - * @param input Input stream to peek the WAV header from. - * @throws ParserException If the input file is an incorrect RIFF WAV. + * @param input The input stream to peek from. The position should point to the start of the + * stream. + * @return Whether the given {@code input} starts with a RIFF chunk header, followed by a WAVE + * tag. * @throws IOException If peeking from the input fails. - * @return A new {@code WavHeader} peeked from {@code input}, or null if the input is not a - * supported WAV format. */ - @Nullable - public static WavHeader peek(ExtractorInput input) throws IOException { - Assertions.checkNotNull(input); - - // Allocate a scratch buffer large enough to store the format chunk. - ParsableByteArray scratch = new ParsableByteArray(16); - + public static boolean checkFileType(ExtractorInput input) throws IOException { + ParsableByteArray scratch = new ParsableByteArray(ChunkHeader.SIZE_IN_BYTES); // Attempt to read the RIFF chunk. ChunkHeader chunkHeader = ChunkHeader.peek(input, scratch); if (chunkHeader.id != WavUtil.RIFF_FOURCC) { - return null; + return false; } input.peekFully(scratch.getData(), 0, 4); scratch.setPosition(0); - int riffFormat = scratch.readInt(); - if (riffFormat != WavUtil.WAVE_FOURCC) { - Log.e(TAG, "Unsupported RIFF format: " + riffFormat); - return null; + int formType = scratch.readInt(); + if (formType != WavUtil.WAVE_FOURCC) { + Log.e(TAG, "Unsupported form type: " + formType); + return false; } + return true; + } + + /** + * Reads and returns a {@code WavFormat}. + * + * @param input Input stream to read the WAV format from. The position should point to the byte + * following the WAVE tag. + * @throws IOException If reading from the input fails. + * @return A new {@code WavFormat} read from {@code input}. + */ + public static WavFormat readFormat(ExtractorInput input) throws IOException { + // Allocate a scratch buffer large enough to store the format chunk. + ParsableByteArray scratch = new ParsableByteArray(16); + // Skip chunks until we find the format chunk. - chunkHeader = ChunkHeader.peek(input, scratch); + ChunkHeader chunkHeader = ChunkHeader.peek(input, scratch); while (chunkHeader.id != WavUtil.FMT_FOURCC) { - input.advancePeekPosition((int) chunkHeader.size); + input.skipFully(ChunkHeader.SIZE_IN_BYTES + (int) chunkHeader.size); chunkHeader = ChunkHeader.peek(input, scratch); } @@ -88,7 +98,8 @@ import java.io.IOException; extraData = Util.EMPTY_BYTE_ARRAY; } - return new WavHeader( + input.skipFully((int) (input.getPeekPosition() - input.getPosition())); + return new WavFormat( audioFormatType, numChannels, frameRateHz, @@ -109,8 +120,6 @@ import java.io.IOException; * @throws IOException If reading from the input fails. */ public static Pair skipToSampleData(ExtractorInput input) throws IOException { - Assertions.checkNotNull(input); - // Make sure the peek position is set to the read position before we peek the first header. input.resetPeekPosition(); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavSeekMap.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavSeekMap.java index 2a92c38431..1d5c8fdae1 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavSeekMap.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/wav/WavSeekMap.java @@ -22,18 +22,18 @@ import com.google.android.exoplayer2.util.Util; /* package */ final class WavSeekMap implements SeekMap { - private final WavHeader wavHeader; + private final WavFormat wavFormat; private final int framesPerBlock; private final long firstBlockPosition; private final long blockCount; private final long durationUs; public WavSeekMap( - WavHeader wavHeader, int framesPerBlock, long dataStartPosition, long dataEndPosition) { - this.wavHeader = wavHeader; + WavFormat wavFormat, int framesPerBlock, long dataStartPosition, long dataEndPosition) { + this.wavFormat = wavFormat; this.framesPerBlock = framesPerBlock; this.firstBlockPosition = dataStartPosition; - this.blockCount = (dataEndPosition - dataStartPosition) / wavHeader.blockSize; + this.blockCount = (dataEndPosition - dataStartPosition) / wavFormat.blockSize; durationUs = blockIndexToTimeUs(blockCount); } @@ -50,17 +50,17 @@ import com.google.android.exoplayer2.util.Util; @Override public SeekPoints getSeekPoints(long timeUs) { // Calculate the containing block index, constraining to valid indices. - long blockIndex = (timeUs * wavHeader.frameRateHz) / (C.MICROS_PER_SECOND * framesPerBlock); + long blockIndex = (timeUs * wavFormat.frameRateHz) / (C.MICROS_PER_SECOND * framesPerBlock); blockIndex = Util.constrainValue(blockIndex, 0, blockCount - 1); - long seekPosition = firstBlockPosition + (blockIndex * wavHeader.blockSize); + long seekPosition = firstBlockPosition + (blockIndex * wavFormat.blockSize); long seekTimeUs = blockIndexToTimeUs(blockIndex); SeekPoint seekPoint = new SeekPoint(seekTimeUs, seekPosition); if (seekTimeUs >= timeUs || blockIndex == blockCount - 1) { return new SeekPoints(seekPoint); } else { long secondBlockIndex = blockIndex + 1; - long secondSeekPosition = firstBlockPosition + (secondBlockIndex * wavHeader.blockSize); + long secondSeekPosition = firstBlockPosition + (secondBlockIndex * wavFormat.blockSize); long secondSeekTimeUs = blockIndexToTimeUs(secondBlockIndex); SeekPoint secondSeekPoint = new SeekPoint(secondSeekTimeUs, secondSeekPosition); return new SeekPoints(seekPoint, secondSeekPoint); @@ -69,6 +69,6 @@ import com.google.android.exoplayer2.util.Util; private long blockIndexToTimeUs(long blockIndex) { return Util.scaleLargeTimestamp( - blockIndex * framesPerBlock, C.MICROS_PER_SECOND, wavHeader.frameRateHz); + blockIndex * framesPerBlock, C.MICROS_PER_SECOND, wavFormat.frameRateHz); } } From 293cf2f865d28a0d498fdac8e66f5925c72477d2 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 3 Nov 2021 11:33:57 +0000 Subject: [PATCH 437/441] Fix broken link on supported-formats dev guide page #minor-release PiperOrigin-RevId: 407305661 --- docs/supported-formats.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/supported-formats.md b/docs/supported-formats.md index 8270866bcd..70b24416a8 100644 --- a/docs/supported-formats.md +++ b/docs/supported-formats.md @@ -92,7 +92,7 @@ FFmpeg decoder name. ## Standalone subtitle formats ## ExoPlayer supports standalone subtitle files in a variety of formats. Subtitle -files can be side-loaded as described on the [Media source page][]. +files can be side-loaded as described on the [media items page][]. | Container format | Supported | MIME type | |---------------------------|:------------:|:----------| @@ -101,7 +101,7 @@ files can be side-loaded as described on the [Media source page][]. | SubRip | YES | MimeTypes.APPLICATION_SUBRIP | | SubStationAlpha (SSA/ASS) | YES | MimeTypes.TEXT_SSA | -[Media source page]: {{ site.baseurl }}/media-sources.html#side-loading-a-subtitle-file +[media items page]: {{ site.baseurl }}/media-items.html#sideloading-subtitle-tracks ## HDR video playback ## From f6e0790a68423a4238095d12d45618843e324a14 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Wed, 3 Nov 2021 11:57:41 +0000 Subject: [PATCH 438/441] Fix END_OF_STREAM transformer timestamp matching previous. This cause the muxer to fail to stop on older devices/API levels. #minor-release PiperOrigin-RevId: 407309028 --- RELEASENOTES.md | 3 +++ .../exoplayer2/transformer/TransformerAudioRenderer.java | 1 + 2 files changed, 4 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 586144ca28..cbf79d1a9d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -90,6 +90,9 @@ * Rename `MediaSessionConnector.QueueNavigator#onCurrentWindowIndexChanged` to `onCurrentMediaItemIndexChanged`. +* Transformer: + * Avoid sending a duplicate timestamp to the encoder with the end of + stream buffer. * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index f20915c120..7efa0eb780 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -316,6 +316,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private void queueEndOfStreamToEncoder(MediaCodecAdapterWrapper encoder) { checkState(checkNotNull(encoderInputBuffer.data).position() == 0); + encoderInputBuffer.timeUs = nextEncoderInputBufferTimeUs; encoderInputBuffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); encoderInputBuffer.flip(); // Queuing EOS should only occur with an empty buffer. From de71fd6eba72721076ed94472dac7a602984a81f Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 3 Nov 2021 12:36:06 +0000 Subject: [PATCH 439/441] Bump version to 2.16.0 PiperOrigin-RevId: 407314385 --- constants.gradle | 4 ++-- .../com/google/android/exoplayer2/ExoPlayerLibraryInfo.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/constants.gradle b/constants.gradle index 400eba8c9f..bd4a545c4c 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.15.1' - releaseVersionCode = 2015001 + releaseVersion = '2.16.0' + releaseVersionCode = 2016000 minSdkVersion = 16 appTargetSdkVersion = 29 // Upgrading this requires [Internal ref: b/193254928] to be fixed, or some 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 9f13465861..4784575659 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.15.1"; + public static final String VERSION = "2.16.0"; /** 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.15.1"; + public static final String VERSION_SLASHY = "ExoPlayerLib/2.16.0"; /** * 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 = 2015001; + public static final int VERSION_INT = 2016000; /** Whether the library was compiled with {@link Assertions} checks enabled. */ public static final boolean ASSERTIONS_ENABLED = true; From 6388dc637623c72cd01b3c0bf6ddf2bc661ac57b Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 3 Nov 2021 14:37:41 +0000 Subject: [PATCH 440/441] Update release notes for 2.16.0 PiperOrigin-RevId: 407333525 --- RELEASENOTES.md | 50 ++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index cbf79d1a9d..f3d1f89a3c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,39 +1,33 @@ # Release notes -### dev-v2 (not yet released) +### 2.16.0 (2021-11-04) * Core Library: + * Deprecate `SimpleExoPlayer`. All functionality has been moved to + `ExoPlayer` instead. `ExoPlayer.Builder` can be used instead of + `SimpleExoPlayer.Builder`. + * Add track selection methods to the `Player` interface, for example, + `Player.getCurrentTracksInfo` and `Player.setTrackSelectionParameters`. + These methods can be used instead of directly accessing the track + selector. * Enable MediaCodec asynchronous queueing by default on devices with API level >= 31. Add methods in `DefaultMediaCodecRendererFactory` and `DefaultRenderersFactory` to force enable or force disable asynchronous queueing ([6348](https://github.com/google/ExoPlayer/issues/6348)). - * Add 12 public method headers to `ExoPlayer` that exist in - `SimpleExoPlayer`, such that all public methods in `SimpleExoPlayer` are - overrides. + * Remove final dependency on `jcenter()`. + * Fix `mediaMetadata` being reset when media is repeated + ([#9458](https://github.com/google/ExoPlayer/issues/9458)). + * Adjust `ExoPlayer` `MediaMetadata` update priority, such that values + input through the `MediaItem.MediaMetadata` are used above media derived + values. * Move `com.google.android.exoplayer2.device.DeviceInfo` to `com.google.android.exoplayer2.DeviceInfo`. * Move `com.google.android.exoplayer2.drm.DecryptionException` to `com.google.android.exoplayer2.decoder.CryptoException`. * Move `com.google.android.exoplayer2.upstream.cache.CachedRegionTracker` to `com.google.android.exoplayer2.upstream.CachedRegionTracker`. - * Remove `ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED`. Use - `GlUtil.glAssertionsEnabled` instead. * Move `Player.addListener(EventListener)` and `Player.removeListener(EventListener)` out of `Player` into subclasses. - * Fix `mediaMetadata` being reset when media is repeated - ([#9458](https://github.com/google/ExoPlayer/issues/9458)). - * Remove final dependency on `jcenter()`. - * Adjust `ExoPlayer` `MediaMetadata` update priority, such that values - input through the `MediaItem.MediaMetadata` are used above media derived - values. -* Video: - * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a - released `Surface` when playing without an app-provided `Surface` - ([#9476](https://github.com/google/ExoPlayer/issues/9476)). -* DRM: - * Log an error (instead of throwing `IllegalStateException`) when calling - `DefaultDrmSession#release()` on a fully released session - ([#9392](https://github.com/google/ExoPlayer/issues/9392)). * Android 12 compatibility: * Keep `DownloadService` started and in the foreground whilst waiting for requirements to be met on Android 12. This is necessary due to new @@ -49,6 +43,14 @@ are not compatible with apps targeting Android 12, and will crash with an `IllegalArgumentException` when creating `PendingIntent`s ([#9181](https://github.com/google/ExoPlayer/issues/9181)). +* Video: + * Fix bug in `MediaCodecVideoRenderer` that resulted in re-using a + released `Surface` when playing without an app-provided `Surface` + ([#9476](https://github.com/google/ExoPlayer/issues/9476)). +* DRM: + * Log an error (instead of throwing `IllegalStateException`) when calling + `DefaultDrmSession#release()` on a fully released session + ([#9392](https://github.com/google/ExoPlayer/issues/9392)). * UI: * `SubtitleView` no longer implements `TextOutput`. `SubtitleView` implements `Player.Listener`, so can be registered to a player with @@ -74,7 +76,7 @@ requirements for downloads to continue. In both cases, `DownloadService` will now remain started and in the foreground whilst waiting for requirements to be met. - * Modify `DownlaodService` behavior when running on Android 12 and above. + * Modify `DownloadService` behavior when running on Android 12 and above. See the "Android 12 compatibility" section above. * RTSP: * Support RFC4566 SDP attribute field grammar @@ -83,6 +85,12 @@ * Populate `Format.sampleMimeType`, `width` and `height` for image `AdaptationSet` elements ([#9500](https://github.com/google/ExoPlayer/issues/9500)). +* HLS: + * Fix rounding error in HLS playlists + ([#9575](https://github.com/google/ExoPlayer/issues/9575)). + * Fix `NoSuchElementException` thrown when an HLS manifest declares + `#EXT-X-RENDITION-REPORT` at the beginning of the playlist + ([#9592](https://github.com/google/ExoPlayer/issues/9592)). * RTMP extension: * Upgrade to `io.antmedia:rtmp_client`, which does not rely on `jcenter()` ([#9591](https://github.com/google/ExoPlayer/issues/9591)). From 7b89c4363c6a0c65b129299182bd60bf0404abcf Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 3 Nov 2021 18:06:31 +0000 Subject: [PATCH 441/441] Update Javadoc for 2.16.0 PiperOrigin-RevId: 407379522 --- docs/doc/reference/allclasses-index.html | 2524 ++++---- docs/doc/reference/allclasses.html | 85 +- docs/doc/reference/allpackages-index.html | 18 +- .../AbstractConcatenatedTimeline.html | 26 +- .../google/android/exoplayer2/BasePlayer.html | 591 +- .../android/exoplayer2/BaseRenderer.html | 37 +- .../google/android/exoplayer2/Bundleable.html | 2 +- .../C.AudioAllowedCapturePolicy.html | 1 + .../exoplayer2/C.AudioContentType.html | 1 + .../android/exoplayer2/C.AudioFlags.html | 1 + ...ry.html => C.AudioManagerOffloadMode.html} | 102 +- .../android/exoplayer2/C.AudioUsage.html | 1 + .../android/exoplayer2/C.CryptoType.html | 187 + .../android/exoplayer2/C.RoleFlags.html | 1 + .../android/exoplayer2/C.SelectionFlags.html | 1 + .../android/exoplayer2/C.SelectionReason.html | 186 + .../android/exoplayer2/C.StreamType.html | 2 +- .../android/exoplayer2/C.TrackType.html | 187 + ...ml => C.VideoChangeFrameRateStrategy.html} | 13 +- .../exoplayer2/C.VideoScalingMode.html | 3 +- .../google/android/exoplayer2/C.WakeMode.html | 1 + .../com/google/android/exoplayer2/C.html | 779 +-- .../android/exoplayer2/ControlDispatcher.html | 576 -- .../exoplayer2/DefaultControlDispatcher.html | 746 --- .../exoplayer2/DefaultLoadControl.html | 39 +- .../exoplayer2/DefaultRenderersFactory.html | 50 +- .../{device => }/DeviceInfo.PlaybackType.html | 42 +- .../exoplayer2/{device => }/DeviceInfo.html | 82 +- .../exoplayer2/ExoPlaybackException.html | 22 +- .../exoplayer2/ExoPlayer.AudioComponent.html | 232 +- .../android/exoplayer2/ExoPlayer.Builder.html | 574 +- .../exoplayer2/ExoPlayer.DeviceComponent.html | 163 +- .../ExoPlayer.MetadataComponent.html | 295 - .../exoplayer2/ExoPlayer.TextComponent.html | 71 +- .../exoplayer2/ExoPlayer.VideoComponent.html | 337 +- .../google/android/exoplayer2/ExoPlayer.html | 880 ++- .../exoplayer2/ExoPlayerLibraryInfo.html | 62 +- .../android/exoplayer2/Format.Builder.html | 41 +- .../com/google/android/exoplayer2/Format.html | 166 +- .../android/exoplayer2/ForwardingPlayer.html | 1046 +-- ...> MediaItem.AdsConfiguration.Builder.html} | 168 +- .../MediaItem.AdsConfiguration.html | 56 +- .../android/exoplayer2/MediaItem.Builder.html | 597 +- ...diaItem.ClippingConfiguration.Builder.html | 434 ++ .../MediaItem.ClippingConfiguration.html | 521 ++ .../MediaItem.ClippingProperties.html | 227 +- .../MediaItem.DrmConfiguration.Builder.html | 503 ++ .../MediaItem.DrmConfiguration.html | 144 +- .../MediaItem.LiveConfiguration.Builder.html | 414 ++ .../MediaItem.LiveConfiguration.html | 68 +- .../MediaItem.LocalConfiguration.html | 490 ++ .../MediaItem.PlaybackProperties.html | 267 +- .../exoplayer2/MediaItem.Subtitle.html | 317 +- ...diaItem.SubtitleConfiguration.Builder.html | 423 ++ .../MediaItem.SubtitleConfiguration.html | 471 ++ .../google/android/exoplayer2/MediaItem.html | 103 +- .../exoplayer2/MediaMetadata.Builder.html | 106 +- .../exoplayer2/MediaMetadata.FolderType.html | 1 + .../exoplayer2/MediaMetadata.PictureType.html | 1 + .../android/exoplayer2/MediaMetadata.html | 8 +- .../android/exoplayer2/NoSampleRenderer.html | 13 +- .../PlaybackException.ErrorCode.html | 1 + .../android/exoplayer2/PlaybackException.html | 30 +- .../exoplayer2/PlaybackParameters.html | 9 +- .../android/exoplayer2/Player.Command.html | 3 +- .../exoplayer2/Player.Commands.Builder.html | 36 +- .../android/exoplayer2/Player.Commands.html | 10 +- .../Player.DiscontinuityReason.html | 1 + .../android/exoplayer2/Player.Event.html | 1 + .../exoplayer2/Player.EventListener.html | 188 +- .../android/exoplayer2/Player.Events.html | 16 +- .../android/exoplayer2/Player.Listener.html | 194 +- .../Player.MediaItemTransitionReason.html | 1 + .../Player.PlayWhenReadyChangeReason.html | 1 + .../Player.PlaybackSuppressionReason.html | 1 + .../exoplayer2/Player.PositionInfo.html | 102 +- .../android/exoplayer2/Player.RepeatMode.html | 1 + .../android/exoplayer2/Player.State.html | 1 + .../Player.TimelineChangeReason.html | 1 + .../com/google/android/exoplayer2/Player.html | 1471 +++-- .../exoplayer2/PlayerMessage.Target.html | 3 +- .../android/exoplayer2/PlayerMessage.html | 72 +- .../exoplayer2/Renderer.MessageType.html | 186 + .../google/android/exoplayer2/Renderer.html | 140 +- .../exoplayer2/RendererCapabilities.html | 6 +- .../android/exoplayer2/RenderersFactory.html | 6 +- .../exoplayer2/SimpleExoPlayer.Builder.html | 660 +- .../android/exoplayer2/SimpleExoPlayer.html | 1522 +++-- .../Timeline.RemotableTimeline.html | 26 +- .../google/android/exoplayer2/Timeline.html | 137 +- .../exoplayer2/TracksInfo.TrackGroupInfo.html | 584 ++ .../google/android/exoplayer2/TracksInfo.html | 502 ++ .../analytics/AnalyticsCollector.html | 212 +- .../AnalyticsListener.EventTime.html | 6 +- .../analytics/AnalyticsListener.html | 220 +- .../DefaultPlaybackSessionManager.html | 14 +- .../analytics/PlaybackSessionManager.html | 10 +- .../analytics/PlaybackStatsListener.html | 30 +- .../android/exoplayer2/audio/AacUtil.html | 25 +- .../android/exoplayer2/audio/Ac3Util.html | 30 +- .../audio/AudioAttributes.Builder.html | 24 +- .../exoplayer2/audio/AudioAttributes.html | 16 +- .../exoplayer2/audio/AudioListener.html | 337 - .../exoplayer2/audio/AudioProcessor.html | 2 +- .../audio/DecoderAudioRenderer.html | 29 +- .../audio/MediaCodecAudioRenderer.html | 15 +- .../android/exoplayer2/audio/OpusUtil.html | 52 +- .../exoplayer2/audio/TeeAudioProcessor.html | 4 +- .../exoplayer2/audio/package-summary.html | 18 +- .../exoplayer2/audio/package-tree.html | 1 - .../exoplayer2/database/DatabaseProvider.html | 8 +- .../database/ExoDatabaseProvider.html | 176 +- .../database/StandaloneDatabaseProvider.html | 446 ++ .../exoplayer2/database/VersionTable.html | 4 +- .../exoplayer2/database/package-summary.html | 14 +- .../exoplayer2/database/package-tree.html | 6 +- .../android/exoplayer2/decoder/Buffer.html | 2 +- .../CryptoConfig.html} | 15 +- .../CryptoException.html} | 24 +- .../exoplayer2/decoder/CryptoInfo.html | 4 +- .../android/exoplayer2/decoder/Decoder.html | 2 +- .../decoder/DecoderInputBuffer.html | 24 +- ...er.html => DecoderOutputBuffer.Owner.html} | 16 +- ...utBuffer.html => DecoderOutputBuffer.html} | 20 +- .../exoplayer2/decoder/SimpleDecoder.html | 20 +- ...er.html => SimpleDecoderOutputBuffer.html} | 38 +- .../VideoDecoderOutputBuffer.html | 48 +- .../exoplayer2/decoder/package-summary.html | 42 +- .../exoplayer2/decoder/package-tree.html | 9 +- .../drm/DefaultDrmSessionManager.Builder.html | 8 +- .../drm/DefaultDrmSessionManager.html | 30 +- .../drm/DefaultDrmSessionManagerProvider.html | 4 +- .../drm/DrmSession.DrmSessionException.html | 12 +- .../android/exoplayer2/drm/DrmSession.html | 48 +- .../exoplayer2/drm/DrmSessionManager.html | 36 +- .../android/exoplayer2/drm/DrmUtil.html | 8 +- .../exoplayer2/drm/DummyExoMediaDrm.html | 80 +- .../exoplayer2/drm/ErrorStateDrmSession.html | 57 +- .../android/exoplayer2/drm/ExoMediaDrm.html | 73 +- ...Crypto.html => FrameworkCryptoConfig.html} | 32 +- .../exoplayer2/drm/FrameworkMediaDrm.html | 84 +- .../exoplayer2/drm/package-summary.html | 41 +- .../android/exoplayer2/drm/package-tree.html | 5 +- .../exoplayer2/ext/av1/Gav1Decoder.html | 50 +- .../ext/av1/Libgav1VideoRenderer.html | 36 +- .../exoplayer2/ext/cast/CastPlayer.html | 386 +- .../ext/cronet/CronetDataSource.Factory.html | 48 +- .../CronetDataSource.OpenException.html | 46 +- .../ext/cronet/CronetDataSourceFactory.html | 2 +- .../ext/cronet/CronetEngineWrapper.html | 4 +- .../exoplayer2/ext/cronet/CronetUtil.html | 39 +- .../ext/ffmpeg/FfmpegAudioRenderer.html | 22 +- .../exoplayer2/ext/flac/FlacDecoder.html | 30 +- .../ext/flac/LibflacAudioRenderer.html | 22 +- .../exoplayer2/ext/gvr/GvrAudioProcessor.html | 593 -- .../exoplayer2/ext/gvr/package-tree.html | 159 - .../ext/ima/ImaAdsLoader.Builder.html | 9 +- .../exoplayer2/ext/ima/ImaAdsLoader.html | 61 +- .../ext/leanback/LeanbackPlayerAdapter.html | 37 +- .../ext/media2/SessionPlayerConnector.html | 46 +- ...MediaSessionConnector.CaptionCallback.html | 2 +- ...MediaSessionConnector.CommandReceiver.html | 11 +- ...SessionConnector.CustomActionProvider.html | 11 +- ...sionConnector.MediaButtonEventHandler.html | 11 +- ...ediaSessionConnector.PlaybackPreparer.html | 2 +- .../MediaSessionConnector.QueueEditor.html | 2 +- .../MediaSessionConnector.QueueNavigator.html | 59 +- .../MediaSessionConnector.RatingCallback.html | 2 +- .../mediasession/MediaSessionConnector.html | 60 +- .../RepeatModeActionProvider.html | 15 +- .../ext/mediasession/TimelineQueueEditor.html | 15 +- .../mediasession/TimelineQueueNavigator.html | 80 +- .../ext/okhttp/OkHttpDataSource.Factory.html | 40 +- .../ext/okhttp/OkHttpDataSourceFactory.html | 2 +- .../ext/opus/LibopusAudioRenderer.html | 22 +- .../exoplayer2/ext/opus/OpusDecoder.html | 42 +- .../exoplayer2/ext/opus/OpusLibrary.html | 39 +- .../exoplayer2/ext/rtmp/RtmpDataSource.html | 4 +- .../ext/vp9/LibvpxVideoRenderer.html | 36 +- .../exoplayer2/ext/vp9/VpxDecoder.html | 62 +- .../exoplayer2/ext/vp9/VpxLibrary.html | 35 +- .../WorkManagerScheduler.SchedulerWorker.html | 2 +- .../extractor/ConstantBitrateSeekMap.html | 40 +- .../extractor/DefaultExtractorsFactory.html | 55 +- .../extractor/DummyExtractorOutput.html | 11 +- .../exoplayer2/extractor/Extractor.html | 2 +- .../exoplayer2/extractor/ExtractorOutput.html | 15 +- .../extractor/FlacMetadataReader.html | 2 +- .../extractor/TrueHdSampleRechunker.html | 365 ++ .../extractor/amr/AmrExtractor.Flags.html | 2 +- .../extractor/amr/AmrExtractor.html | 29 +- .../flac}/FlacConstants.html | 60 +- .../extractor/flac/package-summary.html | 6 + .../extractor/flac/package-tree.html | 1 + .../jpeg/StartOffsetExtractorOutput.html | 11 +- .../extractor/mp3/Mp3Extractor.Flags.html | 3 +- .../extractor/mp3/Mp3Extractor.html | 29 + .../exoplayer2/extractor/mp4/Track.html | 12 +- .../exoplayer2/extractor/package-summary.html | 14 +- .../exoplayer2/extractor/package-tree.html | 1 + .../extractor/ts/AdtsExtractor.Flags.html | 2 +- .../extractor/ts/AdtsExtractor.html | 29 +- .../exoplayer2/extractor/ts/TsExtractor.html | 42 +- .../extractor/wav/WavExtractor.html | 3 +- .../DefaultMediaCodecAdapterFactory.html | 411 ++ .../MediaCodecAdapter.Configuration.html | 239 +- .../mediacodec/MediaCodecAdapter.Factory.html | 2 +- .../mediacodec/MediaCodecAdapter.html | 71 +- .../mediacodec/MediaCodecRenderer.html | 189 +- .../SynchronousMediaCodecAdapter.html | 75 +- .../mediacodec/package-summary.html | 16 +- .../exoplayer2/mediacodec/package-tree.html | 1 + .../exoplayer2/metadata/Metadata.Entry.html | 2 +- .../metadata/MetadataInputBuffer.html | 2 +- .../exoplayer2/metadata/MetadataOutput.html | 8 - .../exoplayer2/metadata/MetadataRenderer.html | 6 +- .../android/exoplayer2/offline/Download.html | 10 +- .../exoplayer2/offline/DownloadManager.html | 3 +- .../exoplayer2/offline/DownloadRequest.html | 2 +- .../exoplayer2/offline/DownloadService.html | 134 +- .../android/exoplayer2/package-summary.html | 207 +- .../android/exoplayer2/package-tree.html | 64 +- .../robolectric/PlaybackOutput.html | 8 +- .../robolectric/TestPlayerRunHelper.html | 64 +- .../robolectric/package-summary.html | 4 +- ...ormScheduler.PlatformSchedulerService.html | 4 +- .../source/ClippingMediaPeriod.html | 25 +- ...tMediaSourceFactory.AdsLoaderProvider.html | 8 +- .../source/DefaultMediaSourceFactory.html | 102 +- .../exoplayer2/source/ForwardingTimeline.html | 26 +- .../exoplayer2/source/LoopingMediaSource.html | 4 +- ...askingMediaSource.PlaceholderTimeline.html | 2 +- .../exoplayer2/source/MediaLoadData.html | 26 +- .../exoplayer2/source/MediaSource.html | 8 +- ...iaSourceEventListener.EventDispatcher.html | 43 +- .../exoplayer2/source/MediaSourceFactory.html | 63 +- .../ProgressiveMediaSource.Factory.html | 25 +- .../source/SilenceMediaSource.Factory.html | 9 +- .../source/SinglePeriodTimeline.html | 4 +- .../SingleSampleMediaSource.Factory.html | 66 +- .../android/exoplayer2/source/TrackGroup.html | 81 +- .../exoplayer2/source/TrackGroupArray.html | 85 +- .../source/ads/AdPlaybackState.AdGroup.html | 17 +- .../source/ads/AdPlaybackState.html | 51 +- .../source/ads/SinglePeriodAdTimeline.html | 4 +- .../source/chunk/BaseMediaChunk.html | 1 + .../source/chunk/BaseMediaChunkOutput.html | 15 +- .../source/chunk/BundledChunkExtractor.html | 21 +- .../exoplayer2/source/chunk/Chunk.html | 11 +- .../source/chunk/ChunkExtractor.Factory.html | 8 +- .../ChunkExtractor.TrackOutputProvider.html | 11 +- .../source/chunk/ChunkSampleStream.html | 15 +- .../source/chunk/ContainerMediaChunk.html | 1 + .../exoplayer2/source/chunk/DataChunk.html | 1 + .../source/chunk/InitializationChunk.html | 1 + .../exoplayer2/source/chunk/MediaChunk.html | 1 + .../chunk/MediaParserChunkExtractor.html | 9 +- .../source/chunk/SingleSampleMediaChunk.html | 12 +- .../source/dash/DashChunkSource.Factory.html | 12 +- .../source/dash/DashMediaSource.Factory.html | 31 +- .../exoplayer2/source/dash/DashUtil.html | 8 +- .../dash/DefaultDashChunkSource.Factory.html | 16 +- .../source/dash/DefaultDashChunkSource.html | 21 +- .../source/dash/manifest/AdaptationSet.html | 20 +- .../dash/manifest/DashManifestParser.html | 46 +- .../source/dash/offline/DashDownloader.html | 2 +- .../exoplayer2/source/hls/HlsMediaPeriod.html | 9 +- .../source/hls/HlsMediaSource.Factory.html | 32 +- .../hls/HlsMediaSource.MetadataType.html | 3 +- .../source/hls/offline/HlsDownloader.html | 2 +- .../mediaparser/OutputConsumerAdapterV30.html | 15 +- .../exoplayer2/source/package-summary.html | 4 +- .../exoplayer2/source/package-tree.html | 4 +- .../source/rtsp/RtspMediaSource.Factory.html | 73 +- .../SsMediaSource.Factory.html | 25 +- .../manifest/SsManifest.StreamElement.html | 12 +- .../smoothstreaming/offline/SsDownloader.html | 2 +- .../testutil/Action.AddMediaItems.html | 18 +- .../testutil/Action.ClearMediaItems.html | 18 +- .../testutil/Action.ClearVideoSurface.html | 18 +- .../testutil/Action.ExecuteRunnable.html | 16 +- .../testutil/Action.MoveMediaItem.html | 18 +- .../testutil/Action.PlayUntilPosition.html | 38 +- .../exoplayer2/testutil/Action.Prepare.html | 16 +- .../testutil/Action.RemoveMediaItem.html | 18 +- .../testutil/Action.RemoveMediaItems.html | 18 +- .../exoplayer2/testutil/Action.Seek.html | 22 +- .../testutil/Action.SendMessages.html | 22 +- .../testutil/Action.SetAudioAttributes.html | 18 +- .../testutil/Action.SetMediaItems.html | 24 +- .../Action.SetMediaItemsResetPosition.html | 18 +- .../testutil/Action.SetPlayWhenReady.html | 16 +- .../Action.SetPlaybackParameters.html | 16 +- .../testutil/Action.SetRendererDisabled.html | 16 +- .../testutil/Action.SetRepeatMode.html | 26 +- .../Action.SetShuffleModeEnabled.html | 16 +- .../testutil/Action.SetShuffleOrder.html | 16 +- .../testutil/Action.SetVideoSurface.html | 18 +- .../exoplayer2/testutil/Action.Stop.html | 16 +- .../Action.ThrowPlaybackException.html | 16 +- .../testutil/Action.WaitForIsLoading.html | 30 +- .../testutil/Action.WaitForMessage.html | 30 +- .../Action.WaitForPendingPlayerCommands.html | 30 +- .../testutil/Action.WaitForPlayWhenReady.html | 32 +- .../testutil/Action.WaitForPlaybackState.html | 40 +- .../Action.WaitForPositionDiscontinuity.html | 32 +- .../Action.WaitForTimelineChanged.html | 40 +- .../android/exoplayer2/testutil/Action.html | 56 +- .../testutil/ActionSchedule.Builder.html | 88 +- .../ActionSchedule.PlayerRunnable.html | 6 +- .../testutil/ActionSchedule.PlayerTarget.html | 9 +- .../testutil/AdditionalFailureInfo.html | 4 +- .../testutil/AssetContentProvider.html | 535 ++ .../testutil/CapturingRenderersFactory.html | 4 +- .../DefaultRenderersFactoryAsserts.html | 8 +- .../exoplayer2/testutil/ExoHostedTest.html | 26 +- .../testutil/ExoPlayerTestRunner.Builder.html | 17 +- .../testutil/ExoPlayerTestRunner.html | 231 +- .../testutil/FakeAdaptiveMediaSource.html | 2 +- .../testutil/FakeAudioRenderer.html | 12 +- .../FakeCryptoConfig.html} | 78 +- .../testutil/FakeExoMediaDrm.Builder.html | 46 +- .../FakeExoMediaDrm.LicenseServer.html | 31 +- .../exoplayer2/testutil/FakeExoMediaDrm.html | 91 +- .../testutil/FakeExtractorOutput.html | 11 +- .../exoplayer2/testutil/FakeMediaChunk.html | 3 +- .../testutil/FakeMediaClockRenderer.html | 10 +- .../FakeMediaSource.InitialTimeline.html | 4 +- .../exoplayer2/testutil/FakeMediaSource.html | 49 +- .../testutil/FakeMediaSourceFactory.html | 570 ++ .../testutil/FakeMetadataEntry.html | 456 ++ .../exoplayer2/testutil/FakeRenderer.html | 111 +- .../exoplayer2/testutil/FakeTimeline.html | 26 +- .../testutil/FakeTrackSelection.html | 7 + .../testutil/FakeTrackSelector.html | 2 +- .../testutil/FakeVideoRenderer.html | 15 +- .../exoplayer2/testutil/HostActivity.html | 6 +- .../exoplayer2/testutil/NoUidTimeline.html | 4 +- .../exoplayer2/testutil/StubExoPlayer.html | 2360 ++----- .../exoplayer2/testutil/StubPlayer.html | 1958 ++++++ .../testutil/TestExoPlayerBuilder.html | 77 +- .../android/exoplayer2/testutil/TestUtil.html | 66 +- .../exoplayer2/testutil/TimelineAsserts.html | 34 +- .../exoplayer2/testutil/package-summary.html | 137 +- .../exoplayer2/testutil/package-tree.html | 12 + .../exoplayer2/text/Cue.AnchorType.html | 1 + .../android/exoplayer2/text/Cue.Builder.html | 78 +- .../android/exoplayer2/text/Cue.LineType.html | 1 + .../exoplayer2/text/Cue.TextSizeType.html | 1 + .../exoplayer2/text/Cue.VerticalType.html | 1 + .../google/android/exoplayer2/text/Cue.html | 78 +- .../CueDecoder.html} | 133 +- .../android/exoplayer2/text/CueEncoder.html | 312 + .../exoplayer2/text/ExoplayerCuesDecoder.html | 472 ++ .../exoplayer2/text/SubtitleDecoder.html | 2 +- .../text/SubtitleDecoderFactory.html | 1 + .../exoplayer2/text/SubtitleExtractor.html | 493 ++ .../exoplayer2/text/SubtitleInputBuffer.html | 2 +- .../exoplayer2/text/SubtitleOutputBuffer.html | 22 +- .../android/exoplayer2/text/TextOutput.html | 8 - .../android/exoplayer2/text/TextRenderer.html | 6 +- .../exoplayer2/text/package-summary.html | 24 + .../android/exoplayer2/text/package-tree.html | 6 +- .../AdaptiveTrackSelection.Factory.html | 115 +- .../AdaptiveTrackSelection.html | 67 +- .../trackselection/BaseTrackSelection.html | 15 +- .../DefaultTrackSelector.Parameters.html | 106 +- ...efaultTrackSelector.ParametersBuilder.html | 222 +- ...efaultTrackSelector.SelectionOverride.html | 92 +- .../trackselection/DefaultTrackSelector.html | 158 +- .../ExoTrackSelection.Definition.html | 12 +- .../trackselection/ExoTrackSelection.html | 7 + .../trackselection/FixedTrackSelection.html | 23 +- .../MappingTrackSelector.MappedTrackInfo.html | 14 +- .../trackselection/MappingTrackSelector.html | 2 +- .../trackselection/RandomTrackSelection.html | 7 + .../TrackSelection.Type.html} | 101 +- .../trackselection/TrackSelection.html | 33 +- .../TrackSelectionOverrides.Builder.html | 381 ++ ...ctionOverrides.TrackSelectionOverride.html | 488 ++ .../TrackSelectionOverrides.html | 484 ++ .../TrackSelectionParameters.Builder.html | 156 +- .../TrackSelectionParameters.html | 188 +- .../trackselection/TrackSelectionUtil.html | 21 +- .../trackselection/TrackSelector.html | 67 +- .../trackselection/TrackSelectorResult.html | 58 +- .../trackselection/package-summary.html | 43 +- .../trackselection/package-tree.html | 15 +- .../TranscodingTransformer.Builder.html | 620 ++ .../TranscodingTransformer.Listener.html} | 71 +- ...TranscodingTransformer.ProgressState.html} | 76 +- .../transformer/TranscodingTransformer.html | 616 ++ .../exoplayer2/transformer/Transformer.html | 14 +- .../transformer/package-summary.html | 24 + .../exoplayer2/transformer/package-tree.html | 4 + .../exoplayer2/ui/AspectRatioFrameLayout.html | 6 +- .../android/exoplayer2/ui/DefaultTimeBar.html | 4 +- .../ui/DownloadNotificationHelper.html | 47 +- .../exoplayer2/ui/PlayerControlView.html | 68 +- .../ui/PlayerNotificationManager.Builder.html | 1 + .../ui/PlayerNotificationManager.html | 74 +- .../android/exoplayer2/ui/PlayerView.html | 104 +- .../ui/StyledPlayerControlView.html | 74 +- .../exoplayer2/ui/StyledPlayerView.html | 108 +- .../android/exoplayer2/ui/SubtitleView.html | 36 +- .../exoplayer2/ui/TrackSelectionView.html | 6 +- .../android/exoplayer2/ui/package-tree.html | 2 +- ...etDataSource.AssetDataSourceException.html | 12 +- .../{cache => }/CachedRegionTracker.html | 126 +- ...DataSource.ContentDataSourceException.html | 12 +- .../exoplayer2/upstream/DataSink.Factory.html | 2 +- .../upstream/DataSource.Factory.html | 2 +- .../upstream/DataSourceException.html | 34 +- .../exoplayer2/upstream/DataSourceUtil.html | 331 + .../upstream/DefaultBandwidthMeter.html | 34 +- .../upstream/DefaultDataSource.Factory.html | 379 ++ .../upstream/DefaultDataSource.html | 22 +- .../upstream/DefaultDataSourceFactory.html | 25 +- .../DefaultHttpDataSource.Factory.html | 46 +- .../DefaultHttpDataSourceFactory.html | 474 -- .../DefaultLoadErrorHandlingPolicy.html | 6 +- ...ileDataSource.FileDataSourceException.html | 24 +- .../upstream/HttpDataSource.BaseFactory.html | 34 +- .../upstream/HttpDataSource.Factory.html | 30 +- ...ttpDataSource.HttpDataSourceException.html | 88 +- ...y.html => PriorityDataSource.Factory.html} | 73 +- .../upstream/PriorityDataSource.html | 22 +- .../upstream/PriorityDataSourceFactory.html | 20 +- ...Source.RawResourceDataSourceException.html | 16 +- .../{util => upstream}/SlidingPercentile.html | 4 +- .../UdpDataSource.UdpDataSourceException.html | 8 +- .../upstream/cache/Cache.Listener.html | 2 +- .../cache/CacheDataSourceFactory.html | 430 -- .../upstream/cache/package-summary.html | 33 +- .../upstream/cache/package-tree.html | 3 - .../upstream/crypto/AesFlushingCipher.html | 20 + .../exoplayer2/upstream/package-summary.html | 81 +- .../exoplayer2/upstream/package-tree.html | 12 +- ...ndleableUtils.html => BundleableUtil.html} | 123 +- .../util/CodecSpecificDataUtil.html | 25 +- .../exoplayer2/util/DebugTextViewHelper.html | 63 +- .../android/exoplayer2/util/EventLogger.html | 80 +- .../exoplayer2/util/GlUtil.Attribute.html | 23 +- .../exoplayer2/util/GlUtil.GlException.html | 302 + ...dOutputStream.html => GlUtil.Program.html} | 271 +- .../exoplayer2/util/GlUtil.Uniform.html | 22 +- ...GlUtil.UnsupportedEglVersionException.html | 294 + .../android/exoplayer2/util/GlUtil.html | 316 +- .../exoplayer2/util/ListenerSet.Event.html | 2 +- .../ListenerSet.IterationFinishedEvent.html | 2 +- .../android/exoplayer2/util/ListenerSet.html | 4 +- .../exoplayer2/util/MediaFormatUtil.html | 28 +- .../android/exoplayer2/util/MimeTypes.html | 176 +- .../util/NalUnitUtil.H265SpsData.html | 455 ++ .../exoplayer2/util/NalUnitUtil.SpsData.html | 14 +- .../android/exoplayer2/util/NalUnitUtil.html | 145 +- .../exoplayer2/util/RepeatModeUtil.html | 18 +- .../google/android/exoplayer2/util/Util.html | 455 +- .../exoplayer2/util/package-summary.html | 75 +- .../android/exoplayer2/util/package-tree.html | 22 +- .../android/exoplayer2/video/AvcConfig.html | 42 +- .../android/exoplayer2/video/ColorInfo.html | 71 +- .../video/DecoderVideoRenderer.html | 65 +- .../exoplayer2/video/DummySurface.html | 4 +- .../android/exoplayer2/video/HevcConfig.html | 78 +- .../video/MediaCodecVideoRenderer.html | 73 +- .../video/VideoDecoderGLSurfaceView.html | 20 +- .../video/VideoDecoderInputBuffer.html | 396 -- .../VideoDecoderOutputBufferRenderer.html | 8 +- .../video/VideoFrameReleaseHelper.html | 20 +- .../exoplayer2/video/VideoListener.html | 347 - .../exoplayer2/video/package-summary.html | 22 +- .../exoplayer2/video/package-tree.html | 17 +- .../video/spherical/CameraMotionRenderer.html | 9 +- .../spherical/SphericalGLSurfaceView.html | 6 +- docs/doc/reference/constant-values.html | 1269 ++-- docs/doc/reference/deprecated-list.html | 1429 +++-- docs/doc/reference/element-list | 2 - docs/doc/reference/index-all.html | 5614 +++++++++++------ docs/doc/reference/index.html | 156 +- docs/doc/reference/member-search-index.js | 2 +- docs/doc/reference/member-search-index.zip | Bin 136486 -> 140976 bytes docs/doc/reference/overview-tree.html | 166 +- docs/doc/reference/package-search-index.js | 2 +- docs/doc/reference/package-search-index.zip | Bin 706 -> 697 bytes docs/doc/reference/serialized-form.html | 50 +- docs/doc/reference/type-search-index.js | 2 +- docs/doc/reference/type-search-index.zip | Bin 10091 -> 10295 bytes 488 files changed, 37457 insertions(+), 21429 deletions(-) rename docs/doc/reference/com/google/android/exoplayer2/{ext/gvr/package-summary.html => C.AudioManagerOffloadMode.html} (51%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/C.CryptoType.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/C.SelectionReason.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/C.TrackType.html rename docs/doc/reference/com/google/android/exoplayer2/{Renderer.VideoScalingMode.html => C.VideoChangeFrameRateStrategy.html} (89%) delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/ControlDispatcher.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/DefaultControlDispatcher.html rename docs/doc/reference/com/google/android/exoplayer2/{device => }/DeviceInfo.PlaybackType.html (75%) rename docs/doc/reference/com/google/android/exoplayer2/{device => }/DeviceInfo.html (80%) delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.MetadataComponent.html rename docs/doc/reference/com/google/android/exoplayer2/{upstream/cache/CacheDataSinkFactory.html => MediaItem.AdsConfiguration.Builder.html} (60%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.Builder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.Builder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.LiveConfiguration.Builder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.LocalConfiguration.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.Builder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/Renderer.MessageType.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/TracksInfo.TrackGroupInfo.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/TracksInfo.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/audio/AudioListener.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/database/StandaloneDatabaseProvider.html rename docs/doc/reference/com/google/android/exoplayer2/{drm/ExoMediaCrypto.html => decoder/CryptoConfig.html} (88%) rename docs/doc/reference/com/google/android/exoplayer2/{drm/DecryptionException.html => decoder/CryptoException.html} (93%) rename docs/doc/reference/com/google/android/exoplayer2/decoder/{OutputBuffer.Owner.html => DecoderOutputBuffer.Owner.html} (89%) rename docs/doc/reference/com/google/android/exoplayer2/decoder/{OutputBuffer.html => DecoderOutputBuffer.html} (92%) rename docs/doc/reference/com/google/android/exoplayer2/decoder/{SimpleOutputBuffer.html => SimpleDecoderOutputBuffer.html} (86%) rename docs/doc/reference/com/google/android/exoplayer2/{video => decoder}/VideoDecoderOutputBuffer.html (87%) rename docs/doc/reference/com/google/android/exoplayer2/drm/{FrameworkMediaCrypto.html => FrameworkCryptoConfig.html} (88%) delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-tree.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/extractor/TrueHdSampleRechunker.html rename docs/doc/reference/com/google/android/exoplayer2/{util => extractor/flac}/FlacConstants.html (82%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/testutil/AssetContentProvider.html rename docs/doc/reference/com/google/android/exoplayer2/{drm/UnsupportedMediaCrypto.html => testutil/FakeCryptoConfig.html} (80%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMetadataEntry.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/testutil/StubPlayer.html rename docs/doc/reference/com/google/android/exoplayer2/{util/IntArrayQueue.html => text/CueDecoder.html} (72%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/text/CueEncoder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/text/SubtitleExtractor.html rename docs/doc/reference/com/google/android/exoplayer2/{device/package-summary.html => trackselection/TrackSelection.Type.html} (66%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.Builder.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/transformer/TranscodingTransformer.Builder.html rename docs/doc/reference/com/google/android/exoplayer2/{device/DeviceListener.html => transformer/TranscodingTransformer.Listener.html} (69%) rename docs/doc/reference/com/google/android/exoplayer2/{device/package-tree.html => transformer/TranscodingTransformer.ProgressState.html} (66%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/transformer/TranscodingTransformer.html rename docs/doc/reference/com/google/android/exoplayer2/upstream/{cache => }/CachedRegionTracker.html (65%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/DataSourceUtil.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultDataSource.Factory.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.html rename docs/doc/reference/com/google/android/exoplayer2/upstream/{FileDataSourceFactory.html => PriorityDataSource.Factory.html} (78%) rename docs/doc/reference/com/google/android/exoplayer2/{util => upstream}/SlidingPercentile.html (99%) delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.html rename docs/doc/reference/com/google/android/exoplayer2/util/{BundleableUtils.html => BundleableUtil.html} (58%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/util/GlUtil.GlException.html rename docs/doc/reference/com/google/android/exoplayer2/util/{ReusableBufferedOutputStream.html => GlUtil.Program.html} (52%) create mode 100644 docs/doc/reference/com/google/android/exoplayer2/util/GlUtil.UnsupportedEglVersionException.html create mode 100644 docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.H265SpsData.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/video/VideoDecoderInputBuffer.html delete mode 100644 docs/doc/reference/com/google/android/exoplayer2/video/VideoListener.html diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html index 0b597a9f2a..f99c81d555 100644 --- a/docs/doc/reference/allclasses-index.html +++ b/docs/doc/reference/allclasses-index.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":8,"i92":2,"i93":2,"i94":2,"i95":2,"i96":2,"i97":1,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":2,"i126":2,"i127":8,"i128":2,"i129":2,"i130":2,"i131":2,"i132":2,"i133":1,"i134":2,"i135":1,"i136":2,"i137":1,"i138":1,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":2,"i146":2,"i147":2,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":32,"i169":32,"i170":32,"i171":32,"i172":1,"i173":8,"i174":1,"i175":2,"i176":2,"i177":2,"i178":8,"i179":2,"i180":2,"i181":2,"i182":32,"i183":1,"i184":2,"i185":32,"i186":2,"i187":2,"i188":1,"i189":1,"i190":2,"i191":2,"i192":1,"i193":1,"i194":2,"i195":2,"i196":32,"i197":2,"i198":2,"i199":2,"i200":2,"i201":2,"i202":2,"i203":2,"i204":2,"i205":2,"i206":1,"i207":1,"i208":1,"i209":2,"i210":2,"i211":2,"i212":1,"i213":1,"i214":2,"i215":2,"i216":8,"i217":32,"i218":1,"i219":2,"i220":2,"i221":2,"i222":2,"i223":2,"i224":2,"i225":1,"i226":2,"i227":2,"i228":2,"i229":1,"i230":2,"i231":2,"i232":8,"i233":1,"i234":2,"i235":1,"i236":2,"i237":2,"i238":2,"i239":8,"i240":2,"i241":2,"i242":2,"i243":2,"i244":2,"i245":32,"i246":2,"i247":32,"i248":32,"i249":32,"i250":1,"i251":1,"i252":2,"i253":2,"i254":2,"i255":2,"i256":8,"i257":2,"i258":2,"i259":1,"i260":2,"i261":2,"i262":8,"i263":1,"i264":2,"i265":1,"i266":2,"i267":1,"i268":1,"i269":1,"i270":1,"i271":2,"i272":2,"i273":2,"i274":2,"i275":8,"i276":2,"i277":2,"i278":2,"i279":32,"i280":32,"i281":2,"i282":1,"i283":2,"i284":2,"i285":2,"i286":8,"i287":2,"i288":32,"i289":8,"i290":2,"i291":32,"i292":32,"i293":2,"i294":8,"i295":2,"i296":2,"i297":1,"i298":2,"i299":8,"i300":32,"i301":2,"i302":2,"i303":2,"i304":2,"i305":2,"i306":2,"i307":2,"i308":2,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":2,"i315":2,"i316":2,"i317":2,"i318":8,"i319":32,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":2,"i335":2,"i336":2,"i337":2,"i338":2,"i339":1,"i340":2,"i341":2,"i342":32,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":2,"i354":2,"i355":2,"i356":2,"i357":2,"i358":32,"i359":2,"i360":2,"i361":32,"i362":1,"i363":2,"i364":2,"i365":32,"i366":32,"i367":2,"i368":1,"i369":1,"i370":1,"i371":1,"i372":8,"i373":2,"i374":1,"i375":8,"i376":1,"i377":2,"i378":1,"i379":2,"i380":2,"i381":2,"i382":2,"i383":8,"i384":2,"i385":2,"i386":2,"i387":1,"i388":8,"i389":32,"i390":1,"i391":2,"i392":1,"i393":1,"i394":1,"i395":2,"i396":32,"i397":2,"i398":2,"i399":2,"i400":2,"i401":2,"i402":2,"i403":1,"i404":2,"i405":2,"i406":2,"i407":2,"i408":1,"i409":2,"i410":2,"i411":2,"i412":1,"i413":32,"i414":2,"i415":8,"i416":32,"i417":1,"i418":1,"i419":2,"i420":1,"i421":2,"i422":2,"i423":2,"i424":2,"i425":2,"i426":2,"i427":2,"i428":2,"i429":1,"i430":1,"i431":2,"i432":2,"i433":32,"i434":2,"i435":1,"i436":1,"i437":1,"i438":1,"i439":2,"i440":8,"i441":32,"i442":1,"i443":1,"i444":1,"i445":2,"i446":1,"i447":1,"i448":1,"i449":1,"i450":2,"i451":2,"i452":2,"i453":8,"i454":32,"i455":1,"i456":2,"i457":1,"i458":1,"i459":32,"i460":2,"i461":2,"i462":2,"i463":1,"i464":2,"i465":1,"i466":1,"i467":1,"i468":2,"i469":2,"i470":2,"i471":2,"i472":2,"i473":2,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":2,"i484":2,"i485":2,"i486":2,"i487":2,"i488":2,"i489":2,"i490":8,"i491":2,"i492":2,"i493":2,"i494":2,"i495":2,"i496":1,"i497":2,"i498":2,"i499":2,"i500":2,"i501":2,"i502":2,"i503":2,"i504":2,"i505":2,"i506":1,"i507":2,"i508":2,"i509":2,"i510":2,"i511":8,"i512":2,"i513":2,"i514":2,"i515":8,"i516":2,"i517":2,"i518":32,"i519":1,"i520":2,"i521":2,"i522":2,"i523":2,"i524":2,"i525":8,"i526":2,"i527":2,"i528":32,"i529":32,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":2,"i540":2,"i541":2,"i542":2,"i543":2,"i544":2,"i545":2,"i546":2,"i547":2,"i548":2,"i549":32,"i550":2,"i551":2,"i552":2,"i553":2,"i554":8,"i555":2,"i556":2,"i557":2,"i558":2,"i559":2,"i560":2,"i561":2,"i562":2,"i563":2,"i564":2,"i565":1,"i566":1,"i567":2,"i568":2,"i569":1,"i570":2,"i571":1,"i572":2,"i573":2,"i574":2,"i575":2,"i576":1,"i577":2,"i578":2,"i579":2,"i580":32,"i581":2,"i582":2,"i583":2,"i584":2,"i585":2,"i586":2,"i587":32,"i588":2,"i589":2,"i590":8,"i591":1,"i592":1,"i593":1,"i594":1,"i595":8,"i596":8,"i597":1,"i598":2,"i599":2,"i600":2,"i601":2,"i602":1,"i603":1,"i604":2,"i605":8,"i606":1,"i607":8,"i608":32,"i609":8,"i610":8,"i611":2,"i612":2,"i613":2,"i614":2,"i615":2,"i616":2,"i617":2,"i618":2,"i619":1,"i620":2,"i621":2,"i622":2,"i623":8,"i624":2,"i625":2,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":2,"i632":8,"i633":1,"i634":2,"i635":2,"i636":2,"i637":2,"i638":2,"i639":2,"i640":2,"i641":2,"i642":2,"i643":1,"i644":1,"i645":1,"i646":1,"i647":2,"i648":1,"i649":1,"i650":2,"i651":1,"i652":8,"i653":1,"i654":2,"i655":1,"i656":2,"i657":2,"i658":32,"i659":2,"i660":2,"i661":2,"i662":2,"i663":2,"i664":2,"i665":2,"i666":2,"i667":2,"i668":1,"i669":2,"i670":2,"i671":2,"i672":32,"i673":2,"i674":2,"i675":1,"i676":1,"i677":1,"i678":2,"i679":1,"i680":1,"i681":2,"i682":8,"i683":2,"i684":2,"i685":8,"i686":1,"i687":2,"i688":8,"i689":8,"i690":2,"i691":2,"i692":1,"i693":8,"i694":2,"i695":2,"i696":2,"i697":2,"i698":2,"i699":2,"i700":2,"i701":2,"i702":2,"i703":1,"i704":1,"i705":2,"i706":2,"i707":2,"i708":32,"i709":32,"i710":2,"i711":2,"i712":2,"i713":2,"i714":1,"i715":1,"i716":2,"i717":1,"i718":2,"i719":2,"i720":1,"i721":1,"i722":1,"i723":2,"i724":1,"i725":1,"i726":32,"i727":1,"i728":1,"i729":1,"i730":1,"i731":1,"i732":2,"i733":1,"i734":1,"i735":2,"i736":1,"i737":2,"i738":2,"i739":8,"i740":32,"i741":2,"i742":1,"i743":1,"i744":1,"i745":2,"i746":1,"i747":2,"i748":2,"i749":2,"i750":2,"i751":2,"i752":2,"i753":32,"i754":2,"i755":32,"i756":2,"i757":2,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":1,"i766":32,"i767":2,"i768":2,"i769":2,"i770":32,"i771":2,"i772":2,"i773":2,"i774":2,"i775":2,"i776":2,"i777":2,"i778":8,"i779":2,"i780":2,"i781":2,"i782":1,"i783":2,"i784":2,"i785":2,"i786":2,"i787":8,"i788":2,"i789":1,"i790":2,"i791":2,"i792":2,"i793":2,"i794":2,"i795":2,"i796":2,"i797":2,"i798":8,"i799":32,"i800":32,"i801":2,"i802":2,"i803":1,"i804":1,"i805":2,"i806":2,"i807":2,"i808":2,"i809":2,"i810":1,"i811":1,"i812":32,"i813":2,"i814":2,"i815":32,"i816":32,"i817":1,"i818":2,"i819":1,"i820":32,"i821":32,"i822":32,"i823":2,"i824":32,"i825":32,"i826":32,"i827":2,"i828":1,"i829":1,"i830":2,"i831":1,"i832":2,"i833":1,"i834":1,"i835":2,"i836":2,"i837":1,"i838":1,"i839":1,"i840":32,"i841":32,"i842":2,"i843":32,"i844":2,"i845":2,"i846":2,"i847":2,"i848":8,"i849":2,"i850":2,"i851":2,"i852":2,"i853":2,"i854":1,"i855":1,"i856":2,"i857":2,"i858":2,"i859":2,"i860":2,"i861":2,"i862":2,"i863":2,"i864":2,"i865":2,"i866":2,"i867":8,"i868":1,"i869":32,"i870":32,"i871":1,"i872":1,"i873":32,"i874":32,"i875":32,"i876":32,"i877":2,"i878":1,"i879":2,"i880":2,"i881":32,"i882":2,"i883":2,"i884":2,"i885":2,"i886":32,"i887":2,"i888":1,"i889":2,"i890":2,"i891":1,"i892":2,"i893":2,"i894":2,"i895":2,"i896":2,"i897":2,"i898":2,"i899":2,"i900":2,"i901":1,"i902":1,"i903":2,"i904":2,"i905":2,"i906":8,"i907":2,"i908":2,"i909":2,"i910":1,"i911":8,"i912":1,"i913":32,"i914":32,"i915":1,"i916":1,"i917":2,"i918":1,"i919":2,"i920":2,"i921":2,"i922":2,"i923":2,"i924":2,"i925":2,"i926":2,"i927":2,"i928":2,"i929":2,"i930":2,"i931":2,"i932":1,"i933":1,"i934":2,"i935":2,"i936":2,"i937":1,"i938":2,"i939":1,"i940":1,"i941":2,"i942":1,"i943":2,"i944":1,"i945":1,"i946":1,"i947":1,"i948":2,"i949":2,"i950":1,"i951":2,"i952":2,"i953":2,"i954":2,"i955":2,"i956":2,"i957":2,"i958":2,"i959":2,"i960":2,"i961":2,"i962":2,"i963":2,"i964":2,"i965":2,"i966":2,"i967":2,"i968":2,"i969":2,"i970":2,"i971":2,"i972":2,"i973":1,"i974":2,"i975":2,"i976":1,"i977":1,"i978":1,"i979":1,"i980":1,"i981":1,"i982":1,"i983":1,"i984":1,"i985":2,"i986":2,"i987":1,"i988":2,"i989":2,"i990":2,"i991":2,"i992":2,"i993":2,"i994":2,"i995":2,"i996":2,"i997":1,"i998":1,"i999":2,"i1000":2,"i1001":2,"i1002":2,"i1003":2,"i1004":8,"i1005":2,"i1006":2,"i1007":2,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":2,"i1013":2,"i1014":1,"i1015":1,"i1016":1,"i1017":2,"i1018":32,"i1019":2,"i1020":1,"i1021":1,"i1022":8,"i1023":1,"i1024":2,"i1025":2,"i1026":2,"i1027":32,"i1028":2,"i1029":2,"i1030":2,"i1031":2,"i1032":1,"i1033":2,"i1034":2,"i1035":2,"i1036":2,"i1037":2,"i1038":2,"i1039":2,"i1040":32,"i1041":2,"i1042":32,"i1043":32,"i1044":2,"i1045":1,"i1046":2,"i1047":2,"i1048":1,"i1049":1,"i1050":2,"i1051":2,"i1052":2,"i1053":2,"i1054":2,"i1055":2,"i1056":2,"i1057":1,"i1058":2,"i1059":1,"i1060":2,"i1061":2,"i1062":2,"i1063":2,"i1064":1,"i1065":2,"i1066":2,"i1067":32,"i1068":2,"i1069":2,"i1070":2,"i1071":1,"i1072":1,"i1073":2,"i1074":32,"i1075":1,"i1076":2,"i1077":2,"i1078":1,"i1079":2,"i1080":2,"i1081":2,"i1082":1,"i1083":2,"i1084":1,"i1085":2,"i1086":1,"i1087":2,"i1088":1,"i1089":2,"i1090":2,"i1091":1,"i1092":32,"i1093":2,"i1094":32,"i1095":1,"i1096":2,"i1097":2,"i1098":1,"i1099":32,"i1100":2,"i1101":2,"i1102":2,"i1103":2,"i1104":2,"i1105":8,"i1106":32,"i1107":8,"i1108":8,"i1109":32,"i1110":2,"i1111":2,"i1112":2,"i1113":2,"i1114":2,"i1115":2,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":1,"i1121":1,"i1122":2,"i1123":1,"i1124":1,"i1125":2,"i1126":2,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":8,"i1135":2,"i1136":2,"i1137":2,"i1138":2,"i1139":2,"i1140":2,"i1141":2,"i1142":32,"i1143":32,"i1144":2,"i1145":2,"i1146":2,"i1147":2,"i1148":2,"i1149":2,"i1150":2,"i1151":2,"i1152":1,"i1153":2}; +var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":2,"i92":8,"i93":2,"i94":2,"i95":2,"i96":2,"i97":2,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":2,"i126":2,"i127":8,"i128":2,"i129":2,"i130":2,"i131":2,"i132":2,"i133":1,"i134":2,"i135":1,"i136":2,"i137":1,"i138":1,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":2,"i146":2,"i147":2,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":32,"i169":32,"i170":32,"i171":32,"i172":32,"i173":32,"i174":32,"i175":32,"i176":32,"i177":1,"i178":8,"i179":1,"i180":2,"i181":2,"i182":2,"i183":8,"i184":2,"i185":2,"i186":32,"i187":1,"i188":2,"i189":32,"i190":2,"i191":1,"i192":1,"i193":2,"i194":2,"i195":1,"i196":1,"i197":2,"i198":2,"i199":32,"i200":2,"i201":2,"i202":2,"i203":2,"i204":2,"i205":2,"i206":2,"i207":2,"i208":2,"i209":1,"i210":1,"i211":1,"i212":2,"i213":2,"i214":2,"i215":1,"i216":1,"i217":2,"i218":2,"i219":8,"i220":32,"i221":1,"i222":2,"i223":2,"i224":2,"i225":2,"i226":2,"i227":2,"i228":1,"i229":2,"i230":2,"i231":2,"i232":1,"i233":2,"i234":2,"i235":8,"i236":1,"i237":2,"i238":2,"i239":2,"i240":2,"i241":8,"i242":2,"i243":2,"i244":2,"i245":1,"i246":8,"i247":2,"i248":2,"i249":32,"i250":2,"i251":32,"i252":32,"i253":32,"i254":2,"i255":2,"i256":1,"i257":1,"i258":2,"i259":2,"i260":2,"i261":2,"i262":8,"i263":2,"i264":2,"i265":1,"i266":2,"i267":2,"i268":8,"i269":1,"i270":2,"i271":1,"i272":2,"i273":1,"i274":1,"i275":1,"i276":1,"i277":2,"i278":2,"i279":2,"i280":2,"i281":8,"i282":2,"i283":2,"i284":2,"i285":2,"i286":32,"i287":32,"i288":2,"i289":1,"i290":2,"i291":2,"i292":2,"i293":8,"i294":2,"i295":32,"i296":8,"i297":2,"i298":1,"i299":2,"i300":32,"i301":32,"i302":2,"i303":2,"i304":2,"i305":1,"i306":2,"i307":8,"i308":32,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":2,"i315":2,"i316":2,"i317":2,"i318":2,"i319":2,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":8,"i327":32,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":2,"i335":2,"i336":2,"i337":2,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":2,"i347":1,"i348":2,"i349":2,"i350":32,"i351":2,"i352":2,"i353":2,"i354":2,"i355":2,"i356":2,"i357":2,"i358":2,"i359":2,"i360":2,"i361":2,"i362":2,"i363":2,"i364":2,"i365":2,"i366":32,"i367":2,"i368":2,"i369":32,"i370":2,"i371":2,"i372":32,"i373":32,"i374":2,"i375":1,"i376":1,"i377":1,"i378":1,"i379":8,"i380":2,"i381":1,"i382":8,"i383":1,"i384":2,"i385":1,"i386":2,"i387":2,"i388":2,"i389":2,"i390":8,"i391":2,"i392":2,"i393":2,"i394":1,"i395":8,"i396":32,"i397":1,"i398":2,"i399":1,"i400":1,"i401":1,"i402":2,"i403":32,"i404":2,"i405":2,"i406":2,"i407":2,"i408":2,"i409":2,"i410":1,"i411":2,"i412":2,"i413":2,"i414":2,"i415":1,"i416":2,"i417":2,"i418":2,"i419":1,"i420":32,"i421":2,"i422":8,"i423":32,"i424":1,"i425":1,"i426":2,"i427":1,"i428":2,"i429":2,"i430":2,"i431":2,"i432":2,"i433":2,"i434":2,"i435":2,"i436":1,"i437":2,"i438":2,"i439":32,"i440":2,"i441":1,"i442":1,"i443":1,"i444":1,"i445":2,"i446":8,"i447":32,"i448":1,"i449":1,"i450":1,"i451":2,"i452":1,"i453":1,"i454":1,"i455":2,"i456":2,"i457":2,"i458":2,"i459":8,"i460":32,"i461":1,"i462":2,"i463":1,"i464":1,"i465":32,"i466":2,"i467":2,"i468":2,"i469":1,"i470":2,"i471":1,"i472":1,"i473":1,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":2,"i484":2,"i485":2,"i486":2,"i487":2,"i488":2,"i489":2,"i490":2,"i491":2,"i492":2,"i493":2,"i494":2,"i495":2,"i496":2,"i497":8,"i498":2,"i499":2,"i500":2,"i501":2,"i502":2,"i503":1,"i504":2,"i505":2,"i506":2,"i507":2,"i508":2,"i509":2,"i510":2,"i511":2,"i512":2,"i513":2,"i514":2,"i515":1,"i516":2,"i517":2,"i518":2,"i519":2,"i520":8,"i521":2,"i522":2,"i523":2,"i524":8,"i525":2,"i526":32,"i527":1,"i528":2,"i529":2,"i530":2,"i531":2,"i532":2,"i533":8,"i534":2,"i535":2,"i536":32,"i537":32,"i538":2,"i539":2,"i540":2,"i541":2,"i542":2,"i543":2,"i544":2,"i545":2,"i546":2,"i547":2,"i548":2,"i549":2,"i550":2,"i551":2,"i552":2,"i553":2,"i554":2,"i555":2,"i556":2,"i557":32,"i558":2,"i559":2,"i560":2,"i561":2,"i562":8,"i563":2,"i564":2,"i565":2,"i566":2,"i567":8,"i568":2,"i569":2,"i570":8,"i571":2,"i572":2,"i573":2,"i574":2,"i575":1,"i576":1,"i577":2,"i578":2,"i579":1,"i580":2,"i581":1,"i582":2,"i583":2,"i584":2,"i585":2,"i586":1,"i587":2,"i588":2,"i589":2,"i590":32,"i591":2,"i592":2,"i593":2,"i594":2,"i595":2,"i596":2,"i597":32,"i598":2,"i599":2,"i600":8,"i601":1,"i602":1,"i603":1,"i604":1,"i605":8,"i606":8,"i607":1,"i608":2,"i609":2,"i610":2,"i611":2,"i612":1,"i613":1,"i614":2,"i615":8,"i616":1,"i617":8,"i618":32,"i619":8,"i620":8,"i621":2,"i622":2,"i623":2,"i624":2,"i625":2,"i626":2,"i627":2,"i628":2,"i629":1,"i630":2,"i631":2,"i632":2,"i633":8,"i634":2,"i635":2,"i636":2,"i637":2,"i638":2,"i639":2,"i640":2,"i641":8,"i642":1,"i643":2,"i644":2,"i645":2,"i646":2,"i647":2,"i648":2,"i649":2,"i650":2,"i651":2,"i652":1,"i653":1,"i654":1,"i655":1,"i656":2,"i657":1,"i658":1,"i659":2,"i660":1,"i661":8,"i662":1,"i663":2,"i664":1,"i665":2,"i666":2,"i667":32,"i668":2,"i669":2,"i670":2,"i671":2,"i672":2,"i673":2,"i674":2,"i675":2,"i676":2,"i677":1,"i678":2,"i679":2,"i680":2,"i681":32,"i682":2,"i683":2,"i684":1,"i685":1,"i686":1,"i687":2,"i688":1,"i689":1,"i690":2,"i691":8,"i692":2,"i693":2,"i694":8,"i695":1,"i696":2,"i697":8,"i698":8,"i699":2,"i700":2,"i701":1,"i702":8,"i703":2,"i704":2,"i705":2,"i706":2,"i707":2,"i708":2,"i709":2,"i710":2,"i711":2,"i712":2,"i713":2,"i714":2,"i715":2,"i716":2,"i717":2,"i718":2,"i719":2,"i720":1,"i721":1,"i722":2,"i723":2,"i724":2,"i725":32,"i726":32,"i727":2,"i728":2,"i729":2,"i730":2,"i731":1,"i732":1,"i733":2,"i734":1,"i735":2,"i736":2,"i737":1,"i738":1,"i739":1,"i740":2,"i741":1,"i742":1,"i743":32,"i744":1,"i745":1,"i746":1,"i747":1,"i748":1,"i749":2,"i750":1,"i751":1,"i752":2,"i753":1,"i754":2,"i755":2,"i756":8,"i757":32,"i758":2,"i759":1,"i760":1,"i761":1,"i762":2,"i763":1,"i764":2,"i765":2,"i766":2,"i767":2,"i768":2,"i769":2,"i770":32,"i771":2,"i772":32,"i773":2,"i774":2,"i775":2,"i776":2,"i777":2,"i778":2,"i779":2,"i780":2,"i781":2,"i782":2,"i783":1,"i784":32,"i785":2,"i786":2,"i787":2,"i788":32,"i789":2,"i790":2,"i791":2,"i792":2,"i793":2,"i794":2,"i795":2,"i796":8,"i797":2,"i798":2,"i799":2,"i800":2,"i801":2,"i802":2,"i803":8,"i804":2,"i805":1,"i806":2,"i807":2,"i808":2,"i809":2,"i810":2,"i811":2,"i812":2,"i813":2,"i814":8,"i815":32,"i816":32,"i817":2,"i818":2,"i819":1,"i820":1,"i821":2,"i822":2,"i823":2,"i824":2,"i825":2,"i826":1,"i827":1,"i828":32,"i829":2,"i830":2,"i831":32,"i832":32,"i833":1,"i834":2,"i835":1,"i836":32,"i837":32,"i838":32,"i839":2,"i840":32,"i841":32,"i842":32,"i843":2,"i844":1,"i845":1,"i846":2,"i847":1,"i848":2,"i849":1,"i850":1,"i851":2,"i852":2,"i853":1,"i854":1,"i855":1,"i856":32,"i857":32,"i858":2,"i859":32,"i860":2,"i861":2,"i862":2,"i863":2,"i864":2,"i865":8,"i866":2,"i867":2,"i868":2,"i869":2,"i870":2,"i871":1,"i872":1,"i873":2,"i874":2,"i875":2,"i876":2,"i877":2,"i878":2,"i879":2,"i880":2,"i881":2,"i882":2,"i883":2,"i884":8,"i885":1,"i886":32,"i887":32,"i888":1,"i889":1,"i890":32,"i891":32,"i892":32,"i893":32,"i894":2,"i895":1,"i896":2,"i897":2,"i898":32,"i899":2,"i900":2,"i901":2,"i902":2,"i903":32,"i904":2,"i905":1,"i906":2,"i907":2,"i908":1,"i909":2,"i910":2,"i911":2,"i912":2,"i913":2,"i914":2,"i915":2,"i916":2,"i917":1,"i918":1,"i919":2,"i920":2,"i921":2,"i922":8,"i923":2,"i924":2,"i925":2,"i926":1,"i927":8,"i928":1,"i929":32,"i930":32,"i931":1,"i932":1,"i933":2,"i934":1,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":2,"i941":2,"i942":2,"i943":2,"i944":2,"i945":2,"i946":2,"i947":2,"i948":1,"i949":1,"i950":2,"i951":2,"i952":2,"i953":1,"i954":2,"i955":1,"i956":1,"i957":2,"i958":1,"i959":2,"i960":1,"i961":1,"i962":1,"i963":1,"i964":2,"i965":2,"i966":1,"i967":2,"i968":2,"i969":2,"i970":2,"i971":2,"i972":2,"i973":2,"i974":2,"i975":2,"i976":2,"i977":2,"i978":2,"i979":2,"i980":2,"i981":2,"i982":2,"i983":2,"i984":2,"i985":2,"i986":2,"i987":2,"i988":2,"i989":1,"i990":2,"i991":2,"i992":1,"i993":1,"i994":1,"i995":1,"i996":1,"i997":1,"i998":1,"i999":1,"i1000":1,"i1001":2,"i1002":2,"i1003":1,"i1004":2,"i1005":2,"i1006":2,"i1007":2,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":2,"i1013":1,"i1014":1,"i1015":2,"i1016":2,"i1017":2,"i1018":2,"i1019":2,"i1020":8,"i1021":2,"i1022":2,"i1023":2,"i1024":2,"i1025":2,"i1026":2,"i1027":2,"i1028":2,"i1029":2,"i1030":2,"i1031":2,"i1032":1,"i1033":1,"i1034":1,"i1035":2,"i1036":32,"i1037":2,"i1038":1,"i1039":1,"i1040":8,"i1041":1,"i1042":2,"i1043":2,"i1044":2,"i1045":2,"i1046":32,"i1047":2,"i1048":2,"i1049":2,"i1050":2,"i1051":1,"i1052":2,"i1053":2,"i1054":2,"i1055":2,"i1056":2,"i1057":2,"i1058":2,"i1059":32,"i1060":2,"i1061":32,"i1062":32,"i1063":2,"i1064":1,"i1065":2,"i1066":2,"i1067":1,"i1068":1,"i1069":2,"i1070":2,"i1071":2,"i1072":2,"i1073":2,"i1074":2,"i1075":2,"i1076":1,"i1077":2,"i1078":1,"i1079":2,"i1080":2,"i1081":2,"i1082":2,"i1083":1,"i1084":2,"i1085":2,"i1086":32,"i1087":2,"i1088":2,"i1089":2,"i1090":1,"i1091":1,"i1092":2,"i1093":32,"i1094":1,"i1095":32,"i1096":2,"i1097":2,"i1098":1,"i1099":2,"i1100":2,"i1101":2,"i1102":2,"i1103":2,"i1104":2,"i1105":1,"i1106":2,"i1107":1,"i1108":2,"i1109":1,"i1110":2,"i1111":2,"i1112":2,"i1113":2,"i1114":2,"i1115":1,"i1116":32,"i1117":1,"i1118":2,"i1119":2,"i1120":1,"i1121":32,"i1122":2,"i1123":2,"i1124":32,"i1125":1,"i1126":2,"i1127":2,"i1128":1,"i1129":32,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":2,"i1135":8,"i1136":32,"i1137":8,"i1138":8,"i1139":32,"i1140":2,"i1141":2,"i1142":2,"i1143":2,"i1144":2,"i1145":2,"i1146":2,"i1147":2,"i1148":1,"i1149":1,"i1150":2,"i1151":1,"i1152":2,"i1153":2,"i1154":2,"i1155":2,"i1156":2,"i1157":2,"i1158":2,"i1159":2,"i1160":2,"i1161":8,"i1162":2,"i1163":2,"i1164":2,"i1165":2,"i1166":2,"i1167":2,"i1168":2,"i1169":32,"i1170":32,"i1171":2,"i1172":2,"i1173":2,"i1174":2,"i1175":2,"i1176":2,"i1177":2,"i1178":2,"i1179":1,"i1180":2}; var tabs = {65535:["t0","All Classes"],1:["t1","Interface Summary"],2:["t2","Class Summary"],8:["t4","Exception Summary"],32:["t6","Annotation Types Summary"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -195,19 +195,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      Action.AddMediaItems - +
      Action.ClearMediaItems - +
      Action.ClearVideoSurface - +
      Action.MoveMediaItem - +
      Action.RemoveMediaItem - +
      Action.RemoveMediaItems - +
      Action.SetAudioAttributes - +
      Action.SetMediaItems - +
      Action.SetMediaItemsResetPosition - +
      Action.SetRepeatMode - +
      Action.SetVideoSurface - +
      Action.WaitForPlaybackState -
      Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
      +
      Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
      Action.WaitForPlayWhenReady
      Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.Listener.onPlayWhenReadyChanged(boolean, int).
      + Player.Listener.onPlayWhenReadyChanged(boolean, int).
      Action.WaitForPositionDiscontinuity -
      Action.WaitForTimelineChanged - +
      AssetContentProvider +
      A ContentProvider for reading asset data.
      +
      AssetDataSource
      A DataSource for reading from a local asset.
      AssetDataSource.AssetDataSourceException
      Thrown when an IOException is encountered reading a local asset.
      AtomicFile
      A helper class for performing atomic operations on a file by creating a backup file until a write has successfully completed.
      AudioAttributes
      Attributes for audio playback, which configure the underlying platform AudioTrack.
      AudioAttributes.Builder
      Builder for AudioAttributes.
      AudioCapabilities
      Represents the set of audio formats that a device is capable of playing.
      AudioCapabilitiesReceiver
      Receives broadcast events indicating changes to the device's audio capabilities, notifying a AudioCapabilitiesReceiver.Listener when audio capability changes occur.
      AudioCapabilitiesReceiver.Listener
      Listener notified when audio capabilities change.
      AudioListenerDeprecated. - -
      AudioProcessor @@ -960,7 +960,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      BundleableUtilsBundleableUtil
      Utilities for Bundleable.
      C.AudioManagerOffloadMode +
      Playback offload mode.
      +
      C.AudioUsage
      Usage types for audio attributes.
      C.BufferFlags
      Flags which can apply to a buffer containing a media sample.
      C.ColorRange
      Video color range.
      C.ColorSpace
      Video colorspaces.
      C.ColorTransfer
      Video color transfer characteristics.
      C.ContentType
      Represents a streaming or other media type.
      C.CryptoMode
      Crypto modes for a codec.
      C.CryptoType +
      Types of crypto implementation.
      +
      C.DataType
      Represents a type of data.
      C.Encoding
      Represents an audio encoding, or an invalid or unset value.
      C.FormatSupport
      Level of renderer support for a format.
      C.NetworkType
      Network connection type.
      C.PcmEncoding
      Represents a PCM audio encoding, or an invalid or unset value.
      C.Projection
      Video projection types.
      C.RoleFlags
      Track role flags.
      C.SelectionFlags
      Track selection flags.
      C.SelectionReason +
      Represents a reason for selection.
      +
      C.StereoMode
      The stereo mode for 360/3D/VR videos.
      C.StreamType
      Stream types for an AudioTrack.
      C.TrackType +
      Represents a type of media track.
      +
      C.VideoChangeFrameRateStrategy + +
      C.VideoOutputMode
      Video decoder output modes.
      C.VideoScalingMode
      Video scaling modes for MediaCodec-based renderers.
      C.WakeMode
      Mode specifying whether the player should hold a WakeLock and a WifiLock.
      Cache
      A cache that supports partial caching of resources.
      Cache.CacheException
      Thrown when an error is encountered when writing data.
      Cache.Listener
      Listener of Cache events.
      CacheAsserts
      Assertion methods for Cache.
      CacheAsserts.RequestSet
      Defines a set of data requests.
      CacheDataSink
      Writes data into a cache.
      CacheDataSink.CacheDataSinkException
      Thrown when an IOException is encountered when writing data to the sink.
      CacheDataSink.Factory
      CacheDataSinkFactoryDeprecated. - -
      CacheDataSource
      A DataSource that reads and writes a Cache.
      CacheDataSource.CacheIgnoredReason
      Reasons the cache may be ignored.
      CacheDataSource.EventListener
      Listener of CacheDataSource events.
      CacheDataSource.Factory
      CacheDataSource.Flags
      Flags controlling the CacheDataSource's behavior.
      CacheDataSourceFactoryDeprecated. - -
      CachedRegionTracker
      CachedRegionTracker
      Utility class for efficiently tracking regions of data that are stored in a Cache for a given cache key.
      CacheEvictor
      Evicts data from a Cache.
      CacheKeyFactory
      Factory for cache keys.
      CacheSpan
      Defines a span of data that may or may not be cached (as indicated by CacheSpan.isCached).
      CacheWriter
      Caching related utility methods.
      CacheWriter.ProgressListener
      Receives progress updates during cache operations.
      CameraMotionListener
      Listens camera motion.
      CameraMotionRenderer
      A Renderer that parses the camera motion track.
      CaptionStyleCompat
      A compatibility wrapper for CaptioningManager.CaptionStyle.
      CaptionStyleCompat.EdgeType
      The type of edge, which may be none.
      CapturingAudioSink
      A ForwardingAudioSink that captures configuration, discontinuity and buffer events.
      CapturingRenderersFactory
      A RenderersFactory that captures interactions with the audio and video MediaCodecAdapter instances.
      CastPlayer
      Player implementation that communicates with a Cast receiver app.
      Cea608Decoder
      A SubtitleDecoder for CEA-608 (also known as "line 21 captions" and "EIA-608").
      Cea708Decoder
      A SubtitleDecoder for CEA-708 (also known as "EIA-708").
      CeaUtil
      Utility methods for handling CEA-608/708 messages.
      ChapterFrame
      Chapter information ID3 frame.
      ChapterTocFrame
      Chapter table of contents ID3 frame.
      Chunk
      An abstract base class for Loader.Loadable implementations that load chunks of data required for the playback of streams.
      ChunkExtractor
      Extracts samples and track Formats from chunks.
      ChunkExtractor.Factory
      Creates ChunkExtractor instances.
      ChunkExtractor.TrackOutputProvider
      Provides TrackOutput instances to be written to during extraction.
      ChunkHolder
      Holds a chunk or an indication that the end of the stream has been reached.
      ChunkIndex
      Defines chunks of samples within a media stream.
      ChunkSampleStream<T extends ChunkSource>
      A SampleStream that loads media in Chunks, obtained from a ChunkSource.
      ChunkSampleStream.ReleaseCallback<T extends ChunkSource>
      A callback to be notified when a sample stream has finished being released.
      ChunkSource
      A provider of Chunks for a ChunkSampleStream to load.
      ClippingMediaPeriod
      Wraps a MediaPeriod and clips its SampleStreams to provide a subsequence of their samples.
      ClippingMediaSource
      MediaSource that wraps a source and clips its timeline based on specified start/end positions.
      ClippingMediaSource.IllegalClippingException
      Thrown when a ClippingMediaSource cannot clip its wrapped source.
      ClippingMediaSource.IllegalClippingException.Reason
      The reason clipping failed.
      Clock
      An interface through which system clocks can be read and HandlerWrappers created.
      CodecSpecificDataUtil
      Provides utilities for handling various types of codec-specific data.
      ColorInfo
      Stores color info.
      ColorParser
      Parser for color expressions found in styling formats, e.g.
      CommentFrame
      Comment ID3 frame.
      CompositeMediaSource<T>
      Composite MediaSource consisting of multiple child sources.
      CompositeSequenceableLoader
      A SequenceableLoader that encapsulates multiple other SequenceableLoaders.
      CompositeSequenceableLoaderFactory
      A factory to create composite SequenceableLoaders.
      ConcatenatingMediaSource
      Concatenates multiple MediaSources.
      ConditionVariable
      An interruptible condition variable.
      ConstantBitrateSeekMap
      A SeekMap implementation that assumes the stream has a constant bitrate and consists of multiple independent frames of the same size.
      Consumer<T>
      Represents an operation that accepts a single input argument and returns no result.
      ContainerMediaChunk
      A BaseMediaChunk that uses an Extractor to decode sample data.
      ContentDataSource
      A DataSource for reading from a content URI.
      ContentDataSource.ContentDataSourceException
      Thrown when an IOException is encountered reading from a content URI.
      ContentMetadata
      Interface for an immutable snapshot of keyed metadata.
      ContentMetadataMutations
      Defines multiple mutations on metadata value which are applied atomically.
      ControlDispatcherDeprecated. -
      Use a ForwardingPlayer or configure the player to customize operations.
      -
      CopyOnWriteMultiset<E>
      An unordered collection of elements that allows duplicates, but also allows access to a set of unique elements.
      CronetDataSource
      DataSource without intermediate buffer based on Cronet API set using UrlRequest.
      CronetDataSource.Factory
      CronetDataSource.OpenException
      Thrown when an error is encountered when trying to open a CronetDataSource.
      CronetDataSourceFactory Deprecated.
      CronetEngineWrapper Deprecated.
      Use CronetEngine directly.
      CronetUtil
      Cronet utility methods.
      CryptoInfo
      CryptoConfig -
      Compatibility wrapper for MediaCodec.CryptoInfo.
      +
      Configuration for a decoder to allow it to decode encrypted media data.
      CryptoException +
      Thrown when a non-platform component fails to decrypt data.
      +
      CryptoInfo +
      Metadata describing the structure of an encrypted input sample.
      +
      Cue
      Contains information about a specific cue, including textual content and formatting data.
      Cue.AnchorType
      The type of anchor, which may be unset.
      Cue.Builder
      A builder for Cue objects.
      Cue.LineType
      The type of line, which may be unset.
      Cue.TextSizeType
      The type of default text size for this cue, which may be unset.
      Cue.VerticalType
      The type of vertical layout for this cue, which may be unset (i.e.
      CueDecoder +
      Decodes data encoded by CueEncoder.
      +
      CueEncoder +
      Encodes data that can be decoded by CueDecoder.
      +
      DashChunkSource
      A ChunkSource for DASH streams.
      DashChunkSource.Factory
      Factory for DashChunkSources.
      DashDownloader
      A downloader for DASH streams.
      DashManifest
      Represents a DASH media presentation description (mpd), as defined by ISO/IEC 23009-1:2014 Section 5.3.1.2.
      DashManifestParser
      A parser of media presentation description files.
      DashManifestParser.RepresentationInfo
      A parsed Representation element.
      DashManifestStaleException
      Thrown when a live playback's manifest is stale and a new manifest could not be loaded.
      DashMediaSource
      A DASH MediaSource.
      DashMediaSource.Factory
      Factory for DashMediaSources.
      DashSegmentIndex
      Indexes the segments within a media stream.
      DashUtil
      Utility methods for DASH streams.
      DashWrappingSegmentIndex
      An implementation of DashSegmentIndex that wraps a ChunkIndex parsed from a media stream.
      DatabaseIOException
      An IOException whose cause is an SQLException.
      DatabaseProvider -
      Provides SQLiteDatabase instances to ExoPlayer components, which may read and write +
      Provides SQLiteDatabase instances to media library components, which may read and write tables prefixed with DatabaseProvider.TABLE_PREFIX.
      DataChunk
      A base class for Chunk implementations where the data should be loaded into a byte[] before being consumed.
      DataReader
      Reads bytes from a data stream.
      DataSchemeDataSource
      A DataSource for reading data URLs, as defined by RFC 2397.
      DataSink
      A component to which streams of data can be written.
      DataSink.Factory
      A factory for DataSink instances.
      DataSource
      Reads data from URI-identified resources.
      DataSource.Factory
      A factory for DataSource instances.
      DataSourceContractTest
      A collection of contract tests for DataSource implementations.
      DataSourceContractTest.FakeTransferListener
      A TransferListener that only keeps track of the transferred bytes.
      DataSourceContractTest.TestResource
      Information about a resource that can be used to test the DataSource instance.
      DataSourceContractTest.TestResource.Builder
      DataSourceException
      Used to specify reason of a DataSource error.
      DataSourceInputStream
      Allows data corresponding to a given DataSpec to be read from a DataSource and consumed through an InputStream.
      DataSourceUtil +
      Utility methods for DataSource.
      +
      DataSpec
      Defines a region of data in a resource.
      DataSpec.Builder
      Builds DataSpec instances.
      DataSpec.Flags
      The flags that apply to any request for data.
      DataSpec.HttpMethod
      HTTP methods supported by ExoPlayer HttpDataSources.
      DebugTextViewHelper
      A helper class for periodically updating a TextView with debug information obtained from - a SimpleExoPlayer.
      + an ExoPlayer.
      Decoder<I,​O,​E extends DecoderException>
      A media decoder.
      DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleOutputBuffer,​? extends DecoderException>>
      DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleDecoderOutputBuffer,​? extends DecoderException>>
      Decodes and renders audio using a Decoder.
      DecoderCounters
      Maintains decoder event counts, for debugging purposes only.
      DecoderCountersUtil
      Assertions for DecoderCounters.
      DecoderException
      Thrown when a Decoder error occurs.
      DecoderInputBuffer
      Holds input for a decoder.
      DecoderInputBuffer.BufferReplacementMode
      The buffer replacement mode.
      DecoderInputBuffer.InsufficientCapacityException
      Thrown when an attempt is made to write into a DecoderInputBuffer whose DecoderInputBuffer.bufferReplacementMode is DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED and who DecoderInputBuffer.data capacity is smaller than required.
      DecoderOutputBuffer +
      Output buffer decoded by a Decoder.
      +
      DecoderOutputBuffer.Owner<S extends DecoderOutputBuffer> +
      Buffer owner.
      +
      DecoderReuseEvaluation
      The result of an evaluation to determine whether a decoder can be reused for a new input format.
      DecoderReuseEvaluation.DecoderDiscardReasons
      Possible reasons why reuse is not possible.
      DecoderReuseEvaluation.DecoderReuseResult
      Possible outcomes of the evaluation.
      DecoderVideoRenderer
      Decodes and renders video using a Decoder.
      DecryptionException -
      Thrown when a non-platform component fails to decrypt data.
      -
      DefaultAllocator
      Default implementation of Allocator.
      DefaultAudioSink
      Plays audio data.
      DefaultAudioSink.AudioProcessorChain
      Provides a chain of audio processors, which are used for any user-defined processing and applying playback parameters (if supported).
      DefaultAudioSink.DefaultAudioProcessorChain
      The default audio processor chain, which applies a (possibly empty) chain of user-defined audio processors followed by SilenceSkippingAudioProcessor and SonicAudioProcessor.
      DefaultAudioSink.InvalidAudioTrackTimestampException
      Thrown when the audio track has provided a spurious timestamp, if DefaultAudioSink.failOnSpuriousAudioTimestamp is set.
      DefaultAudioSink.OffloadMode
      Audio offload mode configuration.
      DefaultBandwidthMeter
      Estimates bandwidth by listening to data transfers.
      DefaultBandwidthMeter.Builder
      Builder for a bandwidth meter.
      DefaultCastOptionsProvider
      A convenience OptionsProvider to target the default cast receiver app.
      DefaultCompositeSequenceableLoaderFactory
      Default implementation of CompositeSequenceableLoaderFactory.
      DefaultContentMetadata
      Default implementation of ContentMetadata.
      DefaultControlDispatcherDeprecated. -
      Use a ForwardingPlayer or configure the player to customize operations.
      -
      DefaultDashChunkSource
      A default DashChunkSource implementation.
      DefaultDashChunkSource.Factory  
      DefaultDashChunkSource.RepresentationHolder
      Holds information about a snapshot of a single Representation.
      DefaultDashChunkSource.RepresentationSegmentIterator
      DefaultDatabaseProvider
      A DatabaseProvider that provides instances obtained from a SQLiteOpenHelper.
      DefaultDataSource
      A DataSource that supports multiple URI schemes.
      DefaultDataSourceFactory
      DefaultDataSource.Factory -
      A DataSource.Factory that produces DefaultDataSource instances that delegate to DefaultHttpDataSources for non-file/asset/content URIs.
      +
      DefaultDataSourceFactoryDeprecated. + +
      DefaultDownloaderFactory
      Default DownloaderFactory, supporting creation of progressive, DASH, HLS and SmoothStreaming downloaders.
      DefaultDownloadIndex
      A DownloadIndex that uses SQLite to persist Downloads.
      DefaultDrmSessionManager
      A DrmSessionManager that supports playbacks using ExoMediaDrm.
      DefaultDrmSessionManager.Builder
      Builder for DefaultDrmSessionManager instances.
      DefaultDrmSessionManager.MissingSchemeDataException
      DefaultDrmSessionManager.Mode
      Determines the action to be done after a session acquired.
      DefaultDrmSessionManagerProvider
      Default implementation of DrmSessionManagerProvider.
      DefaultExtractorInput
      An ExtractorInput that wraps a DataReader.
      DefaultExtractorsFactory
      An ExtractorsFactory that provides an array of extractors for the following formats: @@ -2099,1745 +2147,1760 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); com.google.android.exoplayer2.ext.flac.FlacExtractor is used.
      DefaultHlsDataSourceFactory
      Default implementation of HlsDataSourceFactory.
      DefaultHlsExtractorFactory
      Default HlsExtractorFactory implementation.
      DefaultHlsPlaylistParserFactory
      Default implementation for HlsPlaylistParserFactory.
      DefaultHlsPlaylistTracker
      Default implementation for HlsPlaylistTracker.
      DefaultHttpDataSource
      An HttpDataSource that uses Android's HttpURLConnection.
      DefaultHttpDataSource.Factory
      DefaultHttpDataSourceFactoryDeprecated. - -
      DefaultLivePlaybackSpeedControl
      A LivePlaybackSpeedControl that adjusts the playback speed using a proportional controller.
      DefaultLivePlaybackSpeedControl.Builder
      DefaultLoadControl
      The default LoadControl implementation.
      DefaultLoadControl.Builder
      Builder for DefaultLoadControl.
      DefaultLoadErrorHandlingPolicy
      Default implementation of LoadErrorHandlingPolicy.
      DefaultMediaCodecAdapterFactory + +
      DefaultMediaDescriptionAdapter
      DefaultMediaItemConverter
      Default MediaItemConverter implementation.
      DefaultMediaItemConverter
      Default implementation of MediaItemConverter.
      DefaultMediaSourceFactory
      The default MediaSourceFactory implementation.
      DefaultMediaSourceFactory.AdsLoaderProvider -
      Provides AdsLoader instances for media items that have ad tag URIs.
      +
      Provides AdsLoader instances for media items that have ad tag URIs.
      DefaultPlaybackSessionManager
      Default PlaybackSessionManager which instantiates a new session for each window in the timeline and also for each ad within the windows.
      DefaultRenderersFactory
      Default RenderersFactory implementation.
      DefaultRenderersFactory.ExtensionRendererMode
      Modes for using extension renderers.
      DefaultRenderersFactoryAsserts
      Assertions for DefaultRenderersFactory.
      DefaultRtpPayloadReaderFactory
      Default RtpPayloadReader.Factory implementation.
      DefaultSsChunkSource
      A default SsChunkSource implementation.
      DefaultSsChunkSource.Factory  
      DefaultTimeBar
      A time bar that shows a current position, buffered position, duration and ad markers.
      DefaultTrackNameProvider
      DefaultTrackSelector
      A default TrackSelector suitable for most use cases.
      DefaultTrackSelector.AudioTrackScore
      Represents how well an audio track matches the selection DefaultTrackSelector.Parameters.
      DefaultTrackSelector.OtherTrackScore
      Represents how well any other track (non video, audio or text) matches the selection DefaultTrackSelector.Parameters.
      DefaultTrackSelector.Parameters
      Extends DefaultTrackSelector.Parameters by adding fields that are specific to DefaultTrackSelector.
      DefaultTrackSelector.ParametersBuilder
      DefaultTrackSelector.SelectionOverride
      A track selection override.
      DefaultTrackSelector.TextTrackScore
      Represents how well a text track matches the selection DefaultTrackSelector.Parameters.
      DefaultTrackSelector.VideoTrackScore
      Represents how well a video track matches the selection DefaultTrackSelector.Parameters.
      DefaultTsPayloadReaderFactory
      Default TsPayloadReader.Factory implementation.
      DefaultTsPayloadReaderFactory.Flags
      Flags controlling elementary stream readers' behavior.
      Descriptor
      A descriptor, as defined by ISO 23009-1, 2nd edition, 5.8.2.
      DeviceInfo
      DeviceInfo
      Information about the playback device.
      DeviceInfo.PlaybackType
      DeviceInfo.PlaybackType
      Types of playback.
      DeviceListenerDeprecated. - -
      DolbyVisionConfig
      Dolby Vision configuration data.
      Download
      Represents state of a download.
      Download.FailureReason
      Failure reasons.
      Download.State
      Download states.
      DownloadBuilder
      Builder for Download.
      DownloadCursor
      Provides random read-write access to the result set returned by a database query.
      Downloader
      Downloads and removes a piece of content.
      Downloader.ProgressListener
      Receives progress updates during download operations.
      DownloaderFactory
      Creates Downloaders for given DownloadRequests.
      DownloadException
      Thrown on an error during downloading.
      DownloadHelper
      A helper for initializing and removing downloads.
      DownloadHelper.Callback
      A callback to be notified when the DownloadHelper is prepared.
      DownloadHelper.LiveContentUnsupportedException
      Thrown at an attempt to download live content.
      DownloadIndex
      An index of Downloads.
      DownloadManager
      Manages downloads.
      DownloadManager.Listener
      Listener for DownloadManager events.
      DownloadNotificationHelper
      Helper for creating download notifications.
      DownloadProgress
      Mutable Download progress.
      DownloadRequest
      Defines content to be downloaded.
      DownloadRequest.Builder
      A builder for download requests.
      DownloadRequest.UnsupportedRequestException
      Thrown when the encoded request data belongs to an unsupported request type.
      DownloadService
      A Service for downloading media.
      DrmInitData
      Initialization data for one or more DRM schemes.
      DrmInitData.SchemeData
      Scheme initialization data.
      DrmSession
      A DRM session.
      DrmSession.DrmSessionException
      Wraps the throwable which is the cause of the error state.
      DrmSession.State
      The state of the DRM session.
      DrmSessionEventListener
      Listener of DrmSessionManager events.
      DrmSessionEventListener.EventDispatcher
      Dispatches events to DrmSessionEventListeners.
      DrmSessionManager
      Manages a DRM session.
      DrmSessionManager.DrmSessionReference
      Represents a single reference count of a DrmSession, while deliberately not giving access to the underlying session.
      DrmSessionManagerProvider
      A provider to obtain a DrmSessionManager suitable for playing the content described by a MediaItem.
      DrmUtil
      DRM-related utility methods.
      DrmUtil.ErrorSource
      Identifies the operation which caused a DRM-related error.
      DtsReader
      Parses a continuous DTS byte stream and extracts individual samples.
      DtsUtil
      Utility methods for parsing DTS frames.
      DummyDataSource
      A DataSource which provides no data.
      DummyExoMediaDrm
      An ExoMediaDrm that does not support any protection schemes.
      DummyExtractorOutput
      A fake ExtractorOutput implementation.
      DummyMainThread
      Helper class to simulate main/UI thread in tests.
      DummyMainThread.TestRunnable
      Runnable variant which can throw a checked exception.
      DummySurface
      A dummy Surface.
      DummyTrackOutput
      A fake TrackOutput implementation.
      DumpableFormat
      Wraps a Format to allow dumping it.
      Dumper
      Helper utility to dump field values.
      Dumper.Dumpable
      Provides custom dump method.
      DumpFileAsserts
      Helper class to enable assertions based on golden-data dump files.
      DvbDecoder
      A SimpleSubtitleDecoder for DVB subtitles.
      DvbSubtitleReader
      Parses DVB subtitle data and extracts individual frames.
      EbmlProcessor
      Defines EBML element IDs/types and processes events.
      EbmlProcessor.ElementType
      EBML element types.
      EGLSurfaceTexture
      Generates a SurfaceTexture using EGL/GLES functions.
      EGLSurfaceTexture.GlException
      A runtime exception to be thrown if some EGL operations failed.
      EGLSurfaceTexture.SecureMode
      Secure mode to be used by the EGL surface and context.
      EGLSurfaceTexture.TextureImageListener
      Listener to be called when the texture image on SurfaceTexture has been updated.
      ElementaryStreamReader
      Extracts individual samples from an elementary media stream, preserving original order.
      EmptySampleStream
      An empty SampleStream.
      ErrorMessageProvider<T extends Throwable>
      Converts throwables into error codes and user readable error messages.
      ErrorStateDrmSession
      A DrmSession that's in a terminal error state.
      EventLogger
      Logs events from Player and other core components using Log.
      EventMessage
      An Event Message (emsg) as defined in ISO 23009-1.
      EventMessageDecoder
      Decodes data encoded by EventMessageEncoder.
      EventMessageEncoder
      Encodes data that can be decoded by EventMessageDecoder.
      EventStream
      A DASH in-MPD EventStream element, as defined by ISO/IEC 23009-1, 2nd edition, section 5.10.
      ExoDatabaseProvider -
      An SQLiteOpenHelper that provides instances of a standalone ExoPlayer database.
      +
      Deprecated. +
      ExoHostedTest
      A HostActivity.HostedTest for ExoPlayer playback tests.
      ExoMediaCrypto -
      Enables decoding of encrypted data using keys in a DRM session.
      -
      ExoMediaDrm
      Used to obtain keys for decrypting protected media streams.
      ExoMediaDrm.AppManagedProvider
      Provides an ExoMediaDrm instance owned by the app.
      ExoMediaDrm.KeyRequest
      Contains data used to request keys from a license server.
      ExoMediaDrm.KeyRequest.RequestType
      Key request types.
      ExoMediaDrm.KeyStatus
      Defines the status of a key.
      ExoMediaDrm.OnEventListener
      Called when a DRM event occurs.
      ExoMediaDrm.OnExpirationUpdateListener
      Called when a session expiration update occurs.
      ExoMediaDrm.OnKeyStatusChangeListener
      Called when the keys in a DRM session change state.
      ExoMediaDrm.Provider
      Provider for ExoMediaDrm instances.
      ExoMediaDrm.ProvisionRequest
      Contains data to request a certificate from a provisioning server.
      ExoPlaybackException
      Thrown when a non locally recoverable playback failure occurs.
      ExoPlaybackException.Type
      The type of source that produced the error.
      ExoPlayer
      An extensible media player that plays MediaSources.
      ExoPlayer.AudioComponent -
      The audio component of an ExoPlayer.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
      ExoPlayer.AudioOffloadListener
      A listener for audio offload events.
      ExoPlayer.BuilderDeprecated. - + +
      A builder for ExoPlayer instances.
      ExoPlayer.DeviceComponent -
      The device component of an ExoPlayer.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
      ExoPlayer.MetadataComponent -
      The metadata component of an ExoPlayer.
      -
      ExoPlayer.TextComponent -
      The text component of an ExoPlayer.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      ExoPlayer.VideoComponent -
      The video component of an ExoPlayer.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
      ExoplayerCuesDecoder +
      A SubtitleDecoder that decodes subtitle samples of type MimeTypes.TEXT_EXOPLAYER_CUES
      +
      ExoPlayerLibraryInfo -
      Information about the ExoPlayer library.
      +
      Information about the media libraries.
      ExoPlayerTestRunner
      Helper class to run an ExoPlayer test.
      ExoPlayerTestRunner.Builder -
      Builder to set-up a ExoPlayerTestRunner.
      +
      Builder to set-up an ExoPlayerTestRunner.
      ExoTimeoutException
      A timeout of an operation on the ExoPlayer playback thread.
      ExoTimeoutException.TimeoutOperation
      The operation which produced the timeout error.
      ExoTrackSelection
      ExoTrackSelection.Definition
      Contains of a subset of selected tracks belonging to a TrackGroup.
      ExoTrackSelection.Factory
      Factory for ExoTrackSelection instances.
      Extractor
      Extracts media data from a container format.
      Extractor.ReadResult
      Result values that can be returned by Extractor.read(ExtractorInput, PositionHolder).
      ExtractorAsserts
      Assertion methods for Extractor.
      ExtractorAsserts.AssertionConfig
      A config for the assertions made (e.g.
      ExtractorAsserts.AssertionConfig.Builder
      Builder for ExtractorAsserts.AssertionConfig instances.
      ExtractorAsserts.ExtractorFactory
      A factory for Extractor instances.
      ExtractorAsserts.SimulationConfig
      A config of different environments to simulate and extractor behaviours to test.
      ExtractorInput
      Provides data to be consumed by an Extractor.
      ExtractorOutput
      Receives stream level data extracted by an Extractor.
      ExtractorsFactory
      Factory for arrays of Extractor instances.
      ExtractorUtil
      Extractor related utility methods.
      FailOnCloseDataSink
      A DataSink that can simulate caching the bytes being written to it, and then failing to persist them when FailOnCloseDataSink.close() is called.
      FailOnCloseDataSink.Factory
      Factory to create a FailOnCloseDataSink.
      FakeAdaptiveDataSet
      Fake data set emulating the data of an adaptive media source.
      FakeAdaptiveDataSet.Factory
      Factory for FakeAdaptiveDataSets.
      FakeAdaptiveDataSet.Iterator
      MediaChunkIterator for the chunks defined by a fake adaptive data set.
      FakeAdaptiveMediaPeriod
      Fake MediaPeriod that provides tracks from the given TrackGroupArray.
      FakeAdaptiveMediaSource
      Fake MediaSource that provides a given timeline.
      FakeAudioRenderer
      FakeChunkSource
      Fake ChunkSource with adaptive media chunks of a given duration.
      FakeChunkSource.Factory
      Factory for a FakeChunkSource.
      FakeClock
      Fake Clock implementation that allows to advance the time manually to trigger pending timed messages.
      FakeCryptoConfig + +
      FakeDataSet
      Collection of FakeDataSet.FakeData to be served by a FakeDataSource.
      FakeDataSet.FakeData
      Container of fake data to be served by a FakeDataSource.
      FakeDataSet.FakeData.Segment
      A segment of FakeDataSet.FakeData.
      FakeDataSource
      A fake DataSource capable of simulating various scenarios.
      FakeDataSource.Factory
      Factory to create a FakeDataSource.
      FakeExoMediaDrm
      A fake implementation of ExoMediaDrm for use in tests.
      FakeExoMediaDrm.Builder
      Builder for FakeExoMediaDrm instances.
      FakeExoMediaDrm.LicenseServer
      An license server implementation to interact with FakeExoMediaDrm.
      FakeExtractorInput
      A fake ExtractorInput capable of simulating various scenarios.
      FakeExtractorInput.Builder
      Builder of FakeExtractorInput instances.
      FakeExtractorInput.SimulatedIOException
      Thrown when simulating an IOException.
      FakeExtractorOutput
      FakeMediaChunk
      FakeMediaChunkIterator
      FakeMediaClockRenderer
      Fake abstract Renderer which is also a MediaClock.
      FakeMediaPeriod
      Fake MediaPeriod that provides tracks from the given TrackGroupArray.
      FakeMediaPeriod.TrackDataFactory
      A factory to create the test data for a particular track.
      FakeMediaSource
      Fake MediaSource that provides a given timeline.
      FakeMediaSource.InitialTimeline
      A forwarding timeline to provide an initial timeline for fake multi window sources.
      FakeMediaSourceFactory +
      Fake MediaSourceFactory that creates a FakeMediaSource.
      +
      FakeMetadataEntry + +
      FakeRenderer
      Fake Renderer that supports any format with the matching track type.
      FakeSampleStream
      Fake SampleStream that outputs a given Format and any amount of items.
      FakeSampleStream.FakeSampleStreamItem
      FakeShuffleOrder
      Fake ShuffleOrder which returns a reverse order.
      FakeTimeline
      Fake Timeline which can be setup to return custom FakeTimeline.TimelineWindowDefinitions.
      FakeTimeline.TimelineWindowDefinition
      Definition used to define a FakeTimeline.
      FakeTrackOutput
      A fake TrackOutput.
      FakeTrackOutput.Factory
      Factory for FakeTrackOutput instances.
      FakeTrackSelection
      A fake ExoTrackSelection that only returns 1 fixed track, and allows querying the number of calls to its methods.
      FakeTrackSelector
      FakeVideoRenderer
      FfmpegAudioRenderer
      Decodes and renders audio using FFmpeg.
      FfmpegDecoderException
      Thrown when an FFmpeg decoder error occurs.
      FfmpegLibrary
      Configures and queries the underlying native library.
      FileDataSource
      A DataSource for reading local files.
      FileDataSource.Factory
      FileDataSource.FileDataSourceException
      Thrown when a FileDataSource encounters an error reading a file.
      FileDataSourceFactoryDeprecated. - -
      FileTypes
      Defines common file type constants and helper methods.
      FileTypes.Type
      File types.
      FilterableManifest<T>
      A manifest that can generate copies of itself including only the streams specified by the given keys.
      FilteringHlsPlaylistParserFactory
      A HlsPlaylistParserFactory that includes only the streams identified by the given stream keys.
      FilteringManifestParser<T extends FilterableManifest<T>>
      A manifest parser that includes only the streams identified by the given stream keys.
      FixedTrackSelection
      A TrackSelection consisting of a single track.
      FlacConstants
      FlacConstants
      Defines constants used by the FLAC extractor.
      FlacDecoder
      Flac decoder.
      FlacDecoderException
      Thrown when an Flac decoder error occurs.
      FlacExtractor
      Facilitates the extraction of data from the FLAC container format.
      FlacExtractor
      Extracts data from FLAC container format.
      FlacExtractor.Flags
      Flags controlling the behavior of the extractor.
      FlacExtractor.Flags
      Flags controlling the behavior of the extractor.
      FlacFrameReader
      Reads and peeks FLAC frame elements according to the FLAC format specification.
      FlacFrameReader.SampleNumberHolder
      Holds a sample number.
      FlacLibrary
      Configures and queries the underlying native library.
      FlacMetadataReader
      Reads and peeks FLAC stream metadata elements according to the FLAC format specification.
      FlacMetadataReader.FlacStreamMetadataHolder
      FlacSeekTableSeekMap
      A SeekMap implementation for FLAC streams that contain a seek table.
      FlacStreamMetadata
      Holder for FLAC metadata.
      FlacStreamMetadata.SeekTable
      A FLAC seek table.
      FlagSet
      A set of integer flags.
      FlagSet.Builder
      A builder for FlagSet instances.
      FlvExtractor
      Extracts data from the FLV container format.
      Format
      Represents a media format.
      Format.Builder
      Builds Format instances.
      FormatHolder
      Holds a Format.
      ForwardingAudioSink
      An overridable AudioSink implementation forwarding all methods to another sink.
      ForwardingExtractorInput
      An overridable ExtractorInput implementation forwarding all methods to another input.
      ForwardingPlayer
      A Player that forwards operations to another Player.
      ForwardingTimeline
      An overridable Timeline implementation forwarding all methods to another timeline.
      FragmentedMp4Extractor
      Extracts data from the FMP4 container format.
      FragmentedMp4Extractor.Flags
      Flags controlling the behavior of the extractor.
      FrameworkMediaCrypto
      FrameworkCryptoConfig -
      An ExoMediaCrypto implementation that contains the necessary information to build or - update a framework MediaCrypto.
      +
      FrameworkMediaDrm
      An ExoMediaDrm implementation that wraps the framework MediaDrm.
      GaplessInfoHolder
      Holder for gapless playback information.
      Gav1Decoder
      Gav1 decoder.
      Gav1DecoderException
      Thrown when a libgav1 decoder error occurs.
      Gav1Library
      Configures and queries the underlying native library.
      GeobFrame
      GEOB (General Encapsulated Object) ID3 frame.
      GlUtil
      GL utilities.
      GlUtil.Attribute
      GL attribute, which can be attached to a buffer with GlUtil.Attribute.setBuffer(float[], int).
      GlUtil.GlException +
      Thrown when an OpenGL error occurs and GlUtil.glAssertionsEnabled is true.
      +
      GlUtil.Program +
      GL program.
      +
      GlUtil.Uniform
      GL uniform, which can be attached to a sampler using GlUtil.Uniform.setSamplerTexId(int, int).
      GvrAudioProcessorDeprecated. -
      If you still need this component, please contact us by filing an issue on our issue tracker.
      +
      GlUtil.UnsupportedEglVersionException +
      Thrown when the required EGL version is not supported by the device.
      H262Reader
      Parses a continuous H262 byte stream and extracts individual frames.
      H263Reader
      Parses an ISO/IEC 14496-2 (MPEG-4 Part 2) or ITU-T Recommendation H.263 byte stream and extracts individual frames.
      H264Reader
      Parses a continuous H264 byte stream and extracts individual frames.
      H265Reader
      Parses a continuous H.265 byte stream and extracts individual frames.
      HandlerWrapper
      An interface to call through to a Handler.
      HandlerWrapper.Message
      A message obtained from the handler.
      HeartRating
      A rating expressed as "heart" or "no heart".
      HevcConfig
      HEVC configuration data.
      HlsDataSourceFactory
      Creates DataSources for HLS playlists, encryption and media chunks.
      HlsDownloader
      A downloader for HLS streams.
      HlsExtractorFactory
      Factory for HLS media chunk extractors.
      HlsManifest
      Holds a master playlist along with a snapshot of one of its media playlists.
      HlsMasterPlaylist
      Represents an HLS master playlist.
      HlsMasterPlaylist.Rendition
      A rendition (i.e.
      HlsMasterPlaylist.Variant
      A variant (i.e.
      HlsMediaChunkExtractor
      Extracts samples and track Formats from HlsMediaChunks.
      HlsMediaPeriod
      A MediaPeriod that loads an HLS stream.
      HlsMediaPlaylist
      Represents an HLS media playlist.
      HlsMediaPlaylist.Part
      A media part.
      HlsMediaPlaylist.PlaylistType
      Type of the playlist, as defined by #EXT-X-PLAYLIST-TYPE.
      HlsMediaPlaylist.RenditionReport
      A rendition report for an alternative rendition defined in another media playlist.
      HlsMediaPlaylist.Segment
      Media segment reference.
      HlsMediaPlaylist.SegmentBase
      The base for a HlsMediaPlaylist.Segment or a HlsMediaPlaylist.Part required for playback.
      HlsMediaPlaylist.ServerControl
      Server control attributes.
      HlsMediaSource
      An HLS MediaSource.
      HlsMediaSource.Factory
      Factory for HlsMediaSources.
      HlsMediaSource.MetadataType
      The types of metadata that can be extracted from HLS streams.
      HlsPlaylist
      Represents an HLS playlist.
      HlsPlaylistParser
      HLS playlists parsing logic.
      HlsPlaylistParser.DeltaUpdateException
      Exception thrown when merging a delta update fails.
      HlsPlaylistParserFactory
      Factory for HlsPlaylist parsers.
      HlsPlaylistTracker
      Tracks playlists associated to an HLS stream and provides snapshots.
      HlsPlaylistTracker.Factory
      Factory for HlsPlaylistTracker instances.
      HlsPlaylistTracker.PlaylistEventListener
      Called on playlist loading events.
      HlsPlaylistTracker.PlaylistResetException
      Thrown when the media sequence of a new snapshot indicates the server has reset.
      HlsPlaylistTracker.PlaylistStuckException
      Thrown when a playlist is considered to be stuck due to a server side error.
      HlsPlaylistTracker.PrimaryPlaylistListener
      Listener for primary playlist changes.
      HlsTrackMetadataEntry
      Holds metadata associated to an HLS media track.
      HlsTrackMetadataEntry.VariantInfo
      Holds attributes defined in an EXT-X-STREAM-INF tag.
      HorizontalTextInVerticalContextSpan
      A styling span for horizontal text in a vertical context.
      HostActivity
      A host activity for performing playback tests.
      HostActivity.HostedTest
      Interface for tests that run inside of a HostActivity.
      HttpDataSource
      An HTTP DataSource.
      HttpDataSource.BaseFactory
      Base implementation of HttpDataSource.Factory that sets default request properties.
      HttpDataSource.CleartextNotPermittedException
      Thrown when cleartext HTTP traffic is not permitted.
      HttpDataSource.Factory
      A factory for HttpDataSource instances.
      HttpDataSource.HttpDataSourceException
      Thrown when an error is encountered when trying to read from a HttpDataSource.
      HttpDataSource.HttpDataSourceException.Type
      The type of operation that produced the error.
      HttpDataSource.InvalidContentTypeException
      Thrown when the content type is invalid.
      HttpDataSource.InvalidResponseCodeException
      Thrown when an attempt to open a connection results in a response code not in the 2xx range.
      HttpDataSource.RequestProperties
      Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers in @@ -3845,330 +3908,324 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); state.
      HttpDataSourceTestEnv
      A JUnit Rule that creates test resources for HttpDataSource contract tests.
      HttpMediaDrmCallback
      A MediaDrmCallback that makes requests using HttpDataSource instances.
      HttpUtil
      Utility methods for HTTP.
      IcyDecoder
      Decodes ICY stream information.
      IcyHeaders
      ICY headers.
      IcyInfo
      ICY in-stream information.
      Id3Decoder
      Decodes ID3 tags.
      Id3Decoder.FramePredicate
      A predicate for determining whether individual frames should be decoded.
      Id3Frame
      Base class for ID3 frames.
      Id3Peeker
      Peeks data from the beginning of an ExtractorInput to determine if there is any ID3 tag.
      Id3Reader
      Parses ID3 data and extracts individual text information frames.
      IllegalSeekPositionException
      Thrown when an attempt is made to seek to a position that does not exist in the player's Timeline.
      ImaAdsLoader
      AdsLoader using the IMA SDK.
      ImaAdsLoader.Builder
      Builder for ImaAdsLoader.
      IndexSeekMap
      A SeekMap implementation based on a mapping between times and positions in the input stream.
      InitializationChunk
      A Chunk that uses an Extractor to decode initialization data for single track.
      InputReaderAdapterV30
      MediaParser.SeekableInputReader implementation wrapping a DataReader.
      IntArrayQueue -
      Array-based unbounded queue for int primitives with amortized O(1) add and remove.
      -
      InternalFrame
      Internal ID3 frame that is intended for use by the player.
      JpegExtractor
      Extracts JPEG image using the Exif format.
      KeysExpiredException
      Thrown when the drm keys loaded into an open session expire.
      LanguageFeatureSpan
      Marker interface for span classes that carry language features rather than style information.
      LatmReader
      Parses and extracts samples from an AAC/LATM elementary stream.
      LeanbackPlayerAdapter
      Leanback PlayerAdapter implementation for Player.
      LeastRecentlyUsedCacheEvictor
      Evicts least recently used cache files first.
      LibflacAudioRenderer
      Decodes and renders audio using the native Flac decoder.
      Libgav1VideoRenderer
      Decodes and renders video using libgav1 decoder.
      LibopusAudioRenderer
      Decodes and renders audio using the native Opus decoder.
      LibraryLoader
      Configurable loader for native libraries.
      LibvpxVideoRenderer
      Decodes and renders video using the native VP9 decoder.
      ListenerSet<T>
      ListenerSet<T extends @NonNull Object>
      A set of listeners.
      ListenerSet.Event<T>
      An event sent to a listener.
      ListenerSet.IterationFinishedEvent<T>
      An event sent to a listener when all other events sent during one Looper message queue iteration were handled by the listener.
      LivePlaybackSpeedControl
      Controls the playback speed while playing live content in order to maintain a steady target live offset.
      LoadControl
      Controls buffering of media.
      Loader
      Manages the background loading of Loader.Loadables.
      Loader.Callback<T extends Loader.Loadable>
      A callback to be notified of Loader events.
      Loader.Loadable
      An object that can be loaded using a Loader.
      Loader.LoadErrorAction
      Loader.ReleaseCallback
      A callback to be notified when a Loader has finished being released.
      Loader.UnexpectedLoaderException
      Thrown when an unexpected exception or error is encountered during loading.
      LoaderErrorThrower
      Conditionally throws errors affecting a Loader.
      LoaderErrorThrower.Dummy
      A LoaderErrorThrower that never throws.
      LoadErrorHandlingPolicy
      A policy that defines how load errors are handled.
      LoadErrorHandlingPolicy.FallbackOptions
      Holds information about the available fallback options.
      LoadErrorHandlingPolicy.FallbackSelection
      A selected fallback option.
      LoadErrorHandlingPolicy.FallbackType
      Fallback type.
      LoadErrorHandlingPolicy.LoadErrorInfo
      Holds information about a load task error.
      LoadEventInfo
      MediaSource load event information.
      LocalMediaDrmCallback
      A MediaDrmCallback that provides a fixed response to key requests.
      Log
      Wrapper around Log which allows to set the log level.
      LongArray
      An append-only, auto-growing long[].
      LoopingMediaSource Deprecated. -
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) +
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class.
      MappingTrackSelector
      Base class for TrackSelectors that first establish a mapping between TrackGroups @@ -4176,1667 +4233,1708 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); renderer.
      MappingTrackSelector.MappedTrackInfo
      Provides mapped track information for each renderer.
      MaskingMediaPeriod
      Media period that defers calling MediaSource.createPeriod(MediaPeriodId, Allocator, long) on a given source until MaskingMediaPeriod.createPeriod(MediaPeriodId) has been called.
      MaskingMediaPeriod.PrepareListener
      Listener for preparation events.
      MaskingMediaSource
      A MediaSource that masks the Timeline with a placeholder until the actual media structure is known.
      MaskingMediaSource.PlaceholderTimeline
      A timeline with one dynamic window with a period of indeterminate duration.
      MatroskaExtractor
      Extracts data from the Matroska and WebM container formats.
      MatroskaExtractor.Flags
      Flags controlling the behavior of the extractor.
      MdtaMetadataEntry
      Stores extensible metadata with handler type 'mdta'.
      MediaChunk
      An abstract base class for Chunks that contain media samples.
      MediaChunkIterator
      Iterator for media chunk sequences.
      MediaClock
      Tracks the progression of media time.
      MediaCodecAdapter
      Abstracts MediaCodec operations.
      MediaCodecAdapter.Configuration
      Configuration parameters for a MediaCodecAdapter.
      MediaCodecAdapter.Factory
      A factory for MediaCodecAdapter instances.
      MediaCodecAdapter.OnFrameRenderedListener
      Listener to be called when an output frame has rendered on the output surface.
      MediaCodecAudioRenderer
      Decodes and renders audio using MediaCodec and an AudioSink.
      MediaCodecDecoderException
      Thrown when a failure occurs in a MediaCodec decoder.
      MediaCodecInfo
      Information about a MediaCodec for a given mime type.
      MediaCodecRenderer
      An abstract renderer that uses MediaCodec to decode samples for rendering.
      MediaCodecRenderer.DecoderInitializationException
      Thrown when a failure occurs instantiating a decoder.
      MediaCodecSelector
      Selector of MediaCodec instances.
      MediaCodecUtil
      A utility class for querying the available codecs.
      MediaCodecUtil.DecoderQueryException
      Thrown when an error occurs querying the device for its underlying media capabilities.
      MediaCodecVideoDecoderException
      Thrown when a failure occurs in a MediaCodec video decoder.
      MediaCodecVideoRenderer
      Decodes and renders video using MediaCodec.
      MediaCodecVideoRenderer.CodecMaxValues  
      MediaDrmCallback
      Performs ExoMediaDrm key and provisioning requests.
      MediaDrmCallbackException
      Thrown when an error occurs while executing a DRM key or provisioning request.
      MediaFormatUtil
      Helper class containing utility methods for managing MediaFormat instances.
      MediaItem
      Representation of a media item.
      MediaItem.AdsConfiguration
      Configuration for playing back linear ads with a media item.
      MediaItem.AdsConfiguration.Builder +
      Builder for MediaItem.AdsConfiguration instances.
      +
      MediaItem.Builder
      A builder for MediaItem instances.
      MediaItem.ClippingProperties
      MediaItem.ClippingConfiguration
      Optionally clips the media item to a custom start and end position.
      MediaItem.ClippingConfiguration.Builder +
      Builder for MediaItem.ClippingConfiguration instances.
      +
      MediaItem.ClippingPropertiesDeprecated. + +
      MediaItem.DrmConfiguration
      DRM configuration for a media item.
      MediaItem.DrmConfiguration.Builder + +
      MediaItem.LiveConfiguration
      Live playback configuration.
      MediaItem.PlaybackProperties
      MediaItem.LiveConfiguration.Builder +
      Builder for MediaItem.LiveConfiguration instances.
      +
      MediaItem.LocalConfiguration
      Properties for local playback.
      MediaItem.PlaybackPropertiesDeprecated. + +
      MediaItem.SubtitleDeprecated. + +
      MediaItem.SubtitleConfiguration
      Properties for a text track.
      MediaItem.SubtitleConfiguration.Builder +
      Builder for MediaItem.SubtitleConfiguration instances.
      +
      MediaItemConverter
      Converts between MediaItem and the Cast SDK's MediaQueueItem.
      MediaItemConverter
      Converts between Media2 MediaItem and ExoPlayer MediaItem.
      MediaLoadData
      Descriptor for data being loaded or selected by a MediaSource.
      MediaMetadata
      Metadata of a MediaItem, playlist, or a combination of multiple sources of Metadata.
      MediaMetadata.Builder
      A builder for MediaMetadata instances.
      MediaMetadata.FolderType
      The folder type of the media item.
      MediaMetadata.PictureType
      The picture type of the artwork.
      MediaParserChunkExtractor
      ChunkExtractor implemented on top of the platform's MediaParser.
      MediaParserExtractorAdapter
      ProgressiveMediaExtractor implemented on top of the platform's MediaParser.
      MediaParserHlsMediaChunkExtractor
      HlsMediaChunkExtractor implemented on top of the platform's MediaParser.
      MediaParserUtil
      Miscellaneous constants and utility methods related to the MediaParser integration.
      MediaPeriod
      Loads media corresponding to a Timeline.Period, and allows that media to be read.
      MediaPeriod.Callback
      A callback to be notified of MediaPeriod events.
      MediaPeriodAsserts
      Assertion methods for MediaPeriod.
      MediaPeriodAsserts.FilterableManifestMediaPeriodFactory<T extends FilterableManifest<T>>
      Interface to create media periods for testing based on a FilterableManifest.
      MediaPeriodId
      Identifies a specific playback of a Timeline.Period.
      MediaSessionConnector
      Connects a MediaSessionCompat to a Player.
      MediaSessionConnector.CaptionCallback
      Handles requests for enabling or disabling captions.
      MediaSessionConnector.CommandReceiver
      Receiver of media commands sent by a media controller.
      MediaSessionConnector.CustomActionProvider
      Provides a PlaybackStateCompat.CustomAction to be published and handles the action when sent by a media controller.
      MediaSessionConnector.DefaultMediaMetadataProvider
      Provides a default MediaMetadataCompat with properties and extras taken from the MediaDescriptionCompat of the MediaSessionCompat.QueueItem of the active queue item.
      MediaSessionConnector.MediaButtonEventHandler
      Handles a media button event.
      MediaSessionConnector.MediaMetadataProvider
      Provides a MediaMetadataCompat for a given player state.
      MediaSessionConnector.PlaybackActions
      Playback actions supported by the connector.
      MediaSessionConnector.PlaybackPreparer
      Interface to which playback preparation and play actions are delegated.
      MediaSessionConnector.QueueEditor
      Handles media session queue edits.
      MediaSessionConnector.QueueNavigator
      Handles queue navigation actions, and updates the media session queue by calling MediaSessionCompat.setQueue().
      MediaSessionConnector.RatingCallback
      Callback receiving a user rating for the active media item.
      MediaSource
      Defines and provides media to be played by an ExoPlayer.
      MediaSource.MediaPeriodId
      Identifier for a MediaPeriod.
      MediaSource.MediaSourceCaller
      A caller of media sources, which will be notified of source events.
      MediaSourceEventListener
      Interface for callbacks to be notified of MediaSource events.
      MediaSourceEventListener.EventDispatcher
      Dispatches events to MediaSourceEventListeners.
      MediaSourceFactory
      Factory for creating MediaSources from MediaItems.
      MediaSourceTestRunner
      A runner for MediaSource tests.
      MergingMediaSource
      Merges multiple MediaSources.
      MergingMediaSource.IllegalMergeException
      Thrown when a MergingMediaSource cannot merge its sources.
      MergingMediaSource.IllegalMergeException.Reason
      The reason the merge failed.
      Metadata
      A collection of metadata entries.
      Metadata.Entry
      A metadata entry.
      MetadataDecoder
      Decodes metadata from binary data.
      MetadataDecoderFactory
      A factory for MetadataDecoder instances.
      MetadataInputBuffer
      MetadataOutput
      Receives metadata output.
      MetadataRenderer
      A renderer for metadata.
      MetadataRetriever
      Retrieves the static metadata of MediaItems.
      MimeTypes
      Defines common MIME types and helper methods.
      MlltFrame
      MPEG location lookup table frame.
      MotionPhotoMetadata
      Metadata of a motion photo file.
      Mp3Extractor
      Extracts data from the MP3 container format.
      Mp3Extractor.Flags
      Flags controlling the behavior of the extractor.
      Mp4Extractor
      Extracts data from the MP4 container format.
      Mp4Extractor.Flags
      Flags controlling the behavior of the extractor.
      Mp4WebvttDecoder
      A SimpleSubtitleDecoder for Webvtt embedded in a Mp4 container file.
      MpegAudioReader
      Parses a continuous MPEG Audio byte stream and extracts individual frames.
      MpegAudioUtil
      Utility methods for handling MPEG audio streams.
      MpegAudioUtil.Header
      Stores the metadata for an MPEG audio frame.
      NalUnitUtil
      Utility methods for handling H.264/AVC and H.265/HEVC NAL units.
      NalUnitUtil.H265SpsData +
      Holds data parsed from a H.265 sequence parameter set NAL unit.
      +
      NalUnitUtil.PpsData
      Holds data parsed from a picture parameter set NAL unit.
      NalUnitUtil.SpsData -
      Holds data parsed from a sequence parameter set NAL unit.
      +
      Holds data parsed from a H.264 sequence parameter set NAL unit.
      NetworkTypeObserver
      Observer for network type changes.
      NetworkTypeObserver.Config
      Configuration for NetworkTypeObserver.
      NetworkTypeObserver.Listener
      A listener for network type changes.
      NonNullApi
      Annotation to declare all type usages in the annotated instance as Nonnull, unless explicitly marked with a nullable annotation.
      NoOpCacheEvictor
      Evictor that doesn't ever evict cache files.
      NoSampleRenderer
      A Renderer implementation whose track type is C.TRACK_TYPE_NONE and does not consume data from its SampleStream.
      NotificationUtil
      Utility methods for displaying Notifications.
      NotificationUtil.Importance
      Notification channel importance levels.
      NoUidTimeline
      A timeline which wraps another timeline and overrides all window and period uids to 0.
      OfflineLicenseHelper
      Helper class to download, renew and release offline licenses.
      OggExtractor
      Extracts data from the Ogg container format.
      OkHttpDataSource
      An HttpDataSource that delegates to Square's Call.Factory.
      OkHttpDataSource.Factory
      OkHttpDataSourceFactory Deprecated.
      OpusDecoder
      Opus decoder.
      OpusDecoderException
      Thrown when an Opus decoder error occurs.
      OpusLibrary
      Configures and queries the underlying native library.
      OpusUtil
      Utility methods for handling Opus audio streams.
      OutputBuffer -
      Output buffer decoded by a Decoder.
      -
      OutputBuffer.Owner<S extends OutputBuffer> -
      Buffer owner.
      -
      OutputConsumerAdapterV30
      MediaParser.OutputConsumer implementation that redirects output to an ExtractorOutput.
      ParsableBitArray
      Wraps a byte array, providing methods that allow it to be read as a bitstream.
      ParsableByteArray
      Wraps a byte array, providing a set of methods for parsing data from it.
      ParsableNalUnitBitArray
      Wraps a byte array, providing methods that allow it to be read as a NAL unit bitstream.
      ParserException
      Thrown when an error occurs parsing media data and metadata.
      ParsingLoadable<T>
      A Loader.Loadable for objects that can be parsed from binary data using a ParsingLoadable.Parser.
      ParsingLoadable.Parser<T>
      Parses an object from loaded data.
      PassthroughSectionPayloadReader
      A SectionPayloadReader that directly outputs the section bytes as sample data.
      PercentageRating
      A rating expressed as a percentage.
      Period
      Encapsulates media content components over a contiguous period of time.
      PesReader
      Parses PES packet data and extracts samples.
      PgsDecoder
      A SimpleSubtitleDecoder for PGS subtitles.
      PictureFrame
      A picture parsed from a FLAC file.
      PlatformScheduler
      A Scheduler that uses JobScheduler.
      PlatformScheduler.PlatformSchedulerService
      A JobService that starts the target service if the requirements are met.
      PlaybackException
      Thrown when a non locally recoverable playback failure occurs.
      PlaybackException.ErrorCode
      Codes that identify causes of player errors.
      PlaybackException.FieldNumber
      Identifiers for fields in a Bundle which represents a playback exception.
      PlaybackOutput
      Class to capture output from a playback test.
      PlaybackParameters
      Parameters that apply to playback, including speed setting.
      PlaybackSessionManager
      Manager for active playback sessions.
      PlaybackSessionManager.Listener
      A listener for session updates.
      PlaybackStats
      Statistics about playbacks.
      PlaybackStats.EventTimeAndException
      Stores an exception with the event time at which it occurred.
      PlaybackStats.EventTimeAndFormat
      Stores a format with the event time at which it started being used, or null to indicate that no format was used.
      PlaybackStats.EventTimeAndPlaybackState
      Stores a playback state with the event time at which it became active.
      PlaybackStatsListener
      AnalyticsListener to gather PlaybackStats from the player.
      PlaybackStatsListener.Callback
      A listener for PlaybackStats updates.
      Player
      A media player interface defining traditional high-level functionality, such as the ability to play, pause, seek and query properties of the currently playing media.
      Player.Command
      Commands that can be executed on a Player.
      Player.Commands
      A set of commands.
      Player.Commands.Builder
      A builder for Player.Commands instances.
      Player.DiscontinuityReason
      Reasons for position discontinuities.
      Player.Event
      Events that can be reported via Player.Listener.onEvents(Player, Events).
      Player.EventListener Deprecated.
      Player.Events
      A set of events.
      Player.Listener
      Listener of all changes in the Player.
      Player.MediaItemTransitionReason
      Reasons for media item transitions.
      Player.PlaybackSuppressionReason
      Reason why playback is suppressed even though Player.getPlayWhenReady() is true.
      Player.PlayWhenReadyChangeReason
      Reasons for playWhenReady changes.
      Player.PositionInfo
      Position info describing a playback position involved in a discontinuity.
      Player.RepeatMode
      Repeat modes for playback.
      Player.State
      Playback state.
      Player.TimelineChangeReason
      Reasons for timeline changes.
      PlayerControlView
      A view for controlling Player instances.
      PlayerControlView.ProgressUpdateListener
      Listener to be notified when progress has been updated.
      PlayerControlView.VisibilityListener
      Listener to be notified about changes of the visibility of the UI control.
      PlayerEmsgHandler
      Handles all emsg messages from all media tracks for the player.
      PlayerEmsgHandler.PlayerEmsgCallback
      Callbacks for player emsg events encountered during DASH live stream.
      PlayerMessage
      Defines a player message which can be sent with a PlayerMessage.Sender and received by a PlayerMessage.Target.
      PlayerMessage.Sender
      A sender for messages.
      PlayerMessage.Target
      A target for messages.
      PlayerNotificationManager
      Starts, updates and cancels a media style notification reflecting the player state.
      PlayerNotificationManager.Builder
      A builder for PlayerNotificationManager instances.
      PlayerNotificationManager.CustomActionReceiver
      Defines and handles custom actions.
      PlayerNotificationManager.MediaDescriptionAdapter
      An adapter to provide content assets of the media currently playing.
      PlayerNotificationManager.NotificationListener
      A listener for changes to the notification.
      PlayerNotificationManager.Priority
      Priority of the notification (required for API 25 and lower).
      PlayerNotificationManager.Visibility
      Visibility of notification on the lock screen.
      PlayerView
      A high level view for Player media playbacks.
      PlayerView.ShowBuffering
      Determines when the buffering view is shown.
      PositionHolder
      Holds a position in the stream.
      PriorityDataSource
      A DataSource that can be used as part of a task registered with a PriorityTaskManager.
      PriorityDataSourceFactory
      PriorityDataSource.Factory -
      A DataSource.Factory that produces PriorityDataSource instances.
      +
      PriorityDataSourceFactoryDeprecated. + +
      PriorityTaskManager
      Allows tasks with associated priorities to control how they proceed relative to one another.
      PriorityTaskManager.PriorityTooLowException
      Thrown when task attempts to proceed when another registered task has a higher priority.
      PrivateCommand
      Represents a private command as defined in SCTE35, Section 9.3.6.
      PrivFrame
      PRIV (Private) ID3 frame.
      ProgramInformation
      A parsed program information element.
      ProgressHolder
      Holds a progress percentage.
      ProgressiveDownloader
      A downloader for progressive media streams.
      ProgressiveMediaExtractor
      Extracts the contents of a container file from a progressive media stream.
      ProgressiveMediaExtractor.Factory
      Creates ProgressiveMediaExtractor instances.
      ProgressiveMediaSource
      Provides one period that loads data from a Uri and extracted using an Extractor.
      ProgressiveMediaSource.Factory
      PsExtractor
      Extracts data from the MPEG-2 PS container format.
      PsshAtomUtil
      Utility methods for handling PSSH atoms.
      RandomizedMp3Decoder
      Generates randomized, but correct amount of data on MP3 audio input.
      RandomTrackSelection
      An ExoTrackSelection whose selected track is updated randomly.
      RandomTrackSelection.Factory
      Factory for RandomTrackSelection instances.
      RangedUri
      Defines a range of data located at a reference uri.
      Rating
      A rating for media content.
      RawCcExtractor
      Extracts data from the RawCC container format.
      RawResourceDataSource
      A DataSource for reading a raw resource inside the APK.
      RawResourceDataSource.RawResourceDataSourceException
      Thrown when an IOException is encountered reading from a raw resource.
      Renderer
      Renders media read from a SampleStream.
      Renderer.MessageType +
      Represents a type of message that can be passed to a renderer.
      +
      Renderer.State
      The renderer states.
      Renderer.VideoScalingModeDeprecated. - -
      Renderer.WakeupListener
      Some renderers can signal when Renderer.render(long, long) should be called.
      RendererCapabilities
      Defines the capabilities of a Renderer.
      RendererCapabilities.AdaptiveSupport
      Level of renderer support for adaptive format switches.
      RendererCapabilities.Capabilities
      Combined renderer capabilities.
      RendererCapabilities.FormatSupport Deprecated.
      Use C.FormatSupport instead.
      RendererCapabilities.TunnelingSupport
      Level of renderer support for tunneling.
      RendererConfiguration
      The configuration of a Renderer.
      RenderersFactory -
      Builds Renderer instances for use by a SimpleExoPlayer.
      +
      Builds Renderer instances for use by an ExoPlayer.
      RepeatModeActionProvider
      Provides a custom action for toggling repeat modes.
      RepeatModeUtil
      Util class for repeat mode handling.
      RepeatModeUtil.RepeatToggleModes
      Set of repeat toggle modes.
      Representation
      A DASH representation.
      Representation.MultiSegmentRepresentation
      A DASH representation consisting of multiple segments.
      Representation.SingleSegmentRepresentation
      A DASH representation consisting of a single segment.
      Requirements
      Defines a set of device state requirements.
      Requirements.RequirementFlags
      Requirement flags.
      RequirementsWatcher
      Watches whether the Requirements are met and notifies the RequirementsWatcher.Listener on changes.
      RequirementsWatcher.Listener
      Notified when RequirementsWatcher instance first created and on changes whether the Requirements are met.
      ResolvingDataSource
      DataSource wrapper allowing just-in-time resolution of DataSpecs.
      ResolvingDataSource.Factory
      ResolvingDataSource.Resolver
      Resolves DataSpecs.
      ReusableBufferedOutputStream -
      This is a subclass of BufferedOutputStream with a ReusableBufferedOutputStream.reset(OutputStream) method - that allows an instance to be re-used with another underlying output stream.
      -
      RobolectricUtil
      Utility methods for Robolectric-based tests.
      RtmpDataSource
      A Real-Time Messaging Protocol (RTMP) DataSource.
      RtmpDataSource.Factory
      RtmpDataSourceFactory Deprecated.
      RtpAc3Reader
      Parses an AC3 byte stream carried on RTP packets, and extracts AC3 frames.
      RtpPacket
      Represents the header and the payload of an RTP packet.
      RtpPacket.Builder
      Builder class for an RtpPacket
      RtpPayloadFormat
      Represents the payload format used in RTP.
      RtpPayloadReader
      Extracts media samples from the payload of received RTP packets.
      RtpPayloadReader.Factory
      Factory of RtpPayloadReader instances.
      RtpUtils
      Utility methods for RTP.
      RtspMediaSource
      An Rtsp MediaSource
      RtspMediaSource.Factory
      Factory for RtspMediaSource
      RtspMediaSource.RtspPlaybackException
      Thrown when an exception or error is encountered during loading an RTSP stream.
      RubySpan
      A styling span for ruby text.
      RunnableFutureTask<R,​E extends Exception>
      A RunnableFuture that supports additional uninterruptible operations to query whether execution has started and finished.
      SampleQueue
      A queue of media samples.
      SampleQueue.UpstreamFormatChangedListener
      A listener for changes to the upstream format.
      SampleQueueMappingException
      Thrown when it is not possible to map a TrackGroup to a SampleQueue.
      SampleStream
      A stream of media samples (and associated format information).
      SampleStream.ReadDataResult
      SampleStream.ReadFlags
      Scheduler
      Schedules a service to be started in the foreground when some Requirements are met.
      SectionPayloadReader
      Reads section data.
      SectionReader
      Reads section data packets and feeds the whole sections to a given SectionPayloadReader.
      SeekMap
      Maps seek positions (in microseconds) to corresponding positions (byte offsets) in the stream.
      SeekMap.SeekPoints
      Contains one or two SeekPoints.
      SeekMap.Unseekable
      A SeekMap that does not support seeking.
      SeekParameters
      Parameters that apply to seeking.
      SeekPoint
      Defines a seek point in a media stream.
      SegmentBase
      An approximate representation of a SegmentBase manifest element.
      SegmentBase.MultiSegmentBase
      A SegmentBase that consists of multiple segments.
      SegmentBase.SegmentList
      A SegmentBase.MultiSegmentBase that uses a SegmentList to define its segments.
      SegmentBase.SegmentTemplate
      A SegmentBase.MultiSegmentBase that uses a SegmentTemplate to define its segments.
      SegmentBase.SegmentTimelineElement
      Represents a timeline segment from the MPD's SegmentTimeline list.
      SegmentBase.SingleSegmentBase
      A SegmentBase that defines a single segment.
      SegmentDownloader<M extends FilterableManifest<M>>
      Base class for multi segment stream downloaders.
      SegmentDownloader.Segment
      Smallest unit of content to be downloaded.
      SeiReader
      Consumes SEI buffers, outputting contained CEA-608/708 messages to a TrackOutput.
      SequenceableLoader
      A loader that can proceed in approximate synchronization with other loaders.
      SequenceableLoader.Callback<T extends SequenceableLoader>
      A callback to be notified of SequenceableLoader events.
      ServerSideInsertedAdsMediaSource
      A MediaSource for server-side inserted ad breaks.
      ServerSideInsertedAdsUtil
      A static utility class with methods to work with server-side inserted ads.
      ServiceDescriptionElement
      Represents a service description element.
      SessionAvailabilityListener
      Listener of changes in the cast session availability.
      SessionCallbackBuilder
      Builds a MediaSession.SessionCallback with various collaborators.
      SessionCallbackBuilder.AllowedCommandProvider
      Provides allowed commands for MediaController.
      SessionCallbackBuilder.CustomCommandProvider
      Callbacks for querying what custom commands are supported, and for handling a custom command when a controller sends it.
      SessionCallbackBuilder.DefaultAllowedCommandProvider
      Default implementation of SessionCallbackBuilder.AllowedCommandProvider that behaves as follows: @@ -5847,1288 +5945,1356 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Controller is in the same package as the session.
      SessionCallbackBuilder.DisconnectedCallback
      Callback for handling controller disconnection.
      SessionCallbackBuilder.MediaIdMediaItemProvider
      A SessionCallbackBuilder.MediaItemProvider that creates media items containing only a media ID.
      SessionCallbackBuilder.MediaItemProvider
      Provides the MediaItem.
      SessionCallbackBuilder.PostConnectCallback
      Callback for handling extra initialization after the connection.
      SessionCallbackBuilder.RatingCallback
      Callback receiving a user rating for a specified media id.
      SessionCallbackBuilder.SkipCallback
      Callback receiving skip backward and skip forward.
      SessionPlayerConnector
      An implementation of SessionPlayer that wraps a given ExoPlayer Player instance.
      ShadowMediaCodecConfig
      A JUnit @Rule to configure Roboelectric's ShadowMediaCodec.
      ShuffleOrder
      Shuffled order of indices.
      ShuffleOrder.DefaultShuffleOrder
      The default ShuffleOrder implementation for random shuffle order.
      ShuffleOrder.UnshuffledShuffleOrder
      A ShuffleOrder implementation which does not shuffle.
      SilenceMediaSource
      Media source with a single period consisting of silent raw audio of a given duration.
      SilenceMediaSource.Factory
      Factory for SilenceMediaSources.
      SilenceSkippingAudioProcessor
      An AudioProcessor that skips silence in the input stream.
      SimpleCache
      A Cache implementation that maintains an in-memory representation.
      SimpleDecoder<I extends DecoderInputBuffer,​O extends OutputBuffer,​E extends DecoderException>
      SimpleDecoder<I extends DecoderInputBuffer,​O extends DecoderOutputBuffer,​E extends DecoderException>
      Base class for Decoders that use their own decode thread and decode each input buffer immediately into a corresponding output buffer.
      SimpleDecoderOutputBuffer +
      Buffer for SimpleDecoder output.
      +
      SimpleExoPlayer -
      An ExoPlayer implementation that uses default Renderer components.
      +
      Deprecated. +
      Use ExoPlayer instead.
      SimpleExoPlayer.Builder -
      A builder for SimpleExoPlayer instances.
      +
      Deprecated. +
      Use ExoPlayer.Builder instead.
      SimpleMetadataDecoder
      A MetadataDecoder base class that validates input buffers and discards any for which Buffer.isDecodeOnly() is true.
      SimpleOutputBuffer -
      Buffer for SimpleDecoder output.
      -
      SimpleSubtitleDecoder
      Base class for subtitle parsers that use their own decode thread.
      SinglePeriodAdTimeline
      A Timeline for sources that have ads.
      SinglePeriodTimeline
      A Timeline consisting of a single period and static window.
      SingleSampleMediaChunk
      A BaseMediaChunk for chunks consisting of a single raw sample.
      SingleSampleMediaSource
      Loads data at a given Uri as a single sample belonging to a single MediaPeriod.
      SingleSampleMediaSource.Factory
      SlidingPercentile
      SlidingPercentile
      Calculate any percentile over a sliding window of weighted values.
      SlowMotionData
      Holds information about the segments of slow motion playback within a track.
      SlowMotionData.Segment
      Holds information about a single segment of slow motion playback within a track.
      SmtaMetadataEntry
      Stores metadata from the Samsung smta box.
      SntpClient
      Static utility to retrieve the device time offset using SNTP.
      SntpClient.InitializationCallback
      SonicAudioProcessor
      An AudioProcessor that uses the Sonic library to modify audio speed/pitch/sample rate.
      SpannedSubject
      A Truth Subject for assertions on Spanned instances containing text styling.
      SpannedSubject.AbsoluteSized
      Allows assertions about the absolute size of a span.
      SpannedSubject.Aligned
      Allows assertions about the alignment of a span.
      SpannedSubject.AndSpanFlags
      Allows additional assertions to be made on the flags of matching spans.
      SpannedSubject.Colored
      Allows assertions about the color of a span.
      SpannedSubject.EmphasizedText
      Allows assertions about a span's text emphasis mark and its position.
      SpannedSubject.RelativeSized
      Allows assertions about the relative size of a span.
      SpannedSubject.RubyText
      Allows assertions about a span's ruby text and its position.
      SpannedSubject.Typefaced
      Allows assertions about the typeface of a span.
      SpannedSubject.WithSpanFlags
      Allows additional assertions to be made on the flags of matching spans.
      SpanUtil
      Utility methods for Android span styling.
      SphericalGLSurfaceView
      Renders a GL scene in a non-VR Activity that is affected by phone orientation and touch input.
      SphericalGLSurfaceView.VideoSurfaceListener
      Listener for the Surface to which video frames should be rendered.
      SpliceCommand
      Superclass for SCTE35 splice commands.
      SpliceInfoDecoder
      Decodes splice info sections and produces splice commands.
      SpliceInsertCommand
      Represents a splice insert command defined in SCTE35, Section 9.3.3.
      SpliceInsertCommand.ComponentSplice
      Holds splicing information for specific splice insert command components.
      SpliceNullCommand
      Represents a splice null command as defined in SCTE35, Section 9.3.1.
      SpliceScheduleCommand
      Represents a splice schedule command as defined in SCTE35, Section 9.3.2.
      SpliceScheduleCommand.ComponentSplice
      Holds splicing information for specific splice schedule command components.
      SpliceScheduleCommand.Event
      Represents a splice event as contained in a SpliceScheduleCommand.
      SsaDecoder
      A SimpleSubtitleDecoder for SSA/ASS.
      SsChunkSource
      A ChunkSource for SmoothStreaming.
      SsChunkSource.Factory
      Factory for SsChunkSources.
      SsDownloader
      A downloader for SmoothStreaming streams.
      SsManifest
      Represents a SmoothStreaming manifest.
      SsManifest.ProtectionElement
      Represents a protection element containing a single header.
      SsManifest.StreamElement
      Represents a StreamIndex element.
      SsManifestParser
      Parses SmoothStreaming client manifests.
      SsManifestParser.MissingFieldException
      Thrown if a required field is missing.
      SsMediaSource
      A SmoothStreaming MediaSource.
      SsMediaSource.Factory
      Factory for SsMediaSource.
      StandaloneDatabaseProvider +
      An SQLiteOpenHelper that provides instances of a standalone database.
      +
      StandaloneMediaClock
      A MediaClock whose position advances with real time based on the playback parameters when started.
      StarRating
      A rating expressed as a fractional number of stars.
      StartOffsetExtractorOutput
      An extractor output that wraps another extractor output and applies a give start byte offset to seek positions.
      StatsDataSource
      DataSource wrapper which keeps track of bytes transferred, redirected uris, and response headers.
      StreamKey
      A key for a subset of media that can be separately loaded (a "stream").
      StubExoPlayer
      An abstract ExoPlayer implementation that throws UnsupportedOperationException from every method.
      StubPlayer +
      An abstract Player implementation that throws UnsupportedOperationException from + every method.
      +
      StyledPlayerControlView
      A view for controlling Player instances.
      StyledPlayerControlView.OnFullScreenModeChangedListener
      Listener to be invoked to inform the fullscreen mode is changed.
      StyledPlayerControlView.ProgressUpdateListener
      Listener to be notified when progress has been updated.
      StyledPlayerControlView.VisibilityListener
      Listener to be notified about changes of the visibility of the UI control.
      StyledPlayerView
      A high level view for Player media playbacks.
      StyledPlayerView.ShowBuffering
      Determines when the buffering view is shown.
      SubripDecoder
      A SimpleSubtitleDecoder for SubRip.
      Subtitle
      A subtitle consisting of timed Cues.
      SubtitleDecoder
      SubtitleDecoderException
      Thrown when an error occurs decoding subtitle data.
      SubtitleDecoderFactory
      A factory for SubtitleDecoder instances.
      SubtitleExtractor +
      Generic extractor for extracting subtitles from various subtitle formats.
      +
      SubtitleInputBuffer
      SubtitleOutputBuffer
      Base class for SubtitleDecoder output buffers.
      SubtitleView
      A view for displaying subtitle Cues.
      SubtitleView.ViewType
      The type of View to use to display subtitles.
      SynchronousMediaCodecAdapter
      A MediaCodecAdapter that operates the underlying MediaCodec in synchronous mode.
      SynchronousMediaCodecAdapter.Factory
      A factory for SynchronousMediaCodecAdapter instances.
      SystemClock
      The standard implementation of Clock, an instance of which is available via Clock.DEFAULT.
      TeeAudioProcessor
      Audio processor that outputs its input unmodified and also outputs its input to a given sink.
      TeeAudioProcessor.AudioBufferSink
      A sink for audio buffers handled by the audio processor.
      TeeAudioProcessor.WavFileAudioBufferSink
      A sink for audio buffers that writes output audio as .wav files with a given path prefix.
      TeeDataSource
      Tees data into a DataSink as the data is read.
      TestDownloadManagerListener
      Allows tests to block for, and assert properties of, calls from a DownloadManager to its DownloadManager.Listener.
      TestExoPlayerBuilder
      A builder of SimpleExoPlayer instances for testing.
      TestPlayerRunHelper -
      Helper methods to block the calling thread until the provided SimpleExoPlayer instance - reaches a particular state.
      +
      Helper methods to block the calling thread until the provided ExoPlayer instance reaches + a particular state.
      TestUtil
      Utility methods for tests.
      TextAnnotation
      Properties of a text annotation (i.e.
      TextAnnotation.Position
      The possible positions of the annotation text relative to the base text.
      TextEmphasisSpan
      A styling span for text emphasis marks.
      TextEmphasisSpan.MarkFill
      The possible mark fills that can be used.
      TextEmphasisSpan.MarkShape
      The possible mark shapes that can be used.
      TextInformationFrame
      Text information ID3 frame.
      TextOutput
      Receives text output.
      TextRenderer
      A renderer for text.
      ThumbRating
      A rating expressed as "thumbs up" or "thumbs down".
      TimeBar
      Interface for time bar views that can display a playback position, buffered position, duration and ad markers, and that have a listener for scrubbing (seeking) events.
      TimeBar.OnScrubListener
      Listener for scrubbing events.
      TimedValueQueue<V>
      A utility class to keep a queue of values with timestamps.
      Timeline
      A flexible representation of the structure of media.
      Timeline.Period
      Holds information about a period in a Timeline.
      Timeline.RemotableTimeline
      A concrete class of Timeline to restore a Timeline instance from a Bundle sent by another process via IBinder.
      Timeline.Window
      Holds information about a window in a Timeline.
      TimelineAsserts
      Assertion methods for Timeline.
      TimelineQueueEditor
      TimelineQueueEditor.MediaDescriptionConverter
      Converts a MediaDescriptionCompat to a MediaItem.
      TimelineQueueEditor.MediaIdEqualityChecker
      Media description comparator comparing the media IDs.
      TimelineQueueEditor.QueueDataAdapter
      Adapter to get MediaDescriptionCompat of items in the queue and to notify the application about changes in the queue to sync the data structure backing the MediaSessionConnector.
      TimelineQueueNavigator
      An abstract implementation of the MediaSessionConnector.QueueNavigator that maps the windows of a Player's Timeline to the media session queue.
      TimeSignalCommand
      Represents a time signal command as defined in SCTE35, Section 9.3.4.
      TimestampAdjuster
      Adjusts and offsets sample timestamps.
      TimestampAdjusterProvider
      Provides TimestampAdjuster instances for use during HLS playbacks.
      TimeToFirstByteEstimator
      Provides an estimate of the time to first byte of a transfer.
      TraceUtil
      Calls through to Trace methods on supported API levels.
      Track
      Encapsulates information describing an MP4 track.
      Track.Transformation
      The transformation to apply to samples in the track, if any.
      TrackEncryptionBox
      Encapsulates information parsed from a track encryption (tenc) box or sample group description (sgpd) box in an MP4 stream.
      TrackGroup
      Defines an immutable group of tracks identified by their format identity.
      TrackGroupArray
      An immutable array of TrackGroups.
      TrackNameProvider
      Converts Formats to user readable track names.
      TrackOutput
      Receives track level data extracted by an Extractor.
      TrackOutput.CryptoData
      Holds data required to decrypt a sample.
      TrackOutput.SampleDataPart
      Defines the part of the sample data to which a call to TrackOutput.sampleData(com.google.android.exoplayer2.upstream.DataReader, int, boolean) corresponds.
      TrackSelection
      A track selection consisting of a static subset of selected tracks belonging to a TrackGroup.
      TrackSelection.Type +
      Represents a type track selection.
      +
      TrackSelectionArray
      An array of TrackSelections.
      TrackSelectionDialogBuilder
      Builder for a dialog with a TrackSelectionView.
      TrackSelectionDialogBuilder.DialogCallback
      Callback which is invoked when a track selection has been made.
      TrackSelectionOverrides +
      Forces the selection of the specified tracks in TrackGroups.
      +
      TrackSelectionOverrides.Builder + +
      TrackSelectionOverrides.TrackSelectionOverride + +
      TrackSelectionParameters
      Constraint parameters for track selection.
      TrackSelectionParameters.Builder
      TrackSelectionUtil
      Track selection related utility methods.
      TrackSelectionUtil.AdaptiveTrackSelectionFactory
      Functional interface to create a single adaptive track selection.
      TrackSelectionView
      A view for making track selections.
      TrackSelectionView.TrackSelectionListener
      Listener for changes to the selected tracks.
      TrackSelector
      The component of an ExoPlayer responsible for selecting tracks to be consumed by each of the player's Renderers.
      TrackSelector.InvalidationListener
      Notified when selections previously made by a TrackSelector are no longer valid.
      TrackSelectorResult
      The result of a TrackSelector operation.
      TracksInfo +
      Immutable information (TracksInfo.TrackGroupInfo) about tracks.
      +
      TracksInfo.TrackGroupInfo +
      Information about tracks in a TrackGroup: their C.TrackType, if their format is + supported by the player and if they are selected for playback.
      +
      TranscodingTransformer +
      A transcoding transformer to transform media inputs.
      +
      TranscodingTransformer.Builder +
      A builder for TranscodingTransformer instances.
      +
      TranscodingTransformer.Listener +
      A listener for the transformation events.
      +
      TranscodingTransformer.ProgressState +
      Progress state.
      +
      TransferListener
      A listener of data transfer events.
      Transformer
      A transformer to transform media inputs.
      Transformer.Builder
      A builder for Transformer instances.
      Transformer.Listener
      A listener for the transformation events.
      Transformer.ProgressState
      Progress state.
      TrueHdSampleRechunker +
      Rechunks TrueHD sample data into groups of Ac3Util.TRUEHD_RECHUNK_SAMPLE_COUNT samples.
      +
      TsExtractor
      Extracts data from the MPEG-2 TS container format.
      TsExtractor.Mode
      Modes for the extractor.
      TsPayloadReader
      Parses TS packet payload data.
      TsPayloadReader.DvbSubtitleInfo
      Holds information about a DVB subtitle, as defined in ETSI EN 300 468 V1.11.1 section 6.2.41.
      TsPayloadReader.EsInfo
      Holds information associated with a PMT entry.
      TsPayloadReader.Factory
      Factory of TsPayloadReader instances.
      TsPayloadReader.Flags
      Contextual flags indicating the presence of indicators in the TS packet or PES packet headers.
      TsPayloadReader.TrackIdGenerator
      Generates track ids for initializing TsPayloadReaders' TrackOutputs.
      TsUtil
      Utilities method for extracting MPEG-TS streams.
      TtmlDecoder
      A SimpleSubtitleDecoder for TTML supporting the DFXP presentation profile.
      Tx3gDecoder
      UdpDataSource
      A UDP DataSource.
      UdpDataSource.UdpDataSourceException
      Thrown when an error is encountered when trying to read from a UdpDataSource.
      UnknownNull
      Annotation for specifying unknown nullness.
      UnrecognizedInputFormatException
      Thrown if the input format was not recognized.
      UnsupportedDrmException
      Thrown when the requested DRM scheme is not supported.
      UnsupportedDrmException.Reason
      The reason for the exception.
      UnsupportedMediaCrypto -
      ExoMediaCrypto type that cannot be used to handle any type of protected content.
      -
      UriUtil
      Utility methods for manipulating URIs.
      UrlLinkFrame
      Url link ID3 frame.
      UrlTemplate
      A template from which URLs can be built.
      UtcTimingElement
      Represents a UTCTiming element.
      Util
      Miscellaneous utility methods.
      VersionTable -
      Utility methods for accessing versions of ExoPlayer database components.
      +
      Utility methods for accessing versions of media library database components.
      VideoDecoderGLSurfaceView -
      GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
      +
      GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
      VideoDecoderInputBuffer -
      Input buffer to a video decoder.
      -
      VideoDecoderOutputBuffer
      VideoDecoderOutputBuffer
      Video decoder output buffer containing video frame data.
      VideoDecoderOutputBufferRenderer - +
      VideoFrameMetadataListener
      A listener for metadata corresponding to video frames being rendered.
      VideoFrameReleaseHelper
      Helps a video Renderer release frames to a Surface.
      VideoListenerDeprecated. - -
      VideoRendererEventListener
      Listener of video Renderer events.
      VideoRendererEventListener.EventDispatcher
      Dispatches events to a VideoRendererEventListener.
      VideoSize
      Represents the video size.
      VorbisBitArray
      Wraps a byte array, providing methods that allow it to be read as a Vorbis bitstream.
      VorbisComment
      A vorbis comment.
      VorbisUtil
      Utility methods for parsing Vorbis streams.
      VorbisUtil.CommentHeader
      Vorbis comment header.
      VorbisUtil.Mode
      Vorbis setup header modes.
      VorbisUtil.VorbisIdHeader
      Vorbis identification header.
      VpxDecoder
      Vpx decoder.
      VpxDecoderException
      Thrown when a libvpx decoder error occurs.
      VpxLibrary
      Configures and queries the underlying native library.
      WavExtractor
      Extracts data from WAV byte streams.
      WavUtil
      Utilities for handling WAVE files.
      WebServerDispatcher
      A Dispatcher for MockWebServer that allows per-path customisation of the static data served.
      WebServerDispatcher.Resource
      A resource served by WebServerDispatcher.
      WebServerDispatcher.Resource.Builder
      WebvttCssStyle
      Style object of a Css style block in a Webvtt file.
      WebvttCssStyle.FontSizeUnit
      Font size unit enum.
      WebvttCssStyle.StyleFlags
      Style flag enum.
      WebvttCueInfo
      A representation of a WebVTT cue.
      WebvttCueParser
      Parser for WebVTT cues.
      WebvttDecoder
      A SimpleSubtitleDecoder for WebVTT.
      WebvttExtractor
      A special purpose extractor for WebVTT content in HLS.
      WebvttParserUtil
      Utility methods for parsing WebVTT data.
      WidevineUtil
      Utility methods for Widevine.
      WorkManagerScheduler
      A Scheduler that uses WorkManager.
      WorkManagerScheduler.SchedulerWorker
      A Worker that starts the target service if the requirements are met.
      WritableDownloadIndex
      A writable index of Downloads.
      XmlPullParserUtil
      XmlPullParser utility methods.
      diff --git a/docs/doc/reference/allclasses.html b/docs/doc/reference/allclasses.html index 288afe5bcf..5d8782d8f4 100644 --- a/docs/doc/reference/allclasses.html +++ b/docs/doc/reference/allclasses.html @@ -109,6 +109,7 @@
    • AspectRatioFrameLayout.AspectRatioListener
    • AspectRatioFrameLayout.ResizeMode
    • Assertions
    • +
    • AssetContentProvider
    • AssetDataSource
    • AssetDataSource.AssetDataSourceException
    • AtomicFile
    • @@ -117,7 +118,6 @@
    • AudioCapabilities
    • AudioCapabilitiesReceiver
    • AudioCapabilitiesReceiver.Listener
    • -
    • AudioListener
    • AudioProcessor
    • AudioProcessor.AudioFormat
    • AudioProcessor.UnhandledAudioFormatException
    • @@ -158,7 +158,7 @@
    • Buffer
    • Bundleable
    • Bundleable.Creator
    • -
    • BundleableUtils
    • +
    • BundleableUtil
    • BundledChunkExtractor
    • BundledExtractorsAdapter
    • BundledHlsMediaChunkExtractor
    • @@ -171,6 +171,7 @@
    • C.AudioContentType
    • C.AudioFlags
    • C.AudioFocusGain
    • +
    • C.AudioManagerOffloadMode
    • C.AudioUsage
    • C.BufferFlags
    • C.ColorRange
    • @@ -178,6 +179,7 @@
    • C.ColorTransfer
    • C.ContentType
    • C.CryptoMode
    • +
    • C.CryptoType
    • C.DataType
    • C.Encoding
    • C.FormatSupport
    • @@ -186,8 +188,11 @@
    • C.Projection
    • C.RoleFlags
    • C.SelectionFlags
    • +
    • C.SelectionReason
    • C.StereoMode
    • C.StreamType
    • +
    • C.TrackType
    • +
    • C.VideoChangeFrameRateStrategy
    • C.VideoOutputMode
    • C.VideoScalingMode
    • C.WakeMode
    • @@ -199,14 +204,12 @@
    • CacheDataSink
    • CacheDataSink.CacheDataSinkException
    • CacheDataSink.Factory
    • -
    • CacheDataSinkFactory
    • CacheDataSource
    • CacheDataSource.CacheIgnoredReason
    • CacheDataSource.EventListener
    • CacheDataSource.Factory
    • CacheDataSource.Flags
    • -
    • CacheDataSourceFactory
    • -
    • CachedRegionTracker
    • +
    • CachedRegionTracker
    • CacheEvictor
    • CacheKeyFactory
    • CacheSpan
    • @@ -254,7 +257,6 @@
    • ContentDataSource.ContentDataSourceException
    • ContentMetadata
    • ContentMetadataMutations
    • -
    • ControlDispatcher
    • CopyOnWriteMultiset
    • CronetDataSource
    • CronetDataSource.Factory
    • @@ -262,6 +264,8 @@
    • CronetDataSourceFactory
    • CronetEngineWrapper
    • CronetUtil
    • +
    • CryptoConfig
    • +
    • CryptoException
    • CryptoInfo
    • Cue
    • Cue.AnchorType
    • @@ -269,6 +273,8 @@
    • Cue.LineType
    • Cue.TextSizeType
    • Cue.VerticalType
    • +
    • CueDecoder
    • +
    • CueEncoder
    • DashChunkSource
    • DashChunkSource.Factory
    • DashDownloader
    • @@ -296,6 +302,7 @@
    • DataSourceContractTest.TestResource.Builder
    • DataSourceException
    • DataSourceInputStream
    • +
    • DataSourceUtil
    • DataSpec
    • DataSpec.Builder
    • DataSpec.Flags
    • @@ -309,11 +316,12 @@
    • DecoderInputBuffer
    • DecoderInputBuffer.BufferReplacementMode
    • DecoderInputBuffer.InsufficientCapacityException
    • +
    • DecoderOutputBuffer
    • +
    • DecoderOutputBuffer.Owner
    • DecoderReuseEvaluation
    • DecoderReuseEvaluation.DecoderDiscardReasons
    • DecoderReuseEvaluation.DecoderReuseResult
    • DecoderVideoRenderer
    • -
    • DecryptionException
    • DefaultAllocator
    • DefaultAudioSink
    • DefaultAudioSink.AudioProcessorChain
    • @@ -325,13 +333,13 @@
    • DefaultCastOptionsProvider
    • DefaultCompositeSequenceableLoaderFactory
    • DefaultContentMetadata
    • -
    • DefaultControlDispatcher
    • DefaultDashChunkSource
    • DefaultDashChunkSource.Factory
    • DefaultDashChunkSource.RepresentationHolder
    • DefaultDashChunkSource.RepresentationSegmentIterator
    • DefaultDatabaseProvider
    • DefaultDataSource
    • +
    • DefaultDataSource.Factory
    • DefaultDataSourceFactory
    • DefaultDownloaderFactory
    • DefaultDownloadIndex
    • @@ -348,12 +356,12 @@
    • DefaultHlsPlaylistTracker
    • DefaultHttpDataSource
    • DefaultHttpDataSource.Factory
    • -
    • DefaultHttpDataSourceFactory
    • DefaultLivePlaybackSpeedControl
    • DefaultLivePlaybackSpeedControl.Builder
    • DefaultLoadControl
    • DefaultLoadControl.Builder
    • DefaultLoadErrorHandlingPolicy
    • +
    • DefaultMediaCodecAdapterFactory
    • DefaultMediaDescriptionAdapter
    • DefaultMediaItemConverter
    • DefaultMediaItemConverter
    • @@ -379,9 +387,8 @@
    • DefaultTsPayloadReaderFactory
    • DefaultTsPayloadReaderFactory.Flags
    • Descriptor
    • -
    • DeviceInfo
    • -
    • DeviceInfo.PlaybackType
    • -
    • DeviceListener
    • +
    • DeviceInfo
    • +
    • DeviceInfo.PlaybackType
    • DolbyVisionConfig
    • Download
    • Download.FailureReason
    • @@ -448,7 +455,6 @@
    • EventStream
    • ExoDatabaseProvider
    • ExoHostedTest
    • -
    • ExoMediaCrypto
    • ExoMediaDrm
    • ExoMediaDrm.AppManagedProvider
    • ExoMediaDrm.KeyRequest
    • @@ -466,9 +472,9 @@
    • ExoPlayer.AudioOffloadListener
    • ExoPlayer.Builder
    • ExoPlayer.DeviceComponent
    • -
    • ExoPlayer.MetadataComponent
    • ExoPlayer.TextComponent
    • ExoPlayer.VideoComponent
    • +
    • ExoplayerCuesDecoder
    • ExoPlayerLibraryInfo
    • ExoPlayerTestRunner
    • ExoPlayerTestRunner.Builder
    • @@ -499,6 +505,7 @@
    • FakeChunkSource
    • FakeChunkSource.Factory
    • FakeClock
    • +
    • FakeCryptoConfig
    • FakeDataSet
    • FakeDataSet.FakeData
    • FakeDataSet.FakeData.Segment
    • @@ -518,6 +525,8 @@
    • FakeMediaPeriod.TrackDataFactory
    • FakeMediaSource
    • FakeMediaSource.InitialTimeline
    • +
    • FakeMediaSourceFactory
    • +
    • FakeMetadataEntry
    • FakeRenderer
    • FakeSampleStream
    • FakeSampleStream.FakeSampleStreamItem
    • @@ -535,14 +544,13 @@
    • FileDataSource
    • FileDataSource.Factory
    • FileDataSource.FileDataSourceException
    • -
    • FileDataSourceFactory
    • FileTypes
    • FileTypes.Type
    • FilterableManifest
    • FilteringHlsPlaylistParserFactory
    • FilteringManifestParser
    • FixedTrackSelection
    • -
    • FlacConstants
    • +
    • FlacConstants
    • FlacDecoder
    • FlacDecoderException
    • FlacExtractor
    • @@ -569,7 +577,7 @@
    • ForwardingTimeline
    • FragmentedMp4Extractor
    • FragmentedMp4Extractor.Flags
    • -
    • FrameworkMediaCrypto
    • +
    • FrameworkCryptoConfig
    • FrameworkMediaDrm
    • GaplessInfoHolder
    • Gav1Decoder
    • @@ -578,8 +586,10 @@
    • GeobFrame
    • GlUtil
    • GlUtil.Attribute
    • +
    • GlUtil.GlException
    • +
    • GlUtil.Program
    • GlUtil.Uniform
    • -
    • GvrAudioProcessor
    • +
    • GlUtil.UnsupportedEglVersionException
    • H262Reader
    • H263Reader
    • H264Reader
    • @@ -648,7 +658,6 @@
    • IndexSeekMap
    • InitializationChunk
    • InputReaderAdapterV30
    • -
    • IntArrayQueue
    • InternalFrame
    • JpegExtractor
    • KeysExpiredException
    • @@ -716,12 +725,20 @@
    • MediaFormatUtil
    • MediaItem
    • MediaItem.AdsConfiguration
    • +
    • MediaItem.AdsConfiguration.Builder
    • MediaItem.Builder
    • +
    • MediaItem.ClippingConfiguration
    • +
    • MediaItem.ClippingConfiguration.Builder
    • MediaItem.ClippingProperties
    • MediaItem.DrmConfiguration
    • +
    • MediaItem.DrmConfiguration.Builder
    • MediaItem.LiveConfiguration
    • +
    • MediaItem.LiveConfiguration.Builder
    • +
    • MediaItem.LocalConfiguration
    • MediaItem.PlaybackProperties
    • MediaItem.Subtitle
    • +
    • MediaItem.SubtitleConfiguration
    • +
    • MediaItem.SubtitleConfiguration.Builder
    • MediaItemConverter
    • MediaItemConverter
    • MediaLoadData
    • @@ -780,6 +797,7 @@
    • MpegAudioUtil
    • MpegAudioUtil.Header
    • NalUnitUtil
    • +
    • NalUnitUtil.H265SpsData
    • NalUnitUtil.PpsData
    • NalUnitUtil.SpsData
    • NetworkTypeObserver
    • @@ -800,8 +818,6 @@
    • OpusDecoderException
    • OpusLibrary
    • OpusUtil
    • -
    • OutputBuffer
    • -
    • OutputBuffer.Owner
    • OutputConsumerAdapterV30
    • ParsableBitArray
    • ParsableByteArray
    • @@ -865,6 +881,7 @@
    • PlayerView.ShowBuffering
    • PositionHolder
    • PriorityDataSource
    • +
    • PriorityDataSource.Factory
    • PriorityDataSourceFactory
    • PriorityTaskManager
    • PriorityTaskManager.PriorityTooLowException
    • @@ -888,8 +905,8 @@
    • RawResourceDataSource
    • RawResourceDataSource.RawResourceDataSourceException
    • Renderer
    • +
    • Renderer.MessageType
    • Renderer.State
    • -
    • Renderer.VideoScalingMode
    • Renderer.WakeupListener
    • RendererCapabilities
    • RendererCapabilities.AdaptiveSupport
    • @@ -911,7 +928,6 @@
    • ResolvingDataSource
    • ResolvingDataSource.Factory
    • ResolvingDataSource.Resolver
    • -
    • ReusableBufferedOutputStream
    • RobolectricUtil
    • RtmpDataSource
    • RtmpDataSource.Factory
    • @@ -977,17 +993,17 @@
    • SilenceSkippingAudioProcessor
    • SimpleCache
    • SimpleDecoder
    • +
    • SimpleDecoderOutputBuffer
    • SimpleExoPlayer
    • SimpleExoPlayer.Builder
    • SimpleMetadataDecoder
    • -
    • SimpleOutputBuffer
    • SimpleSubtitleDecoder
    • SinglePeriodAdTimeline
    • SinglePeriodTimeline
    • SingleSampleMediaChunk
    • SingleSampleMediaSource
    • SingleSampleMediaSource.Factory
    • -
    • SlidingPercentile
    • +
    • SlidingPercentile
    • SlowMotionData
    • SlowMotionData.Segment
    • SmtaMetadataEntry
    • @@ -1026,12 +1042,14 @@
    • SsManifestParser.MissingFieldException
    • SsMediaSource
    • SsMediaSource.Factory
    • +
    • StandaloneDatabaseProvider
    • StandaloneMediaClock
    • StarRating
    • StartOffsetExtractorOutput
    • StatsDataSource
    • StreamKey
    • StubExoPlayer
    • +
    • StubPlayer
    • StyledPlayerControlView
    • StyledPlayerControlView.OnFullScreenModeChangedListener
    • StyledPlayerControlView.ProgressUpdateListener
    • @@ -1043,6 +1061,7 @@
    • SubtitleDecoder
    • SubtitleDecoderException
    • SubtitleDecoderFactory
    • +
    • SubtitleExtractor
    • SubtitleInputBuffer
    • SubtitleOutputBuffer
    • SubtitleView
    • @@ -1095,9 +1114,13 @@
    • TrackOutput.CryptoData
    • TrackOutput.SampleDataPart
    • TrackSelection
    • +
    • TrackSelection.Type
    • TrackSelectionArray
    • TrackSelectionDialogBuilder
    • TrackSelectionDialogBuilder.DialogCallback
    • +
    • TrackSelectionOverrides
    • +
    • TrackSelectionOverrides.Builder
    • +
    • TrackSelectionOverrides.TrackSelectionOverride
    • TrackSelectionParameters
    • TrackSelectionParameters.Builder
    • TrackSelectionUtil
    • @@ -1107,11 +1130,18 @@
    • TrackSelector
    • TrackSelector.InvalidationListener
    • TrackSelectorResult
    • +
    • TracksInfo
    • +
    • TracksInfo.TrackGroupInfo
    • +
    • TranscodingTransformer
    • +
    • TranscodingTransformer.Builder
    • +
    • TranscodingTransformer.Listener
    • +
    • TranscodingTransformer.ProgressState
    • TransferListener
    • Transformer
    • Transformer.Builder
    • Transformer.Listener
    • Transformer.ProgressState
    • +
    • TrueHdSampleRechunker
    • TsExtractor
    • TsExtractor.Mode
    • TsPayloadReader
    • @@ -1129,7 +1159,6 @@
    • UnrecognizedInputFormatException
    • UnsupportedDrmException
    • UnsupportedDrmException.Reason
    • -
    • UnsupportedMediaCrypto
    • UriUtil
    • UrlLinkFrame
    • UrlTemplate
    • @@ -1137,12 +1166,10 @@
    • Util
    • VersionTable
    • VideoDecoderGLSurfaceView
    • -
    • VideoDecoderInputBuffer
    • -
    • VideoDecoderOutputBuffer
    • +
    • VideoDecoderOutputBuffer
    • VideoDecoderOutputBufferRenderer
    • VideoFrameMetadataListener
    • VideoFrameReleaseHelper
    • -
    • VideoListener
    • VideoRendererEventListener
    • VideoRendererEventListener.EventDispatcher
    • VideoSize
    • diff --git a/docs/doc/reference/allpackages-index.html b/docs/doc/reference/allpackages-index.html index b1bd57364a..aa307180e2 100644 --- a/docs/doc/reference/allpackages-index.html +++ b/docs/doc/reference/allpackages-index.html @@ -124,35 +124,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      com.google.android.exoplayer2.device 
      com.google.android.exoplayer2.drm  
      com.google.android.exoplayer2.ext.av1  
      com.google.android.exoplayer2.ext.cast  
      com.google.android.exoplayer2.ext.cronet  
      com.google.android.exoplayer2.ext.ffmpeg  
      com.google.android.exoplayer2.ext.flac 
      com.google.android.exoplayer2.ext.gvrcom.google.android.exoplayer2.ext.flac  
      intgetNextWindowIndex​(int windowIndex, - int repeatMode, +getNextWindowIndex​(int windowIndex, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
      Returns the index of the window after the window at index windowIndex depending on the @@ -343,8 +343,8 @@ extends T
      intgetPreviousWindowIndex​(int windowIndex, - int repeatMode, +getPreviousWindowIndex​(int windowIndex, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
      Returns the index of the window before the window at index windowIndex depending on the @@ -380,7 +380,7 @@ extends T

      Methods inherited from class com.google.android.exoplayer2.Timeline

      -equals, getNextPeriodIndex, getPeriod, getPeriodCount, getPeriodPosition, getPeriodPosition, getWindow, getWindowCount, hashCode, isEmpty, isLastPeriod, toBundle, toBundle +equals, getNextPeriodIndex, getPeriod, getPeriodCount, getPeriodPosition, getPeriodPosition, getPeriodPositionUs, getPeriodPositionUs, getWindow, getWindowCount, hashCode, isEmpty, isLastPeriod, toBundle, toBundle - + - + @@ -254,156 +254,219 @@ implements +
      booleancanAdvertiseSession() +
      Returns whether the player can be used to advertise a media session.
      +
      void clearMediaItems()
      Clears the playlist.
      protected Player.Commands getAvailableCommands​(Player.Commands permanentAvailableCommands)
      Returns the Player.Commands available in the player.
      int getBufferedPercentage() -
      Returns an estimate of the percentage in the current content window or ad up to which data is +
      Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
      longgetContentDuration() -
      If Player.isPlayingAd() returns true, returns the duration of the current content - window in milliseconds, or C.TIME_UNSET if the duration is not known.
      -
      longgetCurrentLiveOffset()getContentDuration() -
      Returns the offset of the current playback position from the live edge in milliseconds, or - C.TIME_UNSET if the current window isn't live or the - offset is unknown.
      +
      If Player.isPlayingAd() returns true, returns the duration of the current content in + milliseconds, or C.TIME_UNSET if the duration is not known.
      longgetCurrentLiveOffset() +
      Returns the offset of the current playback position from the live edge in milliseconds, or + C.TIME_UNSET if the current MediaItem Player.isCurrentMediaItemLive() isn't + live} or the offset is unknown.
      +
      Object getCurrentManifest()
      Returns the current manifest.
      MediaItem getCurrentMediaItem() -
      Returns the media item of the current window in the timeline.
      +
      Returns the currently playing MediaItem.
      intgetCurrentWindowIndex() +
      Deprecated.
      +
      MediaItem getMediaItemAt​(int index)
      Returns the MediaItem at the given index.
      int getMediaItemCount()
      Returns the number of media items in the playlist.
      intgetNextMediaItemIndex() +
      Returns the index of the MediaItem that will be played if Player.seekToNextMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
      +
      int getNextWindowIndex() -
      Returns the index of the window that will be played if Player.seekToNextWindow() is called, - which may depend on the current repeat mode and whether shuffle mode is enabled.
      +
      Deprecated.
      intgetPreviousMediaItemIndex() +
      Returns the index of the MediaItem that will be played if Player.seekToPreviousMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
      +
      int getPreviousWindowIndex() -
      Returns the index of the window that will be played if Player.seekToPreviousWindow() is - called, which may depend on the current repeat mode and whether shuffle mode is enabled.
      +
      Deprecated.
      boolean hasNext()
      Deprecated.
      booleanhasNextMediaItem() +
      Returns whether a next MediaItem exists, which may depend on the current repeat mode + and whether shuffle mode is enabled.
      +
      boolean hasNextWindow() -
      Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled.
      +
      Deprecated.
      boolean hasPrevious()
      Deprecated.
      booleanhasPreviousWindow()hasPreviousMediaItem() -
      Returns whether a previous window exists, which may depend on the current repeat mode and +
      Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.
      booleanisCommandAvailable​(int command)hasPreviousWindow() +
      Deprecated.
      +
      booleanisCommandAvailable​(@com.google.android.exoplayer2.Player.Command int command)
      Returns whether the provided Player.Command is available.
      booleanisCurrentMediaItemDynamic() +
      Returns whether the current MediaItem is dynamic (may change when the Timeline + is updated), or false if the Timeline is empty.
      +
      booleanisCurrentMediaItemLive() +
      Returns whether the current MediaItem is live, or false if the Timeline + is empty.
      +
      booleanisCurrentMediaItemSeekable() +
      Returns whether the current MediaItem is seekable, or false if the Timeline is empty.
      +
      boolean isCurrentWindowDynamic() -
      Returns whether the current window is dynamic, or false if the Timeline is - empty.
      +
      Deprecated.
      boolean isCurrentWindowLive() -
      Returns whether the current window is live, or false if the Timeline is empty.
      +
      Deprecated.
      boolean isCurrentWindowSeekable() -
      Returns whether the current window is seekable, or false if the Timeline is - empty.
      +
      Deprecated.
      boolean isPlaying()
      Returns whether the player is playing, i.e.
      void moveMediaItem​(int currentIndex, int newIndex)
      void next()
      Deprecated.
      void pause()
      Pauses playback.
      void play()
      Resumes playback as soon as Player.getPlaybackState() == Player.STATE_READY.
      void previous()
      Deprecated.
      void removeMediaItem​(int index)
      Removes the media item at the given index of the playlist.
      void seekBack() -
      Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
      +
      Seeks back in the current MediaItem by Player.getSeekBackIncrement() milliseconds.
      void seekForward() -
      Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
      +
      Seeks forward in the current MediaItem by Player.getSeekForwardIncrement() + milliseconds.
      void seekTo​(long positionMs) -
      Seeks to a position specified in milliseconds in the current window.
      +
      Seeks to a position specified in milliseconds in the current MediaItem.
      void seekToDefaultPosition() -
      Seeks to the default position associated with the current window.
      +
      Seeks to the default position associated with the current MediaItem.
      voidseekToDefaultPosition​(int windowIndex)seekToDefaultPosition​(int mediaItemIndex) -
      Seeks to the default position associated with the specified window.
      +
      Seeks to the default position associated with the specified MediaItem.
      void seekToNext() -
      Seeks to a later position in the current or next window (if available).
      +
      Seeks to a later position in the current or next MediaItem (if available).
      voidseekToNextMediaItem() +
      Seeks to the default position of the next MediaItem, which may depend on the current + repeat mode and whether shuffle mode is enabled.
      +
      void seekToNextWindow() -
      Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled.
      +
      Deprecated.
      void seekToPrevious() -
      Seeks to an earlier position in the current or previous window (if available).
      +
      Seeks to an earlier position in the current or previous MediaItem (if available).
      voidseekToPreviousMediaItem() +
      Seeks to the default position of the previous MediaItem, which may depend on the + current repeat mode and whether shuffle mode is enabled.
      +
      void seekToPreviousWindow() -
      Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled.
      +
      Deprecated.
      void setMediaItem​(MediaItem mediaItem) @@ -519,7 +597,7 @@ implements +
      void setMediaItem​(MediaItem mediaItem, boolean resetPosition)
      void setMediaItem​(MediaItem mediaItem, long startPositionMs)
      void setMediaItems​(List<MediaItem> mediaItems) @@ -543,20 +621,13 @@ implements +
      void setPlaybackSpeed​(float speed)
      Changes the rate at which playback occurs.
      voidstop() -
      Stops playback without resetting the player.
      -
    @@ -679,7 +750,7 @@ implements Parameters:
    mediaItem - The new MediaItem.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by Player.getCurrentWindowIndex() + false, playback will start from the position defined by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -808,28 +879,27 @@ implements + @@ -942,13 +1028,13 @@ implements public final void seekTo​(long positionMs) -
    Seeks to a position specified in milliseconds in the current window.
    +
    Seeks to a position specified in milliseconds in the current MediaItem.
    Specified by:
    seekTo in interface Player
    Parameters:
    -
    positionMs - The seek position in the current window, or C.TIME_UNSET to seek to - the window's default position.
    +
    positionMs - The seek position in the current MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
    @@ -960,7 +1046,7 @@ implements public final void seekBack() -
    Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
    +
    Seeks back in the current MediaItem by Player.getSeekBackIncrement() milliseconds.
    Specified by:
    seekBack in interface Player
    @@ -975,7 +1061,8 @@ implements public final void seekForward() -
    Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
    +
    Seeks forward in the current MediaItem by Player.getSeekForwardIncrement() + milliseconds.
    Specified by:
    seekForward in interface Player
    @@ -1003,9 +1090,24 @@ public final boolean hasPrevious()
    • hasPreviousWindow

      -
      public final boolean hasPreviousWindow()
      -
      Description copied from interface: Player
      -
      Returns whether a previous window exists, which may depend on the current repeat mode and +
      @Deprecated
      +public final boolean hasPreviousWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      hasPreviousWindow in interface Player
      +
      +
    • +
    + + + +
      +
    • +

      hasPreviousMediaItem

      +
      public final boolean hasPreviousMediaItem()
      +
      Description copied from interface: Player
      +
      Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.

      Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when @@ -1013,7 +1115,7 @@ public final boolean hasPrevious() details.

      Specified by:
      -
      hasPreviousWindow in interface Player
      +
      hasPreviousMediaItem in interface Player
    @@ -1038,18 +1140,32 @@ public final void previous()
    • seekToPreviousWindow

      -
      public final void seekToPreviousWindow()
      -
      Description copied from interface: Player
      -
      Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled. Does nothing if Player.hasPreviousWindow() is - false. +
      @Deprecated
      +public final void seekToPreviousWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      seekToPreviousWindow in interface Player
      +
      +
    • +
    + + + + @@ -1061,18 +1177,20 @@ public final void previous()

    seekToPrevious

    public final void seekToPrevious()
    Description copied from interface: Player
    -
    Seeks to an earlier position in the current or previous window (if available). More precisely: +
    Seeks to an earlier position in the current or previous MediaItem (if available). More + precisely:
    Specified by:
    @@ -1101,17 +1219,32 @@ public final boolean hasNext()
    • hasNextWindow

      -
      public final boolean hasNextWindow()
      -
      Description copied from interface: Player
      -
      Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled. +
      @Deprecated
      +public final boolean hasNextWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      hasNextWindow in interface Player
      +
      +
    • +
    + + + + @@ -1136,17 +1269,33 @@ public final void next()
    • seekToNextWindow

      -
      public final void seekToNextWindow()
      -
      Description copied from interface: Player
      -
      Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled. Does nothing if Player.hasNextWindow() is false. +
      @Deprecated
      +public final void seekToNextWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      seekToNextWindow in interface Player
      +
      +
    • +
    + + + + @@ -1158,14 +1307,15 @@ public final void next()

    seekToNext

    public final void seekToNext()
    Description copied from interface: Player
    -
    Seeks to a later position in the current or next window (if available). More precisely: +
    Seeks to a later position in the current or next MediaItem (if available). More + precisely:
    • If the timeline is empty or seeking is not possible, does nothing. -
    • Otherwise, if a next window exists, seeks to the default - position of the next window. -
    • Otherwise, if the current window is live and has not - ended, seeks to the live edge of the current window. +
    • Otherwise, if a next media item exists, seeks to the default + position of the next MediaItem. +
    • Otherwise, if the current MediaItem is live and + has not ended, seeks to the live edge of the current MediaItem.
    • Otherwise, does nothing.
    @@ -1195,26 +1345,18 @@ public final void next()
    - +
    • -

      stop

      -
      public final void stop()
      -
      Description copied from interface: Player
      -
      Stops playback without resetting the player. Use Player.pause() rather than this method if - the intention is to pause playback. - -

      Calling this method will cause the playback state to transition to Player.STATE_IDLE. The - player instance can still be used, and Player.release() must still be called on the player if - it's no longer required. - -

      Calling this method does not clear the playlist, reset the playback position or the playback - error.

      +

      getCurrentWindowIndex

      +
      @Deprecated
      +public final int getCurrentWindowIndex()
      +
      Deprecated.
      Specified by:
      -
      stop in interface Player
      +
      getCurrentWindowIndex in interface Player
    @@ -1224,17 +1366,33 @@ public final void next() + + + + @@ -1244,18 +1402,33 @@ public final void next() + + + + @@ -1268,13 +1441,12 @@ public final void next()
    @Nullable
     public final MediaItem getCurrentMediaItem()
    Description copied from interface: Player
    -
    Returns the media item of the current window in the timeline. May be null if the timeline is - empty.
    +
    Returns the currently playing MediaItem. May be null if the timeline is empty.
    Specified by:
    getCurrentMediaItem in interface Player
    See Also:
    -
    Player.Listener.onMediaItemTransition(MediaItem, int)
    +
    Player.Listener.onMediaItemTransition(MediaItem, int)
    @@ -1332,7 +1504,7 @@ public final public final int getBufferedPercentage() -
    Returns an estimate of the percentage in the current content window or ad up to which data is +
    Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
    Specified by:
    @@ -1346,13 +1518,28 @@ public final 
  • isCurrentWindowDynamic

    -
    public final boolean isCurrentWindowDynamic()
    -
    -
    Returns whether the current window is dynamic, or false if the Timeline is - empty.
    +
    @Deprecated
    +public final boolean isCurrentWindowDynamic()
    +
    Deprecated.
    Specified by:
    isCurrentWindowDynamic in interface Player
    +
    +
  • + + + + + + + + + + + + +
    @@ -89,32 +102,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +
    -

    Package com.google.android.exoplayer2.ext.gvr

    + +

    Annotation Type C.AudioManagerOffloadMode

    +
    +
    +
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -356,7 +356,7 @@ implements
  • UNKNOWN

    -
    public static final DeviceInfo UNKNOWN
    +
    public static final DeviceInfo UNKNOWN
    Unknown DeviceInfo.
  • @@ -366,7 +366,7 @@ implements
  • playbackType

    -
    public final @com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int playbackType
    +
    public final @com.google.android.exoplayer2.DeviceInfo.PlaybackType int playbackType
    The type of playback.
  • @@ -396,8 +396,8 @@ implements
  • CREATOR

    -
    public static final Bundleable.Creator<DeviceInfo> CREATOR
    -
    Object that can restore DeviceInfo from a Bundle.
    +
    public static final Bundleable.Creator<DeviceInfo> CREATOR
    +
    Object that can restore DeviceInfo from a Bundle.
  • @@ -410,13 +410,13 @@ implements +
    • DeviceInfo

      -
      public DeviceInfo​(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int playbackType,
      +
      public DeviceInfo​(@com.google.android.exoplayer2.DeviceInfo.PlaybackType int playbackType,
                         int minVolume,
                         int maxVolume)
      Creates device information.
      @@ -466,11 +466,11 @@ implements

      toBundle

      public Bundle toBundle()
      -
      Description copied from interface: Bundleable
      +
      Description copied from interface: Bundleable
      Returns a Bundle representing the information stored in this object.
      Specified by:
      -
      toBundle in interface Bundleable
      +
      toBundle in interface Bundleable
    @@ -494,18 +494,18 @@ implements -
  • Overview
  • +
  • Overview
  • Package
  • Tree
  • -
  • Deprecated
  • -
  • Index
  • -
  • Help
  • +
  • Deprecated
  • +
  • Index
  • +
  • Help

  • -
    public static interface ExoPlayer.TextComponent
    -
    The text component of an ExoPlayer.
    +
    @Deprecated
    +public static interface ExoPlayer.TextComponent
    +
    Deprecated. +
    Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
    +
    @@ -152,27 +156,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Description -void -addTextOutput​(TextOutput listener) - -
    Deprecated. - -
    - - - List<Cue> getCurrentCues() -
    Returns the current Cues.
    - - - -void -removeTextOutput​(TextOutput listener) - @@ -193,50 +181,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    Method Detail

    - - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html index a0e7a8c2bf..c2f0aecfef 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":38,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":38,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6}; +var data = {"i0":38,"i1":38,"i2":38,"i3":38,"i4":38,"i5":38,"i6":38,"i7":38,"i8":38,"i9":38,"i10":38,"i11":38,"i12":38,"i13":38,"i14":38,"i15":38,"i16":38,"i17":38}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -129,8 +129,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    ExoPlayer

    -
    public static interface ExoPlayer.VideoComponent
    -
    The video component of an ExoPlayer.
    +
    @Deprecated
    +public static interface ExoPlayer.VideoComponent
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
    +
    @@ -153,137 +157,166 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); void -addVideoListener​(VideoListener listener) +clearCameraMotionListener​(CameraMotionListener listener) void -clearCameraMotionListener​(CameraMotionListener listener) +clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener) -
    Clears the listener which receives camera motion events if it matches the one passed.
    + void -clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener) +clearVideoSurface() -
    Clears the listener which receives video frame metadata events if it matches the one passed.
    +
    Deprecated. + +
    void -clearVideoSurface() +clearVideoSurface​(Surface surface) -
    Clears any Surface, SurfaceHolder, SurfaceView or TextureView - currently set on the player.
    +
    Deprecated. + +
    void -clearVideoSurface​(Surface surface) +clearVideoSurfaceHolder​(SurfaceHolder surfaceHolder) -
    Clears the Surface onto which video is being rendered if it matches the one passed.
    + void -clearVideoSurfaceHolder​(SurfaceHolder surfaceHolder) +clearVideoSurfaceView​(SurfaceView surfaceView) -
    Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed.
    +
    Deprecated. + +
    void -clearVideoSurfaceView​(SurfaceView surfaceView) +clearVideoTextureView​(TextureView textureView) -
    Clears the SurfaceView onto which video is being rendered if it matches the one - passed.
    +
    Deprecated. + +
    -void -clearVideoTextureView​(TextureView textureView) +int +getVideoChangeFrameRateStrategy() -
    Clears the TextureView onto which video is being rendered if it matches the one - passed.
    + int getVideoScalingMode() -
    Returns the C.VideoScalingMode.
    +
    Deprecated. + +
    VideoSize getVideoSize() -
    Gets the size of the video.
    +
    Deprecated. + +
    void -removeVideoListener​(VideoListener listener) +setCameraMotionListener​(CameraMotionListener listener) void -setCameraMotionListener​(CameraMotionListener listener) +setVideoChangeFrameRateStrategy​(int videoChangeFrameRateStrategy) -
    Sets a listener of camera motion events.
    + void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener) -
    Sets a listener to receive video frame metadata events.
    + void setVideoScalingMode​(int videoScalingMode) - +
    Deprecated. + +
    void setVideoSurface​(Surface surface) -
    Sets the Surface onto which video will be rendered.
    +
    Deprecated. + +
    void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) -
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered.
    + void setVideoSurfaceView​(SurfaceView surfaceView) -
    Sets the SurfaceView onto which video will be rendered.
    +
    Deprecated. + +
    void setVideoTextureView​(TextureView textureView) -
    Sets the TextureView onto which video will be rendered.
    +
    Deprecated. + +
    @@ -309,13 +342,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -324,45 +356,40 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); - + - + @@ -371,16 +398,12 @@ void removeVideoListener​(
  • setVideoFrameMetadataListener

    -
    void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    -
    Sets a listener to receive video frame metadata events. - -

    This method is intended to be called by the same component that sets the Surface - onto which video will be rendered. If using ExoPlayer's standard UI components, this method - should not be called directly from application code.

    -
    -
    Parameters:
    -
    listener - The listener.
    -
    +
    @Deprecated
    +void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    +
  • @@ -389,13 +412,12 @@ void removeVideoListener​(
  • clearVideoFrameMetadataListener

    -
    void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    -
    Clears the listener which receives video frame metadata events if it matches the one passed. - Else does nothing.
    -
    -
    Parameters:
    -
    listener - The listener to clear.
    -
    +
    @Deprecated
    +void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    +
  • @@ -404,12 +426,11 @@ void removeVideoListener​(
  • setCameraMotionListener

    -
    void setCameraMotionListener​(CameraMotionListener listener)
    -
    Sets a listener of camera motion events.
    -
    -
    Parameters:
    -
    listener - The listener.
    -
    +
    @Deprecated
    +void setCameraMotionListener​(CameraMotionListener listener)
    +
  • @@ -418,13 +439,11 @@ void removeVideoListener​(
  • clearCameraMotionListener

    -
    void clearCameraMotionListener​(CameraMotionListener listener)
    -
    Clears the listener which receives camera motion events if it matches the one passed. Else - does nothing.
    -
    -
    Parameters:
    -
    listener - The listener to clear.
    -
    +
    @Deprecated
    +void clearCameraMotionListener​(CameraMotionListener listener)
    +
  • @@ -433,9 +452,11 @@ void removeVideoListener​(
  • clearVideoSurface

    -
    void clearVideoSurface()
    -
    Clears any Surface, SurfaceHolder, SurfaceView or TextureView - currently set on the player.
    +
    @Deprecated
    +void clearVideoSurface()
    +
    Deprecated. + +
  • @@ -444,14 +465,12 @@ void removeVideoListener​(
  • clearVideoSurface

    -
    void clearVideoSurface​(@Nullable
    +
    @Deprecated
    +void clearVideoSurface​(@Nullable
                            Surface surface)
    -
    Clears the Surface onto which video is being rendered if it matches the one passed. - Else does nothing.
    -
    -
    Parameters:
    -
    surface - The surface to clear.
    -
    +
    Deprecated. + +
  • @@ -460,19 +479,12 @@ void removeVideoListener​(
  • setVideoSurface

    -
    void setVideoSurface​(@Nullable
    +
    @Deprecated
    +void setVideoSurface​(@Nullable
                          Surface surface)
    -
    Sets the Surface onto which video will be rendered. The caller is responsible for - tracking the lifecycle of the surface, and must clear the surface by calling - setVideoSurface(null) if the surface is destroyed. - -

    If the surface is held by a SurfaceView, TextureView or SurfaceHolder then it's recommended to use setVideoSurfaceView(SurfaceView), setVideoTextureView(TextureView) or setVideoSurfaceHolder(SurfaceHolder) rather - than this method, since passing the holder allows the player to track the lifecycle of the - surface automatically.

    -
    -
    Parameters:
    -
    surface - The Surface.
    -
    +
    Deprecated. + +
  • @@ -481,17 +493,12 @@ void removeVideoListener​(
  • setVideoSurfaceHolder

    -
    void setVideoSurfaceHolder​(@Nullable
    +
    @Deprecated
    +void setVideoSurfaceHolder​(@Nullable
                                SurfaceHolder surfaceHolder)
    -
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically. - -

    The thread that calls the SurfaceHolder.Callback methods must be the thread - associated with Player.getApplicationLooper().

    -
    -
    Parameters:
    -
    surfaceHolder - The surface holder.
    -
    +
  • @@ -500,14 +507,12 @@ void removeVideoListener​(
  • clearVideoSurfaceHolder

    -
    void clearVideoSurfaceHolder​(@Nullable
    +
    @Deprecated
    +void clearVideoSurfaceHolder​(@Nullable
                                  SurfaceHolder surfaceHolder)
    -
    Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed. Else does nothing.
    -
    -
    Parameters:
    -
    surfaceHolder - The surface holder to clear.
    -
    +
  • @@ -516,17 +521,12 @@ void removeVideoListener​(
  • setVideoSurfaceView

    -
    void setVideoSurfaceView​(@Nullable
    +
    @Deprecated
    +void setVideoSurfaceView​(@Nullable
                              SurfaceView surfaceView)
    -
    Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically. - -

    The thread that calls the SurfaceHolder.Callback methods must be the thread - associated with Player.getApplicationLooper().

    -
    -
    Parameters:
    -
    surfaceView - The surface view.
    -
    +
    Deprecated. + +
  • @@ -535,14 +535,12 @@ void removeVideoListener​(
  • clearVideoSurfaceView

    -
    void clearVideoSurfaceView​(@Nullable
    +
    @Deprecated
    +void clearVideoSurfaceView​(@Nullable
                                SurfaceView surfaceView)
    -
    Clears the SurfaceView onto which video is being rendered if it matches the one - passed. Else does nothing.
    -
    -
    Parameters:
    -
    surfaceView - The texture view to clear.
    -
    +
    Deprecated. + +
  • @@ -551,17 +549,12 @@ void removeVideoListener​(
  • setVideoTextureView

    -
    void setVideoTextureView​(@Nullable
    +
    @Deprecated
    +void setVideoTextureView​(@Nullable
                              TextureView textureView)
    -
    Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically. - -

    The thread that calls the TextureView.SurfaceTextureListener methods must be the - thread associated with Player.getApplicationLooper().

    -
    -
    Parameters:
    -
    textureView - The texture view.
    -
    +
    Deprecated. + +
  • @@ -570,14 +563,12 @@ void removeVideoListener​(
  • clearVideoTextureView

    -
    void clearVideoTextureView​(@Nullable
    +
    @Deprecated
    +void clearVideoTextureView​(@Nullable
                                TextureView textureView)
    -
    Clears the TextureView onto which video is being rendered if it matches the one - passed. Else does nothing.
    -
    -
    Parameters:
    -
    textureView - The texture view to clear.
    -
    +
    Deprecated. + +
  • @@ -586,15 +577,11 @@ void removeVideoListener​(
  • getVideoSize

    -
    VideoSize getVideoSize()
    -
    Gets the size of the video. - -

    The width and height of size could be 0 if there is no video or the size has not been - determined yet.

    -
    -
    See Also:
    -
    VideoListener.onVideoSizeChanged(int, int, int, float)
    -
    +
    @Deprecated
    +VideoSize getVideoSize()
    +
    Deprecated. + +
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html index e8a5fbd7ea..88195ef603 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":6,"i21":38,"i22":38,"i23":6,"i24":38,"i25":6,"i26":6,"i27":6,"i28":6,"i29":6,"i30":6,"i31":6,"i32":6,"i33":6,"i34":6}; +var data = {"i0":6,"i1":6,"i2":38,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":38,"i15":6,"i16":6,"i17":6,"i18":6,"i19":38,"i20":6,"i21":6,"i22":6,"i23":6,"i24":6,"i25":6,"i26":6,"i27":38,"i28":6,"i29":6,"i30":38,"i31":6,"i32":6,"i33":6,"i34":38,"i35":38,"i36":6,"i37":6,"i38":38,"i39":38,"i40":6,"i41":6,"i42":6,"i43":6,"i44":6,"i45":6,"i46":38,"i47":6,"i48":6,"i49":6,"i50":6,"i51":6,"i52":6,"i53":6,"i54":6,"i55":6,"i56":6,"i57":6,"i58":38,"i59":6,"i60":6,"i61":6,"i62":6}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -131,7 +131,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public interface ExoPlayer
     extends Player
    -
    An extensible media player that plays MediaSources. Instances can be obtained from SimpleExoPlayer.Builder. +
    An extensible media player that plays MediaSources. Instances can be obtained from ExoPlayer.Builder.

    Player components

    @@ -143,9 +143,9 @@ extends
  • MediaSources that define the media to be played, load the media, - and from which the loaded media can be read. MediaSources are created from MediaItems by the MediaSourceFactory injected into the player Builder, or can be added directly by methods - like setMediaSource(MediaSource). The library provides a DefaultMediaSourceFactory for progressive media files, DASH, SmoothStreaming and HLS, - which also includes functionality for side-loading subtitle files and clipping media. + and from which the loaded media can be read. MediaSources are created from MediaItems by the MediaSourceFactory injected into the player Builder, or can be added directly by methods like setMediaSource(MediaSource). The library provides a DefaultMediaSourceFactory for + progressive media files, DASH, SmoothStreaming and HLS, which also includes functionality + for side-loading subtitle files and clipping media.
  • Renderers that render individual components of the media. The library provides default implementations for common media types (MediaCodecVideoRenderer, MediaCodecAudioRenderer, TextRenderer and MetadataRenderer). A @@ -229,7 +229,10 @@ extends static interface  ExoPlayer.AudioComponent -
    The audio component of an ExoPlayer.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
    +
    @@ -243,37 +246,37 @@ extends static class  ExoPlayer.Builder -
    Deprecated. - -
    +
    A builder for ExoPlayer instances.
    static interface  ExoPlayer.DeviceComponent -
    The device component of an ExoPlayer.
    +
    Deprecated. +
    Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
    +
    static interface  -ExoPlayer.MetadataComponent +ExoPlayer.TextComponent -
    The metadata component of an ExoPlayer.
    +
    Deprecated. +
    Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
    +
    static interface  -ExoPlayer.TextComponent - -
    The text component of an ExoPlayer.
    - - - -static interface  ExoPlayer.VideoComponent -
    The video component of an ExoPlayer.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
    +
    @@ -303,6 +306,13 @@ extends static long +DEFAULT_DETACH_SURFACE_TIMEOUT_MS + +
    The default timeout for detaching a surface from the player, in milliseconds.
    + + + +static long DEFAULT_RELEASE_TIMEOUT_MS
    The default timeout for calls to Player.release() and setForegroundMode(boolean), in @@ -315,7 +325,7 @@ extends

    Fields inherited from interface com.google.android.exoplayer2.Player

    -COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE_STOP, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_STATIC_METADATA_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE
  • +COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_TRACK_INFOS, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_TRACK_SELECTION_PARAMETERS, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, COMMAND_STOP, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, EVENT_TRACKS_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE @@ -336,12 +346,28 @@ extends void +addAnalyticsListener​(AnalyticsListener listener) + +
    Adds an AnalyticsListener to receive analytics events.
    + + + +void addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    Adds a listener to receive audio offload events.
    - + +void +addListener​(Player.EventListener listener) + + + + + void addMediaSource​(int index, MediaSource mediaSource) @@ -349,14 +375,14 @@ extends Adds a media source at the given index of the playlist.
    - + void addMediaSource​(MediaSource mediaSource)
    Adds a media source to the end of the playlist.
    - + void addMediaSources​(int index, List<MediaSource> mediaSources) @@ -364,77 +390,125 @@ extends Adds a list of media sources at the given index of the playlist.
    - + void addMediaSources​(List<MediaSource> mediaSources)
    Adds a list of media sources to the end of the playlist.
    - + +void +clearAuxEffectInfo() + +
    Detaches any previously attached auxiliary audio effect from the underlying audio track.
    + + + +void +clearCameraMotionListener​(CameraMotionListener listener) + +
    Clears the listener which receives camera motion events if it matches the one passed.
    + + + +void +clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener) + +
    Clears the listener which receives video frame metadata events if it matches the one passed.
    + + + PlayerMessage createMessage​(PlayerMessage.Target target)
    Creates a message that can be sent to a PlayerMessage.Target.
    - + boolean experimentalIsSleepingForOffload()
    Returns whether the player has paused its main loop to save power in offload scheduling mode.
    - + void experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled)
    Sets whether audio offload scheduling is enabled.
    - + +AnalyticsCollector +getAnalyticsCollector() + +
    Returns the AnalyticsCollector used for collecting analytics events.
    + + + ExoPlayer.AudioComponent getAudioComponent() -
    Returns the component of this player for audio output, or null if audio is not supported.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
    +
    - + +DecoderCounters +getAudioDecoderCounters() + +
    Returns DecoderCounters for audio, or null if no audio is being played.
    + + + +Format +getAudioFormat() + +
    Returns the audio format currently being played, or null if no audio is being played.
    + + + +int +getAudioSessionId() + +
    Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
    + + + Clock getClock()
    Returns the Clock used for playback.
    - + ExoPlayer.DeviceComponent getDeviceComponent() -
    Returns the component of this player for playback device, or null if it's not supported.
    +
    Deprecated. +
    Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
    +
    - -ExoPlayer.MetadataComponent -getMetadataComponent() - -
    Returns the component of this player for metadata output, or null if metadata is not supported.
    - - - + boolean getPauseAtEndOfMediaItems()
    Returns whether the player pauses playback at the end of each media item.
    - + Looper getPlaybackLooper()
    Returns the Looper associated with the playback thread.
    - + ExoPlaybackException getPlayerError() @@ -442,49 +516,90 @@ extends ExoPlaybackException. - + int getRendererCount()
    Returns the number of renderers.
    - -int + +@com.google.android.exoplayer2.C.TrackType int getRendererType​(int index)
    Returns the track type that the renderer at a given index handles.
    - + SeekParameters getSeekParameters()
    Returns the currently active SeekParameters of the player.
    - + +boolean +getSkipSilenceEnabled() + +
    Returns whether skipping silences in the audio stream is enabled.
    + + + ExoPlayer.TextComponent getTextComponent() -
    Returns the component of this player for text output, or null if text is not supported.
    +
    Deprecated. +
    Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
    +
    - + TrackSelector getTrackSelector()
    Returns the track selector that this player uses, or null if track selection is not supported.
    - + +int +getVideoChangeFrameRateStrategy() + + + + + ExoPlayer.VideoComponent getVideoComponent() -
    Returns the component of this player for video output, or null if video is not supported.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
    +
    - + +DecoderCounters +getVideoDecoderCounters() + +
    Returns DecoderCounters for video, or null if no video is being played.
    + + + +Format +getVideoFormat() + +
    Returns the video format currently being played, or null if no video is being played.
    + + + +int +getVideoScalingMode() + +
    Returns the C.VideoScalingMode.
    + + + void prepare​(MediaSource mediaSource) @@ -493,7 +608,7 @@ extends - + void prepare​(MediaSource mediaSource, boolean resetPosition, @@ -504,14 +619,30 @@ extends - + +void +removeAnalyticsListener​(AnalyticsListener listener) + +
    Removes an AnalyticsListener.
    + + + void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    Removes a listener of audio offload events.
    - + +void +removeListener​(Player.EventListener listener) + + + + + void retry() @@ -520,7 +651,36 @@ extends - + +void +setAudioAttributes​(AudioAttributes audioAttributes, + boolean handleAudioFocus) + +
    Sets the attributes for audio playback, used by the underlying audio track.
    + + + +void +setAudioSessionId​(int audioSessionId) + +
    Sets the ID of the audio session to attach to the underlying AudioTrack.
    + + + +void +setAuxEffectInfo​(AuxEffectInfo auxEffectInfo) + +
    Sets information on an auxiliary audio effect to attach to the underlying audio track.
    + + + +void +setCameraMotionListener​(CameraMotionListener listener) + +
    Sets a listener of camera motion events.
    + + + void setForegroundMode​(boolean foregroundMode) @@ -528,7 +688,24 @@ extends - + +void +setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy) + +
    Sets whether the player should pause automatically when audio is rerouted from a headset to + device speakers.
    + + + +void +setHandleWakeLock​(boolean handleWakeLock) + +
    Deprecated. +
    Use setWakeMode(int) instead.
    +
    + + + void setMediaSource​(MediaSource mediaSource) @@ -536,7 +713,7 @@ extends - + void setMediaSource​(MediaSource mediaSource, boolean resetPosition) @@ -544,7 +721,7 @@ extends Clears the playlist and adds the specified MediaSource. - + void setMediaSource​(MediaSource mediaSource, long startPositionMs) @@ -552,7 +729,7 @@ extends Clears the playlist and adds the specified MediaSource. - + void setMediaSources​(List<MediaSource> mediaSources) @@ -560,7 +737,7 @@ extends - + void setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition) @@ -568,43 +745,95 @@ extends Clears the playlist and adds the specified MediaSources. - + void setMediaSources​(List<MediaSource> mediaSources, - int startWindowIndex, + int startMediaItemIndex, long startPositionMs)
    Clears the playlist and adds the specified MediaSources.
    - + void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    Sets whether to pause playback at the end of each media item.
    - + +void +setPriorityTaskManager​(PriorityTaskManager priorityTaskManager) + +
    Sets a PriorityTaskManager, or null to clear a previously set priority task manager.
    + + + void setSeekParameters​(SeekParameters seekParameters)
    Sets the parameters that control how seek operations are performed.
    - + void setShuffleOrder​(ShuffleOrder shuffleOrder)
    Sets the shuffle order.
    + +void +setSkipSilenceEnabled​(boolean skipSilenceEnabled) + +
    Sets whether skipping silences in the audio stream is enabled.
    + + + +void +setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread) + +
    Deprecated. +
    Disabling the enforcement can result in hard-to-detect bugs.
    +
    + + + +void +setVideoChangeFrameRateStrategy​(int videoChangeFrameRateStrategy) + +
    Sets a C.VideoChangeFrameRateStrategy that will be used by the player when provided + with a video output Surface.
    + + + +void +setVideoFrameMetadataListener​(VideoFrameMetadataListener listener) + +
    Sets a listener to receive video frame metadata events.
    + + + +void +setVideoScalingMode​(int videoScalingMode) + + + + + +void +setWakeMode​(@com.google.android.exoplayer2.C.WakeMode int wakeMode) + +
    Sets how the player should keep the device awake for playback when the screen is off.
    + + @@ -625,7 +854,7 @@ extends -
      +
      • DEFAULT_RELEASE_TIMEOUT_MS

        static final long DEFAULT_RELEASE_TIMEOUT_MS
        @@ -637,6 +866,20 @@ extends
      + + + +
        +
      • +

        DEFAULT_DETACH_SURFACE_TIMEOUT_MS

        +
        static final long DEFAULT_DETACH_SURFACE_TIMEOUT_MS
        +
        The default timeout for detaching a surface from the player, in milliseconds.
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
    @@ -673,8 +916,12 @@ extends

    getAudioComponent

    @Nullable
    +@Deprecated
     ExoPlayer.AudioComponent getAudioComponent()
    -
    Returns the component of this player for audio output, or null if audio is not supported.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
    +
    @@ -684,8 +931,12 @@ extends

    getVideoComponent

    @Nullable
    +@Deprecated
     ExoPlayer.VideoComponent getVideoComponent()
    -
    Returns the component of this player for video output, or null if video is not supported.
    +
    Deprecated. +
    Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
    +
    @@ -695,19 +946,12 @@ extends

    getTextComponent

    @Nullable
    +@Deprecated
     ExoPlayer.TextComponent getTextComponent()
    -
    Returns the component of this player for text output, or null if text is not supported.
    - - - - - -
      -
    • -

      getMetadataComponent

      -
      @Nullable
      -ExoPlayer.MetadataComponent getMetadataComponent()
      -
      Returns the component of this player for metadata output, or null if metadata is not supported.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      +
    @@ -717,8 +961,51 @@ extends

    getDeviceComponent

    @Nullable
    +@Deprecated
     ExoPlayer.DeviceComponent getDeviceComponent()
    -
    Returns the component of this player for playback device, or null if it's not supported.
    +
    Deprecated. +
    Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
    +
    + + + + + + + + + + @@ -749,6 +1036,44 @@ extends + + + + + + + +
      +
    • +

      addAnalyticsListener

      +
      void addAnalyticsListener​(AnalyticsListener listener)
      +
      Adds an AnalyticsListener to receive analytics events.
      +
      +
      Parameters:
      +
      listener - The listener to be added.
      +
      +
    • +
    + + + +
      +
    • +

      removeAnalyticsListener

      +
      void removeAnalyticsListener​(AnalyticsListener listener)
      +
      Removes an AnalyticsListener.
      +
      +
      Parameters:
      +
      listener - The listener to be removed.
      +
      +
    • +
    @@ -765,7 +1090,7 @@ extends
  • getRendererType

    -
    int getRendererType​(int index)
    +
    @com.google.android.exoplayer2.C.TrackType int getRendererType​(int index)
  • @@ -879,7 +1204,7 @@ void prepare​(MediaSources.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by Player.getCurrentWindowIndex() and Player.getCurrentPosition().
    + by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -890,17 +1215,16 @@ void prepare​(

    setMediaSources

    void setMediaSources​(List<MediaSource> mediaSources,
    -                     int startWindowIndex,
    +                     int startMediaItemIndex,
                          long startPositionMs)
    Clears the playlist and adds the specified MediaSources.
    Parameters:
    mediaSources - The new MediaSources.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    +
    startMediaItemIndex - The media item index to start playback from. If C.INDEX_UNSET is passed, the current position is not reset.
    +
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given media item is used. In any case, + if startMediaItemIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
    @@ -948,7 +1272,7 @@ void prepare​(Parameters:
    mediaSource - The new MediaSource.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by Player.getCurrentWindowIndex() + false, playback will start from the position defined by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -1027,6 +1351,231 @@ void prepare​( + + +
      +
    • +

      setAudioAttributes

      +
      void setAudioAttributes​(AudioAttributes audioAttributes,
      +                        boolean handleAudioFocus)
      +
      Sets the attributes for audio playback, used by the underlying audio track. If not set, the + default audio attributes will be used. They are suitable for general media playback. + +

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

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

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

      If audio focus should be handled, the AudioAttributes.usage must be C.USAGE_MEDIA or C.USAGE_GAME. Other usages will throw an IllegalArgumentException.

      +
      +
      Parameters:
      +
      audioAttributes - The attributes to use for audio playback.
      +
      handleAudioFocus - True if the player should handle audio focus, false otherwise.
      +
      +
    • +
    + + + +
      +
    • +

      setAudioSessionId

      +
      void setAudioSessionId​(int audioSessionId)
      +
      Sets the ID of the audio session to attach to the underlying AudioTrack. + +

      The audio session ID can be generated using Util.generateAudioSessionIdV21(Context) + for API 21+.

      +
      +
      Parameters:
      +
      audioSessionId - The audio session ID, or C.AUDIO_SESSION_ID_UNSET if it should be + generated by the framework.
      +
      +
    • +
    + + + +
      +
    • +

      getAudioSessionId

      +
      int getAudioSessionId()
      +
      Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
      +
    • +
    + + + +
      +
    • +

      setAuxEffectInfo

      +
      void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)
      +
      Sets information on an auxiliary audio effect to attach to the underlying audio track.
      +
    • +
    + + + +
      +
    • +

      clearAuxEffectInfo

      +
      void clearAuxEffectInfo()
      +
      Detaches any previously attached auxiliary audio effect from the underlying audio track.
      +
    • +
    + + + +
      +
    • +

      setSkipSilenceEnabled

      +
      void setSkipSilenceEnabled​(boolean skipSilenceEnabled)
      +
      Sets whether skipping silences in the audio stream is enabled.
      +
      +
      Parameters:
      +
      skipSilenceEnabled - Whether skipping silences in the audio stream is enabled.
      +
      +
    • +
    + + + +
      +
    • +

      getSkipSilenceEnabled

      +
      boolean getSkipSilenceEnabled()
      +
      Returns whether skipping silences in the audio stream is enabled.
      +
    • +
    + + + + + + + + + + + + + + + + + + + +
      +
    • +

      setVideoFrameMetadataListener

      +
      void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
      +
      Sets a listener to receive video frame metadata events. + +

      This method is intended to be called by the same component that sets the Surface + onto which video will be rendered. If using ExoPlayer's standard UI components, this method + should not be called directly from application code.

      +
      +
      Parameters:
      +
      listener - The listener.
      +
      +
    • +
    + + + +
      +
    • +

      clearVideoFrameMetadataListener

      +
      void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
      +
      Clears the listener which receives video frame metadata events if it matches the one passed. + Else does nothing.
      +
      +
      Parameters:
      +
      listener - The listener to clear.
      +
      +
    • +
    + + + +
      +
    • +

      setCameraMotionListener

      +
      void setCameraMotionListener​(CameraMotionListener listener)
      +
      Sets a listener of camera motion events.
      +
      +
      Parameters:
      +
      listener - The listener.
      +
      +
    • +
    + + + +
      +
    • +

      clearCameraMotionListener

      +
      void clearCameraMotionListener​(CameraMotionListener listener)
      +
      Clears the listener which receives camera motion events if it matches the one passed. Else does + nothing.
      +
      +
      Parameters:
      +
      listener - The listener to clear.
      +
      +
    • +
    @@ -1037,8 +1586,8 @@ void prepare​(Creates a message that can be sent to a PlayerMessage.Target. By default, the message will be delivered immediately without blocking on the playback thread. The default PlayerMessage.getType() is 0 and the default PlayerMessage.getPayload() is null. If a position is specified with PlayerMessage.setPosition(long), the message will be - delivered at this position in the current window defined by Player.getCurrentWindowIndex(). - Alternatively, the message can be sent at a specific window using PlayerMessage.setPosition(int, long). + delivered at this position in the current media item defined by Player.getCurrentMediaItemIndex(). Alternatively, the message can be sent at a specific mediaItem + using PlayerMessage.setPosition(int, long). @@ -1112,7 +1661,7 @@ void prepare​(void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems) +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Parameters:
    pauseAtEndOfMediaItems - Whether to pause playback at the end of each media item.
    @@ -1133,6 +1682,143 @@ void prepare​( + + +
      +
    • +

      getAudioFormat

      +
      @Nullable
      +Format getAudioFormat()
      +
      Returns the audio format currently being played, or null if no audio is being played.
      +
    • +
    + + + +
      +
    • +

      getVideoFormat

      +
      @Nullable
      +Format getVideoFormat()
      +
      Returns the video format currently being played, or null if no video is being played.
      +
    • +
    + + + +
      +
    • +

      getAudioDecoderCounters

      +
      @Nullable
      +DecoderCounters getAudioDecoderCounters()
      +
      Returns DecoderCounters for audio, or null if no audio is being played.
      +
    • +
    + + + +
      +
    • +

      getVideoDecoderCounters

      +
      @Nullable
      +DecoderCounters getVideoDecoderCounters()
      +
      Returns DecoderCounters for video, or null if no video is being played.
      +
    • +
    + + + +
      +
    • +

      setHandleAudioBecomingNoisy

      +
      void setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)
      +
      Sets whether the player should pause automatically when audio is rerouted from a headset to + device speakers. See the audio + becoming noisy documentation for more information.
      +
      +
      Parameters:
      +
      handleAudioBecomingNoisy - Whether the player should pause automatically when audio is + rerouted from a headset to device speakers.
      +
      +
    • +
    + + + +
      +
    • +

      setHandleWakeLock

      +
      @Deprecated
      +void setHandleWakeLock​(boolean handleWakeLock)
      +
      Deprecated. +
      Use setWakeMode(int) instead.
      +
      +
    • +
    + + + +
      +
    • +

      setWakeMode

      +
      void setWakeMode​(@WakeMode
      +                 @com.google.android.exoplayer2.C.WakeMode int wakeMode)
      +
      Sets how the player should keep the device awake for playback when the screen is off. + +

      Enabling this feature requires the Manifest.permission.WAKE_LOCK permission. + It should be used together with a foreground Service for use cases where + playback occurs and the screen is off (e.g. background audio playback). It is not useful when + the screen will be kept on during playback (e.g. foreground video playback). + +

      When enabled, the locks (PowerManager.WakeLock / WifiManager.WifiLock) will be held whenever the player is in the Player.STATE_READY or Player.STATE_BUFFERING states with playWhenReady = true. The locks + held depends on the specified C.WakeMode.

      +
      +
      Parameters:
      +
      wakeMode - The C.WakeMode option to keep the device awake during playback.
      +
      +
    • +
    + + + +
      +
    • +

      setPriorityTaskManager

      +
      void setPriorityTaskManager​(@Nullable
      +                            PriorityTaskManager priorityTaskManager)
      +
      Sets a PriorityTaskManager, or null to clear a previously set priority task manager. + +

      The priority C.PRIORITY_PLAYBACK will be set while the player is loading.

      +
      +
      Parameters:
      +
      priorityTaskManager - The PriorityTaskManager, or null to clear a previously set + priority task manager.
      +
      +
    • +
    + + + +
      +
    • +

      setThrowsWhenUsingWrongThread

      +
      @Deprecated
      +void setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread)
      +
      Deprecated. +
      Disabling the enforcement can result in hard-to-detect bugs. Do not use this method + except to ease the transition while wrong thread access problems are fixed.
      +
      +
      Sets whether the player should throw an IllegalStateException when methods are called + from a thread other than the one associated with Player.getApplicationLooper(). + +

      The default is true and this method will be removed in the future.

      +
      +
      Parameters:
      +
      throwsWhenUsingWrongThread - Whether to throw when methods are called from a wrong thread.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerLibraryInfo.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerLibraryInfo.html index b191655a6c..a5f9f4b29b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerLibraryInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerLibraryInfo.html @@ -131,7 +131,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public final class ExoPlayerLibraryInfo
     extends Object
    -
    Information about the ExoPlayer library.
    +
    Information about the media libraries.
    @@ -156,24 +156,7 @@ extends static boolean ASSERTIONS_ENABLED -
    Whether the library was compiled with Assertions - checks enabled.
    - - - -static String -DEFAULT_USER_AGENT - -
    Deprecated. -
    ExoPlayer now uses the user agent of the underlying network stack by default.
    -
    - - - -static boolean -GL_ASSERTIONS_ENABLED - -
    Whether an exception should be thrown in case of an OpenGl error.
    +
    Whether the library was compiled with Assertions checks enabled.
    @@ -187,8 +170,7 @@ extends static boolean TRACE_ENABLED -
    Whether the library was compiled with TraceUtil - trace enabled.
    +
    Whether the library was compiled with TraceUtil trace enabled.
    @@ -209,7 +191,7 @@ extends static String VERSION_SLASHY -
    The version of the library expressed as "ExoPlayerLib/" + VERSION.
    +
    The version of the library expressed as TAG + "/" + VERSION.
    @@ -303,7 +285,7 @@ extends

    VERSION_SLASHY

    public static final String VERSION_SLASHY
    -
    The version of the library expressed as "ExoPlayerLib/" + VERSION.
    +
    The version of the library expressed as TAG + "/" + VERSION.
    See Also:
    Constant Field Values
    @@ -328,20 +310,6 @@ extends - - - -
      -
    • -

      DEFAULT_USER_AGENT

      -
      @Deprecated
      -public static final String DEFAULT_USER_AGENT
      -
      Deprecated. -
      ExoPlayer now uses the user agent of the underlying network stack by default.
      -
      -
      The default user agent for requests made by the library.
      -
    • -
    @@ -349,28 +317,13 @@ public static final 

    ASSERTIONS_ENABLED

    public static final boolean ASSERTIONS_ENABLED
    -
    +
    Whether the library was compiled with Assertions checks enabled.
    See Also:
    Constant Field Values
    - - - -
      -
    • -

      GL_ASSERTIONS_ENABLED

      -
      public static final boolean GL_ASSERTIONS_ENABLED
      -
      Whether an exception should be thrown in case of an OpenGl error.
      -
      -
      See Also:
      -
      Constant Field Values
      -
      -
    • -
    @@ -378,8 +331,7 @@ public static final 

    TRACE_ENABLED

    public static final boolean TRACE_ENABLED
    -
    +
    Whether the library was compiled with TraceUtil trace enabled.
    See Also:
    Constant Field Values
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Format.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/Format.Builder.html index a2b33749a8..4dc4edf5dc 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Format.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Format.Builder.html @@ -234,32 +234,32 @@ extends Format.Builder +setCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType) + + + + + +Format.Builder setDrmInitData​(DrmInitData drmInitData) - + Format.Builder setEncoderDelay​(int encoderDelay) - + Format.Builder setEncoderPadding​(int encoderPadding) - -Format.Builder -setExoMediaCryptoType​(Class<? extends ExoMediaCrypto> exoMediaCryptoType) - - - - Format.Builder setFrameRate​(float frameRate) @@ -353,7 +353,7 @@ extends Format.Builder -setRoleFlags​(int roleFlags) +setRoleFlags​(@com.google.android.exoplayer2.C.RoleFlags int roleFlags) @@ -381,7 +381,7 @@ extends Format.Builder -setSelectionFlags​(int selectionFlags) +setSelectionFlags​(@com.google.android.exoplayer2.C.SelectionFlags int selectionFlags) @@ -519,14 +519,14 @@ extends - +
    • setSelectionFlags

      public Format.Builder setSelectionFlags​(@SelectionFlags
      -                                        int selectionFlags)
      + @com.google.android.exoplayer2.C.SelectionFlags int selectionFlags)
      Sets Format.selectionFlags. The default value is 0.
      Parameters:
      @@ -536,14 +536,14 @@ extends
    - +
    • setRoleFlags

      public Format.Builder setRoleFlags​(@RoleFlags
      -                                   int roleFlags)
      + @com.google.android.exoplayer2.C.RoleFlags int roleFlags)
      Sets Format.roleFlags. The default value is 0.
      Parameters:
      @@ -947,18 +947,17 @@ extends
    - +
    • -

      setExoMediaCryptoType

      -
      public Format.Builder setExoMediaCryptoType​(@Nullable
      -                                            Class<? extends ExoMediaCrypto> exoMediaCryptoType)
      -
      Sets Format.exoMediaCryptoType. The default value is null.
      +

      setCryptoType

      +
      public Format.Builder setCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType)
      +
      Sets Format.cryptoType. The default value is C.CRYPTO_TYPE_NONE.
      Parameters:
      -
      exoMediaCryptoType - The Format.exoMediaCryptoType.
      +
      cryptoType - The C.CryptoType.
      Returns:
      The builder.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/Format.html b/docs/doc/reference/com/google/android/exoplayer2/Format.html index 9e78b8eb59..f896e1c926 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Format.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Format.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":42,"i2":42,"i3":10,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":41,"i13":41,"i14":41,"i15":41,"i16":41,"i17":41,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":9,"i24":10,"i25":10,"i26":10}; +var data = {"i0":10,"i1":42,"i2":10,"i3":42,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":41,"i13":41,"i14":41,"i15":41,"i16":41,"i17":41,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":9,"i24":10,"i25":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,12 +130,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • All Implemented Interfaces:
      -
      Parcelable
      +
      Bundleable

      public final class Format
       extends Object
      -implements Parcelable
      +implements Bundleable
      Represents a media format.

      When building formats, populate all fields whose values are known and relevant to the type of @@ -236,11 +236,11 @@ implements -

    • +
    • -

      Nested classes/interfaces inherited from interface android.os.Parcelable

      -Parcelable.ClassLoaderCreator<T extends Object>, Parcelable.Creator<T extends Object>
    • +

      Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Bundleable

      +Bundleable.Creator<T extends Bundleable>
    @@ -309,18 +309,27 @@ implements -static Parcelable.Creator<Format> +static Bundleable.Creator<Format> CREATOR -  + +
    Object that can restore Format from a Bundle.
    + +@com.google.android.exoplayer2.C.CryptoType int +cryptoType + +
    The type of crypto that must be used to decode samples associated with this format, or C.CRYPTO_TYPE_NONE if the content is not encrypted.
    + + + DrmInitData drmInitData
    DRM initialization data if the stream is protected, or null otherwise.
    - + int encoderDelay @@ -328,21 +337,13 @@ implements + int encoderPadding
    The number of frames to trim from the end of the decoded audio stream, or 0 if not applicable.
    - -Class<? extends ExoMediaCrypto> -exoMediaCryptoType - -
    The type of ExoMediaCrypto that will be associated with the content this format - describes, or null if the content is not encrypted.
    - - float frameRate @@ -444,7 +445,7 @@ implements -int +@com.google.android.exoplayer2.C.RoleFlags int roleFlags
    Track role flags.
    @@ -473,7 +474,7 @@ implements -int +@com.google.android.exoplayer2.C.SelectionFlags int selectionFlags
    Track selection flags.
    @@ -502,13 +503,6 @@ implements -
  • - - -

    Fields inherited from interface android.os.Parcelable

    -CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
  • - @@ -544,6 +538,13 @@ implements Format +copyWithCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType) + +
    Returns a copy of this format with the specified cryptoType.
    + + + +Format copyWithDrmInitData​(DrmInitData drmInitData)
    Deprecated. @@ -551,13 +552,6 @@ implements -Format -copyWithExoMediaCryptoType​(Class<? extends ExoMediaCrypto> exoMediaCryptoType) - -
    Returns a copy of this format with the specified exoMediaCryptoType.
    - - Format copyWithFrameRate​(float frameRate) @@ -634,7 +628,7 @@ implements static Format -createAudioSampleFormat​(String id, +createAudioSampleFormat​(String id, String sampleMimeType, String codecs, int bitrate, @@ -644,7 +638,7 @@ implements List<byte[]> initializationData, DrmInitData drmInitData, - int selectionFlags, + @com.google.android.exoplayer2.C.SelectionFlags int selectionFlags, String language)
    Deprecated. @@ -654,7 +648,7 @@ implements static Format -createAudioSampleFormat​(String id, +createAudioSampleFormat​(String id, String sampleMimeType, String codecs, int bitrate, @@ -663,7 +657,7 @@ implements List<byte[]> initializationData, DrmInitData drmInitData, - int selectionFlags, + @com.google.android.exoplayer2.C.SelectionFlags int selectionFlags, String language)
    Deprecated. @@ -673,14 +667,14 @@ implements static Format -createContainerFormat​(String id, +createContainerFormat​(String id, String label, String containerMimeType, String sampleMimeType, String codecs, int bitrate, - int selectionFlags, - int roleFlags, + @com.google.android.exoplayer2.C.SelectionFlags int selectionFlags, + @com.google.android.exoplayer2.C.RoleFlags int roleFlags, String language)
    Deprecated. @@ -737,16 +731,11 @@ implements -int -describeContents() -  - - boolean equals​(Object obj)   - + int getPixelCount() @@ -754,12 +743,12 @@ implements NO_VALUE otherwise
    - + int hashCode()   - + boolean initializationDataEquals​(Format other) @@ -767,6 +756,13 @@ implements +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + + static String toLogString​(Format format) @@ -784,12 +780,6 @@ implements withManifestFormatInfo​(Format manifestFormat)   - -void -writeToParcel​(Parcel dest, - int flags) -  - @@ -894,7 +884,7 @@ public final int selectionFlags
  • roleFlags

    @RoleFlags
    -public final int roleFlags
    +public final @com.google.android.exoplayer2.C.RoleFlags int roleFlags
    Track role flags.
  • @@ -1197,16 +1187,16 @@ public final int pcmEncoding
    The Accessibility channel, or NO_VALUE if not known or applicable.
    - +
    • -

      exoMediaCryptoType

      -
      @Nullable
      -public final Class<? extends ExoMediaCrypto> exoMediaCryptoType
      -
      The type of ExoMediaCrypto that will be associated with the content this format - describes, or null if the content is not encrypted. Cannot be null if drmInitData is non-null.
      +

      cryptoType

      +
      public final @com.google.android.exoplayer2.C.CryptoType int cryptoType
      +
      The type of crypto that must be used to decode samples associated with this format, or C.CRYPTO_TYPE_NONE if the content is not encrypted. Cannot be C.CRYPTO_TYPE_NONE if + drmInitData is non-null, but may be C.CRYPTO_TYPE_UNSUPPORTED to indicate that + the samples are encrypted using an unsupported crypto type.
    @@ -1215,7 +1205,8 @@ public final 
  • CREATOR

    -
    public static final Parcelable.Creator<Format> CREATOR
    +
    public static final Bundleable.Creator<Format> CREATOR
    +
    Object that can restore Format from a Bundle.
  • @@ -1284,7 +1275,7 @@ public static  + @@ -217,34 +217,27 @@ implements void -addListener​(Player.EventListener listener) +addListener​(Player.Listener listener)
    Deprecated.
    void -addListener​(Player.Listener listener) - -
    Registers a listener to receive all events from the player.
    - - - -void addMediaItem​(int index, MediaItem mediaItem)
    Adds a media item at the given index of the playlist.
    - + void addMediaItem​(MediaItem mediaItem)
    Adds a media item to the end of the playlist.
    - + void addMediaItems​(int index, List<MediaItem> mediaItems) @@ -252,13 +245,20 @@ implements Adds a list of media items at the given index of the playlist.
    - + void addMediaItems​(List<MediaItem> mediaItems)
    Adds a list of media items to the end of the playlist.
    + +boolean +canAdvertiseSession() + +
    Returns whether the player can be used to advertise a media session.
    + + void clearMediaItems() @@ -314,8 +314,7 @@ implements Looper getApplicationLooper() -
    Returns the Looper associated with the application thread that's used to access the - player and on which player events are received.
    +
    Deprecated.
    @@ -336,7 +335,7 @@ implements int getBufferedPercentage() -
    Returns an estimate of the percentage in the current content window or ad up to which data is +
    Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
    @@ -344,8 +343,8 @@ implements long getBufferedPosition() -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
    @@ -353,15 +352,15 @@ implements getContentBufferedPosition()
    If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds.
    + the current content up to which data is buffered, in milliseconds.
    long getContentDuration() -
    If Player.isPlayingAd() returns true, returns the duration of the current content - window in milliseconds, or C.TIME_UNSET if the duration is not known.
    +
    If Player.isPlayingAd() returns true, returns the duration of the current content in + milliseconds, or C.TIME_UNSET if the duration is not known.
    @@ -399,8 +398,8 @@ implements getCurrentLiveOffset()
    Returns the offset of the current playback position from the live edge in milliseconds, or - C.TIME_UNSET if the current window isn't live or the - offset is unknown.
    + C.TIME_UNSET if the current MediaItem Player.isCurrentMediaItemLive() isn't + live} or the offset is unknown.
    @@ -414,30 +413,30 @@ implements MediaItem getCurrentMediaItem() -
    Returns the media item of the current window in the timeline.
    +
    Returns the currently playing MediaItem.
    int +getCurrentMediaItemIndex() + +
    Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is + empty.
    + + + +int getCurrentPeriodIndex()
    Returns the index of the period currently being played.
    - + long getCurrentPosition() -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
    - - - -List<Metadata> -getCurrentStaticMetadata() - -
    Deprecated.
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
    @@ -462,56 +461,63 @@ implements -int -getCurrentWindowIndex() +TracksInfo +getCurrentTracksInfo() -
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    +
    Returns the available tracks, as well as the tracks' support, type, and selection status.
    -DeviceInfo +int +getCurrentWindowIndex() + +
    Deprecated.
    + + + +DeviceInfo getDeviceInfo()
    Gets the device information.
    - + int getDeviceVolume()
    Gets the current volume of the device.
    - + long getDuration() -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    - - - -int -getMaxSeekToPreviousPosition() - -
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous window, - in milliseconds.
    +
    Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
    +long +getMaxSeekToPreviousPosition() + +
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous MediaItem, in milliseconds.
    + + + MediaItem getMediaItemAt​(int index)
    Returns the MediaItem at the given index.
    - + int getMediaItemCount()
    Returns the number of media items in the playlist.
    - + MediaMetadata getMediaMetadata() @@ -519,29 +525,36 @@ implements + +int +getNextMediaItemIndex() + +
    Returns the index of the MediaItem that will be played if Player.seekToNextMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
    + + + int getNextWindowIndex() -
    Returns the index of the window that will be played if Player.seekToNextWindow() is called, - which may depend on the current repeat mode and whether shuffle mode is enabled.
    +
    Deprecated.
    - + PlaybackParameters getPlaybackParameters()
    Returns the currently active playback parameters.
    - + int getPlaybackState()
    Returns the current playback state of the player.
    - + int getPlaybackSuppressionReason() @@ -549,187 +562,236 @@ implements Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    - + PlaybackException getPlayerError()
    Returns the error that caused playback to fail.
    - + MediaMetadata getPlaylistMetadata()
    Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    - + boolean getPlayWhenReady()
    Whether playback will proceed when Player.getPlaybackState() == Player.STATE_READY.
    - + +int +getPreviousMediaItemIndex() + +
    Returns the index of the MediaItem that will be played if Player.seekToPreviousMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
    + + + int getPreviousWindowIndex() -
    Returns the index of the window that will be played if Player.seekToPreviousWindow() is - called, which may depend on the current repeat mode and whether shuffle mode is enabled.
    +
    Deprecated.
    - + int getRepeatMode()
    Returns the current Player.RepeatMode used for playback.
    - + long getSeekBackIncrement()
    Returns the Player.seekBack() increment.
    - + long getSeekForwardIncrement()
    Returns the Player.seekForward() increment.
    - + boolean getShuffleModeEnabled() -
    Returns whether shuffling of windows is enabled.
    +
    Returns whether shuffling of media items is enabled.
    - + long getTotalBufferedDuration()
    Returns an estimate of the total buffered duration from the current position, in milliseconds.
    - + +TrackSelectionParameters +getTrackSelectionParameters() + +
    Returns the parameters constraining the track selection.
    + + + VideoSize getVideoSize()
    Gets the size of the video.
    - + float getVolume()
    Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    - + Player getWrappedPlayer()
    Returns the Player to which operations are forwarded.
    - + boolean hasNext()
    Deprecated.
    - + +boolean +hasNextMediaItem() + +
    Returns whether a next MediaItem exists, which may depend on the current repeat mode + and whether shuffle mode is enabled.
    + + + boolean hasNextWindow() -
    Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled.
    +
    Deprecated.
    - + boolean hasPrevious()
    Deprecated.
    - + boolean -hasPreviousWindow() +hasPreviousMediaItem() -
    Returns whether a previous window exists, which may depend on the current repeat mode and +
    Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.
    - + +boolean +hasPreviousWindow() + +
    Deprecated.
    + + + void increaseDeviceVolume()
    Increases the volume of the device.
    - + boolean -isCommandAvailable​(int command) +isCommandAvailable​(@com.google.android.exoplayer2.Player.Command int command)
    Returns whether the provided Player.Command is available.
    - + +boolean +isCurrentMediaItemDynamic() + +
    Returns whether the current MediaItem is dynamic (may change when the Timeline + is updated), or false if the Timeline is empty.
    + + + +boolean +isCurrentMediaItemLive() + +
    Returns whether the current MediaItem is live, or false if the Timeline + is empty.
    + + + +boolean +isCurrentMediaItemSeekable() + +
    Returns whether the current MediaItem is seekable, or false if the Timeline is empty.
    + + + boolean isCurrentWindowDynamic() -
    Returns whether the current window is dynamic, or false if the Timeline is - empty.
    +
    Deprecated.
    - + boolean isCurrentWindowLive() -
    Returns whether the current window is live, or false if the Timeline is empty.
    +
    Deprecated.
    - + boolean isCurrentWindowSeekable() -
    Returns whether the current window is seekable, or false if the Timeline is - empty.
    +
    Deprecated.
    - + boolean isDeviceMuted()
    Gets whether the device is muted or not.
    - + boolean isLoading()
    Whether the player is currently loading the source.
    - + boolean isPlaying()
    Returns whether the player is playing, i.e.
    - + boolean isPlayingAd()
    Returns whether the player is currently playing an ad.
    - + void moveMediaItem​(int currentIndex, int newIndex) @@ -737,7 +799,7 @@ implements Moves the media item at the current index to the new index.
    - + void moveMediaItems​(int fromIndex, int toIndex, @@ -746,70 +808,63 @@ implements Moves the media item range to the new index. - + void next()
    Deprecated.
    - + void pause()
    Pauses playback.
    - + void play()
    Resumes playback as soon as Player.getPlaybackState() == Player.STATE_READY.
    - + void prepare()
    Prepares the player.
    - + void previous()
    Deprecated.
    - + void release()
    Releases the player.
    - -void -removeListener​(Player.EventListener listener) - -
    Deprecated.
    - - - + void removeListener​(Player.Listener listener)
    Unregister a listener registered through Player.addListener(Listener).
    - + void removeMediaItem​(int index)
    Removes the media item at the given index of the playlist.
    - + void removeMediaItems​(int fromIndex, int toIndex) @@ -817,94 +872,109 @@ implements Removes a range of media items from the playlist. - + void seekBack() -
    Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
    - - - -void -seekForward() - -
    Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
    - - - -void -seekTo​(int windowIndex, - long positionMs) - -
    Seeks to a position specified in milliseconds in the specified window.
    - - - -void -seekTo​(long positionMs) - -
    Seeks to a position specified in milliseconds in the current window.
    - - - -void -seekToDefaultPosition() - -
    Seeks to the default position associated with the current window.
    - - - -void -seekToDefaultPosition​(int windowIndex) - -
    Seeks to the default position associated with the specified window.
    - - - -void -seekToNext() - -
    Seeks to a later position in the current or next window (if available).
    - - - -void -seekToNextWindow() - -
    Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled.
    - - - -void -seekToPrevious() - -
    Seeks to an earlier position in the current or previous window (if available).
    +
    Seeks back in the current MediaItem by Player.getSeekBackIncrement() milliseconds.
    void -seekToPreviousWindow() +seekForward() -
    Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled.
    +
    Seeks forward in the current MediaItem by Player.getSeekForwardIncrement() + milliseconds.
    void +seekTo​(int mediaItemIndex, + long positionMs) + +
    Seeks to a position specified in milliseconds in the specified MediaItem.
    + + + +void +seekTo​(long positionMs) + +
    Seeks to a position specified in milliseconds in the current MediaItem.
    + + + +void +seekToDefaultPosition() + +
    Seeks to the default position associated with the current MediaItem.
    + + + +void +seekToDefaultPosition​(int mediaItemIndex) + +
    Seeks to the default position associated with the specified MediaItem.
    + + + +void +seekToNext() + +
    Seeks to a later position in the current or next MediaItem (if available).
    + + + +void +seekToNextMediaItem() + +
    Seeks to the default position of the next MediaItem, which may depend on the current + repeat mode and whether shuffle mode is enabled.
    + + + +void +seekToNextWindow() + +
    Deprecated.
    + + + +void +seekToPrevious() + +
    Seeks to an earlier position in the current or previous MediaItem (if available).
    + + + +void +seekToPreviousMediaItem() + +
    Seeks to the default position of the previous MediaItem, which may depend on the + current repeat mode and whether shuffle mode is enabled.
    + + + +void +seekToPreviousWindow() + +
    Deprecated.
    + + + +void setDeviceMuted​(boolean muted)
    Sets the mute state of the device.
    - + void setDeviceVolume​(int volume)
    Sets the volume of the device.
    - + void setMediaItem​(MediaItem mediaItem) @@ -912,7 +982,7 @@ implements + void setMediaItem​(MediaItem mediaItem, boolean resetPosition) @@ -920,7 +990,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItem​(MediaItem mediaItem, long startPositionMs) @@ -928,7 +998,7 @@ implements Clears the playlist and adds the specified MediaItem. - + void setMediaItems​(List<MediaItem> mediaItems) @@ -936,7 +1006,7 @@ implements + void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) @@ -944,65 +1014,72 @@ implements Clears the playlist and adds the specified MediaItems. - + void setMediaItems​(List<MediaItem> mediaItems, - int startWindowIndex, + int startIndex, long startPositionMs)
    Clears the playlist and adds the specified MediaItems.
    - + void setPlaybackParameters​(PlaybackParameters playbackParameters)
    Attempts to set the playback parameters.
    - + void setPlaybackSpeed​(float speed)
    Changes the rate at which playback occurs.
    - + void setPlaylistMetadata​(MediaMetadata mediaMetadata)
    Sets the playlist MediaMetadata.
    - + void setPlayWhenReady​(boolean playWhenReady)
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    - + void -setRepeatMode​(int repeatMode) +setRepeatMode​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
    Sets the Player.RepeatMode to be used for playback.
    - + void setShuffleModeEnabled​(boolean shuffleModeEnabled) -
    Sets whether shuffling of windows is enabled.
    +
    Sets whether shuffling of media items is enabled.
    - + +void +setTrackSelectionParameters​(TrackSelectionParameters parameters) + +
    Sets the parameters constraining the track selection.
    + + + void setVideoSurface​(Surface surface)
    Sets the Surface onto which video will be rendered.
    - + void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) @@ -1010,35 +1087,36 @@ implements + void setVideoSurfaceView​(SurfaceView surfaceView)
    Sets the SurfaceView onto which video will be rendered.
    - + void setVideoTextureView​(TextureView textureView)
    Sets the TextureView onto which video will be rendered.
    - + void -setVolume​(float audioVolume) +setVolume​(float volume) -
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    +
    Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
    - + void stop()
    Stops playback without resetting the player.
    - + void stop​(boolean reset) @@ -1095,7 +1173,9 @@ implements
  • getApplicationLooper

    -
    public Looper getApplicationLooper()
    +
    @Deprecated
    +public Looper getApplicationLooper()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the Looper associated with the application thread that's used to access the player and on which player events are received.
    @@ -1105,42 +1185,19 @@ implements - - -
      -
    • -

      addListener

      -
      @Deprecated
      -public void addListener​(Player.EventListener listener)
      -
      Deprecated.
      -
      Description copied from interface: Player
      -
      Registers a listener to receive events from the player. - -

      The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

      -
      -
      Specified by:
      -
      addListener in interface Player
      -
      Parameters:
      -
      listener - The listener to register.
      -
      -
    • -
    • addListener

      -
      public void addListener​(Player.Listener listener)
      +
      @Deprecated
      +public void addListener​(Player.Listener listener)
      +
      Deprecated.
      Description copied from interface: Player
      Registers a listener to receive all events from the player. -

      The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

      +

      The listener's methods will be called on the thread associated with Player.getApplicationLooper().

      Specified by:
      addListener in interface Player
      @@ -1149,26 +1206,6 @@ public void addListener​(
    - - - - @@ -1222,7 +1259,7 @@ public void removeListener​(mediaItems - The new MediaItems.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by Player.getCurrentWindowIndex() and Player.getCurrentPosition().
    + by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
  • @@ -1233,7 +1270,7 @@ public void removeListener​(

    setMediaItems

    public void setMediaItems​(List<MediaItem> mediaItems,
    -                          int startWindowIndex,
    +                          int startIndex,
                               long startPositionMs)
    Description copied from interface: Player
    Clears the playlist and adds the specified MediaItems.
    @@ -1242,11 +1279,11 @@ public void removeListener​(setMediaItems in interface Player
    Parameters:
    mediaItems - The new MediaItems.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    +
    startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET + is passed, the current position is not reset.
    +
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In + any case, if startIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
    @@ -1303,7 +1340,7 @@ public void removeListener​(Parameters:
    mediaItem - The new MediaItem.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by Player.getCurrentWindowIndex() + false, playback will start from the position defined by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -1477,28 +1514,27 @@ public void removeListener​( - + + + + +
      +
    • +

      canAdvertiseSession

      +
      public boolean canAdvertiseSession()
      +
      Description copied from interface: Player
      +
      Returns whether the player can be used to advertise a media session.
      +
      +
      Specified by:
      +
      canAdvertiseSession in interface Player
      +
      +
    • +
    @@ -1521,12 +1572,11 @@ public void removeListener​(The returned Player.Commands are not updated when available commands change. Use Player.Listener.onAvailableCommandsChanged(Commands) to get an update when the available commands change. -

    Executing a command that is not available (for example, calling Player.seekToNextWindow() - if Player.COMMAND_SEEK_TO_NEXT_WINDOW is unavailable) will neither throw an exception nor - generate a Player.getPlayerError() player error}. +

    Executing a command that is not available (for example, calling Player.seekToNextMediaItem() if Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM is unavailable) will + neither throw an exception nor generate a Player.getPlayerError() player error}. -

    Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW and Player.COMMAND_SEEK_TO_NEXT_WINDOW are - unavailable if there is no such MediaItem. +

    Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM and Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM + are unavailable if there is no such MediaItem.

    Specified by:
    getAvailableCommands in interface Player
    @@ -1567,7 +1617,7 @@ public void removeListener​(Returns:
    The current playback state.
    See Also:
    -
    Player.Listener.onPlaybackStateChanged(int)
    +
    Player.Listener.onPlaybackStateChanged(int)
    @@ -1587,7 +1637,7 @@ public void removeListener​(Returns:
    The current playback suppression reason.
    See Also:
    -
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
    +
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
    @@ -1708,23 +1758,23 @@ public Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    - +
    @@ -1757,7 +1807,7 @@ public public void setShuffleModeEnabled​(boolean shuffleModeEnabled) -
    Sets whether shuffling of windows is enabled.
    +
    Sets whether shuffling of media items is enabled.
    Specified by:
    setShuffleModeEnabled in interface Player
    @@ -1774,7 +1824,7 @@ public public boolean getShuffleModeEnabled() -
    Returns whether shuffling of windows is enabled.
    +
    Returns whether shuffling of media items is enabled.
    Specified by:
    getShuffleModeEnabled in interface Player
    @@ -1810,9 +1860,9 @@ public public void seekToDefaultPosition() -
    Seeks to the default position associated with the current window. The position can depend on - the type of media being played. For live streams it will typically be the live edge of the - window. For other streams it will typically be the start of the window.
    +
    Seeks to the default position associated with the current MediaItem. The position can + depend on the type of media being played. For live streams it will typically be the live edge. + For other streams it will typically be the start.
    Specified by:
    seekToDefaultPosition in interface Player
    @@ -1825,17 +1875,17 @@ public 
  • seekToDefaultPosition

    -
    public void seekToDefaultPosition​(int windowIndex)
    +
    public void seekToDefaultPosition​(int mediaItemIndex)
    -
    Seeks to the default position associated with the specified window. The position can depend on - the type of media being played. For live streams it will typically be the live edge of the - window. For other streams it will typically be the start of the window.
    +
    Seeks to the default position associated with the specified MediaItem. The position can + depend on the type of media being played. For live streams it will typically be the live edge. + For other streams it will typically be the start.
    Specified by:
    seekToDefaultPosition in interface Player
    Parameters:
    -
    windowIndex - The index of the window whose associated default position should be seeked - to.
    +
    mediaItemIndex - The index of the MediaItem whose associated default position + should be seeked to.
  • @@ -1847,13 +1897,13 @@ public public void seekTo​(long positionMs) -
    Seeks to a position specified in milliseconds in the current window.
    +
    Seeks to a position specified in milliseconds in the current MediaItem.
    Specified by:
    seekTo in interface Player
    Parameters:
    -
    positionMs - The seek position in the current window, or C.TIME_UNSET to seek to - the window's default position.
    +
    positionMs - The seek position in the current MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
    @@ -1863,17 +1913,17 @@ public 
  • seekTo

    -
    public void seekTo​(int windowIndex,
    +
    public void seekTo​(int mediaItemIndex,
                        long positionMs)
    -
    Seeks to a position specified in milliseconds in the specified window.
    +
    Seeks to a position specified in milliseconds in the specified MediaItem.
    Specified by:
    seekTo in interface Player
    Parameters:
    -
    windowIndex - The index of the window.
    -
    positionMs - The seek position in the specified window, or C.TIME_UNSET to seek to - the window's default position.
    +
    mediaItemIndex - The index of the MediaItem.
    +
    positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
  • @@ -1904,7 +1954,7 @@ public public void seekBack() -
    Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
    +
    Seeks back in the current MediaItem by Player.getSeekBackIncrement() milliseconds.
    Specified by:
    seekBack in interface Player
    @@ -1938,7 +1988,8 @@ public public void seekForward() -
    Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
    +
    Seeks forward in the current MediaItem by Player.getSeekForwardIncrement() + milliseconds.
    Specified by:
    seekForward in interface Player
    @@ -1966,9 +2017,24 @@ public boolean hasPrevious()
    • hasPreviousWindow

      -
      public boolean hasPreviousWindow()
      -
      Description copied from interface: Player
      -
      Returns whether a previous window exists, which may depend on the current repeat mode and +
      @Deprecated
      +public boolean hasPreviousWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      hasPreviousWindow in interface Player
      +
      +
    • +
    + + + +
      +
    • +

      hasPreviousMediaItem

      +
      public boolean hasPreviousMediaItem()
      +
      Description copied from interface: Player
      +
      Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.

      Note: When the repeat mode is Player.REPEAT_MODE_ONE, this method behaves the same as when @@ -1976,7 +2042,7 @@ public boolean hasPrevious() details.

      Specified by:
      -
      hasPreviousWindow in interface Player
      +
      hasPreviousMediaItem in interface Player
    @@ -2001,18 +2067,32 @@ public void previous()
    • seekToPreviousWindow

      -
      public void seekToPreviousWindow()
      -
      Description copied from interface: Player
      -
      Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled. Does nothing if Player.hasPreviousWindow() is - false. +
      @Deprecated
      +public void seekToPreviousWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      seekToPreviousWindow in interface Player
      +
      +
    • +
    + + + + @@ -2024,18 +2104,20 @@ public void previous()

    seekToPrevious

    public void seekToPrevious()
    Description copied from interface: Player
    -
    Seeks to an earlier position in the current or previous window (if available). More precisely: +
    Seeks to an earlier position in the current or previous MediaItem (if available). More + precisely:
    Specified by:
    @@ -2049,17 +2131,16 @@ public void previous() @@ -2084,17 +2165,32 @@ public boolean hasNext()
    • hasNextWindow

      -
      public boolean hasNextWindow()
      -
      Description copied from interface: Player
      -
      Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled. +
      @Deprecated
      +public boolean hasNextWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      hasNextWindow in interface Player
      +
      +
    • +
    + + + + @@ -2119,17 +2215,33 @@ public void next()
    • seekToNextWindow

      -
      public void seekToNextWindow()
      -
      Description copied from interface: Player
      -
      Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled. Does nothing if Player.hasNextWindow() is false. +
      @Deprecated
      +public void seekToNextWindow()
      +
      Deprecated.
      +
      +
      Specified by:
      +
      seekToNextWindow in interface Player
      +
      +
    • +
    + + + + @@ -2141,14 +2253,15 @@ public void next()

    seekToNext

    public void seekToNext()
    Description copied from interface: Player
    -
    Seeks to a later position in the current or next window (if available). More precisely: +
    Seeks to a later position in the current or next MediaItem (if available). More + precisely:
    • If the timeline is empty or seeking is not possible, does nothing. -
    • Otherwise, if a next window exists, seeks to the default - position of the next window. -
    • Otherwise, if the current window is live and has not - ended, seeks to the live edge of the current window. +
    • Otherwise, if a next media item exists, seeks to the default + position of the next MediaItem. +
    • Otherwise, if the current MediaItem is live and + has not ended, seeks to the live edge of the current MediaItem.
    • Otherwise, does nothing.
    @@ -2283,7 +2396,7 @@ public void stop​(boolean reset)
    Specified by:
    getCurrentTrackGroups in interface Player
    See Also:
    -
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -2304,22 +2417,70 @@ public void stop​(boolean reset)
    Specified by:
    getCurrentTrackSelections in interface Player
    See Also:
    -
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    - + + + + + + + + +
      +
    • +

      setTrackSelectionParameters

      +
      public void setTrackSelectionParameters​(TrackSelectionParameters parameters)
      +
      Description copied from interface: Player
      +
      Sets the parameters constraining the track selection. + +

      Unsupported parameters will be silently ignored. + +

      Use Player.getTrackSelectionParameters() to retrieve the current parameters. For example, + the following snippet restricts video to SD whilst keep other track selection parameters + unchanged: + +

      
      + player.setTrackSelectionParameters(
      +   player.getTrackSelectionParameters()
      +         .buildUpon()
      +         .setMaxVideoSizeSd()
      +         .build())
      + 
      +
      +
      Specified by:
      +
      setTrackSelectionParameters in interface Player
    @@ -2336,7 +2497,8 @@ public MediaMetadata is a combination of the MediaItem.mediaMetadata and the static and dynamic metadata from the track selections' - formats and MetadataOutput.onMetadata(Metadata).
    + formats
    and Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata, it will be prioritised above the same field coming from static or + dynamic metadata.
    Specified by:
    getMediaMetadata in interface Player
    @@ -2402,7 +2564,7 @@ public Specified by:
    getCurrentTimeline in interface Player
    See Also:
    -
    Player.Listener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -2427,32 +2589,64 @@ public 
  • getCurrentWindowIndex

    -
    public int getCurrentWindowIndex()
    -
    -
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    +
    @Deprecated
    +public int getCurrentWindowIndex()
    +
    Deprecated.
    Specified by:
    getCurrentWindowIndex in interface Player
  • + + + + + + + + @@ -2462,18 +2656,33 @@ public 
  • getPreviousWindowIndex

    -
    public int getPreviousWindowIndex()
    -
    -
    Returns the index of the window that will be played if Player.seekToPreviousWindow() is - called, which may depend on the current repeat mode and whether shuffle mode is enabled. - Returns C.INDEX_UNSET if Player.hasPreviousWindow() is false. +
    @Deprecated
    +public int getPreviousWindowIndex()
    +
    Deprecated.
    +
    +
    Specified by:
    +
    getPreviousWindowIndex in interface Player
    +
    +
  • + + + + + @@ -2486,13 +2695,12 @@ public @Nullable public MediaItem getCurrentMediaItem()
    Description copied from interface: Player
    -
    Returns the media item of the current window in the timeline. May be null if the timeline is - empty.
    +
    Returns the currently playing MediaItem. May be null if the timeline is empty.
    Specified by:
    getCurrentMediaItem in interface Player
    See Also:
    -
    Player.Listener.onMediaItemTransition(MediaItem, int)
    +
    Player.Listener.onMediaItemTransition(MediaItem, int)
    @@ -2534,7 +2742,8 @@ public public long getDuration() -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    +
    Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
    Specified by:
    getDuration in interface Player
    @@ -2549,9 +2758,8 @@ public public long getCurrentPosition() -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
    Specified by:
    getCurrentPosition in interface Player
    @@ -2566,8 +2774,8 @@ public public long getBufferedPosition() -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
    Specified by:
    getBufferedPosition in interface Player
    @@ -2582,7 +2790,7 @@ public public int getBufferedPercentage() -
    Returns an estimate of the percentage in the current content window or ad up to which data is +
    Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
    Specified by:
    @@ -2599,7 +2807,7 @@ public public long getTotalBufferedDuration()
    Returns an estimate of the total buffered duration from the current position, in milliseconds. - This includes pre-buffered data for subsequent ads and windows.
    + This includes pre-buffered data for subsequent ads and media items.
    Specified by:
    getTotalBufferedDuration in interface Player
    @@ -2612,13 +2820,28 @@ public 
  • isCurrentWindowDynamic

    -
    public boolean isCurrentWindowDynamic()
    -
    -
    Returns whether the current window is dynamic, or false if the Timeline is - empty.
    +
    @Deprecated
    +public boolean isCurrentWindowDynamic()
    +
    Deprecated.
    Specified by:
    isCurrentWindowDynamic in interface Player
    +
    +
  • + + + + + + + + + + + + + @@ -3052,7 +3306,7 @@ public 
  • getDeviceInfo

    -
    public DeviceInfo getDeviceInfo()
    +
    public DeviceInfo getDeviceInfo()
    Description copied from interface: Player
    Gets the device information.
    @@ -3071,12 +3325,12 @@ public Description copied from interface: Player
    Gets the current volume of the device. -

    For devices with local playback, the volume returned +

    For devices with local playback, the volume returned by this method varies according to the current stream type. The stream type is determined by AudioAttributes.usage which can be converted to stream type with - Util.getStreamTypeForAudioUsage(int). + Util.getStreamTypeForAudioUsage(int). -

    For devices with remote playback, the volume of the +

    For devices with remote playback, the volume of the remote device is returned.

    Specified by:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.AdsConfiguration.Builder.html similarity index 60% rename from docs/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.html rename to docs/doc/reference/com/google/android/exoplayer2/MediaItem.AdsConfiguration.Builder.html index 13079461d9..d71987cbca 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSinkFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.AdsConfiguration.Builder.html @@ -2,36 +2,36 @@ -CacheDataSinkFactory (ExoPlayer library) +MediaItem.AdsConfiguration.Builder (ExoPlayer library) - - - - - + + + + + - - + +
  • @@ -255,6 +291,16 @@ public final  + + + @@ -333,7 +379,7 @@ public final 
  • Summary: 
  • -
  • Nested | 
  • +
  • Nested | 
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Builder.html index 7a637f2164..2cc26876fd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Builder.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":10,"i1":10,"i2":42,"i3":42,"i4":42,"i5":42,"i6":10,"i7":42,"i8":42,"i9":42,"i10":42,"i11":10,"i12":10,"i13":42,"i14":42,"i15":42,"i16":42,"i17":42,"i18":42,"i19":42,"i20":42,"i21":42,"i22":42,"i23":10,"i24":42,"i25":42,"i26":42,"i27":42,"i28":42,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":42,"i35":10,"i36":10,"i37":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -173,7 +173,7 @@ extends

    Method Summary

    - + @@ -188,203 +188,273 @@ extends - + - + - + - + - + - + - + - + + + + + + + + + + + - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - +
    Deprecated.
    All Methods Instance Methods Concrete Methods All Methods Instance Methods Concrete Methods Deprecated Methods 
    Modifier and Type Method
    MediaItem.BuildersetAdTagUri​(Uri adTagUri)setAdsConfiguration​(MediaItem.AdsConfiguration adsConfiguration) -
    Sets the optional ad tag Uri.
    +
    Sets the optional MediaItem.AdsConfiguration.
    MediaItem.BuildersetAdTagUri​(Uri adTagUri, - Object adsId)setAdTagUri​(Uri adTagUri) -
    Sets the optional ad tag Uri and ads identifier.
    +
    Deprecated. +
    Use setAdsConfiguration(AdsConfiguration) and pass the adTagUri + to Builder(Uri) instead.
    +
    MediaItem.BuildersetAdTagUri​(String adTagUri)setAdTagUri​(Uri adTagUri, + Object adsId) -
    Sets the optional ad tag Uri.
    +
    Deprecated. + +
    MediaItem.BuildersetClipEndPositionMs​(long endPositionMs)setAdTagUri​(String adTagUri) -
    Sets the optional end position in milliseconds which must be a value larger than or equal to - zero, or C.TIME_END_OF_SOURCE to end when playback reaches the end of media (Default: - C.TIME_END_OF_SOURCE).
    +
    Deprecated. +
    Use setAdsConfiguration(AdsConfiguration), parse the adTagUri + with Uri.parse(String) and pass the result to Builder(Uri) instead.
    +
    MediaItem.BuildersetClipRelativeToDefaultPosition​(boolean relativeToDefaultPosition)setClipEndPositionMs​(long endPositionMs) -
    Sets whether the start position and the end position are relative to the default position in - the window (Default: false).
    +
    MediaItem.BuildersetClipRelativeToLiveWindow​(boolean relativeToLiveWindow)setClippingConfiguration​(MediaItem.ClippingConfiguration clippingConfiguration) -
    Sets whether the start/end positions should move with the live window for live streams.
    +
    MediaItem.BuildersetClipStartPositionMs​(long startPositionMs)setClipRelativeToDefaultPosition​(boolean relativeToDefaultPosition) -
    Sets the optional start position in milliseconds which must be a value larger than or equal - to zero (Default: 0).
    +
    MediaItem.BuildersetClipStartsAtKeyFrame​(boolean startsAtKeyFrame)setClipRelativeToLiveWindow​(boolean relativeToLiveWindow) -
    Sets whether the start point is guaranteed to be a key frame.
    +
    MediaItem.BuildersetClipStartPositionMs​(long startPositionMs) + +
    MediaItem.BuildersetClipStartsAtKeyFrame​(boolean startsAtKeyFrame) + +
    MediaItem.Builder setCustomCacheKey​(String customCacheKey)
    Sets the optional custom cache key (only used for progressive streams).
    MediaItem.BuildersetDrmForceDefaultLicenseUri​(boolean forceDefaultLicenseUri) -
    Sets whether to force use the default DRM license server URI even if the media specifies its - own DRM license server URI.
    -
    MediaItem.BuildersetDrmKeySetId​(byte[] keySetId) -
    Sets the key set ID of the offline license.
    -
    MediaItem.BuildersetDrmLicenseRequestHeaders​(Map<String,​String> licenseRequestHeaders)setDrmConfiguration​(MediaItem.DrmConfiguration drmConfiguration) -
    Sets the optional request headers attached to the DRM license request.
    +
    Sets the optional DRM configuration.
    MediaItem.BuildersetDrmLicenseUri​(Uri licenseUri)setDrmForceDefaultLicenseUri​(boolean forceDefaultLicenseUri) -
    Sets the optional default DRM license server URI.
    +
    MediaItem.BuildersetDrmLicenseUri​(String licenseUri)setDrmKeySetId​(byte[] keySetId) -
    Sets the optional default DRM license server URI.
    +
    MediaItem.BuildersetDrmMultiSession​(boolean multiSession)setDrmLicenseRequestHeaders​(Map<String,​String> licenseRequestHeaders) -
    Sets whether the DRM configuration is multi session enabled.
    +
    MediaItem.BuildersetDrmPlayClearContentWithoutKey​(boolean playClearContentWithoutKey)setDrmLicenseUri​(Uri licenseUri) -
    Sets whether clear samples within protected content should be played when keys for the - encrypted part of the content have yet to be loaded.
    +
    MediaItem.BuildersetDrmSessionForClearPeriods​(boolean sessionForClearPeriods)setDrmLicenseUri​(String licenseUri) -
    Sets whether a DRM session should be used for clear tracks of type C.TRACK_TYPE_VIDEO - and C.TRACK_TYPE_AUDIO.
    +
    MediaItem.BuildersetDrmSessionForClearTypes​(List<Integer> sessionForClearTypes)setDrmMultiSession​(boolean multiSession) -
    Sets a list of C.TRACK_TYPE_* constants for which to use a DRM session even - when the tracks are in the clear.
    +
    MediaItem.BuildersetDrmUuid​(UUID uuid)setDrmPlayClearContentWithoutKey​(boolean playClearContentWithoutKey) -
    Sets the UUID of the protection scheme.
    +
    MediaItem.BuildersetLiveMaxOffsetMs​(long liveMaxOffsetMs)setDrmSessionForClearPeriods​(boolean sessionForClearPeriods) -
    Sets the optional maximum offset from the live edge for live streams, in milliseconds.
    +
    MediaItem.BuildersetLiveMaxPlaybackSpeed​(float maxPlaybackSpeed)setDrmSessionForClearTypes​(List<@TrackType Integer> sessionForClearTypes) -
    Sets the optional maximum playback speed for live stream speed adjustment.
    +
    MediaItem.BuildersetLiveMinOffsetMs​(long liveMinOffsetMs)setDrmUuid​(UUID uuid) -
    Sets the optional minimum offset from the live edge for live streams, in milliseconds.
    +
    Deprecated. +
    Use setDrmConfiguration(DrmConfiguration) and pass the uuid to + Builder(UUID) instead.
    +
    MediaItem.BuildersetLiveMinPlaybackSpeed​(float minPlaybackSpeed)setLiveConfiguration​(MediaItem.LiveConfiguration liveConfiguration) -
    Sets the optional minimum playback speed for live stream speed adjustment.
    +
    MediaItem.BuildersetLiveTargetOffsetMs​(long liveTargetOffsetMs)setLiveMaxOffsetMs​(long liveMaxOffsetMs) -
    Sets the optional target offset from the live edge for live streams, in milliseconds.
    +
    MediaItem.BuildersetLiveMaxPlaybackSpeed​(float maxPlaybackSpeed) + +
    MediaItem.BuildersetLiveMinOffsetMs​(long liveMinOffsetMs) + +
    MediaItem.BuildersetLiveMinPlaybackSpeed​(float minPlaybackSpeed) + +
    MediaItem.BuildersetLiveTargetOffsetMs​(long liveTargetOffsetMs) + +
    MediaItem.Builder setMediaId​(String mediaId)
    Sets the optional media ID which identifies the media item.
    MediaItem.Builder setMediaMetadata​(MediaMetadata mediaMetadata)
    Sets the media metadata.
    MediaItem.Builder setMimeType​(String mimeType)
    Sets the optional MIME type.
    MediaItem.Builder setStreamKeys​(List<StreamKey> streamKeys) @@ -392,28 +462,37 @@ extends
    MediaItem.BuildersetSubtitles​(List<MediaItem.Subtitle> subtitles)setSubtitleConfigurations​(List<MediaItem.SubtitleConfiguration> subtitleConfigurations)
    Sets the optional subtitles.
    MediaItem.BuildersetSubtitles​(List<MediaItem.Subtitle> subtitles) +
    Deprecated. + +
    +
    MediaItem.Builder setTag​(Object tag)
    Sets the optional tag for custom attributes.
    MediaItem.Builder setUri​(Uri uri)
    Sets the optional URI.
    MediaItem.Builder setUri​(String uri) @@ -486,8 +565,8 @@ extends String uri)
    Sets the optional URI. -

    If uri is null or unset then no MediaItem.PlaybackProperties object is created - during build() and no other Builder methods that would populate MediaItem.playbackProperties should be called.

    +

    If uri is null or unset then no MediaItem.LocalConfiguration object is created + during build() and no other Builder methods that would populate MediaItem.localConfiguration should be called. @@ -500,8 +579,8 @@ extends Uri uri)

    Sets the optional URI. -

    If uri is null or unset then no MediaItem.PlaybackProperties object is created - during build() and no other Builder methods that would populate MediaItem.playbackProperties should be called.

    +

    If uri is null or unset then no MediaItem.LocalConfiguration object is created + during build() and no other Builder methods that would populate MediaItem.localConfiguration should be called. @@ -523,15 +602,28 @@ extends + + + +

    @@ -540,10 +632,11 @@ extends
  • setClipEndPositionMs

    -
    public MediaItem.Builder setClipEndPositionMs​(long endPositionMs)
    -
    Sets the optional end position in milliseconds which must be a value larger than or equal to - zero, or C.TIME_END_OF_SOURCE to end when playback reaches the end of media (Default: - C.TIME_END_OF_SOURCE).
    +
    @Deprecated
    +public MediaItem.Builder setClipEndPositionMs​(long endPositionMs)
    +
  • @@ -552,10 +645,11 @@ extends
  • setClipRelativeToLiveWindow

    -
    public MediaItem.Builder setClipRelativeToLiveWindow​(boolean relativeToLiveWindow)
    -
    Sets whether the start/end positions should move with the live window for live streams. If - false, live streams end when playback reaches the end position in live window seen - when the media is first loaded (Default: false).
    +
    @Deprecated
    +public MediaItem.Builder setClipRelativeToLiveWindow​(boolean relativeToLiveWindow)
    +
  • @@ -564,9 +658,11 @@ extends
  • setClipRelativeToDefaultPosition

    -
    public MediaItem.Builder setClipRelativeToDefaultPosition​(boolean relativeToDefaultPosition)
    -
    Sets whether the start position and the end position are relative to the default position in - the window (Default: false).
    +
    @Deprecated
    +public MediaItem.Builder setClipRelativeToDefaultPosition​(boolean relativeToDefaultPosition)
    +
  • @@ -575,9 +671,22 @@ extends
  • setClipStartsAtKeyFrame

    -
    public MediaItem.Builder setClipStartsAtKeyFrame​(boolean startsAtKeyFrame)
    -
    Sets whether the start point is guaranteed to be a key frame. If false, the playback - transition into the clip may not be seamless (Default: false).
    +
    @Deprecated
    +public MediaItem.Builder setClipStartsAtKeyFrame​(boolean startsAtKeyFrame)
    + +
  • + + + + + @@ -586,12 +695,12 @@ extends
  • setDrmLicenseUri

    -
    public MediaItem.Builder setDrmLicenseUri​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setDrmLicenseUri​(@Nullable
                                               Uri licenseUri)
    -
    Sets the optional default DRM license server URI. If this URI is set, the MediaItem.DrmConfiguration.uuid needs to be specified as well. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
  • @@ -600,12 +709,12 @@ extends
  • setDrmLicenseUri

    -
    public MediaItem.Builder setDrmLicenseUri​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setDrmLicenseUri​(@Nullable
                                               String licenseUri)
    -
    Sets the optional default DRM license server URI. If this URI is set, the MediaItem.DrmConfiguration.uuid needs to be specified as well. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
  • @@ -614,14 +723,13 @@ extends
  • setDrmLicenseRequestHeaders

    -
    public MediaItem.Builder setDrmLicenseRequestHeaders​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setDrmLicenseRequestHeaders​(@Nullable
                                                          Map<String,​String> licenseRequestHeaders)
    -
    Sets the optional request headers attached to the DRM license request. - -

    null or an empty Map can be used for a reset. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
  • @@ -630,14 +738,13 @@ extends
  • setDrmUuid

    -
    public MediaItem.Builder setDrmUuid​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setDrmUuid​(@Nullable
                                         UUID uuid)
    -
    Sets the UUID of the protection scheme. - -

    If uuid is null or unset then no MediaItem.DrmConfiguration object is created during - build() and no other Builder methods that would populate MediaItem.PlaybackProperties.drmConfiguration should be called. - -

    This method should only be called if setUri(java.lang.String) is passed a non-null value.

    +
    Deprecated. +
    Use setDrmConfiguration(DrmConfiguration) and pass the uuid to + Builder(UUID) instead.
    +
  • @@ -646,11 +753,11 @@ extends
  • setDrmMultiSession

    -
    public MediaItem.Builder setDrmMultiSession​(boolean multiSession)
    -
    Sets whether the DRM configuration is multi session enabled. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
    @Deprecated
    +public MediaItem.Builder setDrmMultiSession​(boolean multiSession)
    +
  • @@ -659,12 +766,11 @@ extends
  • setDrmForceDefaultLicenseUri

    -
    public MediaItem.Builder setDrmForceDefaultLicenseUri​(boolean forceDefaultLicenseUri)
    -
    Sets whether to force use the default DRM license server URI even if the media specifies its - own DRM license server URI. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
    @Deprecated
    +public MediaItem.Builder setDrmForceDefaultLicenseUri​(boolean forceDefaultLicenseUri)
    +
  • @@ -673,12 +779,11 @@ extends
  • setDrmPlayClearContentWithoutKey

    -
    public MediaItem.Builder setDrmPlayClearContentWithoutKey​(boolean playClearContentWithoutKey)
    -
    Sets whether clear samples within protected content should be played when keys for the - encrypted part of the content have yet to be loaded. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
    @Deprecated
    +public MediaItem.Builder setDrmPlayClearContentWithoutKey​(boolean playClearContentWithoutKey)
    +
  • @@ -687,14 +792,11 @@ extends
  • setDrmSessionForClearPeriods

    -
    public MediaItem.Builder setDrmSessionForClearPeriods​(boolean sessionForClearPeriods)
    -
    Sets whether a DRM session should be used for clear tracks of type C.TRACK_TYPE_VIDEO - and C.TRACK_TYPE_AUDIO. - -

    This method overrides what has been set by previously calling setDrmSessionForClearTypes(List). - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
    @Deprecated
    +public MediaItem.Builder setDrmSessionForClearPeriods​(boolean sessionForClearPeriods)
    +
  • @@ -703,19 +805,13 @@ extends
  • setDrmSessionForClearTypes

    -
    public MediaItem.Builder setDrmSessionForClearTypes​(@Nullable
    -                                                    List<Integer> sessionForClearTypes)
    -
    Sets a list of C.TRACK_TYPE_* constants for which to use a DRM session even - when the tracks are in the clear. - -

    For the common case of using a DRM session for C.TRACK_TYPE_VIDEO and C.TRACK_TYPE_AUDIO the setDrmSessionForClearPeriods(boolean) can be used. - -

    This method overrides what has been set by previously calling setDrmSessionForClearPeriods(boolean). - -

    null or an empty List can be used for a reset. - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
    @Deprecated
    +public MediaItem.Builder setDrmSessionForClearTypes​(@Nullable
    +                                                    List<@TrackType Integer> sessionForClearTypes)
    +
  • @@ -724,16 +820,12 @@ extends
  • setDrmKeySetId

    -
    public MediaItem.Builder setDrmKeySetId​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setDrmKeySetId​(@Nullable
                                             byte[] keySetId)
    -
    Sets the key set ID of the offline license. - -

    The key set ID identifies an offline license. The ID is required to query, renew or - release an existing offline license (see DefaultDrmSessionManager#setMode(int - mode,byte[] offlineLicenseKeySetId)). - -

    This method should only be called if both setUri(java.lang.String) and setDrmUuid(UUID) - are passed non-null values.

    +
  • @@ -750,7 +842,7 @@ extends null or an empty List can be used for a reset.

    If setUri(java.lang.String) is passed a non-null uri, the stream keys are used to create a - MediaItem.PlaybackProperties object. Otherwise they will be ignored. + MediaItem.LocalConfiguration object. Otherwise they will be ignored. @@ -772,11 +864,36 @@ extends

  • setSubtitles

    -
    public MediaItem.Builder setSubtitles​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setSubtitles​(@Nullable
                                           List<MediaItem.Subtitle> subtitles)
    +
    Deprecated. +
    Use setSubtitleConfigurations(List) instead. Note that setSubtitleConfigurations(List) doesn't accept null, use an empty list to clear the + contents.
    +
    +
  • + + + + + + + + + @@ -808,19 +919,13 @@ extends
  • setAdTagUri

    -
    public MediaItem.Builder setAdTagUri​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setAdTagUri​(@Nullable
                                          Uri adTagUri)
    -
    Sets the optional ad tag Uri. - -

    Media items in the playlist with the same ad tag URI, media ID and ads loader will share - the same ad playback state. To resume ad playback when recreating the playlist on returning - from the background, pass media items with the same ad tag URIs and media IDs to the player. - -

    This method should only be called if setUri(java.lang.String) is passed a non-null value.

    -
    -
    Parameters:
    -
    adTagUri - The ad tag URI to load.
    -
    +
    Deprecated. +
    Use setAdsConfiguration(AdsConfiguration) and pass the adTagUri + to Builder(Uri) instead.
    +
  • @@ -829,25 +934,25 @@ extends
  • setAdTagUri

    -
    public MediaItem.Builder setAdTagUri​(@Nullable
    +
    @Deprecated
    +public MediaItem.Builder setAdTagUri​(@Nullable
                                          Uri adTagUri,
                                          @Nullable
                                          Object adsId)
    -
    Sets the optional ad tag Uri and ads identifier. - -

    Media items in the playlist that have the same ads identifier and ads loader share the - same ad playback state. To resume ad playback when recreating the playlist on returning from - the background, pass the same ads IDs to the player. - -

    This method should only be called if setUri(java.lang.String) is passed a non-null value.

    -
    -
    Parameters:
    -
    adTagUri - The ad tag URI to load.
    -
    adsId - An opaque identifier for ad playback state associated with this item. Ad loading - and playback state is shared among all media items that have the same ads ID (by equality) and ads loader, so it is important to pass the same - identifiers when constructing playlist items each time the player returns to the - foreground.
    -
    +
    Deprecated. + +
    +
  • + + + + + @@ -856,15 +961,11 @@ extends
  • setLiveTargetOffsetMs

    -
    public MediaItem.Builder setLiveTargetOffsetMs​(long liveTargetOffsetMs)
    -
    Sets the optional target offset from the live edge for live streams, in milliseconds. - -

    See Player#getCurrentLiveOffset().

    -
    -
    Parameters:
    -
    liveTargetOffsetMs - The target offset, in milliseconds, or C.TIME_UNSET to use - the media-defined default.
    -
    +
    @Deprecated
    +public MediaItem.Builder setLiveTargetOffsetMs​(long liveTargetOffsetMs)
    +
  • @@ -873,15 +974,11 @@ extends
  • setLiveMinOffsetMs

    -
    public MediaItem.Builder setLiveMinOffsetMs​(long liveMinOffsetMs)
    -
    Sets the optional minimum offset from the live edge for live streams, in milliseconds. - -

    See Player#getCurrentLiveOffset().

    -
    -
    Parameters:
    -
    liveMinOffsetMs - The minimum allowed offset, in milliseconds, or C.TIME_UNSET - to use the media-defined default.
    -
    +
    @Deprecated
    +public MediaItem.Builder setLiveMinOffsetMs​(long liveMinOffsetMs)
    +
  • @@ -890,15 +987,11 @@ extends
  • setLiveMaxOffsetMs

    -
    public MediaItem.Builder setLiveMaxOffsetMs​(long liveMaxOffsetMs)
    -
    Sets the optional maximum offset from the live edge for live streams, in milliseconds. - -

    See Player#getCurrentLiveOffset().

    -
    -
    Parameters:
    -
    liveMaxOffsetMs - The maximum allowed offset, in milliseconds, or C.TIME_UNSET - to use the media-defined default.
    -
    +
    @Deprecated
    +public MediaItem.Builder setLiveMaxOffsetMs​(long liveMaxOffsetMs)
    +
  • @@ -907,15 +1000,11 @@ extends
  • setLiveMinPlaybackSpeed

    -
    public MediaItem.Builder setLiveMinPlaybackSpeed​(float minPlaybackSpeed)
    -
    Sets the optional minimum playback speed for live stream speed adjustment. - -

    This value is ignored for other stream types.

    -
    -
    Parameters:
    -
    minPlaybackSpeed - The minimum factor by which playback can be sped up for live streams, - or C.RATE_UNSET to use the media-defined default.
    -
    +
    @Deprecated
    +public MediaItem.Builder setLiveMinPlaybackSpeed​(float minPlaybackSpeed)
    +
  • @@ -924,15 +1013,11 @@ extends
  • setLiveMaxPlaybackSpeed

    -
    public MediaItem.Builder setLiveMaxPlaybackSpeed​(float maxPlaybackSpeed)
    -
    Sets the optional maximum playback speed for live stream speed adjustment. - -

    This value is ignored for other stream types.

    -
    -
    Parameters:
    -
    maxPlaybackSpeed - The maximum factor by which playback can be sped up for live streams, - or C.RATE_UNSET to use the media-defined default.
    -
    +
    @Deprecated
    +public MediaItem.Builder setLiveMaxPlaybackSpeed​(float maxPlaybackSpeed)
    +
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.Builder.html new file mode 100644 index 0000000000..09e7bc2dc1 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.Builder.html @@ -0,0 +1,434 @@ + + + + +MediaItem.ClippingConfiguration.Builder (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class MediaItem.ClippingConfiguration.Builder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Builder

          +
          public Builder()
          +
          Constructs an instance.
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setStartPositionMs

          +
          public MediaItem.ClippingConfiguration.Builder setStartPositionMs​(@IntRange(from=0L)
          +                                                                  long startPositionMs)
          +
          Sets the optional start position in milliseconds which must be a value larger than or equal + to zero (Default: 0).
          +
        • +
        + + + + + + + +
          +
        • +

          setRelativeToLiveWindow

          +
          public MediaItem.ClippingConfiguration.Builder setRelativeToLiveWindow​(boolean relativeToLiveWindow)
          +
          Sets whether the start/end positions should move with the live window for live streams. If + false, live streams end when playback reaches the end position in live window seen + when the media is first loaded (Default: false).
          +
        • +
        + + + +
          +
        • +

          setRelativeToDefaultPosition

          +
          public MediaItem.ClippingConfiguration.Builder setRelativeToDefaultPosition​(boolean relativeToDefaultPosition)
          +
          Sets whether the start position and the end position are relative to the default position + in the window (Default: false).
          +
        • +
        + + + +
          +
        • +

          setStartsAtKeyFrame

          +
          public MediaItem.ClippingConfiguration.Builder setStartsAtKeyFrame​(boolean startsAtKeyFrame)
          +
          Sets whether the start point is guaranteed to be a key frame. If false, the + playback transition into the clip may not be seamless (Default: false).
          +
        • +
        + + + + + + + + +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.html new file mode 100644 index 0000000000..b58cccb864 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingConfiguration.html @@ -0,0 +1,521 @@ + + + + +MediaItem.ClippingConfiguration (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class MediaItem.ClippingConfiguration

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingProperties.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingProperties.html index 4fe4df1dcc..b619bd05a7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingProperties.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.ClippingProperties.html @@ -25,12 +25,6 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; -var altColor = "altColor"; -var rowColor = "rowColor"; -var tableTab = "tableTab"; -var activeTableTab = "activeTableTab"; var pathtoroot = "../../../../"; var useModuleDirectories = false; loadScripts(document, 'script'); @@ -95,7 +89,7 @@ loadScripts(document, 'script');
  • Detail: 
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • @@ -121,10 +115,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.lang.Object
  • +
  • +
    @@ -155,6 +156,13 @@ implements +
  • + + +

    Nested classes/interfaces inherited from class com.google.android.exoplayer2.MediaItem.ClippingConfiguration

    +MediaItem.ClippingConfiguration.Builder
  • + +
    static Bundleable.Creator<MediaItem.ClippingProperties>CREATORstatic MediaItem.ClippingPropertiesUNSET -
    Object that can restore MediaItem.ClippingProperties from a Bundle.
    -
    longendPositionMs -
    The end position in milliseconds.
    -
    booleanrelativeToDefaultPosition -
    Whether startPositionMs and endPositionMs are relative to the default - position.
    -
    booleanrelativeToLiveWindow -
    Whether the clipping of active media periods moves with a live window.
    -
    longstartPositionMs -
    The start position in milliseconds.
    -
    booleanstartsAtKeyFrame -
    Sets whether the start point is guaranteed to be a key frame.
    -
    + @@ -232,31 +211,13 @@ implements -All Methods Instance Methods Concrete Methods  - -Modifier and Type -Method -Description - - -boolean -equals​(Object obj) -  - - -int -hashCode() -  - - -Bundle -toBundle() - -
    Returns a Bundle representing the information stored in this object.
    - - - +
    • @@ -280,118 +241,14 @@ implements - - -
        -
      • -

        startPositionMs

        -
        public final long startPositionMs
        -
        The start position in milliseconds. This is a value larger than or equal to zero.
        -
      • -
      - - - -
        -
      • -

        endPositionMs

        -
        public final long endPositionMs
        -
        The end position in milliseconds. This is a value larger than or equal to zero or C.TIME_END_OF_SOURCE to play to the end of the stream.
        -
      • -
      - - - -
        -
      • -

        relativeToLiveWindow

        -
        public final boolean relativeToLiveWindow
        -
        Whether the clipping of active media periods moves with a live window. If false, - playback ends when it reaches endPositionMs.
        -
      • -
      - - - -
        -
      • -

        relativeToDefaultPosition

        -
        public final boolean relativeToDefaultPosition
        -
        Whether startPositionMs and endPositionMs are relative to the default - position.
        -
      • -
      - - - -
        -
      • -

        startsAtKeyFrame

        -
        public final boolean startsAtKeyFrame
        -
        Sets whether the start point is guaranteed to be a key frame.
        -
      • -
      - + -
    • -
    - - -
    - diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.Builder.html new file mode 100644 index 0000000000..b8bc49adea --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.Builder.html @@ -0,0 +1,503 @@ + + + + +MediaItem.DrmConfiguration.Builder (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class MediaItem.DrmConfiguration.Builder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.html index 962e8326a7..b92180a011 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.DrmConfiguration.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -86,7 +86,7 @@ loadScripts(document, 'script');
    @@ -121,10 +115,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.lang.Object
  • +
  • +
    • @@ -133,9 +132,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      MediaItem

    -
    public static final class MediaItem.PlaybackProperties
    -extends Object
    -
    Properties for local playback.
    +
    @Deprecated
    +public static final class MediaItem.PlaybackProperties
    +extends MediaItem.LocalConfiguration
    +
    Deprecated. + +
    @@ -149,70 +151,13 @@ extends

    Field Summary

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Fields 
    Modifier and TypeFieldDescription
    MediaItem.AdsConfigurationadsConfiguration -
    Optional ads configuration.
    -
    StringcustomCacheKey -
    Optional custom cache key (only used for progressive streams).
    -
    MediaItem.DrmConfigurationdrmConfiguration -
    Optional MediaItem.DrmConfiguration for the media.
    -
    StringmimeType -
    The optional MIME type of the item, or null if unspecified.
    -
    List<StreamKey>streamKeys -
    Optional stream keys by which the manifest is filtered.
    -
    List<MediaItem.Subtitle>subtitles -
    Optional subtitles to be sideloaded.
    -
    Objecttag -
    Optional tag for custom attributes.
    -
    Uriuri -
    The Uri.
    -
    + @@ -223,24 +168,13 @@ extends

    Method Summary

    - - - - - - - - - - - - - - - - - -
    All Methods Instance Methods Concrete Methods 
    Modifier and TypeMethodDescription
    booleanequals​(Object obj) 
    inthashCode() 
    + -
    -
      -
    • - -
      -
        -
      • - - -

        Field Detail

        - - - -
          -
        • -

          uri

          -
          public final Uri uri
          -
          The Uri.
          -
        • -
        - - - -
          -
        • -

          mimeType

          -
          @Nullable
          -public final String mimeType
          -
          The optional MIME type of the item, or null if unspecified. - -

          The MIME type can be used to disambiguate media items that have a URI which does not allow - to infer the actual media type.

          -
        • -
        - - - - - - - - - - - -
          -
        • -

          streamKeys

          -
          public final List<StreamKey> streamKeys
          -
          Optional stream keys by which the manifest is filtered.
          -
        • -
        - - - -
          -
        • -

          customCacheKey

          -
          @Nullable
          -public final String customCacheKey
          -
          Optional custom cache key (only used for progressive streams).
          -
        • -
        - - - - - - - -
          -
        • -

          tag

          -
          @Nullable
          -public final Object tag
          -
          Optional tag for custom attributes. The tag for the media source which will be published in - the com.google.android.exoplayer2.Timeline of the source as - com.google.android.exoplayer2.Timeline.Window#tag.
          -
        • -
        -
      • -
      -
      - -
      -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          equals

          -
          public boolean equals​(@Nullable
          -                      Object obj)
          -
          -
          Overrides:
          -
          equals in class Object
          -
          -
        • -
        - - - -
          -
        • -

          hashCode

          -
          public int hashCode()
          -
          -
          Overrides:
          -
          hashCode in class Object
          -
          -
        • -
        -
      • -
      -
      -
    • -
    -
    @@ -449,9 +240,9 @@ public final 
  • Detail: 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • -
  • Method
  • +
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Subtitle.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Subtitle.html index 6f9c93e6b6..22d9d9bfcf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Subtitle.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.Subtitle.html @@ -25,12 +25,6 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; -var altColor = "altColor"; -var rowColor = "rowColor"; -var tableTab = "tableTab"; -var activeTableTab = "activeTableTab"; var pathtoroot = "../../../../"; var useModuleDirectories = false; loadScripts(document, 'script'); @@ -86,16 +80,16 @@ loadScripts(document, 'script');
    @@ -121,10 +115,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • java.lang.Object
  • +
  • +
    • @@ -133,15 +132,35 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      MediaItem

    -
    public static final class MediaItem.Subtitle
    -extends Object
    -
    Properties for a text track.
    +
    @Deprecated
    +public static final class MediaItem.Subtitle
    +extends MediaItem.SubtitleConfiguration
    +
    Deprecated. + +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.Builder.html new file mode 100644 index 0000000000..b3385dc9c7 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.Builder.html @@ -0,0 +1,423 @@ + + + + +MediaItem.SubtitleConfiguration.Builder (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class MediaItem.SubtitleConfiguration.Builder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.html new file mode 100644 index 0000000000..646cfb4fc5 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.SubtitleConfiguration.html @@ -0,0 +1,471 @@ + + + + +MediaItem.SubtitleConfiguration (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class MediaItem.SubtitleConfiguration

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Direct Known Subclasses:
      +
      MediaItem.Subtitle
      +
      +
      +
      Enclosing class:
      +
      MediaItem
      +
      +
      +
      public static class MediaItem.SubtitleConfiguration
      +extends Object
      +
      Properties for a text track.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          uri

          +
          public final Uri uri
          +
          The Uri to the subtitle file.
          +
        • +
        + + + +
          +
        • +

          mimeType

          +
          @Nullable
          +public final String mimeType
          +
          The optional MIME type of the subtitle file, or null if unspecified.
          +
        • +
        + + + +
          +
        • +

          language

          +
          @Nullable
          +public final String language
          +
          The language.
          +
        • +
        + + + +
          +
        • +

          selectionFlags

          +
          @SelectionFlags
          +public final @com.google.android.exoplayer2.C.SelectionFlags int selectionFlags
          +
          The selection flags.
          +
        • +
        + + + +
          +
        • +

          roleFlags

          +
          @RoleFlags
          +public final @com.google.android.exoplayer2.C.RoleFlags int roleFlags
          +
          The role flags.
          +
        • +
        + + + +
          +
        • +

          label

          +
          @Nullable
          +public final String label
          +
          The label.
          +
        • +
        +
      • +
      +
      + +
      + +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html index 9e476679f9..6286401732 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaItem.html @@ -173,36 +173,63 @@ implements static class  -MediaItem.ClippingProperties +MediaItem.ClippingConfiguration
    Optionally clips the media item to a custom start and end position.
    static class  +MediaItem.ClippingProperties + +
    Deprecated. + +
    + + + +static class  MediaItem.DrmConfiguration
    DRM configuration for a media item.
    - + static class  MediaItem.LiveConfiguration
    Live playback configuration.
    + +static class  +MediaItem.LocalConfiguration + +
    Properties for local playback.
    + + static class  MediaItem.PlaybackProperties -
    Properties for local playback.
    +
    Deprecated. + +
    static class  MediaItem.Subtitle +
    Deprecated. + +
    + + + +static class  +MediaItem.SubtitleConfiguration +
    Properties for a text track.
    @@ -232,40 +259,56 @@ implements Description -MediaItem.ClippingProperties -clippingProperties +MediaItem.ClippingConfiguration +clippingConfiguration
    The clipping properties.
    +MediaItem.ClippingProperties +clippingProperties + +
    Deprecated. + +
    + + + static Bundleable.Creator<MediaItem> CREATOR
    Object that can restore MediaItem from a Bundle.
    - + static String DEFAULT_MEDIA_ID
    The default media ID that is used if the media ID is not explicitly set by MediaItem.Builder.setMediaId(String).
    - + static MediaItem EMPTY
    Empty MediaItem.
    - + MediaItem.LiveConfiguration liveConfiguration
    The live playback configuration.
    + +MediaItem.LocalConfiguration +localConfiguration + +
    Optional configuration for local playback.
    + + String mediaId @@ -284,7 +327,9 @@ implements MediaItem.PlaybackProperties playbackProperties -
    Optional playback properties.
    +
    Deprecated. +
    Use localConfiguration instead.
    +
    @@ -401,15 +446,30 @@ implements Identifies the media item. + + + +
      +
    • +

      localConfiguration

      +
      @Nullable
      +public final MediaItem.LocalConfiguration localConfiguration
      +
      Optional configuration for local playback. May be null if shared over process + boundaries.
      +
    • +
    @@ -432,14 +492,27 @@ public final The media metadata. + + + + @@ -451,7 +524,7 @@ public final Bundleable.Creator<MediaItem> CREATOR
    Object that can restore MediaItem from a Bundle. -

    The playbackProperties of a restored instance will always be null.

    +

    The localConfiguration of a restored instance will always be null. @@ -542,7 +615,7 @@ public final public Bundle toBundle()

    Returns a Bundle representing the information stored in this object. -

    It omits the playbackProperties field. The playbackProperties of an +

    It omits the localConfiguration field. The localConfiguration of an instance restored by CREATOR will always be null.

    Specified by:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html index cceffedcbf..764cb28e27 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.Builder.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":42,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":42}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":42}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -186,8 +186,8 @@ extends MediaMetadata.Builder -maybeSetArtworkData​(byte[] artworkData, - int artworkDataType) +maybeSetArtworkData​(byte[] artworkData, + @com.google.android.exoplayer2.MediaMetadata.PictureType int artworkDataType)
    Sets the artwork data as a compressed byte array in the event that the associated MediaMetadata.PictureType is MediaMetadata.PICTURE_TYPE_FRONT_COVER, the existing MediaMetadata.PictureType is not MediaMetadata.PICTURE_TYPE_FRONT_COVER, or the current artworkData is not set.
    @@ -195,239 +195,246 @@ extends MediaMetadata.Builder +populate​(MediaMetadata mediaMetadata) + +
    Populates all the fields from mediaMetadata, provided they are non-null.
    + + + +MediaMetadata.Builder populateFromMetadata​(Metadata metadata)
    Sets all fields supported by the entries within the Metadata.
    - + MediaMetadata.Builder populateFromMetadata​(List<Metadata> metadataList)
    Sets all fields supported by the entries within the list of Metadata.
    - + MediaMetadata.Builder setAlbumArtist​(CharSequence albumArtist)
    Sets the album artist.
    - + MediaMetadata.Builder setAlbumTitle​(CharSequence albumTitle)
    Sets the album title.
    - + MediaMetadata.Builder setArtist​(CharSequence artist)
    Sets the artist.
    - + MediaMetadata.Builder setArtworkData​(byte[] artworkData) - + MediaMetadata.Builder setArtworkData​(byte[] artworkData, - Integer artworkDataType) + @PictureType Integer artworkDataType)
    Sets the artwork data as a compressed byte array with an associated artworkDataType.
    - + MediaMetadata.Builder setArtworkUri​(Uri artworkUri)
    Sets the artwork Uri.
    - + MediaMetadata.Builder setCompilation​(CharSequence compilation)
    Sets the compilation.
    - + MediaMetadata.Builder setComposer​(CharSequence composer)
    Sets the composer.
    - + MediaMetadata.Builder setConductor​(CharSequence conductor)
    Sets the conductor.
    - + MediaMetadata.Builder setDescription​(CharSequence description)
    Sets the description.
    - + MediaMetadata.Builder setDiscNumber​(Integer discNumber)
    Sets the disc number.
    - + MediaMetadata.Builder setDisplayTitle​(CharSequence displayTitle)
    Sets the display title.
    - + MediaMetadata.Builder setExtras​(Bundle extras)
    Sets the extras Bundle.
    - + MediaMetadata.Builder -setFolderType​(Integer folderType) +setFolderType​(@FolderType Integer folderType) - + MediaMetadata.Builder setGenre​(CharSequence genre)
    Sets the genre.
    - + MediaMetadata.Builder setIsPlayable​(Boolean isPlayable)
    Sets whether the media is playable.
    - + MediaMetadata.Builder setMediaUri​(Uri mediaUri)
    Sets the media Uri.
    - + MediaMetadata.Builder setOverallRating​(Rating overallRating)
    Sets the overall Rating.
    - + MediaMetadata.Builder setRecordingDay​(Integer recordingDay)
    Sets the day of the recording date.
    - + MediaMetadata.Builder setRecordingMonth​(Integer recordingMonth)
    Sets the month of the recording date.
    - + MediaMetadata.Builder setRecordingYear​(Integer recordingYear)
    Sets the year of the recording date.
    - + MediaMetadata.Builder setReleaseDay​(Integer releaseDay)
    Sets the day of the release date.
    - + MediaMetadata.Builder setReleaseMonth​(Integer releaseMonth)
    Sets the month of the release date.
    - + MediaMetadata.Builder setReleaseYear​(Integer releaseYear)
    Sets the year of the release date.
    - + MediaMetadata.Builder setSubtitle​(CharSequence subtitle)
    Sets the subtitle.
    - + MediaMetadata.Builder setTitle​(CharSequence title)
    Sets the title.
    - + MediaMetadata.Builder setTotalDiscCount​(Integer totalDiscCount)
    Sets the total number of discs.
    - + MediaMetadata.Builder setTotalTrackCount​(Integer totalTrackCount)
    Sets the total number of tracks.
    - + MediaMetadata.Builder setTrackNumber​(Integer trackNumber)
    Sets the track number.
    - + MediaMetadata.Builder setUserRating​(Rating userRating)
    Sets the user Rating.
    - + MediaMetadata.Builder setWriter​(CharSequence writer)
    Sets the writer.
    - + MediaMetadata.Builder setYear​(Integer year) @@ -601,7 +608,7 @@ extends MediaMetadata.Builder setArtworkData​(@Nullable byte[] artworkData) @@ -614,11 +621,11 @@ public public MediaMetadata.Builder setArtworkData​(@Nullable byte[] artworkData, @Nullable @PictureType - Integer artworkDataType) + @PictureType Integer artworkDataType)
    Sets the artwork data as a compressed byte array with an associated artworkDataType.
    - + @@ -894,6 +901,17 @@ public Metadata.Entry objects within any of the Metadata relate to the same MediaMetadata field, then the last one will be used. + + + +
      +
    • +

      populate

      +
      public MediaMetadata.Builder populate​(@Nullable
      +                                      MediaMetadata mediaMetadata)
      +
      Populates all the fields from mediaMetadata, provided they are non-null.
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.FolderType.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.FolderType.html index 5cf377cb11..c555f2c606 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.FolderType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.FolderType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface MediaMetadata.FolderType
    The folder type of the media item. diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html index 8aa35d1a6e..06dab22929 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.PictureType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface MediaMetadata.PictureType
    The picture type of the artwork. diff --git a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html index a8ce3ba8e0..446b711fa7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html +++ b/docs/doc/reference/com/google/android/exoplayer2/MediaMetadata.html @@ -232,7 +232,7 @@ implements -Integer +@PictureType Integer artworkDataType
    Optional MediaMetadata.PictureType of the artwork data.
    @@ -365,7 +365,7 @@ implements -Integer +@FolderType Integer folderType @@ -1196,7 +1196,7 @@ public final byte[] artworkData

    artworkDataType

    @Nullable
     @PictureType
    -public final Integer artworkDataType
    +public final @PictureType Integer artworkDataType
    Optional MediaMetadata.PictureType of the artwork data.
    @@ -1241,7 +1241,7 @@ public final @FolderType -public final Integer folderType +public final @FolderType Integer folderType diff --git a/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html index 36998fa580..038a05ad8e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/NoSampleRenderer.html @@ -156,7 +156,7 @@ implements Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener +Renderer.MessageType, Renderer.State, Renderer.WakeupListener
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.Builder.html index ca5c0339c3..80bb720c04 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.Builder.html @@ -181,14 +181,14 @@ extends Player.Commands.Builder -add​(int command) +add​(@com.google.android.exoplayer2.Player.Command int command) Player.Commands.Builder -addAll​(int... commands) +addAll​(@com.google.android.exoplayer2.Player.Command int... commands)
    Adds commands.
    @@ -209,7 +209,7 @@ extends Player.Commands.Builder -addIf​(int command, +addIf​(@com.google.android.exoplayer2.Player.Command int command, boolean condition)
    Adds a Player.Command if the provided condition is true.
    @@ -224,21 +224,21 @@ extends Player.Commands.Builder -remove​(int command) +remove​(@com.google.android.exoplayer2.Player.Command int command)
    Removes a Player.Command.
    Player.Commands.Builder -removeAll​(int... commands) +removeAll​(@com.google.android.exoplayer2.Player.Command int... commands)
    Removes commands.
    Player.Commands.Builder -removeIf​(int command, +removeIf​(@com.google.android.exoplayer2.Player.Command int command, boolean condition)
    Removes a Player.Command if the provided condition is true.
    @@ -288,14 +288,14 @@ extends

    Method Detail

    - + - +
    • addIf

      public Player.Commands.Builder addIf​(@Command
      -                                     int command,
      +                                     @com.google.android.exoplayer2.Player.Command int command,
                                            boolean condition)
      Adds a Player.Command if the provided condition is true. Does nothing otherwise.
      @@ -328,14 +328,14 @@ extends
    - + - + - +
    • removeIf

      public Player.Commands.Builder removeIf​(@Command
      -                                        int command,
      +                                        @com.google.android.exoplayer2.Player.Command int command,
                                               boolean condition)
      Removes a Player.Command if the provided condition is true. Does nothing otherwise.
      @@ -421,14 +421,14 @@ extends
    - +
    • removeAll

      public Player.Commands.Builder removeAll​(@Command
      -                                         int... commands)
      + @com.google.android.exoplayer2.Player.Command int... commands)
      Removes commands.
      Parameters:
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.html b/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.html index 7b79b004ec..545fd32c74 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.Commands.html @@ -236,7 +236,7 @@ implements boolean -contains​(int command) +contains​(@com.google.android.exoplayer2.Player.Command int command)
      Returns whether the set of commands contains the specified Player.Command.
      @@ -247,7 +247,7 @@ implements   -int +@com.google.android.exoplayer2.Player.Command int get​(int index)
      Returns the Player.Command at the given index.
      @@ -336,14 +336,14 @@ implements Returns a Player.Commands.Builder initialized with the values of this instance.
    - +
    • contains

      public boolean contains​(@Command
      -                        int command)
      + @com.google.android.exoplayer2.Player.Command int command)
      Returns whether the set of commands contains the specified Player.Command.
    @@ -364,7 +364,7 @@ implements

    get

    @Command
    -public int get​(int index)
    +public @com.google.android.exoplayer2.Player.Command int get​(int index)
    Returns the Player.Command at the given index.
    Parameters:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.DiscontinuityReason.html b/docs/doc/reference/com/google/android/exoplayer2/Player.DiscontinuityReason.html index 0fa6ed4600..76879e9080 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.DiscontinuityReason.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.DiscontinuityReason.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface Player.DiscontinuityReason
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html b/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html index 51e7f50293..5407eca322 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.Event.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface Player.Event
    Events that can be reported via Player.Listener.onEvents(Player, Events). diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.EventListener.html b/docs/doc/reference/com/google/android/exoplayer2/Player.EventListener.html index 8aadfb108f..f6beaf7e46 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.EventListener.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.EventListener.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":50,"i1":50,"i2":50,"i3":50,"i4":50,"i5":50,"i6":50,"i7":50,"i8":50,"i9":50,"i10":50,"i11":50,"i12":50,"i13":50,"i14":50,"i15":50,"i16":50,"i17":50,"i18":50,"i19":50,"i20":50,"i21":50,"i22":50,"i23":50,"i24":50,"i25":50}; +var data = {"i0":50,"i1":50,"i2":50,"i3":50,"i4":50,"i5":50,"i6":50,"i7":50,"i8":50,"i9":50,"i10":50,"i11":50,"i12":50,"i13":50,"i14":50,"i15":50,"i16":50,"i17":50,"i18":50,"i19":50,"i20":50,"i21":50,"i22":50,"i23":50,"i24":50,"i25":50,"i26":50}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],16:["t5","Default Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -126,7 +126,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    All Known Implementing Classes:
    -
    AnalyticsCollector, DebugTextViewHelper, ExoPlayerTestRunner, ImaAdsLoader
    +
    AnalyticsCollector, DebugTextViewHelper, ExoPlayerTestRunner, ImaAdsLoader, SubtitleView
    Enclosing interface:
    @@ -169,7 +169,7 @@ public static interface Player.EventListener< onAvailableCommandsChanged​(Player.Commands availableCommands)
    Deprecated.
    -
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one +
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one Player.Command.
    @@ -209,7 +209,7 @@ public static interface Player.EventListener< default void -onMaxSeekToPreviousPositionChanged​(int maxSeekToPreviousPositionMs) +onMaxSeekToPreviousPositionChanged​(long maxSeekToPreviousPositionMs)
    Deprecated.
    Called when the value of Player.getMaxSeekToPreviousPosition() changes.
    @@ -217,8 +217,8 @@ public static interface Player.EventListener< default void -onMediaItemTransition​(MediaItem mediaItem, - int reason) +onMediaItemTransition​(MediaItem mediaItem, + @com.google.android.exoplayer2.Player.MediaItemTransitionReason int reason)
    Deprecated.
    Called when playback transitions to a media item or starts repeating a media item according @@ -243,7 +243,7 @@ public static interface Player.EventListener< default void -onPlaybackStateChanged​(int playbackState) +onPlaybackStateChanged​(@com.google.android.exoplayer2.Player.State int playbackState)
    Deprecated.
    Called when the value returned from Player.getPlaybackState() changes.
    @@ -251,7 +251,7 @@ public static interface Player.EventListener< default void -onPlaybackSuppressionReasonChanged​(int playbackSuppressionReason) +onPlaybackSuppressionReasonChanged​(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int playbackSuppressionReason)
    Deprecated.
    Called when the value returned from Player.getPlaybackSuppressionReason() changes.
    @@ -275,11 +275,11 @@ public static interface Player.EventListener< default void -onPlayerStateChanged​(boolean playWhenReady, - int playbackState) +onPlayerStateChanged​(boolean playWhenReady, + @com.google.android.exoplayer2.Player.State int playbackState) @@ -293,8 +293,8 @@ public static interface Player.EventListener< default void -onPlayWhenReadyChanged​(boolean playWhenReady, - int reason) +onPlayWhenReadyChanged​(boolean playWhenReady, + @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int reason)
    Deprecated.
    Called when the value returned from Player.getPlayWhenReady() changes.
    @@ -302,18 +302,18 @@ public static interface Player.EventListener< default void -onPositionDiscontinuity​(int reason) +onPositionDiscontinuity​(@com.google.android.exoplayer2.Player.DiscontinuityReason int reason) default void -onPositionDiscontinuity​(Player.PositionInfo oldPosition, +onPositionDiscontinuity​(Player.PositionInfo oldPosition, Player.PositionInfo newPosition, - int reason) + @com.google.android.exoplayer2.Player.DiscontinuityReason int reason)
    Deprecated.
    Called when a position discontinuity occurs.
    @@ -321,7 +321,7 @@ public static interface Player.EventListener< default void -onRepeatModeChanged​(int repeatMode) +onRepeatModeChanged​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
    Deprecated.
    Called when the value of Player.getRepeatMode() changes.
    @@ -362,29 +362,35 @@ public static interface Player.EventListener< default void -onStaticMetadataChanged​(List<Metadata> metadataList) - -
    Deprecated. -
    Use Player.getMediaMetadata() and onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or access the - raw static metadata directly from the track - selections' formats.
    -
    - - - -default void -onTimelineChanged​(Timeline timeline, - int reason) +onTimelineChanged​(Timeline timeline, + @com.google.android.exoplayer2.Player.TimelineChangeReason int reason)
    Deprecated.
    Called when the timeline has been refreshed.
    - + default void onTracksChanged​(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) +
    Deprecated. + +
    + + + +default void +onTrackSelectionParametersChanged​(TrackSelectionParameters parameters) + +
    Deprecated.
    +
    Called when the value returned from Player.getTrackSelectionParameters() changes.
    + + + +default void +onTracksInfoChanged​(TracksInfo tracksInfo) +
    Deprecated.
    Called when the available or selected tracks change.
    @@ -406,7 +412,7 @@ public static interface Player.EventListener<

    Method Detail

    - +
      @@ -414,12 +420,14 @@ public static interface Player.EventListener<

      onTimelineChanged

      default void onTimelineChanged​(Timeline timeline,
                                      @TimelineChangeReason
      -                               int reason)
      + @com.google.android.exoplayer2.Player.TimelineChangeReason int reason)
      Deprecated.
      Called when the timeline has been refreshed. -

      Note that the current window or period index may change as a result of a timeline change. - If playback can't continue smoothly because of this timeline change, a separate onPositionDiscontinuity(PositionInfo, PositionInfo, int) callback will be triggered. +

      Note that the current MediaItem or playback position may change as a result of a + timeline change. If playback can't continue smoothly because of this timeline change, a + separate onPositionDiscontinuity(PositionInfo, PositionInfo, int) callback will be + triggered.

      onEvents(Player, Events) will also be called to report this event along with other events that happen in the same Looper message queue iteration.

      @@ -430,7 +438,7 @@ public static interface Player.EventListener<
    - +
      @@ -439,7 +447,7 @@ public static interface Player.EventListener<
      default void onMediaItemTransition​(@Nullable
                                          MediaItem mediaItem,
                                          @MediaItemTransitionReason
      -                                   int reason)
      + @com.google.android.exoplayer2.Player.MediaItemTransitionReason int reason)
      Deprecated.
      Called when playback transitions to a media item or starts repeating a media item according to the current repeat mode. @@ -462,9 +470,12 @@ public static interface Player.EventListener<
    - + @@ -506,7 +520,11 @@ default void onStaticMetadataChanged​(MediaMetadata is a combination of the MediaItem.mediaMetadata and the static and dynamic metadata from the track - selections' formats and MetadataOutput.onMetadata(Metadata). + selections' formats and Player.Listener.onMetadata(Metadata). If a field is populated in + the MediaItem.mediaMetadata, it will be prioritised above the same field coming from + static or dynamic metadata. + +

    This method may be called multiple times in quick succession.

    onEvents(Player, Events) will also be called to report this event along with other events that happen in the same Looper message queue iteration. @@ -566,7 +584,7 @@ default void onLoadingChanged​(boolean isLoading)

    onAvailableCommandsChanged

    default void onAvailableCommandsChanged​(Player.Commands availableCommands)
    Deprecated.
    -
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one +
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one Player.Command.

    onEvents(Player, Events) will also be called to report this event along with @@ -577,7 +595,25 @@ default void onLoadingChanged​(boolean isLoading)

    - + + + + + - +
    • onPlaybackStateChanged

      default void onPlaybackStateChanged​(@State
      -                                    int playbackState)
      + @com.google.android.exoplayer2.Player.State int playbackState)
      Deprecated.
      Called when the value returned from Player.getPlaybackState() changes. @@ -611,7 +647,7 @@ default void onPlayerStateChanged​(boolean playWhenReady,
    - +
      @@ -619,7 +655,7 @@ default void onPlayerStateChanged​(boolean playWhenReady,

      onPlayWhenReadyChanged

      default void onPlayWhenReadyChanged​(boolean playWhenReady,
                                           @PlayWhenReadyChangeReason
      -                                    int reason)
      + @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int reason)
      Deprecated.
      Called when the value returned from Player.getPlayWhenReady() changes. @@ -632,14 +668,14 @@ default void onPlayerStateChanged​(boolean playWhenReady,
    - +
    • onPlaybackSuppressionReasonChanged

      default void onPlaybackSuppressionReasonChanged​(@PlaybackSuppressionReason
      -                                                int playbackSuppressionReason)
      + @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int playbackSuppressionReason)
      Deprecated.
      Called when the value returned from Player.getPlaybackSuppressionReason() changes. @@ -669,14 +705,14 @@ default void onPlayerStateChanged​(boolean playWhenReady,
    - +
    • onRepeatModeChanged

      default void onRepeatModeChanged​(@RepeatMode
      -                                 int repeatMode)
      + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
      Deprecated.
      Called when the value of Player.getRepeatMode() changes. @@ -702,7 +738,7 @@ default void onPlayerStateChanged​(boolean playWhenReady, other events that happen in the same Looper message queue iteration.
      Parameters:
      -
      shuffleModeEnabled - Whether shuffling of windows is enabled.
      +
      shuffleModeEnabled - Whether shuffling of media items is enabled.
    @@ -750,7 +786,7 @@ default void onPlayerStateChanged​(boolean playWhenReady,
    - + - + @@ -419,7 +411,7 @@ extends + - + - +
    • -

      onTracksChanged

      -
      default void onTracksChanged​(TrackGroupArray trackGroups,
      -                             TrackSelectionArray trackSelections)
      -
      Description copied from interface: Player.EventListener
      +

      onTracksInfoChanged

      +
      default void onTracksInfoChanged​(TracksInfo tracksInfo)
      +
      Description copied from interface: Player.EventListener
      Called when the available or selected tracks change.

      Player.EventListener.onEvents(Player, Events) will also be called to report this event along with other events that happen in the same Looper message queue iteration.

      Specified by:
      -
      onTracksChanged in interface Player.EventListener
      +
      onTracksInfoChanged in interface Player.EventListener
      Parameters:
      -
      trackGroups - The available tracks. Never null, but may be of length zero.
      -
      trackSelections - The selected tracks. Never null, but may contain null elements. A - concrete implementation may include null elements if it has a fixed number of renderer - components, wishes to report a TrackSelection for each of them, and has one or more - renderer components that is not assigned any selected tracks.
      +
      tracksInfo - The available tracks information. Never null, but may be of length zero.
    @@ -526,7 +515,7 @@ extends default void onAvailableCommandsChanged​(Player.Commands availableCommands)
    Description copied from interface: Player.EventListener
    -
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one +
    Called when the value returned from Player.isCommandAvailable(int) changes for at least one Player.Command.

    Player.EventListener.onEvents(Player, Events) will also be called to report this event along with @@ -539,28 +528,28 @@ extends +

    - + - +
    @@ -713,7 +702,7 @@ extends + - + @@ -896,12 +868,7 @@ extends default void onDeviceVolumeChanged​(int volume, boolean muted) -
    Called when the device volume or mute state changes.
    -
    -
    Specified by:
    -
    onDeviceVolumeChanged in interface DeviceListener
    -
    @@ -924,15 +891,15 @@ extends Player.EventListener.onPlaybackStateChanged(int) and Player.EventListener.onPlayWhenReadyChanged(boolean, + both Player.EventListener.onPlaybackStateChanged(int) and Player.EventListener.onPlayWhenReadyChanged(boolean, int)).
  • They need access to the Player object to trigger further events (e.g. to call - Player.seekTo(long) after a Player.EventListener.onMediaItemTransition(MediaItem, int)). + Player.seekTo(long) after a Player.EventListener.onMediaItemTransition(MediaItem, int)).
  • They intend to use multiple state values together or in combination with Player - getter methods. For example using Player.getCurrentWindowIndex() with the - timeline provided in Player.EventListener.onTimelineChanged(Timeline, int) is only safe from + getter methods. For example using Player.getCurrentMediaItemIndex() with the + timeline provided in Player.EventListener.onTimelineChanged(Timeline, int) is only safe from within this method. -
  • They are interested in events that logically happened together (e.g Player.EventListener.onPlaybackStateChanged(int) to Player.STATE_BUFFERING because of Player.EventListener.onMediaItemTransition(MediaItem, int)). +
  • They are interested in events that logically happened together (e.g Player.EventListener.onPlaybackStateChanged(int) to Player.STATE_BUFFERING because of Player.EventListener.onMediaItemTransition(MediaItem, int)).
    Specified by:
    @@ -952,11 +919,8 @@ extends

    onVideoSizeChanged

    default void onVideoSizeChanged​(VideoSize videoSize)
    -
    Description copied from interface: VideoListener
    Called each time there's a change in the size of the video being rendered.
    -
    Specified by:
    -
    onVideoSizeChanged in interface VideoListener
    Parameters:
    videoSize - The new size of the video.
    @@ -970,15 +934,12 @@ extends default void onSurfaceSizeChanged​(int width, int height) -
    Called each time there's a change in the size of the surface onto which the video is being rendered.
    -
    Specified by:
    -
    onSurfaceSizeChanged in interface VideoListener
    Parameters:
    -
    width - The surface width in pixels. May be C.LENGTH_UNSET if unknown, or 0 if the - video is not rendered onto a surface.
    +
    width - The surface width in pixels. May be C.LENGTH_UNSET if unknown, or 0 if + the video is not rendered onto a surface.
    height - The surface height in pixels. May be C.LENGTH_UNSET if unknown, or 0 if the video is not rendered onto a surface.
    @@ -991,13 +952,8 @@ extends

    onRenderedFirstFrame

    default void onRenderedFirstFrame()
    -
    Called when a frame is rendered for the first time since setting the surface, or since the renderer was reset, or since the stream being rendered was changed.
    -
    -
    Specified by:
    -
    onRenderedFirstFrame in interface VideoListener
    -
  • @@ -1007,14 +963,11 @@ extends

    onCues

    default void onCues​(List<Cue> cues)
    -
    Description copied from interface: TextOutput
    Called when there is a change in the Cues.

    cues is in ascending order of priority. If any of the cue boxes overlap when displayed, the Cue nearer the end of the list should be shown on top.

    -
    Specified by:
    -
    onCues in interface TextOutput
    Parameters:
    cues - The Cues. May be empty.
    @@ -1027,11 +980,8 @@ extends

    onMetadata

    default void onMetadata​(Metadata metadata)
    -
    Description copied from interface: MetadataOutput
    -
    Called when there is metadata associated with current playback time.
    +
    Called when there is metadata associated with the current playback time.
    -
    Specified by:
    -
    onMetadata in interface MetadataOutput
    Parameters:
    metadata - The metadata.
    @@ -1049,7 +999,11 @@ extends MediaMetadata is a combination of the MediaItem.mediaMetadata and the static and dynamic metadata from the track - selections' formats and MetadataOutput.onMetadata(Metadata). + selections' formats
    and onMetadata(Metadata). If a field is populated in + the MediaItem.mediaMetadata, it will be prioritised above the same field coming from + static or dynamic metadata. + +

    This method may be called multiple times in quick succession.

    Player.EventListener.onEvents(Player, Events) will also be called to report this event along with other events that happen in the same Looper message queue iteration. diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.MediaItemTransitionReason.html b/docs/doc/reference/com/google/android/exoplayer2/Player.MediaItemTransitionReason.html index ca6b2f59b9..9aeb9e8ff3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.MediaItemTransitionReason.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.MediaItemTransitionReason.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));


    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface Player.MediaItemTransitionReason
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.PlayWhenReadyChangeReason.html b/docs/doc/reference/com/google/android/exoplayer2/Player.PlayWhenReadyChangeReason.html index 5727e123a3..c859add3c2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.PlayWhenReadyChangeReason.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.PlayWhenReadyChangeReason.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface Player.PlayWhenReadyChangeReason
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.PlaybackSuppressionReason.html b/docs/doc/reference/com/google/android/exoplayer2/Player.PlaybackSuppressionReason.html index adb9d25a81..e9449f426b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.PlaybackSuppressionReason.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.PlaybackSuppressionReason.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
     public static @interface Player.PlaybackSuppressionReason
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.PositionInfo.html b/docs/doc/reference/com/google/android/exoplayer2/Player.PositionInfo.html index 56aad779c6..14ab0b9589 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.PositionInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.PositionInfo.html @@ -207,6 +207,20 @@ implements +MediaItem +mediaItem + +
    The media item, or null if the timeline is empty.
    + + + +int +mediaItemIndex + +
    The media item index.
    + + + int periodIndex @@ -217,7 +231,7 @@ implements Object periodUid -
    The UID of the period, or null, if the timeline is empty.
    +
    The UID of the period, or null if the timeline is empty.
    @@ -231,14 +245,16 @@ implements int windowIndex -
    The window index.
    +
    Deprecated. +
    Use mediaItemIndex instead.
    +
    Object windowUid -
    The UID of the window, or null, if the timeline is empty.
    +
    The UID of the window, or null if the timeline is empty.
    @@ -259,8 +275,9 @@ implements Description -PositionInfo​(Object windowUid, - int windowIndex, +PositionInfo​(Object windowUid, + int mediaItemIndex, + MediaItem mediaItem, Object periodUid, int periodIndex, long positionMs, @@ -271,6 +288,22 @@ implements Creates an instance. + +PositionInfo​(Object windowUid, + int mediaItemIndex, + Object periodUid, + int periodIndex, + long positionMs, + long contentPositionMs, + int adGroupIndex, + int adIndexInAdGroup) + + + + @@ -338,7 +371,7 @@ implements Object windowUid -
    The UID of the window, or null, if the timeline is empty.
    +
    The UID of the window, or null if the timeline is empty.
    @@ -347,8 +380,32 @@ public final 
  • windowIndex

    -
    public final int windowIndex
    -
    The window index.
    +
    @Deprecated
    +public final int windowIndex
    +
    Deprecated. +
    Use mediaItemIndex instead.
    +
    +
  • + + + + +
      +
    • +

      mediaItemIndex

      +
      public final int mediaItemIndex
      +
      The media item index.
      +
    • +
    + + + +
      +
    • +

      mediaItem

      +
      @Nullable
      +public final MediaItem mediaItem
      +
      The media item, or null if the timeline is empty.
    @@ -359,7 +416,7 @@ public final Object periodUid -
    The UID of the period, or null, if the timeline is empty.
    +
    The UID of the period, or null if the timeline is empty.
    @@ -437,12 +494,37 @@ public final  + + + +
    • PositionInfo

      public PositionInfo​(@Nullable
                           Object windowUid,
      -                    int windowIndex,
      +                    int mediaItemIndex,
      +                    @Nullable
      +                    MediaItem mediaItem,
                           @Nullable
                           Object periodUid,
                           int periodIndex,
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.RepeatMode.html b/docs/doc/reference/com/google/android/exoplayer2/Player.RepeatMode.html
      index 6c7fa3a240..f2c8abd799 100644
      --- a/docs/doc/reference/com/google/android/exoplayer2/Player.RepeatMode.html
      +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.RepeatMode.html
      @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      @Documented
       @Retention(SOURCE)
      +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
       public static @interface Player.RepeatMode
    • diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.State.html b/docs/doc/reference/com/google/android/exoplayer2/Player.State.html index f4758744ae..2e49a77eda 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.State.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.State.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      @Documented
       @Retention(SOURCE)
      +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
       public static @interface Player.State
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.TimelineChangeReason.html b/docs/doc/reference/com/google/android/exoplayer2/Player.TimelineChangeReason.html index 34514269e3..9972d82602 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.TimelineChangeReason.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.TimelineChangeReason.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      @Documented
       @Retention(SOURCE)
      +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
       public static @interface Player.TimelineChangeReason
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.html b/docs/doc/reference/com/google/android/exoplayer2/Player.html index 06a5f53fd3..a2e407a755 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":38,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":6,"i21":6,"i22":6,"i23":6,"i24":6,"i25":6,"i26":6,"i27":6,"i28":6,"i29":38,"i30":6,"i31":6,"i32":6,"i33":6,"i34":6,"i35":6,"i36":6,"i37":6,"i38":6,"i39":6,"i40":6,"i41":6,"i42":6,"i43":6,"i44":6,"i45":6,"i46":6,"i47":6,"i48":6,"i49":6,"i50":6,"i51":6,"i52":6,"i53":6,"i54":6,"i55":6,"i56":38,"i57":6,"i58":38,"i59":6,"i60":6,"i61":6,"i62":6,"i63":6,"i64":6,"i65":6,"i66":6,"i67":6,"i68":6,"i69":6,"i70":6,"i71":38,"i72":6,"i73":6,"i74":6,"i75":38,"i76":6,"i77":38,"i78":6,"i79":6,"i80":6,"i81":6,"i82":6,"i83":6,"i84":6,"i85":6,"i86":6,"i87":6,"i88":6,"i89":6,"i90":6,"i91":6,"i92":6,"i93":6,"i94":6,"i95":6,"i96":6,"i97":6,"i98":6,"i99":6,"i100":6,"i101":6,"i102":6,"i103":6,"i104":6,"i105":6,"i106":6,"i107":6,"i108":6,"i109":6,"i110":6,"i111":38}; +var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6,"i18":6,"i19":6,"i20":6,"i21":6,"i22":6,"i23":6,"i24":6,"i25":6,"i26":6,"i27":6,"i28":6,"i29":6,"i30":6,"i31":38,"i32":38,"i33":6,"i34":38,"i35":6,"i36":6,"i37":6,"i38":6,"i39":6,"i40":6,"i41":6,"i42":6,"i43":38,"i44":6,"i45":6,"i46":6,"i47":6,"i48":6,"i49":6,"i50":6,"i51":38,"i52":6,"i53":6,"i54":6,"i55":6,"i56":6,"i57":6,"i58":6,"i59":6,"i60":38,"i61":6,"i62":38,"i63":38,"i64":6,"i65":38,"i66":6,"i67":6,"i68":6,"i69":6,"i70":6,"i71":38,"i72":38,"i73":38,"i74":6,"i75":6,"i76":6,"i77":6,"i78":6,"i79":6,"i80":38,"i81":6,"i82":6,"i83":6,"i84":38,"i85":6,"i86":6,"i87":6,"i88":6,"i89":6,"i90":6,"i91":6,"i92":6,"i93":6,"i94":6,"i95":6,"i96":6,"i97":38,"i98":6,"i99":6,"i100":38,"i101":6,"i102":6,"i103":6,"i104":6,"i105":6,"i106":6,"i107":6,"i108":6,"i109":6,"i110":6,"i111":6,"i112":6,"i113":6,"i114":6,"i115":6,"i116":6,"i117":6,"i118":6,"i119":6,"i120":6,"i121":6,"i122":38}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -126,7 +126,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    All Known Implementing Classes:
    -
    BasePlayer, CastPlayer, ForwardingPlayer, SimpleExoPlayer, StubExoPlayer
    +
    BasePlayer, CastPlayer, ForwardingPlayer, SimpleExoPlayer, StubExoPlayer, StubPlayer

    public interface Player
    @@ -143,10 +143,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); @@ -311,7 +309,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); static int COMMAND_GET_CURRENT_MEDIA_ITEM -
    Command to get the MediaItem of the current window.
    +
    Command to get the currently playing MediaItem.
    @@ -344,130 +342,180 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); static int +COMMAND_GET_TRACK_INFOS + +
    Command to get track infos.
    + + + +static int COMMAND_GET_VOLUME
    Command to get the player volume.
    - + static int COMMAND_INVALID
    Represents an invalid Player.Command.
    - + static int COMMAND_PLAY_PAUSE
    Command to start, pause or resume playback.
    + +static int +COMMAND_PREPARE + +
    Command to prepare the player.
    + + static int -COMMAND_PREPARE_STOP +COMMAND_SEEK_BACK -
    Command to prepare the player, stop playback or release the player.
    +
    Command to seek back by a fixed increment into the current MediaItem.
    static int -COMMAND_SEEK_BACK +COMMAND_SEEK_FORWARD -
    Command to seek back by a fixed increment into the current window.
    +
    Command to seek forward by a fixed increment into the current MediaItem.
    static int -COMMAND_SEEK_FORWARD +COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM -
    Command to seek forward by a fixed increment into the current window.
    +
    Command to seek anywhere into the current MediaItem.
    static int COMMAND_SEEK_IN_CURRENT_WINDOW -
    Command to seek anywhere into the current window.
    +
    Deprecated. + +
    static int COMMAND_SEEK_TO_DEFAULT_POSITION -
    Command to seek to the default position of the current window.
    +
    Command to seek to the default position of the current MediaItem.
    static int +COMMAND_SEEK_TO_MEDIA_ITEM + +
    Command to seek anywhere in any MediaItem.
    + + + +static int COMMAND_SEEK_TO_NEXT -
    Command to seek to a later position in the current or next window.
    +
    Command to seek to a later position in the current or next MediaItem.
    + + + +static int +COMMAND_SEEK_TO_NEXT_MEDIA_ITEM + +
    Command to seek to the default position of the next MediaItem.
    static int COMMAND_SEEK_TO_NEXT_WINDOW -
    Command to seek to the default position of the next window.
    +
    Deprecated. + +
    static int COMMAND_SEEK_TO_PREVIOUS -
    Command to seek to an earlier position in the current or previous window.
    +
    Command to seek to an earlier position in the current or previous MediaItem.
    static int -COMMAND_SEEK_TO_PREVIOUS_WINDOW +COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM -
    Command to seek to the default position of the previous window.
    +
    Command to seek to the default position of the previous MediaItem.
    static int -COMMAND_SEEK_TO_WINDOW +COMMAND_SEEK_TO_PREVIOUS_WINDOW -
    Command to seek anywhere in any window.
    +
    Deprecated. + +
    static int +COMMAND_SEEK_TO_WINDOW + +
    Deprecated. + +
    + + + +static int COMMAND_SET_DEVICE_VOLUME
    Command to set the device volume and mute it.
    - + static int COMMAND_SET_MEDIA_ITEMS_METADATA
    Command to set the MediaItems metadata.
    - + static int COMMAND_SET_REPEAT_MODE
    Command to set the repeat mode.
    - + static int COMMAND_SET_SHUFFLE_MODE
    Command to enable shuffling.
    - + static int COMMAND_SET_SPEED_AND_PITCH
    Command to set the playback speed and pitch.
    + +static int +COMMAND_SET_TRACK_SELECTION_PARAMETERS + +
    Command to set the player's track selection parameters.
    + + static int COMMAND_SET_VIDEO_SURFACE @@ -484,33 +532,40 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); static int +COMMAND_STOP + +
    Command to stop playback or release the player.
    + + + +static int DISCONTINUITY_REASON_AUTO_TRANSITION
    Automatic playback transition from one period in the timeline to the next.
    - + static int DISCONTINUITY_REASON_INTERNAL
    Discontinuity introduced internally (e.g.
    - + static int DISCONTINUITY_REASON_REMOVE
    Discontinuity caused by the removal of the current period from the Timeline.
    - + static int DISCONTINUITY_REASON_SEEK
    Seek within the current period or to another period.
    - + static int DISCONTINUITY_REASON_SEEK_ADJUSTMENT @@ -518,141 +573,132 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); permitted to be inexact. - + static int DISCONTINUITY_REASON_SKIP
    Discontinuity introduced by a skipped period (for instance a skipped ad).
    - + static int EVENT_AVAILABLE_COMMANDS_CHANGED -
    isCommandAvailable(int) changed for at least one Player.Command.
    +
    isCommandAvailable(int) changed for at least one Player.Command.
    - + static int EVENT_IS_LOADING_CHANGED
    isLoading() ()} changed.
    - + static int EVENT_IS_PLAYING_CHANGED
    isPlaying() changed.
    - + static int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED - + static int EVENT_MEDIA_ITEM_TRANSITION
    getCurrentMediaItem() changed or the player started repeating the current item.
    - + static int EVENT_MEDIA_METADATA_CHANGED - + static int EVENT_PLAY_WHEN_READY_CHANGED - + static int EVENT_PLAYBACK_PARAMETERS_CHANGED - + static int EVENT_PLAYBACK_STATE_CHANGED - + static int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED - + static int EVENT_PLAYER_ERROR - + static int EVENT_PLAYLIST_METADATA_CHANGED - + static int EVENT_POSITION_DISCONTINUITY
    A position discontinuity occurred.
    - + static int EVENT_REPEAT_MODE_CHANGED - + static int EVENT_SEEK_BACK_INCREMENT_CHANGED - + static int EVENT_SEEK_FORWARD_INCREMENT_CHANGED - + static int EVENT_SHUFFLE_MODE_ENABLED_CHANGED - -static int -EVENT_STATIC_METADATA_CHANGED - -
    Deprecated. -
    Use EVENT_MEDIA_METADATA_CHANGED for structured metadata changes.
    -
    - - static int EVENT_TIMELINE_CHANGED @@ -662,110 +708,117 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); static int -EVENT_TRACKS_CHANGED +EVENT_TRACK_SELECTION_PARAMETERS_CHANGED - + static int +EVENT_TRACKS_CHANGED + + + + + +static int MEDIA_ITEM_TRANSITION_REASON_AUTO
    Playback has automatically transitioned to the next media item.
    - + static int MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED
    The current media item has changed because of a change in the playlist.
    - + static int MEDIA_ITEM_TRANSITION_REASON_REPEAT
    The media item has been repeated.
    - + static int MEDIA_ITEM_TRANSITION_REASON_SEEK
    A seek to another media item has occurred.
    - + static int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY
    Playback has been paused to avoid becoming noisy.
    - + static int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS
    Playback has been paused because of a loss of audio focus.
    - + static int PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM
    Playback has been paused at the end of a media item.
    - + static int PLAY_WHEN_READY_CHANGE_REASON_REMOTE
    Playback has been started or paused because of a remote change.
    - + static int PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST
    Playback has been started or paused by a call to setPlayWhenReady(boolean).
    - + static int PLAYBACK_SUPPRESSION_REASON_NONE
    Playback is not suppressed.
    - + static int PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS
    Playback is suppressed due to transient audio focus loss.
    - + static int REPEAT_MODE_ALL
    Repeats the entire timeline infinitely.
    - + static int REPEAT_MODE_OFF
    Normal playback without repetition.
    - + static int REPEAT_MODE_ONE -
    Repeats the currently playing window infinitely during ongoing playback.
    +
    Repeats the currently playing MediaItem infinitely during ongoing playback.
    - + static int STATE_BUFFERING @@ -773,35 +826,35 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); so. - + static int STATE_ENDED
    The player has finished playing the media.
    - + static int STATE_IDLE
    The player is idle, and must be prepared before it will play the media.
    - + static int STATE_READY
    The player is able to immediately play from its current position.
    - + static int TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
    Timeline changed as a result of a change of the playlist items or the order of the items.
    - + static int TIMELINE_CHANGE_REASON_SOURCE_UPDATE @@ -828,21 +881,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); void -addListener​(Player.EventListener listener) - -
    Deprecated. - -
    - - - -void addListener​(Player.Listener listener)
    Registers a listener to receive all events from the player.
    - + void addMediaItem​(int index, MediaItem mediaItem) @@ -850,14 +894,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Adds a media item at the given index of the playlist.
    - + void addMediaItem​(MediaItem mediaItem)
    Adds a media item to the end of the playlist.
    - + void addMediaItems​(int index, List<MediaItem> mediaItems) @@ -865,13 +909,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Adds a list of media items at the given index of the playlist.
    - + void addMediaItems​(List<MediaItem> mediaItems)
    Adds a list of media items to the end of the playlist.
    + +boolean +canAdvertiseSession() + +
    Returns whether the player can be used to advertise a media session.
    + + void clearMediaItems() @@ -949,7 +1000,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); int getBufferedPercentage() -
    Returns an estimate of the percentage in the current content window or ad up to which data is +
    Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
    @@ -957,8 +1008,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); long getBufferedPosition() -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
    @@ -966,15 +1017,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); getContentBufferedPosition()
    If isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds.
    + the current content up to which data is buffered, in milliseconds.
    long getContentDuration() -
    If isPlayingAd() returns true, returns the duration of the current content - window in milliseconds, or C.TIME_UNSET if the duration is not known.
    +
    If isPlayingAd() returns true, returns the duration of the current content in + milliseconds, or C.TIME_UNSET if the duration is not known.
    @@ -1012,8 +1063,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); getCurrentLiveOffset()
    Returns the offset of the current playback position from the live edge in milliseconds, or - C.TIME_UNSET if the current window isn't live or the - offset is unknown.
    + C.TIME_UNSET if the current MediaItem isCurrentMediaItemLive() isn't + live} or the offset is unknown. @@ -1027,34 +1078,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); MediaItem getCurrentMediaItem() -
    Returns the media item of the current window in the timeline.
    +
    Returns the currently playing MediaItem.
    int +getCurrentMediaItemIndex() + +
    Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is + empty.
    + + + +int getCurrentPeriodIndex()
    Returns the index of the period currently being played.
    - + long getCurrentPosition() -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
    - - - -List<Metadata> -getCurrentStaticMetadata() - -
    Deprecated. -
    Use getMediaMetadata() and Player.Listener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or - access the raw static metadata directly from the track - selections' formats.
    -
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
    @@ -1068,67 +1115,80 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); TrackGroupArray getCurrentTrackGroups() -
    Returns the available track groups.
    +
    Deprecated. + +
    TrackSelectionArray getCurrentTrackSelections() -
    Returns the current track selections.
    +
    Deprecated. + +
    -int -getCurrentWindowIndex() +TracksInfo +getCurrentTracksInfo() -
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    +
    Returns the available tracks, as well as the tracks' support, type, and selection status.
    -DeviceInfo +int +getCurrentWindowIndex() + +
    Deprecated. + +
    + + + +DeviceInfo getDeviceInfo()
    Gets the device information.
    - + int getDeviceVolume()
    Gets the current volume of the device.
    - + long getDuration() -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    - - - -int -getMaxSeekToPreviousPosition() - -
    Returns the maximum position for which seekToPrevious() seeks to the previous window, - in milliseconds.
    +
    Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
    +long +getMaxSeekToPreviousPosition() + +
    Returns the maximum position for which seekToPrevious() seeks to the previous MediaItem, in milliseconds.
    + + + MediaItem getMediaItemAt​(int index)
    Returns the MediaItem at the given index.
    - + int getMediaItemCount()
    Returns the number of media items in the playlist.
    - + MediaMetadata getMediaMetadata() @@ -1136,214 +1196,284 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); supported. - + +int +getNextMediaItemIndex() + +
    Returns the index of the MediaItem that will be played if seekToNextMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
    + + + int getNextWindowIndex() -
    Returns the index of the window that will be played if seekToNextWindow() is called, - which may depend on the current repeat mode and whether shuffle mode is enabled.
    +
    Deprecated. + +
    - + PlaybackParameters getPlaybackParameters()
    Returns the currently active playback parameters.
    - -int + +@com.google.android.exoplayer2.Player.State int getPlaybackState()
    Returns the current playback state of the player.
    - -int + +@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int getPlaybackSuppressionReason()
    Returns the reason why playback is suppressed even though getPlayWhenReady() is true, or PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    - + PlaybackException getPlayerError()
    Returns the error that caused playback to fail.
    - + MediaMetadata getPlaylistMetadata()
    Returns the playlist MediaMetadata, as set by setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    - + boolean getPlayWhenReady()
    Whether playback will proceed when getPlaybackState() == STATE_READY.
    - + +int +getPreviousMediaItemIndex() + +
    Returns the index of the MediaItem that will be played if seekToPreviousMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
    + + + int getPreviousWindowIndex() -
    Returns the index of the window that will be played if seekToPreviousWindow() is - called, which may depend on the current repeat mode and whether shuffle mode is enabled.
    +
    Deprecated. + +
    - -int + +@com.google.android.exoplayer2.Player.RepeatMode int getRepeatMode()
    Returns the current Player.RepeatMode used for playback.
    - + long getSeekBackIncrement()
    Returns the seekBack() increment.
    - + long getSeekForwardIncrement()
    Returns the seekForward() increment.
    - + boolean getShuffleModeEnabled() -
    Returns whether shuffling of windows is enabled.
    +
    Returns whether shuffling of media items is enabled.
    - + long getTotalBufferedDuration()
    Returns an estimate of the total buffered duration from the current position, in milliseconds.
    - + +TrackSelectionParameters +getTrackSelectionParameters() + +
    Returns the parameters constraining the track selection.
    + + + VideoSize getVideoSize()
    Gets the size of the video.
    - + float getVolume()
    Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    - + boolean hasNext()
    Deprecated. -
    Use hasNextWindow() instead.
    +
    Use hasNextMediaItem() instead.
    - + +boolean +hasNextMediaItem() + +
    Returns whether a next MediaItem exists, which may depend on the current repeat mode + and whether shuffle mode is enabled.
    + + + boolean hasNextWindow() -
    Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled.
    +
    Deprecated. +
    Use hasNextMediaItem() instead.
    +
    - + boolean hasPrevious()
    Deprecated. -
    Use hasPreviousWindow() instead.
    +
    - + boolean -hasPreviousWindow() +hasPreviousMediaItem() -
    Returns whether a previous window exists, which may depend on the current repeat mode and +
    Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.
    - + +boolean +hasPreviousWindow() + +
    Deprecated. + +
    + + + void increaseDeviceVolume()
    Increases the volume of the device.
    - + boolean -isCommandAvailable​(int command) +isCommandAvailable​(@com.google.android.exoplayer2.Player.Command int command)
    Returns whether the provided Player.Command is available.
    - + +boolean +isCurrentMediaItemDynamic() + +
    Returns whether the current MediaItem is dynamic (may change when the Timeline + is updated), or false if the Timeline is empty.
    + + + +boolean +isCurrentMediaItemLive() + +
    Returns whether the current MediaItem is live, or false if the Timeline + is empty.
    + + + +boolean +isCurrentMediaItemSeekable() + +
    Returns whether the current MediaItem is seekable, or false if the Timeline is empty.
    + + + boolean isCurrentWindowDynamic() -
    Returns whether the current window is dynamic, or false if the Timeline is - empty.
    +
    Deprecated. + +
    - + boolean isCurrentWindowLive() -
    Returns whether the current window is live, or false if the Timeline is empty.
    +
    Deprecated. + +
    - + boolean isCurrentWindowSeekable() -
    Returns whether the current window is seekable, or false if the Timeline is - empty.
    +
    Deprecated. + +
    - + boolean isDeviceMuted()
    Gets whether the device is muted or not.
    - + boolean isLoading()
    Whether the player is currently loading the source.
    - + boolean isPlaying()
    Returns whether the player is playing, i.e.
    - + boolean isPlayingAd()
    Returns whether the player is currently playing an ad.
    - + void moveMediaItem​(int currentIndex, int newIndex) @@ -1351,7 +1481,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Moves the media item at the current index to the new index.
    - + void moveMediaItems​(int fromIndex, int toIndex, @@ -1360,76 +1490,67 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Moves the media item range to the new index.
    - + void next()
    Deprecated. -
    Use seekToNextWindow() instead.
    +
    - + void pause()
    Pauses playback.
    - + void play()
    Resumes playback as soon as getPlaybackState() == STATE_READY.
    - + void prepare()
    Prepares the player.
    - + void previous()
    Deprecated. - +
    - + void release()
    Releases the player.
    - -void -removeListener​(Player.EventListener listener) - -
    Deprecated. - -
    - - - + void removeListener​(Player.Listener listener)
    Unregister a listener registered through addListener(Listener).
    - + void removeMediaItem​(int index)
    Removes the media item at the given index of the playlist.
    - + void removeMediaItems​(int fromIndex, int toIndex) @@ -1437,94 +1558,113 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Removes a range of media items from the playlist.
    - + void seekBack() -
    Seeks back in the current window by getSeekBackIncrement() milliseconds.
    - - - -void -seekForward() - -
    Seeks forward in the current window by getSeekForwardIncrement() milliseconds.
    - - - -void -seekTo​(int windowIndex, - long positionMs) - -
    Seeks to a position specified in milliseconds in the specified window.
    - - - -void -seekTo​(long positionMs) - -
    Seeks to a position specified in milliseconds in the current window.
    - - - -void -seekToDefaultPosition() - -
    Seeks to the default position associated with the current window.
    - - - -void -seekToDefaultPosition​(int windowIndex) - -
    Seeks to the default position associated with the specified window.
    - - - -void -seekToNext() - -
    Seeks to a later position in the current or next window (if available).
    - - - -void -seekToNextWindow() - -
    Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled.
    - - - -void -seekToPrevious() - -
    Seeks to an earlier position in the current or previous window (if available).
    +
    Seeks back in the current MediaItem by getSeekBackIncrement() milliseconds.
    void -seekToPreviousWindow() +seekForward() -
    Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled.
    +
    Seeks forward in the current MediaItem by getSeekForwardIncrement() + milliseconds.
    void +seekTo​(int mediaItemIndex, + long positionMs) + +
    Seeks to a position specified in milliseconds in the specified MediaItem.
    + + + +void +seekTo​(long positionMs) + +
    Seeks to a position specified in milliseconds in the current MediaItem.
    + + + +void +seekToDefaultPosition() + +
    Seeks to the default position associated with the current MediaItem.
    + + + +void +seekToDefaultPosition​(int mediaItemIndex) + +
    Seeks to the default position associated with the specified MediaItem.
    + + + +void +seekToNext() + +
    Seeks to a later position in the current or next MediaItem (if available).
    + + + +void +seekToNextMediaItem() + +
    Seeks to the default position of the next MediaItem, which may depend on the current + repeat mode and whether shuffle mode is enabled.
    + + + +void +seekToNextWindow() + +
    Deprecated. + +
    + + + +void +seekToPrevious() + +
    Seeks to an earlier position in the current or previous MediaItem (if available).
    + + + +void +seekToPreviousMediaItem() + +
    Seeks to the default position of the previous MediaItem, which may depend on the + current repeat mode and whether shuffle mode is enabled.
    + + + +void +seekToPreviousWindow() + +
    Deprecated. + +
    + + + +void setDeviceMuted​(boolean muted)
    Sets the mute state of the device.
    - + void setDeviceVolume​(int volume)
    Sets the volume of the device.
    - + void setMediaItem​(MediaItem mediaItem) @@ -1532,7 +1672,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); default position.
    - + void setMediaItem​(MediaItem mediaItem, boolean resetPosition) @@ -1540,7 +1680,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Clears the playlist and adds the specified MediaItem.
    - + void setMediaItem​(MediaItem mediaItem, long startPositionMs) @@ -1548,7 +1688,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Clears the playlist and adds the specified MediaItem.
    - + void setMediaItems​(List<MediaItem> mediaItems) @@ -1556,7 +1696,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); the default position. - + void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) @@ -1564,65 +1704,72 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Clears the playlist and adds the specified MediaItems.
    - + void setMediaItems​(List<MediaItem> mediaItems, - int startWindowIndex, + int startIndex, long startPositionMs)
    Clears the playlist and adds the specified MediaItems.
    - + void setPlaybackParameters​(PlaybackParameters playbackParameters)
    Attempts to set the playback parameters.
    - + void setPlaybackSpeed​(float speed)
    Changes the rate at which playback occurs.
    - + void setPlaylistMetadata​(MediaMetadata mediaMetadata)
    Sets the playlist MediaMetadata.
    - + void setPlayWhenReady​(boolean playWhenReady)
    Sets whether playback should proceed when getPlaybackState() == STATE_READY.
    - + void -setRepeatMode​(int repeatMode) +setRepeatMode​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
    Sets the Player.RepeatMode to be used for playback.
    - + void setShuffleModeEnabled​(boolean shuffleModeEnabled) -
    Sets whether shuffling of windows is enabled.
    +
    Sets whether shuffling of media items is enabled.
    - + +void +setTrackSelectionParameters​(TrackSelectionParameters parameters) + +
    Sets the parameters constraining the track selection.
    + + + void setVideoSurface​(Surface surface)
    Sets the Surface onto which video will be rendered.
    - + void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) @@ -1630,35 +1777,36 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); rendered. - + void setVideoSurfaceView​(SurfaceView surfaceView)
    Sets the SurfaceView onto which video will be rendered.
    - + void setVideoTextureView​(TextureView textureView)
    Sets the TextureView onto which video will be rendered.
    - + void -setVolume​(float audioVolume) +setVolume​(float volume) -
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    +
    Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
    - + void stop()
    Stops playback without resetting the player.
    - + void stop​(boolean reset) @@ -1850,7 +1998,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    REPEAT_MODE_OFF

    static final int REPEAT_MODE_OFF
    Normal playback without repetition. "Previous" and "Next" actions move to the previous and next - windows respectively, and do nothing when there is no previous or next window to move to.
    + MediaItem respectively, and do nothing when there is no previous or next MediaItem to move to.
    See Also:
    Constant Field Values
    @@ -1864,9 +2012,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • REPEAT_MODE_ONE

    static final int REPEAT_MODE_ONE
    -
    Repeats the currently playing window infinitely during ongoing playback. "Previous" and "Next" - actions behave as they do in REPEAT_MODE_OFF, moving to the previous and next windows - respectively, and doing nothing when there is no previous or next window to move to.
    +
    Repeats the currently playing MediaItem infinitely during ongoing playback. "Previous" + and "Next" actions behave as they do in REPEAT_MODE_OFF, moving to the previous and + next MediaItem respectively, and doing nothing when there is no previous or next MediaItem to move to.
    See Also:
    Constant Field Values
    @@ -1882,8 +2030,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    static final int REPEAT_MODE_ALL
    Repeats the entire timeline infinitely. "Previous" and "Next" actions behave as they do in REPEAT_MODE_OFF, but with looping at the ends so that "Previous" when playing the - first window will move to the last window, and "Next" when playing the last window will move to - the first window.
    + first MediaItem will move to the last MediaItem, and "Next" when playing the + last MediaItem will move to the first MediaItem.
    See Also:
    Constant Field Values
    @@ -2108,30 +2256,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • EVENT_TRACKS_CHANGED

    static final int EVENT_TRACKS_CHANGED
    - +
    See Also:
    Constant Field Values
  • - - - - @@ -2251,7 +2382,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • EVENT_POSITION_DISCONTINUITY

    static final int EVENT_POSITION_DISCONTINUITY
    -
    A position discontinuity occurred. See Player.Listener.onPositionDiscontinuity(PositionInfo, +
    See Also:
    @@ -2280,7 +2411,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • EVENT_AVAILABLE_COMMANDS_CHANGED

    static final int EVENT_AVAILABLE_COMMANDS_CHANGED
    -
    isCommandAvailable(int) changed for at least one Player.Command.
    +
    isCommandAvailable(int) changed for at least one Player.Command.
    See Also:
    Constant Field Values
    @@ -2357,6 +2488,20 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • + + + + @@ -2371,17 +2516,31 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • - +
    • -

      COMMAND_PREPARE_STOP

      -
      static final int COMMAND_PREPARE_STOP
      -
      Command to prepare the player, stop playback or release the player.
      +

      COMMAND_PREPARE

      +
      static final int COMMAND_PREPARE
      +
      Command to prepare the player.
      See Also:
      -
      Constant Field Values
      +
      Constant Field Values
      +
      +
    • +
    + + + +
      +
    • +

      COMMAND_STOP

      +
      static final int COMMAND_STOP
      +
      Command to stop playback or release the player.
      +
      +
      See Also:
      +
      Constant Field Values
    @@ -2392,35 +2551,69 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • COMMAND_SEEK_TO_DEFAULT_POSITION

    static final int COMMAND_SEEK_TO_DEFAULT_POSITION
    -
    Command to seek to the default position of the current window.
    +
    Command to seek to the default position of the current MediaItem.
    See Also:
    Constant Field Values
  • + + + +
      +
    • +

      COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM

      +
      static final int COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM
      +
      Command to seek anywhere into the current MediaItem.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    + + + +
      +
    • +

      COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM

      +
      static final int COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM
      +
      Command to seek to the default position of the previous MediaItem.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    • COMMAND_SEEK_TO_PREVIOUS_WINDOW

      -
      static final int COMMAND_SEEK_TO_PREVIOUS_WINDOW
      -
      Command to seek to the default position of the previous window.
      +
      @Deprecated
      +static final int COMMAND_SEEK_TO_PREVIOUS_WINDOW
      +
      Deprecated. + +
      See Also:
      Constant Field Values
      @@ -2434,21 +2627,38 @@ static final int EVENT_STATIC_METADATA_CHANGED
    • COMMAND_SEEK_TO_PREVIOUS

      static final int COMMAND_SEEK_TO_PREVIOUS
      -
      Command to seek to an earlier position in the current or previous window.
      +
      Command to seek to an earlier position in the current or previous MediaItem.
      See Also:
      Constant Field Values
    + + + +
      +
    • +

      COMMAND_SEEK_TO_NEXT_MEDIA_ITEM

      +
      static final int COMMAND_SEEK_TO_NEXT_MEDIA_ITEM
      +
      Command to seek to the default position of the next MediaItem.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    • COMMAND_SEEK_TO_NEXT_WINDOW

      -
      static final int COMMAND_SEEK_TO_NEXT_WINDOW
      -
      Command to seek to the default position of the next window.
      +
      @Deprecated
      +static final int COMMAND_SEEK_TO_NEXT_WINDOW
      +
      Deprecated. + +
      See Also:
      Constant Field Values
      @@ -2462,21 +2672,38 @@ static final int EVENT_STATIC_METADATA_CHANGED
    • COMMAND_SEEK_TO_NEXT

      static final int COMMAND_SEEK_TO_NEXT
      -
      Command to seek to a later position in the current or next window.
      +
      Command to seek to a later position in the current or next MediaItem.
      See Also:
      Constant Field Values
    + + + +
      +
    • +

      COMMAND_SEEK_TO_MEDIA_ITEM

      +
      static final int COMMAND_SEEK_TO_MEDIA_ITEM
      +
      Command to seek anywhere in any MediaItem.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    • COMMAND_SEEK_TO_WINDOW

      -
      static final int COMMAND_SEEK_TO_WINDOW
      -
      Command to seek anywhere in any window.
      +
      @Deprecated
      +static final int COMMAND_SEEK_TO_WINDOW
      +
      Deprecated. + +
      See Also:
      Constant Field Values
      @@ -2490,7 +2717,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
    • COMMAND_SEEK_BACK

      static final int COMMAND_SEEK_BACK
      -
      Command to seek back by a fixed increment into the current window.
      +
      Command to seek back by a fixed increment into the current MediaItem.
      See Also:
      Constant Field Values
      @@ -2504,7 +2731,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
    • COMMAND_SEEK_FORWARD

      static final int COMMAND_SEEK_FORWARD
      -
      Command to seek forward by a fixed increment into the current window.
      +
      Command to seek forward by a fixed increment into the current MediaItem.
      See Also:
      Constant Field Values
      @@ -2560,7 +2787,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
    • COMMAND_GET_CURRENT_MEDIA_ITEM

      static final int COMMAND_GET_CURRENT_MEDIA_ITEM
      -
      Command to get the MediaItem of the current window.
      +
      Command to get the currently playing MediaItem.
      See Also:
      Constant Field Values
      @@ -2735,6 +2962,34 @@ static final int EVENT_STATIC_METADATA_CHANGED
    + + + +
      +
    • +

      COMMAND_SET_TRACK_SELECTION_PARAMETERS

      +
      static final int COMMAND_SET_TRACK_SELECTION_PARAMETERS
      +
      Command to set the player's track selection parameters.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    + + + +
      +
    • +

      COMMAND_GET_TRACK_INFOS

      +
      static final int COMMAND_GET_TRACK_INFOS
      +
      Command to get track infos.
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    @@ -2770,28 +3025,6 @@ static final int EVENT_STATIC_METADATA_CHANGED player and on which player events are received.
  • - - - -
      -
    • -

      addListener

      -
      @Deprecated
      -void addListener​(Player.EventListener listener)
      -
      Deprecated. - -
      -
      Registers a listener to receive events from the player. - -

      The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

      -
      -
      Parameters:
      -
      listener - The listener to register.
      -
      -
    • -
    @@ -2801,34 +3034,13 @@ void addListener​(void addListener​(Player.Listener listener)
    Registers a listener to receive all events from the player. -

    The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

    +

    The listener's methods will be called on the thread associated with getApplicationLooper().

    Parameters:
    listener - The listener to register.
    - - - - @@ -2873,7 +3085,7 @@ void removeListener​(MediaItems.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by getCurrentWindowIndex() and getCurrentPosition().
    + by getCurrentMediaItemIndex() and getCurrentPosition().
    @@ -2884,19 +3096,19 @@ void removeListener​(

    setMediaItems

    void setMediaItems​(List<MediaItem> mediaItems,
    -                   int startWindowIndex,
    +                   int startIndex,
                        long startPositionMs)
    Clears the playlist and adds the specified MediaItems.
    Parameters:
    mediaItems - The new MediaItems.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    +
    startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET + is passed, the current position is not reset.
    +
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In + any case, if startIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
    Throws:
    -
    IllegalSeekPositionException - If the provided startWindowIndex is not within the +
    IllegalSeekPositionException - If the provided startIndex is not within the bounds of the list of media items.
    @@ -2945,7 +3157,7 @@ void removeListener​(Parameters:
    mediaItem - The new MediaItem.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by getCurrentWindowIndex() + false, playback will start from the position defined by getCurrentMediaItemIndex() and getCurrentPosition().
    @@ -3090,24 +3302,23 @@ void removeListener​(Clears the playlist. - + @@ -3178,14 +3398,14 @@ int getPlaybackState()
  • getPlaybackSuppressionReason

    @PlaybackSuppressionReason
    -int getPlaybackSuppressionReason()
    +@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int getPlaybackSuppressionReason()
    Returns the reason why playback is suppressed even though getPlayWhenReady() is true, or PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    Returns:
    The current playback suppression reason.
    See Also:
    -
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
    +
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
  • @@ -3284,18 +3504,18 @@ int getPlaybackSuppressionReason()
    Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    - + @@ -3327,7 +3547,7 @@ int getRepeatMode()
  • setShuffleModeEnabled

    void setShuffleModeEnabled​(boolean shuffleModeEnabled)
    -
    Sets whether shuffling of windows is enabled.
    +
    Sets whether shuffling of media items is enabled.
    Parameters:
    shuffleModeEnabled - Whether shuffling is enabled.
    @@ -3341,7 +3561,7 @@ int getRepeatMode()
  • getShuffleModeEnabled

    boolean getShuffleModeEnabled()
    -
    Returns whether shuffling of windows is enabled.
    +
    Returns whether shuffling of media items is enabled.
    See Also:
    Player.Listener.onShuffleModeEnabledChanged(boolean)
    @@ -3371,9 +3591,9 @@ int getRepeatMode()
  • seekToDefaultPosition

    void seekToDefaultPosition()
    -
    Seeks to the default position associated with the current window. The position can depend on - the type of media being played. For live streams it will typically be the live edge of the - window. For other streams it will typically be the start of the window.
    +
    Seeks to the default position associated with the current MediaItem. The position can + depend on the type of media being played. For live streams it will typically be the live edge. + For other streams it will typically be the start.
  • @@ -3382,17 +3602,17 @@ int getRepeatMode() @@ -3403,11 +3623,11 @@ int getRepeatMode()
  • seekTo

    void seekTo​(long positionMs)
    -
    Seeks to a position specified in milliseconds in the current window.
    +
    Seeks to a position specified in milliseconds in the current MediaItem.
    Parameters:
    -
    positionMs - The seek position in the current window, or C.TIME_UNSET to seek to - the window's default position.
    +
    positionMs - The seek position in the current MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
  • @@ -3417,17 +3637,17 @@ int getRepeatMode()
    • seekTo

      -
      void seekTo​(int windowIndex,
      +
      void seekTo​(int mediaItemIndex,
                   long positionMs)
      -
      Seeks to a position specified in milliseconds in the specified window.
      +
      Seeks to a position specified in milliseconds in the specified MediaItem.
      Parameters:
      -
      windowIndex - The index of the window.
      -
      positionMs - The seek position in the specified window, or C.TIME_UNSET to seek to - the window's default position.
      +
      mediaItemIndex - The index of the MediaItem.
      +
      positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
      Throws:
      IllegalSeekPositionException - If the player has a non-empty timeline and the provided - windowIndex is not within the bounds of the current timeline.
      + mediaItemIndex is not within the bounds of the current timeline.
    @@ -3454,7 +3674,7 @@ int getRepeatMode()
  • seekBack

    void seekBack()
    -
    Seeks back in the current window by getSeekBackIncrement() milliseconds.
    +
    Seeks back in the current MediaItem by getSeekBackIncrement() milliseconds.
  • @@ -3480,7 +3700,8 @@ int getRepeatMode()
  • seekForward

    void seekForward()
    -
    +
    Seeks forward in the current MediaItem by getSeekForwardIncrement() + milliseconds.
  • @@ -3492,7 +3713,7 @@ int getRepeatMode()
    @Deprecated
     boolean hasPrevious()
    Deprecated. -
    Use hasPreviousWindow() instead.
    +
  • @@ -3502,8 +3723,21 @@ boolean hasPrevious()
    • hasPreviousWindow

      -
      boolean hasPreviousWindow()
      -
      Returns whether a previous window exists, which may depend on the current repeat mode and +
      @Deprecated
      +boolean hasPreviousWindow()
      +
      Deprecated. + +
      +
    • +
    + + + +
      +
    • +

      hasPreviousMediaItem

      +
      boolean hasPreviousMediaItem()
      +
      Returns whether a previous media item exists, which may depend on the current repeat mode and whether shuffle mode is enabled.

      Note: When the repeat mode is REPEAT_MODE_ONE, this method behaves the same as when @@ -3520,7 +3754,7 @@ boolean hasPrevious()

      @Deprecated
       void previous()
      Deprecated. - +
    @@ -3530,10 +3764,22 @@ void previous()
    • seekToPreviousWindow

      -
      void seekToPreviousWindow()
      -
      Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled. Does nothing if hasPreviousWindow() is - false. +
      @Deprecated
      +void seekToPreviousWindow()
      +
      Deprecated. + +
      +
    • +
    + + + + @@ -3588,7 +3835,7 @@ void previous()
    @Deprecated
     boolean hasNext()
    Deprecated. -
    Use hasNextWindow() instead.
    +
    Use hasNextMediaItem() instead.
  • @@ -3598,9 +3845,22 @@ boolean hasNext()
    • hasNextWindow

      -
      boolean hasNextWindow()
      -
      Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled. +
      @Deprecated
      +boolean hasNextWindow()
      +
      Deprecated. +
      Use hasNextMediaItem() instead.
      +
      +
    • +
    + + + + @@ -3626,9 +3886,23 @@ void next()
    • seekToNextWindow

      -
      void seekToNextWindow()
      -
      Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled. Does nothing if hasNextWindow() is false. +
      @Deprecated
      +void seekToNextWindow()
      +
      Deprecated. + +
      +
    • +
    + + + + @@ -3871,8 +4193,22 @@ void stop​(boolean reset) + + + +
      +
    • +

      getCurrentMediaItemIndex

      +
      int getCurrentMediaItemIndex()
      +
      Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is + empty.
    @@ -3881,9 +4217,23 @@ void stop​(boolean reset) + + + + @@ -3959,9 +4322,8 @@ void stop​(boolean reset)
  • getCurrentPosition

    long getCurrentPosition()
    -
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
  • @@ -3971,8 +4333,8 @@ void stop​(boolean reset)
  • getBufferedPosition

    long getBufferedPosition()
    -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
  • @@ -3981,8 +4343,10 @@ void stop​(boolean reset)
    • getBufferedPercentage

      -
      int getBufferedPercentage()
      -
      Returns an estimate of the percentage in the current content window or ad up to which data is +
      @IntRange(from=0L,
      +          to=100L)
      +int getBufferedPercentage()
      +
      Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
    @@ -3994,7 +4358,7 @@ void stop​(boolean reset)

    getTotalBufferedDuration

    long getTotalBufferedDuration()
    Returns an estimate of the total buffered duration from the current position, in milliseconds. - This includes pre-buffered data for subsequent ads and windows.
    + This includes pre-buffered data for subsequent ads and
    media items. @@ -4003,9 +4367,22 @@ void stop​(boolean reset) + + + + @@ -155,7 +155,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) -
    Builds the Renderer instances for a SimpleExoPlayer.
    +
    Builds the Renderer instances for an ExoPlayer.
    @@ -186,7 +186,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); AudioRendererEventListener audioRendererEventListener, TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) -
    Builds the Renderer instances for a SimpleExoPlayer.
    +
    Builds the Renderer instances for an ExoPlayer.
    Parameters:
    eventHandler - A handler to use when invoking event listeners and outputs.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html index cb8e403feb..3b18bc8635 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":42,"i1":42,"i2":42,"i3":42,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":42,"i13":42,"i14":42,"i15":42,"i16":42,"i17":42,"i18":42,"i19":42,"i20":42,"i21":42,"i22":42,"i23":42}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -133,11 +133,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    SimpleExoPlayer

    -
    public static final class SimpleExoPlayer.Builder
    +
    @Deprecated
    +public static final class SimpleExoPlayer.Builder
     extends Object
    -
    A builder for SimpleExoPlayer instances. - -

    See Builder(Context) for the list of default values.

    +
    Deprecated. +
    Use ExoPlayer.Builder instead.
    +
    @@ -160,21 +161,27 @@ extends Builder​(Context context) -
    Creates a builder.
    +
    Deprecated. +
    Use Builder(Context) instead.
    +
    Builder​(Context context, ExtractorsFactory extractorsFactory) -
    Creates a builder with a custom ExtractorsFactory.
    + Builder​(Context context, RenderersFactory renderersFactory) -
    Creates a builder with a custom RenderersFactory.
    +
    Deprecated. + +
    @@ -182,7 +189,10 @@ extends RenderersFactory renderersFactory, ExtractorsFactory extractorsFactory)
    -
    Creates a builder with a custom RenderersFactory and ExtractorsFactory.
    + @@ -194,7 +204,11 @@ extends BandwidthMeter bandwidthMeter, AnalyticsCollector analyticsCollector) -
    Creates a builder with the specified custom components.
    + @@ -209,7 +223,7 @@ extends

    Method Summary

    - + @@ -219,21 +233,28 @@ extends SimpleExoPlayer @@ -241,144 +262,191 @@ extends setAudioAttributes​(AudioAttributes audioAttributes, boolean handleAudioFocus) - + - + + + + + +
    All Methods Instance Methods Concrete Methods All Methods Instance Methods Concrete Methods Deprecated Methods 
    Modifier and Type Method build() -
    Builds a SimpleExoPlayer instance.
    +
    Deprecated. + +
    SimpleExoPlayer.Builder experimentalSetForegroundModeTimeoutMs​(long timeoutMs) -
    Set a limit on the time a call to SimpleExoPlayer.setForegroundMode(boolean) can spend.
    +
    SimpleExoPlayer.Builder setAnalyticsCollector​(AnalyticsCollector analyticsCollector) -
    Sets the AnalyticsCollector that will collect and forward all player events.
    +
    -
    Sets AudioAttributes that will be used by the player and whether to handle audio - focus.
    +
    SimpleExoPlayer.Builder setBandwidthMeter​(BandwidthMeter bandwidthMeter) -
    Sets the BandwidthMeter that will be used by the player.
    +
    SimpleExoPlayer.Builder setClock​(Clock clock) -
    Sets the Clock that will be used by the player.
    +
    Deprecated. + +
    SimpleExoPlayer.Builder setDetachSurfaceTimeoutMs​(long detachSurfaceTimeoutMs) -
    Sets a timeout for detaching a surface from the player.
    +
    SimpleExoPlayer.Builder setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy) -
    Sets whether the player should pause automatically when audio is rerouted from a headset to - device speakers.
    +
    SimpleExoPlayer.Builder setLivePlaybackSpeedControl​(LivePlaybackSpeedControl livePlaybackSpeedControl) -
    Sets the LivePlaybackSpeedControl that will control the playback speed when playing - live streams, in order to maintain a steady target offset from the live stream edge.
    +
    SimpleExoPlayer.Builder setLoadControl​(LoadControl loadControl) -
    Sets the LoadControl that will be used by the player.
    +
    SimpleExoPlayer.Builder setLooper​(Looper looper) -
    Sets the Looper that must be used for all calls to the player and that is used to - call listeners on.
    +
    Deprecated. + +
    SimpleExoPlayer.Builder setMediaSourceFactory​(MediaSourceFactory mediaSourceFactory) -
    Sets the MediaSourceFactory that will be used by the player.
    +
    SimpleExoPlayer.Builder setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems) -
    Sets whether to pause playback at the end of each media item.
    +
    SimpleExoPlayer.Builder setPriorityTaskManager​(PriorityTaskManager priorityTaskManager) -
    Sets an PriorityTaskManager that will be used by the player.
    +
    SimpleExoPlayer.Builder setReleaseTimeoutMs​(long releaseTimeoutMs) - +
    SimpleExoPlayer.Builder setSeekBackIncrementMs​(long seekBackIncrementMs) -
    Sets the BasePlayer.seekBack() increment.
    +
    SimpleExoPlayer.Builder setSeekForwardIncrementMs​(long seekForwardIncrementMs) -
    Sets the BasePlayer.seekForward() increment.
    +
    SimpleExoPlayer.Builder setSeekParameters​(SeekParameters seekParameters) -
    Sets the parameters that control how seek operations are performed.
    +
    SimpleExoPlayer.Builder setSkipSilenceEnabled​(boolean skipSilenceEnabled) -
    Sets whether silences silences in the audio stream is enabled.
    +
    SimpleExoPlayer.Builder setTrackSelector​(TrackSelector trackSelector) -
    Sets the TrackSelector that will be used by the player.
    +
    SimpleExoPlayer.Builder setUseLazyPreparation​(boolean useLazyPreparation) -
    Sets whether media sources should be initialized lazily.
    +
    SimpleExoPlayer.BuildersetVideoScalingMode​(int videoScalingMode)setVideoChangeFrameRateStrategy​(int videoChangeFrameRateStrategy) -
    Sets the C.VideoScalingMode that will be used by the player.
    +
    SimpleExoPlayer.BuildersetWakeMode​(int wakeMode)setVideoScalingMode​(int videoScalingMode) -
    Sets the C.WakeMode that will be used by the player.
    +
    Deprecated. + +
    +
    SimpleExoPlayer.BuildersetWakeMode​(@com.google.android.exoplayer2.C.WakeMode int wakeMode) +
    Deprecated. + +
    @@ -411,43 +479,11 @@ extends
  • Builder

    -
    public Builder​(Context context)
    -
    Creates a builder. - -

    Use Builder(Context, RenderersFactory), Builder(Context, - RenderersFactory) or Builder(Context, RenderersFactory, ExtractorsFactory) instead, - if you intend to provide a custom RenderersFactory or a custom ExtractorsFactory. This is to ensure that ProGuard or R8 can remove ExoPlayer's DefaultRenderersFactory and DefaultExtractorsFactory from the APK. - -

    The builder uses the following default values: - -

    -
    -
    Parameters:
    -
    context - A Context.
    -
    +
    @Deprecated
    +public Builder​(Context context)
    +
    Deprecated. +
    Use Builder(Context) instead.
    +
  • @@ -456,17 +492,12 @@ extends
  • Builder

    -
    public Builder​(Context context,
    +
    @Deprecated
    +public Builder​(Context context,
                    RenderersFactory renderersFactory)
    -
    Creates a builder with a custom RenderersFactory. - -

    See Builder(Context) for a list of default values.

    -
    -
    Parameters:
    -
    context - A Context.
    -
    renderersFactory - A factory for creating Renderers to be used by the - player.
    -
    +
    Deprecated. + +
  • @@ -475,17 +506,12 @@ extends
  • Builder

    -
    public Builder​(Context context,
    +
    @Deprecated
    +public Builder​(Context context,
                    ExtractorsFactory extractorsFactory)
    -
    Creates a builder with a custom ExtractorsFactory. - -

    See Builder(Context) for a list of default values.

    -
    -
    Parameters:
    -
    context - A Context.
    -
    extractorsFactory - An ExtractorsFactory used to extract progressive media from - its container.
    -
    +
  • @@ -494,20 +520,14 @@ extends
  • Builder

    -
    public Builder​(Context context,
    +
    @Deprecated
    +public Builder​(Context context,
                    RenderersFactory renderersFactory,
                    ExtractorsFactory extractorsFactory)
    -
    Creates a builder with a custom RenderersFactory and ExtractorsFactory. - -

    See Builder(Context) for a list of default values.

    -
    -
    Parameters:
    -
    context - A Context.
    -
    renderersFactory - A factory for creating Renderers to be used by the - player.
    -
    extractorsFactory - An ExtractorsFactory used to extract progressive media from - its container.
    -
    +
  • @@ -516,28 +536,19 @@ extends
  • Builder

    -
    public Builder​(Context context,
    +
    @Deprecated
    +public Builder​(Context context,
                    RenderersFactory renderersFactory,
                    TrackSelector trackSelector,
                    MediaSourceFactory mediaSourceFactory,
                    LoadControl loadControl,
                    BandwidthMeter bandwidthMeter,
                    AnalyticsCollector analyticsCollector)
    -
    Creates a builder with the specified custom components. - -

    Note that this constructor is only useful to try and ensure that ExoPlayer's default - components can be removed by ProGuard or R8.

    -
    -
    Parameters:
    -
    context - A Context.
    -
    renderersFactory - A factory for creating Renderers to be used by the - player.
    -
    trackSelector - A TrackSelector.
    -
    mediaSourceFactory - A MediaSourceFactory.
    -
    loadControl - A LoadControl.
    -
    bandwidthMeter - A BandwidthMeter.
    -
    analyticsCollector - An AnalyticsCollector.
    -
    +
  • @@ -556,15 +567,12 @@ extends
  • experimentalSetForegroundModeTimeoutMs

    -
    public SimpleExoPlayer.Builder experimentalSetForegroundModeTimeoutMs​(long timeoutMs)
    -
    Set a limit on the time a call to SimpleExoPlayer.setForegroundMode(boolean) can spend. If a call to SimpleExoPlayer.setForegroundMode(boolean) takes more than timeoutMs milliseconds to complete, the player - will raise an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException). - -

    This method is experimental, and will be renamed or removed in a future release.

    -
    -
    Parameters:
    -
    timeoutMs - The time limit in milliseconds.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder experimentalSetForegroundModeTimeoutMs​(long timeoutMs)
    +
  • @@ -573,16 +581,11 @@ extends
  • setTrackSelector

    -
    public SimpleExoPlayer.Builder setTrackSelector​(TrackSelector trackSelector)
    -
    Sets the TrackSelector that will be used by the player.
    -
    -
    Parameters:
    -
    trackSelector - A TrackSelector.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setTrackSelector​(TrackSelector trackSelector)
    +
  • @@ -591,16 +594,11 @@ extends
  • setMediaSourceFactory

    -
    public SimpleExoPlayer.Builder setMediaSourceFactory​(MediaSourceFactory mediaSourceFactory)
    -
    Sets the MediaSourceFactory that will be used by the player.
    -
    -
    Parameters:
    -
    mediaSourceFactory - A MediaSourceFactory.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setMediaSourceFactory​(MediaSourceFactory mediaSourceFactory)
    +
  • @@ -609,16 +607,11 @@ extends
  • setLoadControl

    -
    public SimpleExoPlayer.Builder setLoadControl​(LoadControl loadControl)
    -
    Sets the LoadControl that will be used by the player.
    -
    -
    Parameters:
    -
    loadControl - A LoadControl.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setLoadControl​(LoadControl loadControl)
    +
  • @@ -627,16 +620,11 @@ extends
  • setBandwidthMeter

    -
    public SimpleExoPlayer.Builder setBandwidthMeter​(BandwidthMeter bandwidthMeter)
    -
    Sets the BandwidthMeter that will be used by the player.
    -
    -
    Parameters:
    -
    bandwidthMeter - A BandwidthMeter.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setBandwidthMeter​(BandwidthMeter bandwidthMeter)
    +
  • @@ -645,17 +633,11 @@ extends
  • setLooper

    -
    public SimpleExoPlayer.Builder setLooper​(Looper looper)
    -
    Sets the Looper that must be used for all calls to the player and that is used to - call listeners on.
    -
    -
    Parameters:
    -
    looper - A Looper.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setLooper​(Looper looper)
    +
    Deprecated. + +
  • @@ -664,16 +646,11 @@ extends
  • setAnalyticsCollector

    -
    public SimpleExoPlayer.Builder setAnalyticsCollector​(AnalyticsCollector analyticsCollector)
    -
    Sets the AnalyticsCollector that will collect and forward all player events.
    -
    -
    Parameters:
    -
    analyticsCollector - An AnalyticsCollector.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setAnalyticsCollector​(AnalyticsCollector analyticsCollector)
    +
  • @@ -682,19 +659,13 @@ extends
  • setPriorityTaskManager

    -
    public SimpleExoPlayer.Builder setPriorityTaskManager​(@Nullable
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setPriorityTaskManager​(@Nullable
                                                           PriorityTaskManager priorityTaskManager)
    -
    Sets an PriorityTaskManager that will be used by the player. - -

    The priority C.PRIORITY_PLAYBACK will be set while the player is loading.

    -
    -
    Parameters:
    -
    priorityTaskManager - A PriorityTaskManager, or null to not use one.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
  • @@ -703,48 +674,27 @@ extends
  • setAudioAttributes

    -
    public SimpleExoPlayer.Builder setAudioAttributes​(AudioAttributes audioAttributes,
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setAudioAttributes​(AudioAttributes audioAttributes,
                                                       boolean handleAudioFocus)
    -
    Sets AudioAttributes that will be used by the player and whether to handle audio - focus. - -

    If audio focus should be handled, the AudioAttributes.usage must be C.USAGE_MEDIA or C.USAGE_GAME. Other usages will throw an IllegalArgumentException.

    -
    -
    Parameters:
    -
    audioAttributes - AudioAttributes.
    -
    handleAudioFocus - Whether the player should handle audio focus.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
  • - + @@ -753,19 +703,11 @@ extends
  • setHandleAudioBecomingNoisy

    -
    public SimpleExoPlayer.Builder setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)
    -
    Sets whether the player should pause automatically when audio is rerouted from a headset to - device speakers. See the audio - becoming noisy documentation for more information.
    -
    -
    Parameters:
    -
    handleAudioBecomingNoisy - Whether the player should pause automatically when audio is - rerouted from a headset to device speakers.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)
    +
  • @@ -774,16 +716,11 @@ extends
  • setSkipSilenceEnabled

    -
    public SimpleExoPlayer.Builder setSkipSilenceEnabled​(boolean skipSilenceEnabled)
    -
    Sets whether silences silences in the audio stream is enabled.
    -
    -
    Parameters:
    -
    skipSilenceEnabled - Whether skipping silences is enabled.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setSkipSilenceEnabled​(boolean skipSilenceEnabled)
    +
  • @@ -792,19 +729,26 @@ extends
  • setVideoScalingMode

    -
    public SimpleExoPlayer.Builder setVideoScalingMode​(@VideoScalingMode
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setVideoScalingMode​(@VideoScalingMode
                                                        int videoScalingMode)
    -
    Sets the C.VideoScalingMode that will be used by the player. - -

    Note that the scaling mode only applies if a MediaCodec-based video Renderer is enabled and if the output surface is owned by a SurfaceView.

    -
    -
    Parameters:
    -
    videoScalingMode - A C.VideoScalingMode.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    Deprecated. + +
    +
  • + + + + + @@ -813,20 +757,11 @@ extends
  • setUseLazyPreparation

    -
    public SimpleExoPlayer.Builder setUseLazyPreparation​(boolean useLazyPreparation)
    -
    Sets whether media sources should be initialized lazily. - -

    If false, all initial preparation steps (e.g., manifest loads) happen immediately. If - true, these initial preparations are triggered only when the player starts buffering the - media.

    -
    -
    Parameters:
    -
    useLazyPreparation - Whether to use lazy preparation.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setUseLazyPreparation​(boolean useLazyPreparation)
    +
  • @@ -835,16 +770,11 @@ extends
  • setSeekParameters

    -
    public SimpleExoPlayer.Builder setSeekParameters​(SeekParameters seekParameters)
    -
    Sets the parameters that control how seek operations are performed.
    -
    -
    Parameters:
    -
    seekParameters - The SeekParameters.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setSeekParameters​(SeekParameters seekParameters)
    +
  • @@ -853,18 +783,12 @@ extends
  • setSeekBackIncrementMs

    -
    public SimpleExoPlayer.Builder setSeekBackIncrementMs​(@IntRange(from=1L)
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setSeekBackIncrementMs​(@IntRange(from=1L)
                                                           long seekBackIncrementMs)
    -
    Sets the BasePlayer.seekBack() increment.
    -
    -
    Parameters:
    -
    seekBackIncrementMs - The seek back increment, in milliseconds.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalArgumentException - If seekBackIncrementMs is non-positive.
    -
    IllegalStateException - If build() has already been called.
    -
    +
  • @@ -873,18 +797,12 @@ extends
  • setSeekForwardIncrementMs

    -
    public SimpleExoPlayer.Builder setSeekForwardIncrementMs​(@IntRange(from=1L)
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setSeekForwardIncrementMs​(@IntRange(from=1L)
                                                              long seekForwardIncrementMs)
    -
    Sets the BasePlayer.seekForward() increment.
    -
    -
    Parameters:
    -
    seekForwardIncrementMs - The seek forward increment, in milliseconds.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalArgumentException - If seekForwardIncrementMs is non-positive.
    -
    IllegalStateException - If build() has already been called.
    -
    +
  • @@ -893,19 +811,11 @@ extends
  • setReleaseTimeoutMs

    -
    public SimpleExoPlayer.Builder setReleaseTimeoutMs​(long releaseTimeoutMs)
    - -
    -
    Parameters:
    -
    releaseTimeoutMs - The release timeout, in milliseconds.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setReleaseTimeoutMs​(long releaseTimeoutMs)
    +
  • @@ -914,19 +824,11 @@ extends
  • setDetachSurfaceTimeoutMs

    -
    public SimpleExoPlayer.Builder setDetachSurfaceTimeoutMs​(long detachSurfaceTimeoutMs)
    -
    Sets a timeout for detaching a surface from the player. - -

    If detaching a surface or replacing a surface takes more than - detachSurfaceTimeoutMs to complete, the player will report an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.PlaybackException).

    -
    -
    Parameters:
    -
    detachSurfaceTimeoutMs - The timeout for detaching a surface, in milliseconds.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setDetachSurfaceTimeoutMs​(long detachSurfaceTimeoutMs)
    +
  • @@ -935,18 +837,11 @@ extends
  • setPauseAtEndOfMediaItems

    -
    public SimpleExoPlayer.Builder setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    -
    Sets whether to pause playback at the end of each media item. - -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    -
    -
    Parameters:
    -
    pauseAtEndOfMediaItems - Whether to pause playback at the end of each media item.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    +
  • @@ -955,17 +850,11 @@ extends
  • setLivePlaybackSpeedControl

    -
    public SimpleExoPlayer.Builder setLivePlaybackSpeedControl​(LivePlaybackSpeedControl livePlaybackSpeedControl)
    -
    Sets the LivePlaybackSpeedControl that will control the playback speed when playing - live streams, in order to maintain a steady target offset from the live stream edge.
    -
    -
    Parameters:
    -
    livePlaybackSpeedControl - The LivePlaybackSpeedControl.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setLivePlaybackSpeedControl​(LivePlaybackSpeedControl livePlaybackSpeedControl)
    +
  • @@ -974,17 +863,11 @@ extends
  • setClock

    -
    public SimpleExoPlayer.Builder setClock​(Clock clock)
    -
    Sets the Clock that will be used by the player. Should only be set for testing - purposes.
    -
    -
    Parameters:
    -
    clock - A Clock.
    -
    Returns:
    -
    This builder.
    -
    Throws:
    -
    IllegalStateException - If build() has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer.Builder setClock​(Clock clock)
    +
    Deprecated. + +
  • @@ -993,12 +876,11 @@ extends
  • build

    -
    public SimpleExoPlayer build()
    -
    Builds a SimpleExoPlayer instance.
    -
    -
    Throws:
    -
    IllegalStateException - If this method has already been called.
    -
    +
    @Deprecated
    +public SimpleExoPlayer build()
    +
    Deprecated. + +
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html index 3471b07a47..f9d5724fe1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":42,"i2":10,"i3":42,"i4":42,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":42,"i12":42,"i13":42,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":42,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":42,"i87":42,"i88":10,"i89":10,"i90":42,"i91":10,"i92":42,"i93":42,"i94":10,"i95":10,"i96":42,"i97":42,"i98":42,"i99":42,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109":42,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":10,"i124":10,"i125":10,"i126":10,"i127":10,"i128":42,"i129":10,"i130":10,"i131":10,"i132":10,"i133":10,"i134":10,"i135":10,"i136":10,"i137":42}; +var data = {"i0":42,"i1":42,"i2":42,"i3":42,"i4":42,"i5":42,"i6":42,"i7":42,"i8":42,"i9":42,"i10":42,"i11":42,"i12":42,"i13":42,"i14":42,"i15":42,"i16":42,"i17":42,"i18":42,"i19":42,"i20":42,"i21":42,"i22":42,"i23":42,"i24":42,"i25":42,"i26":42,"i27":42,"i28":42,"i29":42,"i30":42,"i31":42,"i32":42,"i33":42,"i34":42,"i35":42,"i36":42,"i37":42,"i38":42,"i39":42,"i40":42,"i41":42,"i42":42,"i43":42,"i44":42,"i45":42,"i46":42,"i47":42,"i48":42,"i49":42,"i50":42,"i51":42,"i52":42,"i53":42,"i54":42,"i55":42,"i56":42,"i57":42,"i58":42,"i59":42,"i60":42,"i61":42,"i62":42,"i63":42,"i64":42,"i65":42,"i66":42,"i67":42,"i68":42,"i69":42,"i70":42,"i71":42,"i72":42,"i73":42,"i74":42,"i75":42,"i76":42,"i77":42,"i78":42,"i79":42,"i80":42,"i81":42,"i82":42,"i83":42,"i84":42,"i85":42,"i86":42,"i87":42,"i88":42,"i89":42,"i90":42,"i91":42,"i92":42,"i93":42,"i94":42,"i95":42,"i96":42,"i97":42,"i98":42,"i99":42,"i100":42,"i101":42,"i102":42,"i103":42,"i104":42,"i105":42,"i106":42,"i107":42,"i108":42,"i109":42,"i110":42,"i111":42,"i112":42,"i113":42,"i114":42,"i115":42,"i116":42,"i117":42,"i118":42,"i119":42,"i120":42,"i121":42,"i122":42,"i123":42,"i124":42,"i125":42,"i126":42,"i127":42,"i128":42,"i129":42,"i130":42,"i131":42}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -135,14 +135,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    ExoPlayer, ExoPlayer.AudioComponent, ExoPlayer.DeviceComponent, ExoPlayer.MetadataComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent, Player
    +
    ExoPlayer, ExoPlayer.AudioComponent, ExoPlayer.DeviceComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent, Player

    -
    public class SimpleExoPlayer
    +
    @Deprecated
    +public class SimpleExoPlayer
     extends BasePlayer
    -implements ExoPlayer, ExoPlayer.AudioComponent, ExoPlayer.VideoComponent, ExoPlayer.TextComponent, ExoPlayer.MetadataComponent, ExoPlayer.DeviceComponent
    -
    An ExoPlayer implementation that uses default Renderer components. Instances can - be obtained from SimpleExoPlayer.Builder.
    +implements ExoPlayer, ExoPlayer.AudioComponent, ExoPlayer.VideoComponent, ExoPlayer.TextComponent, ExoPlayer.DeviceComponent
    +
    Deprecated. +
    Use ExoPlayer instead.
    +
  • @@ -167,7 +169,9 @@ implements static class  SimpleExoPlayer.Builder -
    A builder for SimpleExoPlayer instances.
    +
    Deprecated. +
    Use ExoPlayer.Builder instead.
    +
    @@ -176,7 +180,7 @@ implements ExoPlayer -ExoPlayer.AudioComponent, ExoPlayer.AudioOffloadListener, ExoPlayer.DeviceComponent, ExoPlayer.MetadataComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent +ExoPlayer.AudioComponent, ExoPlayer.AudioOffloadListener, ExoPlayer.DeviceComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent @@ -267,14 +266,16 @@ implements Looper applicationLooper)
    Deprecated. - +
    protected SimpleExoPlayer​(SimpleExoPlayer.Builder builder) -  + +
    Deprecated.
    +  @@ -298,623 +299,672 @@ implements void addAnalyticsListener​(AnalyticsListener listener) +
    Deprecated.
    Adds an AnalyticsListener to receive analytics events.
    void -addAudioListener​(AudioListener listener) - -
    Deprecated.
    - - - -void addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener) +
    Deprecated.
    Adds a listener to receive audio offload events.
    - -void -addDeviceListener​(DeviceListener listener) - -
    Deprecated.
    - - - + void addListener​(Player.EventListener listener)
    Deprecated.
    - + void addListener​(Player.Listener listener) +
    Deprecated.
    Registers a listener to receive all events from the player.
    - + void addMediaItems​(int index, List<MediaItem> mediaItems) +
    Deprecated.
    Adds a list of media items at the given index of the playlist.
    - + void addMediaSource​(int index, MediaSource mediaSource) +
    Deprecated.
    Adds a media source at the given index of the playlist.
    - + void addMediaSource​(MediaSource mediaSource) +
    Deprecated.
    Adds a media source to the end of the playlist.
    - + void addMediaSources​(int index, List<MediaSource> mediaSources) +
    Deprecated.
    Adds a list of media sources at the given index of the playlist.
    + +void +addMediaSources​(List<MediaSource> mediaSources) + +
    Deprecated.
    +
    Adds a list of media sources to the end of the playlist.
    + + + +void +clearAuxEffectInfo() + +
    Deprecated.
    +
    Detaches any previously attached auxiliary audio effect from the underlying audio track.
    + + void -addMediaSources​(List<MediaSource> mediaSources) +clearCameraMotionListener​(CameraMotionListener listener) -
    Adds a list of media sources to the end of the playlist.
    +
    Deprecated.
    +
    Clears the listener which receives camera motion events if it matches the one passed.
    void -addMetadataOutput​(MetadataOutput output) +clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    Deprecated.
    +
    Clears the listener which receives video frame metadata events if it matches the one passed.
    void -addTextOutput​(TextOutput listener) - -
    Deprecated.
    - - - -void -addVideoListener​(VideoListener listener) - -
    Deprecated.
    - - - -void -clearAuxEffectInfo() - -
    Detaches any previously attached auxiliary audio effect from the underlying audio track.
    - - - -void -clearCameraMotionListener​(CameraMotionListener listener) - -
    Clears the listener which receives camera motion events if it matches the one passed.
    - - - -void -clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener) - -
    Clears the listener which receives video frame metadata events if it matches the one passed.
    - - - -void clearVideoSurface() +
    Deprecated.
    Clears any Surface, SurfaceHolder, SurfaceView or TextureView currently set on the player.
    - + void clearVideoSurface​(Surface surface) +
    Deprecated.
    Clears the Surface onto which video is being rendered if it matches the one passed.
    - + void clearVideoSurfaceHolder​(SurfaceHolder surfaceHolder) +
    Deprecated.
    Clears the SurfaceHolder that holds the Surface onto which video is being rendered if it matches the one passed.
    - + void clearVideoSurfaceView​(SurfaceView surfaceView) +
    Deprecated.
    Clears the SurfaceView onto which video is being rendered if it matches the one passed.
    - + void clearVideoTextureView​(TextureView textureView) +
    Deprecated.
    Clears the TextureView onto which video is being rendered if it matches the one passed.
    - + PlayerMessage createMessage​(PlayerMessage.Target target) +
    Deprecated.
    Creates a message that can be sent to a PlayerMessage.Target.
    - + void decreaseDeviceVolume() +
    Deprecated.
    Decreases the volume of the device.
    - + boolean experimentalIsSleepingForOffload() +
    Deprecated.
    Returns whether the player has paused its main loop to save power in offload scheduling mode.
    - + void experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled) +
    Deprecated.
    Sets whether audio offload scheduling is enabled.
    - + AnalyticsCollector getAnalyticsCollector() +
    Deprecated.
    Returns the AnalyticsCollector used for collecting analytics events.
    - + Looper getApplicationLooper() +
    Deprecated.
    Returns the Looper associated with the application thread that's used to access the player and on which player events are received.
    - + AudioAttributes getAudioAttributes() +
    Deprecated.
    Returns the attributes for audio playback.
    - + ExoPlayer.AudioComponent getAudioComponent() -
    Returns the component of this player for audio output, or null if audio is not supported.
    - +
    Deprecated.
    +  - + DecoderCounters getAudioDecoderCounters() +
    Deprecated.
    Returns DecoderCounters for audio, or null if no audio is being played.
    - + Format getAudioFormat() +
    Deprecated.
    Returns the audio format currently being played, or null if no audio is being played.
    - + int getAudioSessionId() +
    Deprecated.
    Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
    - + Player.Commands getAvailableCommands() +
    Deprecated.
    Returns the player's currently available Player.Commands.
    - + long getBufferedPosition() -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Deprecated.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
    - + Clock getClock() +
    Deprecated.
    Returns the Clock used for playback.
    - + long getContentBufferedPosition() +
    Deprecated.
    If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds.
    + the current content up to which data is buffered, in milliseconds. - + long getContentPosition() +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the content position that will be played once all ads in the ad group have finished playing, in milliseconds.
    - + int getCurrentAdGroupIndex() +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the index of the ad group in the period currently being played.
    - + int getCurrentAdIndexInAdGroup() +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the index of the ad in its ad group.
    - + List<Cue> getCurrentCues() +
    Deprecated.
    Returns the current Cues.
    - + int -getCurrentPeriodIndex() +getCurrentMediaItemIndex() -
    Returns the index of the period currently being played.
    - - - -long -getCurrentPosition() - -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is +
    Deprecated.
    +
    Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is empty.
    - -List<Metadata> -getCurrentStaticMetadata() + +int +getCurrentPeriodIndex()
    Deprecated.
    +
    Returns the index of the period currently being played.
    - + +long +getCurrentPosition() + +
    Deprecated.
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
    + + + Timeline getCurrentTimeline() +
    Deprecated.
    Returns the current Timeline.
    - + TrackGroupArray getCurrentTrackGroups() +
    Deprecated.
    Returns the available track groups.
    - + TrackSelectionArray getCurrentTrackSelections() +
    Deprecated.
    Returns the current track selections.
    - -int -getCurrentWindowIndex() + +TracksInfo +getCurrentTracksInfo() -
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    +
    Deprecated.
    +
    Returns the available tracks, as well as the tracks' support, type, and selection status.
    - + ExoPlayer.DeviceComponent getDeviceComponent() -
    Returns the component of this player for playback device, or null if it's not supported.
    - +
    Deprecated.
    +  - -DeviceInfo + +DeviceInfo getDeviceInfo() +
    Deprecated.
    Gets the device information.
    - + int getDeviceVolume() +
    Deprecated.
    Gets the current volume of the device.
    - + long getDuration() -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    +
    Deprecated.
    +
    Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
    - -int + +long getMaxSeekToPreviousPosition() -
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous window, - in milliseconds.
    +
    Deprecated.
    +
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous MediaItem, in milliseconds.
    - + MediaMetadata getMediaMetadata() +
    Deprecated.
    Returns the current combined MediaMetadata, or MediaMetadata.EMPTY if not supported.
    - -ExoPlayer.MetadataComponent -getMetadataComponent() - -
    Returns the component of this player for metadata output, or null if metadata is not supported.
    - - - + boolean getPauseAtEndOfMediaItems() +
    Deprecated.
    Returns whether the player pauses playback at the end of each media item.
    - + Looper getPlaybackLooper() +
    Deprecated.
    Returns the Looper associated with the playback thread.
    - + PlaybackParameters getPlaybackParameters() +
    Deprecated.
    Returns the currently active playback parameters.
    - -int + +@com.google.android.exoplayer2.Player.State int getPlaybackState() +
    Deprecated.
    Returns the current playback state of the player.
    - -int + +@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int getPlaybackSuppressionReason() +
    Deprecated.
    Returns the reason why playback is suppressed even though Player.getPlayWhenReady() is true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    - + ExoPlaybackException getPlayerError() +
    Deprecated.
    Equivalent to Player.getPlayerError(), except the exception is guaranteed to be an ExoPlaybackException.
    - + MediaMetadata getPlaylistMetadata() +
    Deprecated.
    Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    - + boolean getPlayWhenReady() +
    Deprecated.
    Whether playback will proceed when Player.getPlaybackState() == Player.STATE_READY.
    - + int getRendererCount() +
    Deprecated.
    Returns the number of renderers.
    - -int + +@com.google.android.exoplayer2.C.TrackType int getRendererType​(int index) +
    Deprecated.
    Returns the track type that the renderer at a given index handles.
    - -int + +@com.google.android.exoplayer2.Player.RepeatMode int getRepeatMode() +
    Deprecated.
    Returns the current Player.RepeatMode used for playback.
    - + long getSeekBackIncrement() +
    Deprecated.
    Returns the Player.seekBack() increment.
    - + long getSeekForwardIncrement() +
    Deprecated.
    Returns the Player.seekForward() increment.
    - + SeekParameters getSeekParameters() +
    Deprecated.
    Returns the currently active SeekParameters of the player.
    - + boolean getShuffleModeEnabled() -
    Returns whether shuffling of windows is enabled.
    +
    Deprecated.
    +
    Returns whether shuffling of media items is enabled.
    - + boolean getSkipSilenceEnabled() +
    Deprecated.
    Returns whether skipping silences in the audio stream is enabled.
    - + ExoPlayer.TextComponent getTextComponent() -
    Returns the component of this player for text output, or null if text is not supported.
    - +
    Deprecated.
    +  - + long getTotalBufferedDuration() +
    Deprecated.
    Returns an estimate of the total buffered duration from the current position, in milliseconds.
    - + +TrackSelectionParameters +getTrackSelectionParameters() + +
    Deprecated.
    +
    Returns the parameters constraining the track selection.
    + + + TrackSelector getTrackSelector() +
    Deprecated.
    Returns the track selector that this player uses, or null if track selection is not supported.
    - + +int +getVideoChangeFrameRateStrategy() + +
    Deprecated.
    + + + + ExoPlayer.VideoComponent getVideoComponent() -
    Returns the component of this player for video output, or null if video is not supported.
    - +
    Deprecated.
    +  - + DecoderCounters getVideoDecoderCounters() +
    Deprecated.
    Returns DecoderCounters for video, or null if no video is being played.
    - + Format getVideoFormat() +
    Deprecated.
    Returns the video format currently being played, or null if no video is being played.
    - + int getVideoScalingMode() +
    Deprecated.
    Returns the C.VideoScalingMode.
    - + VideoSize getVideoSize() +
    Deprecated.
    Gets the size of the video.
    - + float getVolume() +
    Deprecated.
    Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    - + void increaseDeviceVolume() +
    Deprecated.
    Increases the volume of the device.
    - + boolean isDeviceMuted() +
    Deprecated.
    Gets whether the device is muted or not.
    - + boolean isLoading() +
    Deprecated.
    Whether the player is currently loading the source.
    - + boolean isPlayingAd() +
    Deprecated.
    Returns whether the player is currently playing an ad.
    - + void moveMediaItems​(int fromIndex, int toIndex, int newIndex) +
    Deprecated.
    Moves the media item range to the new index.
    - + void prepare() +
    Deprecated.
    Prepares the player.
    - + void prepare​(MediaSource mediaSource) @@ -923,7 +973,7 @@ implements + void prepare​(MediaSource mediaSource, boolean resetPosition, @@ -935,85 +985,55 @@ implements + void release() +
    Deprecated.
    Releases the player.
    - + void removeAnalyticsListener​(AnalyticsListener listener) +
    Deprecated.
    Removes an AnalyticsListener.
    - -void -removeAudioListener​(AudioListener listener) - -
    Deprecated.
    - - - + void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener) +
    Deprecated.
    Removes a listener of audio offload events.
    - -void -removeDeviceListener​(DeviceListener listener) - -
    Deprecated.
    - - - + void removeListener​(Player.EventListener listener)
    Deprecated.
    - + void removeListener​(Player.Listener listener) +
    Deprecated.
    Unregister a listener registered through Player.addListener(Listener).
    - + void removeMediaItems​(int fromIndex, int toIndex) +
    Deprecated.
    Removes a range of media items from the playlist.
    - -void -removeMetadataOutput​(MetadataOutput output) - -
    Deprecated.
    - - - -void -removeTextOutput​(TextOutput listener) - -
    Deprecated.
    - - - -void -removeVideoListener​(VideoListener listener) - -
    Deprecated.
    - - - + void retry() @@ -1022,285 +1042,342 @@ implements + void -seekTo​(int windowIndex, +seekTo​(int mediaItemIndex, long positionMs) -
    Seeks to a position specified in milliseconds in the specified window.
    +
    Deprecated.
    +
    Seeks to a position specified in milliseconds in the specified MediaItem.
    - + void setAudioAttributes​(AudioAttributes audioAttributes, boolean handleAudioFocus) +
    Deprecated.
    Sets the attributes for audio playback, used by the underlying audio track.
    - + void setAudioSessionId​(int audioSessionId) +
    Deprecated.
    Sets the ID of the audio session to attach to the underlying AudioTrack.
    - + void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo) +
    Deprecated.
    Sets information on an auxiliary audio effect to attach to the underlying audio track.
    - + void setCameraMotionListener​(CameraMotionListener listener) +
    Deprecated.
    Sets a listener of camera motion events.
    - + void setDeviceMuted​(boolean muted) +
    Deprecated.
    Sets the mute state of the device.
    - + void setDeviceVolume​(int volume) +
    Deprecated.
    Sets the volume of the device.
    - + void setForegroundMode​(boolean foregroundMode) +
    Deprecated.
    Sets whether the player is allowed to keep holding limited resources such as video decoders, even when in the idle state.
    - + void setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy) +
    Deprecated.
    Sets whether the player should pause automatically when audio is rerouted from a headset to device speakers.
    - + void setHandleWakeLock​(boolean handleWakeLock) -
    Deprecated. -
    Use setWakeMode(int) instead.
    -
    +
    Deprecated.
    - + void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) +
    Deprecated.
    Clears the playlist and adds the specified MediaItems.
    - + void setMediaItems​(List<MediaItem> mediaItems, - int startWindowIndex, + int startIndex, long startPositionMs) +
    Deprecated.
    Clears the playlist and adds the specified MediaItems.
    - + void setMediaSource​(MediaSource mediaSource) +
    Deprecated.
    Clears the playlist, adds the specified MediaSource and resets the position to the default position.
    - + void setMediaSource​(MediaSource mediaSource, boolean resetPosition) +
    Deprecated.
    Clears the playlist and adds the specified MediaSource.
    - + void setMediaSource​(MediaSource mediaSource, long startPositionMs) +
    Deprecated.
    Clears the playlist and adds the specified MediaSource.
    - + void setMediaSources​(List<MediaSource> mediaSources) +
    Deprecated.
    Clears the playlist, adds the specified MediaSources and resets the position to the default position.
    - + void setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition) +
    Deprecated.
    Clears the playlist and adds the specified MediaSources.
    + +void +setMediaSources​(List<MediaSource> mediaSources, + int startMediaItemIndex, + long startPositionMs) + +
    Deprecated.
    +
    Clears the playlist and adds the specified MediaSources.
    + + + +void +setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems) + +
    Deprecated.
    +
    Sets whether to pause playback at the end of each media item.
    + + + +void +setPlaybackParameters​(PlaybackParameters playbackParameters) + +
    Deprecated.
    +
    Attempts to set the playback parameters.
    + + + +void +setPlaylistMetadata​(MediaMetadata mediaMetadata) + +
    Deprecated.
    +
    Sets the playlist MediaMetadata.
    + + + +void +setPlayWhenReady​(boolean playWhenReady) + +
    Deprecated.
    +
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    + + + +void +setPriorityTaskManager​(PriorityTaskManager priorityTaskManager) + +
    Deprecated.
    +
    Sets a PriorityTaskManager, or null to clear a previously set priority task manager.
    + + + +void +setRepeatMode​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode) + +
    Deprecated.
    +
    Sets the Player.RepeatMode to be used for playback.
    + + + +void +setSeekParameters​(SeekParameters seekParameters) + +
    Deprecated.
    +
    Sets the parameters that control how seek operations are performed.
    + + + +void +setShuffleModeEnabled​(boolean shuffleModeEnabled) + +
    Deprecated.
    +
    Sets whether shuffling of media items is enabled.
    + + void -setMediaSources​(List<MediaSource> mediaSources, - int startWindowIndex, - long startPositionMs) +setShuffleOrder​(ShuffleOrder shuffleOrder) -
    Clears the playlist and adds the specified MediaSources.
    +
    Deprecated.
    +
    Sets the shuffle order.
    void -setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems) +setSkipSilenceEnabled​(boolean skipSilenceEnabled) -
    Sets whether to pause playback at the end of each media item.
    +
    Deprecated.
    +
    Sets whether skipping silences in the audio stream is enabled.
    void -setPlaybackParameters​(PlaybackParameters playbackParameters) +setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread) -
    Attempts to set the playback parameters.
    +
    Deprecated.
    void -setPlaylistMetadata​(MediaMetadata mediaMetadata) +setTrackSelectionParameters​(TrackSelectionParameters parameters) -
    Sets the playlist MediaMetadata.
    +
    Deprecated.
    +
    Sets the parameters constraining the track selection.
    void -setPlayWhenReady​(boolean playWhenReady) +setVideoChangeFrameRateStrategy​(int videoChangeFrameRateStrategy) -
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    +
    Deprecated.
    +
    Sets a C.VideoChangeFrameRateStrategy that will be used by the player when provided + with a video output Surface.
    void -setPriorityTaskManager​(PriorityTaskManager priorityTaskManager) +setVideoFrameMetadataListener​(VideoFrameMetadataListener listener) -
    Sets a PriorityTaskManager, or null to clear a previously set priority task manager.
    +
    Deprecated.
    +
    Sets a listener to receive video frame metadata events.
    void -setRepeatMode​(int repeatMode) +setVideoScalingMode​(int videoScalingMode) -
    Sets the Player.RepeatMode to be used for playback.
    +
    Deprecated.
    + void -setSeekParameters​(SeekParameters seekParameters) +setVideoSurface​(Surface surface) -
    Sets the parameters that control how seek operations are performed.
    +
    Deprecated.
    +
    Sets the Surface onto which video will be rendered.
    void -setShuffleModeEnabled​(boolean shuffleModeEnabled) - -
    Sets whether shuffling of windows is enabled.
    - - - -void -setShuffleOrder​(ShuffleOrder shuffleOrder) - -
    Sets the shuffle order.
    - - - -void -setSkipSilenceEnabled​(boolean skipSilenceEnabled) - -
    Sets whether skipping silences in the audio stream is enabled.
    - - - -void -setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread) - -
    Deprecated. -
    Disabling the enforcement can result in hard-to-detect bugs.
    -
    - - - -void -setVideoFrameMetadataListener​(VideoFrameMetadataListener listener) - -
    Sets a listener to receive video frame metadata events.
    - - - -void -setVideoScalingMode​(int videoScalingMode) - -
    Sets the video scaling mode.
    - - - -void -setVideoSurface​(Surface surface) - -
    Sets the Surface onto which video will be rendered.
    - - - -void setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) +
    Deprecated.
    Sets the SurfaceHolder that holds the Surface onto which video will be rendered.
    - + void setVideoSurfaceView​(SurfaceView surfaceView) +
    Deprecated.
    Sets the SurfaceView onto which video will be rendered.
    - + void setVideoTextureView​(TextureView textureView) +
    Deprecated.
    Sets the TextureView onto which video will be rendered.
    - + void -setVolume​(float audioVolume) +setVolume​(float volume) -
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    +
    Deprecated.
    +
    Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
    - + void -setWakeMode​(int wakeMode) +setWakeMode​(@com.google.android.exoplayer2.C.WakeMode int wakeMode) +
    Deprecated.
    Sets how the player should keep the device awake for playback when the screen is off.
    - + +void +stop() + +
    Deprecated.
    +
    Stops playback without resetting the player.
    + + + void stop​(boolean reset) @@ -1313,7 +1390,7 @@ implements BasePlayer -addMediaItem, addMediaItem, addMediaItems, clearMediaItems, getAvailableCommands, getBufferedPercentage, getContentDuration, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getMediaItemAt, getMediaItemCount, getNextWindowIndex, getPreviousWindowIndex, hasNext, hasNextWindow, hasPrevious, hasPreviousWindow, isCommandAvailable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isPlaying, moveMediaItem, next, pause, play, previous, removeMediaItem, seekBack, seekForward, seekTo, seekToDefaultPosition, seekToDefaultPosition, seekToNext, seekToNextWindow, seekToPrevious, seekToPreviousWindow, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setPlaybackSpeed, stop +addMediaItem, addMediaItem, addMediaItems, canAdvertiseSession, clearMediaItems, getAvailableCommands, getBufferedPercentage, getContentDuration, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getCurrentWindowIndex, getMediaItemAt, getMediaItemCount, getNextMediaItemIndex, getNextWindowIndex, getPreviousMediaItemIndex, getPreviousWindowIndex, hasNext, hasNextMediaItem, hasNextWindow, hasPrevious, hasPreviousMediaItem, hasPreviousWindow, isCommandAvailable, isCurrentMediaItemDynamic, isCurrentMediaItemLive, isCurrentMediaItemSeekable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isPlaying, moveMediaItem, next, pause, play, previous, removeMediaItem, seekBack, seekForward, seekTo, seekToDefaultPosition, seekToDefaultPosition, seekToNext, seekToNextMediaItem, seekToNextWindow, seekToPrevious, seekToPreviousMediaItem, seekToPreviousWindow, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setPlaybackSpeed @@ -1345,20 +1422,6 @@ implements - - -
      -
    • -

      DEFAULT_DETACH_SURFACE_TIMEOUT_MS

      -
      public static final long DEFAULT_DETACH_SURFACE_TIMEOUT_MS
      -
      The default timeout for detaching a surface from the player, in milliseconds.
      -
      -
      See Also:
      -
      Constant Field Values
      -
      -
    • -
    @@ -1366,6 +1429,7 @@ implements

    renderers

    protected final Renderer[] renderers
    +
    Deprecated.
    @@ -1396,7 +1460,7 @@ protected SimpleExoPlayer​(Clock clock, Looper applicationLooper)
    Deprecated. - +
    @@ -1407,6 +1471,7 @@ protected SimpleExoPlayer​(

    SimpleExoPlayer

    protected SimpleExoPlayer​(SimpleExoPlayer.Builder builder)
    +
    Deprecated.
    Parameters:
    builder - The SimpleExoPlayer.Builder to obtain all construction parameters.
    @@ -1430,6 +1495,7 @@ protected SimpleExoPlayer​(

    experimentalSetOffloadSchedulingEnabled

    public void experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled)
    +
    Deprecated.
    Sets whether audio offload scheduling is enabled. If enabled, ExoPlayer's main loop will run as rarely as possible when playing an audio stream using audio offload. @@ -1476,6 +1542,7 @@ protected SimpleExoPlayer​(

    experimentalIsSleepingForOffload

    public boolean experimentalIsSleepingForOffload()
    +
    Deprecated.
    Returns whether the player has paused its main loop to save power in offload scheduling mode.
    @@ -1495,8 +1562,7 @@ protected SimpleExoPlayer​(@Nullable public ExoPlayer.AudioComponent getAudioComponent() -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for audio output, or null if audio is not supported.
    +
    Deprecated.
    Specified by:
    getAudioComponent in interface ExoPlayer
    @@ -1511,8 +1577,7 @@ public @Nullable public ExoPlayer.VideoComponent getVideoComponent() -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for video output, or null if video is not supported.
    +
    Deprecated.
    Specified by:
    getVideoComponent in interface ExoPlayer
    @@ -1527,30 +1592,13 @@ public @Nullable public ExoPlayer.TextComponent getTextComponent() -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for text output, or null if text is not supported.
    +
    Deprecated.
    Specified by:
    getTextComponent in interface ExoPlayer
    - - - - @@ -1559,8 +1607,7 @@ public @Nullable public ExoPlayer.DeviceComponent getDeviceComponent() -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for playback device, or null if it's not supported.
    +
    Deprecated.
    Specified by:
    getDeviceComponent in interface ExoPlayer
    @@ -1575,12 +1622,16 @@ public public void setVideoScalingMode​(@VideoScalingMode int videoScalingMode) -
    Sets the video scaling mode. +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    +
    Sets the C.VideoScalingMode. -

    Note that the scaling mode only applies if a MediaCodec-based video Renderer - is enabled and if the output surface is owned by a SurfaceView.

    +

    The scaling mode only applies if a MediaCodec-based video Renderer is + enabled and if the output surface is owned by a SurfaceView.

    Specified by:
    +
    setVideoScalingMode in interface ExoPlayer
    +
    Specified by:
    setVideoScalingMode in interface ExoPlayer.VideoComponent
    Parameters:
    videoScalingMode - The C.VideoScalingMode.
    @@ -1595,14 +1646,64 @@ public @VideoScalingMode public int getVideoScalingMode() -
    Description copied from interface: ExoPlayer.VideoComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns the C.VideoScalingMode.
    Specified by:
    +
    getVideoScalingMode in interface ExoPlayer
    +
    Specified by:
    getVideoScalingMode in interface ExoPlayer.VideoComponent
    + + + + + + + + @@ -1610,6 +1711,7 @@ public int getVideoScalingMode()
  • getVideoSize

    public VideoSize getVideoSize()
    +
    Deprecated.
    Description copied from interface: Player
    Gets the size of the video. @@ -1632,6 +1734,7 @@ public int getVideoScalingMode()
  • clearVideoSurface

    public void clearVideoSurface()
    +
    Deprecated.
    Description copied from interface: Player
    Clears any Surface, SurfaceHolder, SurfaceView or TextureView currently set on the player.
    @@ -1651,6 +1754,7 @@ public int getVideoScalingMode()

    clearVideoSurface

    public void clearVideoSurface​(@Nullable
                                   Surface surface)
    +
    Deprecated.
    Description copied from interface: Player
    Clears the Surface onto which video is being rendered if it matches the one passed. Else does nothing.
    @@ -1672,6 +1776,7 @@ public int getVideoScalingMode()

    setVideoSurface

    public void setVideoSurface​(@Nullable
                                 Surface surface)
    +
    Deprecated.
    Description copied from interface: Player
    Sets the Surface onto which video will be rendered. The caller is responsible for tracking the lifecycle of the surface, and must clear the surface by calling @@ -1698,6 +1803,7 @@ public int getVideoScalingMode()

    setVideoSurfaceHolder

    public void setVideoSurfaceHolder​(@Nullable
                                       SurfaceHolder surfaceHolder)
    +
    Deprecated.
    Description copied from interface: Player
    Sets the SurfaceHolder that holds the Surface onto which video will be rendered. The player will track the lifecycle of the surface automatically. @@ -1722,6 +1828,7 @@ public int getVideoScalingMode()

    clearVideoSurfaceHolder

    public void clearVideoSurfaceHolder​(@Nullable
                                         SurfaceHolder surfaceHolder)
    +
    Deprecated.
    Description copied from interface: Player
    Clears the SurfaceHolder that holds the Surface onto which video is being rendered if it matches the one passed. Else does nothing.
    @@ -1743,6 +1850,7 @@ public int getVideoScalingMode()

    setVideoSurfaceView

    public void setVideoSurfaceView​(@Nullable
                                     SurfaceView surfaceView)
    +
    Deprecated.
    Description copied from interface: Player
    Sets the SurfaceView onto which video will be rendered. The player will track the lifecycle of the surface automatically. @@ -1767,6 +1875,7 @@ public int getVideoScalingMode()

    clearVideoSurfaceView

    public void clearVideoSurfaceView​(@Nullable
                                       SurfaceView surfaceView)
    +
    Deprecated.
    Description copied from interface: Player
    Clears the SurfaceView onto which video is being rendered if it matches the one passed. Else does nothing.
    @@ -1788,6 +1897,7 @@ public int getVideoScalingMode()

    setVideoTextureView

    public void setVideoTextureView​(@Nullable
                                     TextureView textureView)
    +
    Deprecated.
    Description copied from interface: Player
    Sets the TextureView onto which video will be rendered. The player will track the lifecycle of the surface automatically. @@ -1812,6 +1922,7 @@ public int getVideoScalingMode()

    clearVideoTextureView

    public void clearVideoTextureView​(@Nullable
                                       TextureView textureView)
    +
    Deprecated.
    Description copied from interface: Player
    Clears the TextureView onto which video is being rendered if it matches the one passed. Else does nothing.
    @@ -1832,6 +1943,7 @@ public int getVideoScalingMode()
  • addAudioOffloadListener

    public void addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Adds a listener to receive audio offload events.
    @@ -1849,6 +1961,7 @@ public int getVideoScalingMode()
  • removeAudioOffloadListener

    public void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Removes a listener of audio offload events.
    @@ -1859,44 +1972,6 @@ public int getVideoScalingMode()
  • - - - - - - - - @@ -1905,7 +1980,8 @@ public void removeAudioListener​(public void setAudioAttributes​(AudioAttributes audioAttributes, boolean handleAudioFocus) -
    Description copied from interface: ExoPlayer.AudioComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets the attributes for audio playback, used by the underlying audio track. If not set, the default audio attributes will be used. They are suitable for general media playback. @@ -1915,13 +1991,15 @@ public void removeAudioListener​(Util.getStreamTypeForAudioUsage(int). +

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

    If audio focus should be handled, the AudioAttributes.usage must be C.USAGE_MEDIA or C.USAGE_GAME. Other usages will throw an IllegalArgumentException.

    Specified by:
    +
    setAudioAttributes in interface ExoPlayer
    +
    Specified by:
    setAudioAttributes in interface ExoPlayer.AudioComponent
    Parameters:
    audioAttributes - The attributes to use for audio playback.
    @@ -1936,6 +2014,7 @@ public void removeAudioListener​(

    getAudioAttributes

    public AudioAttributes getAudioAttributes()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the attributes for audio playback.
    @@ -1953,17 +2032,20 @@ public void removeAudioListener​(

    setAudioSessionId

    public void setAudioSessionId​(int audioSessionId)
    -
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets the ID of the audio session to attach to the underlying AudioTrack. -

    The audio session ID can be generated using C.generateAudioSessionIdV21(Context) +

    The audio session ID can be generated using Util.generateAudioSessionIdV21(Context) for API 21+.

    Specified by:
    +
    setAudioSessionId in interface ExoPlayer
    +
    Specified by:
    setAudioSessionId in interface ExoPlayer.AudioComponent
    Parameters:
    -
    audioSessionId - The audio session ID, or C.AUDIO_SESSION_ID_UNSET if it should - be generated by the framework.
    +
    audioSessionId - The audio session ID, or C.AUDIO_SESSION_ID_UNSET if it should be + generated by the framework.
  • @@ -1974,10 +2056,13 @@ public void removeAudioListener​(

    getAudioSessionId

    public int getAudioSessionId()
    -
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
    Specified by:
    +
    getAudioSessionId in interface ExoPlayer
    +
    Specified by:
    getAudioSessionId in interface ExoPlayer.AudioComponent
    @@ -1989,10 +2074,13 @@ public void removeAudioListener​(

    setAuxEffectInfo

    public void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)
    -
    Description copied from interface: ExoPlayer.AudioComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets information on an auxiliary audio effect to attach to the underlying audio track.
    Specified by:
    +
    setAuxEffectInfo in interface ExoPlayer
    +
    Specified by:
    setAuxEffectInfo in interface ExoPlayer.AudioComponent
    @@ -2004,10 +2092,13 @@ public void removeAudioListener​(

    clearAuxEffectInfo

    public void clearAuxEffectInfo()
    -
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Detaches any previously attached auxiliary audio effect from the underlying audio track.
    Specified by:
    +
    clearAuxEffectInfo in interface ExoPlayer
    +
    Specified by:
    clearAuxEffectInfo in interface ExoPlayer.AudioComponent
    @@ -2018,16 +2109,18 @@ public void removeAudioListener​(
  • setVolume

    -
    public void setVolume​(float audioVolume)
    +
    public void setVolume​(float volume)
    +
    Deprecated.
    -
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    +
    Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
    Specified by:
    setVolume in interface ExoPlayer.AudioComponent
    Specified by:
    setVolume in interface Player
    Parameters:
    -
    audioVolume - Linear output gain to apply to all audio channels.
    +
    volume - Linear output gain to apply to all audio channels.
  • @@ -2038,6 +2131,7 @@ public void removeAudioListener​(

    getVolume

    public float getVolume()
    +
    Deprecated.
    Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    @@ -2057,10 +2151,13 @@ public void removeAudioListener​(

    getSkipSilenceEnabled

    public boolean getSkipSilenceEnabled()
    -
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns whether skipping silences in the audio stream is enabled.
    Specified by:
    +
    getSkipSilenceEnabled in interface ExoPlayer
    +
    Specified by:
    getSkipSilenceEnabled in interface ExoPlayer.AudioComponent
    @@ -2072,10 +2169,13 @@ public void removeAudioListener​(

    setSkipSilenceEnabled

    public void setSkipSilenceEnabled​(boolean skipSilenceEnabled)
    -
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets whether skipping silences in the audio stream is enabled.
    Specified by:
    +
    setSkipSilenceEnabled in interface ExoPlayer
    +
    Specified by:
    setSkipSilenceEnabled in interface ExoPlayer.AudioComponent
    Parameters:
    skipSilenceEnabled - Whether skipping silences in the audio stream is enabled.
    @@ -2089,7 +2189,13 @@ public void removeAudioListener​(

    getAnalyticsCollector

    public AnalyticsCollector getAnalyticsCollector()
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns the AnalyticsCollector used for collecting analytics events.
    +
    +
    Specified by:
    +
    getAnalyticsCollector in interface ExoPlayer
    +
    @@ -2099,8 +2205,12 @@ public void removeAudioListener​(

    addAnalyticsListener

    public void addAnalyticsListener​(AnalyticsListener listener)
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Adds an AnalyticsListener to receive analytics events.
    +
    Specified by:
    +
    addAnalyticsListener in interface ExoPlayer
    Parameters:
    listener - The listener to be added.
    @@ -2113,8 +2223,12 @@ public void removeAudioListener​(

    removeAnalyticsListener

    public void removeAnalyticsListener​(AnalyticsListener listener)
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Removes an AnalyticsListener.
    +
    Specified by:
    +
    removeAnalyticsListener in interface ExoPlayer
    Parameters:
    listener - The listener to be removed.
    @@ -2127,10 +2241,14 @@ public void removeAudioListener​(

    setHandleAudioBecomingNoisy

    public void setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)
    +
    Deprecated.
    +
    Sets whether the player should pause automatically when audio is rerouted from a headset to device speakers. See the audio becoming noisy documentation for more information.
    +
    Specified by:
    +
    setHandleAudioBecomingNoisy in interface ExoPlayer
    Parameters:
    handleAudioBecomingNoisy - Whether the player should pause automatically when audio is rerouted from a headset to device speakers.
    @@ -2145,10 +2263,14 @@ public void removeAudioListener​(public void setPriorityTaskManager​(@Nullable PriorityTaskManager priorityTaskManager) +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets a PriorityTaskManager, or null to clear a previously set priority task manager.

    The priority C.PRIORITY_PLAYBACK will be set while the player is loading.

    +
    Specified by:
    +
    setPriorityTaskManager in interface ExoPlayer
    Parameters:
    priorityTaskManager - The PriorityTaskManager, or null to clear a previously set priority task manager.
    @@ -2163,7 +2285,13 @@ public void removeAudioListener​(@Nullable public Format getVideoFormat() +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns the video format currently being played, or null if no video is being played.
    +
    +
    Specified by:
    +
    getVideoFormat in interface ExoPlayer
    +
    @@ -2174,7 +2302,13 @@ public getAudioFormat
    @Nullable
     public Format getAudioFormat()
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns the audio format currently being played, or null if no audio is being played.
    +
    +
    Specified by:
    +
    getAudioFormat in interface ExoPlayer
    +
    @@ -2185,7 +2319,13 @@ public getVideoDecoderCounters
    @Nullable
     public DecoderCounters getVideoDecoderCounters()
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns DecoderCounters for video, or null if no video is being played.
    +
    +
    Specified by:
    +
    getVideoDecoderCounters in interface ExoPlayer
    +
    @@ -2196,44 +2336,12 @@ public @Nullable public DecoderCounters getAudioDecoderCounters() +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Returns DecoderCounters for audio, or null if no audio is being played.
    - - - - - - - - - - @@ -2244,7 +2352,8 @@ public void removeVideoListener​(

    setVideoFrameMetadataListener

    public void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    -
    Description copied from interface: ExoPlayer.VideoComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets a listener to receive video frame metadata events.

    This method is intended to be called by the same component that sets the Surface @@ -2252,6 +2361,8 @@ public void removeVideoListener​(Specified by: +

    setVideoFrameMetadataListener in interface ExoPlayer
    +
    Specified by:
    setVideoFrameMetadataListener in interface ExoPlayer.VideoComponent
    Parameters:
    listener - The listener.
    @@ -2265,11 +2376,14 @@ public void removeVideoListener​(

    clearVideoFrameMetadataListener

    public void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
    -
    Description copied from interface: ExoPlayer.VideoComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Clears the listener which receives video frame metadata events if it matches the one passed. Else does nothing.
    Specified by:
    +
    clearVideoFrameMetadataListener in interface ExoPlayer
    +
    Specified by:
    clearVideoFrameMetadataListener in interface ExoPlayer.VideoComponent
    Parameters:
    listener - The listener to clear.
    @@ -2283,10 +2397,13 @@ public void removeVideoListener​(

    setCameraMotionListener

    public void setCameraMotionListener​(CameraMotionListener listener)
    -
    Description copied from interface: ExoPlayer.VideoComponent
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    Sets a listener of camera motion events.
    Specified by:
    +
    setCameraMotionListener in interface ExoPlayer
    +
    Specified by:
    setCameraMotionListener in interface ExoPlayer.VideoComponent
    Parameters:
    listener - The listener.
    @@ -2300,55 +2417,20 @@ public void removeVideoListener​(

    clearCameraMotionListener

    public void clearCameraMotionListener​(CameraMotionListener listener)
    -
    Description copied from interface: ExoPlayer.VideoComponent
    -
    Clears the listener which receives camera motion events if it matches the one passed. Else - does nothing.
    +
    Deprecated.
    +
    Description copied from interface: ExoPlayer
    +
    Clears the listener which receives camera motion events if it matches the one passed. Else does + nothing.
    Specified by:
    +
    clearCameraMotionListener in interface ExoPlayer
    +
    Specified by:
    clearCameraMotionListener in interface ExoPlayer.VideoComponent
    Parameters:
    listener - The listener to clear.
    - - - - - - - - @@ -2356,6 +2438,7 @@ public void removeTextOutput​(

    getCurrentCues

    public List<Cue> getCurrentCues()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the current Cues. This list may be empty.
    @@ -2366,44 +2449,6 @@ public void removeTextOutput​( - - - - - - - - @@ -2411,6 +2456,7 @@ public void removeMetadataOutput​(

    getPlaybackLooper

    public Looper getPlaybackLooper()
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Returns the Looper associated with the playback thread.
    @@ -2426,6 +2472,7 @@ public void removeMetadataOutput​(

    getApplicationLooper

    public Looper getApplicationLooper()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the Looper associated with the application thread that's used to access the player and on which player events are received.
    @@ -2442,6 +2489,7 @@ public void removeMetadataOutput​(

    getClock

    public Clock getClock()
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Returns the Clock used for playback.
    @@ -2457,12 +2505,11 @@ public void removeMetadataOutput​(

    addListener

    public void addListener​(Player.Listener listener)
    +
    Deprecated.
    Description copied from interface: Player
    Registers a listener to receive all events from the player. -

    The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

    +

    The listener's methods will be called on the thread associated with Player.getApplicationLooper().

    Specified by:
    addListener in interface Player
    @@ -2480,15 +2527,13 @@ public void removeMetadataOutput​(@Deprecated public void addListener​(Player.EventListener listener)
    Deprecated.
    -
    Description copied from interface: Player
    +
    Description copied from interface: ExoPlayer
    Registers a listener to receive events from the player. -

    The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

    +

    The listener's methods will be called on the thread associated with Player.getApplicationLooper().

    Specified by:
    -
    addListener in interface Player
    +
    addListener in interface ExoPlayer
    Parameters:
    listener - The listener to register.
    @@ -2501,6 +2546,7 @@ public void addListener​(

    removeListener

    public void removeListener​(Player.Listener listener)
    +
    Deprecated.
    Description copied from interface: Player
    Unregister a listener registered through Player.addListener(Listener). The listener will no longer receive events.
    @@ -2521,12 +2567,12 @@ public void addListener​(@Deprecated public void removeListener​(Player.EventListener listener)
    Deprecated.
    -
    Description copied from interface: Player
    -
    Unregister a listener registered through Player.addListener(EventListener). The listener will +
    Description copied from interface: ExoPlayer
    +
    Unregister a listener registered through ExoPlayer.addListener(EventListener). The listener will no longer receive events from the player.
    Specified by:
    -
    removeListener in interface Player
    +
    removeListener in interface ExoPlayer
    Parameters:
    listener - The listener to unregister.
    @@ -2539,7 +2585,8 @@ public void removeListener​(

    getPlaybackState

    @State
    -public int getPlaybackState()
    +public @com.google.android.exoplayer2.Player.State int getPlaybackState() +
    Deprecated.
    Description copied from interface: Player
    Returns the current playback state of the player.
    @@ -2548,7 +2595,7 @@ public int getPlaybackState()
    Returns:
    The current playback state.
    See Also:
    -
    Player.Listener.onPlaybackStateChanged(int)
    +
    Player.Listener.onPlaybackStateChanged(int)
    @@ -2559,7 +2606,8 @@ public int getPlaybackState()
  • getPlaybackSuppressionReason

    @PlaybackSuppressionReason
    -public int getPlaybackSuppressionReason()
    +public @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int getPlaybackSuppressionReason() +
    Deprecated.
    Description copied from interface: Player
    Returns the reason why playback is suppressed even though Player.getPlayWhenReady() is true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    @@ -2569,7 +2617,7 @@ public int getPlaybackSuppressionReason()
    Returns:
    The current playback suppression reason.
    See Also:
    -
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
    +
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
  • @@ -2581,6 +2629,7 @@ public int getPlaybackSuppressionReason()

    getPlayerError

    @Nullable
     public ExoPlaybackException getPlayerError()
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Equivalent to Player.getPlayerError(), except the exception is guaranteed to be an ExoPlaybackException.
    @@ -2620,18 +2669,18 @@ public void retry()
  • getAvailableCommands

    public Player.Commands getAvailableCommands()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the player's currently available Player.Commands.

    The returned Player.Commands are not updated when available commands change. Use Player.Listener.onAvailableCommandsChanged(Commands) to get an update when the available commands change. -

    Executing a command that is not available (for example, calling Player.seekToNextWindow() - if Player.COMMAND_SEEK_TO_NEXT_WINDOW is unavailable) will neither throw an exception nor - generate a Player.getPlayerError() player error}. +

    Executing a command that is not available (for example, calling Player.seekToNextMediaItem() if Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM is unavailable) will + neither throw an exception nor generate a Player.getPlayerError() player error}. -

    Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW and Player.COMMAND_SEEK_TO_NEXT_WINDOW are - unavailable if there is no such MediaItem.

    +

    Player.COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM and Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM + are unavailable if there is no such MediaItem.

    Specified by:
    getAvailableCommands in interface Player
    @@ -2649,6 +2698,7 @@ public void retry()
  • prepare

    public void prepare()
    +
    Deprecated.
    Description copied from interface: Player
    Prepares the player.
    @@ -2702,6 +2752,7 @@ public void prepare​(public void setMediaItems​(List<MediaItem> mediaItems, boolean resetPosition) +
    Deprecated.
    Description copied from interface: Player
    Clears the playlist and adds the specified MediaItems.
    @@ -2711,7 +2762,7 @@ public void prepare​(MediaItems.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by Player.getCurrentWindowIndex() and Player.getCurrentPosition().
    + by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
  • @@ -2722,8 +2773,9 @@ public void prepare​(

    setMediaItems

    public void setMediaItems​(List<MediaItem> mediaItems,
    -                          int startWindowIndex,
    +                          int startIndex,
                               long startPositionMs)
    +
    Deprecated.
    Description copied from interface: Player
    Clears the playlist and adds the specified MediaItems.
    @@ -2731,11 +2783,11 @@ public void prepare​(setMediaItems in interface Player
    Parameters:
    mediaItems - The new MediaItems.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    +
    startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET + is passed, the current position is not reset.
    +
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In + any case, if startIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
  • @@ -2746,6 +2798,7 @@ public void prepare​(

    setMediaSources

    public void setMediaSources​(List<MediaSource> mediaSources)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist, adds the specified MediaSources and resets the position to the default position.
    @@ -2765,6 +2818,7 @@ public void prepare​(public void setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition) +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist and adds the specified MediaSources.
    @@ -2774,7 +2828,7 @@ public void prepare​(MediaSources.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by Player.getCurrentWindowIndex() and Player.getCurrentPosition().
    + by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -2785,8 +2839,9 @@ public void prepare​(

    setMediaSources

    public void setMediaSources​(List<MediaSource> mediaSources,
    -                            int startWindowIndex,
    +                            int startMediaItemIndex,
                                 long startPositionMs)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist and adds the specified MediaSources.
    @@ -2794,11 +2849,10 @@ public void prepare​(setMediaSources in interface ExoPlayer
    Parameters:
    mediaSources - The new MediaSources.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    +
    startMediaItemIndex - The media item index to start playback from. If C.INDEX_UNSET is passed, the current position is not reset.
    +
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given media item is used. In any case, + if startMediaItemIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
    @@ -2809,6 +2863,7 @@ public void prepare​(

    setMediaSource

    public void setMediaSource​(MediaSource mediaSource)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist, adds the specified MediaSource and resets the position to the default position.
    @@ -2828,6 +2883,7 @@ public void prepare​(public void setMediaSource​(MediaSource mediaSource, boolean resetPosition) +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist and adds the specified MediaSource.
    @@ -2836,7 +2892,7 @@ public void prepare​(Parameters:
    mediaSource - The new MediaSource.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by Player.getCurrentWindowIndex() + false, playback will start from the position defined by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -2849,6 +2905,7 @@ public void prepare​(public void setMediaSource​(MediaSource mediaSource, long startPositionMs) +
    Deprecated.
    Description copied from interface: ExoPlayer
    Clears the playlist and adds the specified MediaSource.
    @@ -2868,6 +2925,7 @@ public void prepare​(public void addMediaItems​(int index, List<MediaItem> mediaItems) +
    Deprecated.
    Description copied from interface: Player
    Adds a list of media items at the given index of the playlist.
    @@ -2887,6 +2945,7 @@ public void prepare​(

    addMediaSource

    public void addMediaSource​(MediaSource mediaSource)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Adds a media source to the end of the playlist.
    @@ -2905,6 +2964,7 @@ public void prepare​(public void addMediaSource​(int index, MediaSource mediaSource) +
    Deprecated.
    Description copied from interface: ExoPlayer
    Adds a media source at the given index of the playlist.
    @@ -2923,6 +2983,7 @@ public void prepare​(

    addMediaSources

    public void addMediaSources​(List<MediaSource> mediaSources)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Adds a list of media sources to the end of the playlist.
    @@ -2941,6 +3002,7 @@ public void prepare​(public void addMediaSources​(int index, List<MediaSource> mediaSources) +
    Deprecated.
    Description copied from interface: ExoPlayer
    Adds a list of media sources at the given index of the playlist.
    @@ -2961,6 +3023,7 @@ public void prepare​(public void moveMediaItems​(int fromIndex, int toIndex, int newIndex) +
    Deprecated.
    Moves the media item range to the new index.
    @@ -2983,6 +3046,7 @@ public void prepare​(public void removeMediaItems​(int fromIndex, int toIndex) +
    Deprecated.
    Removes a range of media items from the playlist.
    @@ -3002,6 +3066,7 @@ public void prepare​(

    setShuffleOrder

    public void setShuffleOrder​(ShuffleOrder shuffleOrder)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Sets the shuffle order.
    @@ -3019,6 +3084,7 @@ public void prepare​(

    setPlayWhenReady

    public void setPlayWhenReady​(boolean playWhenReady)
    +
    Deprecated.
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY. @@ -3038,6 +3104,7 @@ public void prepare​(

    getPlayWhenReady

    public boolean getPlayWhenReady()
    +
    Deprecated.
    Whether playback will proceed when Player.getPlaybackState() == Player.STATE_READY.
    @@ -3046,7 +3113,7 @@ public void prepare​(Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    @@ -3057,10 +3124,11 @@ public void prepare​(

    setPauseAtEndOfMediaItems

    public void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    +
    Deprecated.
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Specified by:
    setPauseAtEndOfMediaItems in interface ExoPlayer
    @@ -3076,6 +3144,7 @@ public void prepare​(

    getPauseAtEndOfMediaItems

    public boolean getPauseAtEndOfMediaItems()
    +
    Deprecated.
    Returns whether the player pauses playback at the end of each media item.
    @@ -3093,7 +3162,8 @@ public void prepare​(

    getRepeatMode

    @RepeatMode
    -public int getRepeatMode()
    +public @com.google.android.exoplayer2.Player.RepeatMode int getRepeatMode() +
    Deprecated.
    Description copied from interface: Player
    Returns the current Player.RepeatMode used for playback.
    @@ -3102,23 +3172,24 @@ public int getRepeatMode()
    Returns:
    The current repeat mode.
    See Also:
    -
    Player.Listener.onRepeatModeChanged(int)
    +
    Player.Listener.onRepeatModeChanged(int)
    - +
    • setRepeatMode

      public void setRepeatMode​(@RepeatMode
      -                          int repeatMode)
      -
      Description copied from interface: Player
      + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode) +
      Deprecated.
      +
      Description copied from interface: Player
      Sets the Player.RepeatMode to be used for playback.
      Specified by:
      -
      setRepeatMode in interface Player
      +
      setRepeatMode in interface Player
      Parameters:
      repeatMode - The repeat mode.
      @@ -3131,8 +3202,9 @@ public int getRepeatMode()
    • setShuffleModeEnabled

      public void setShuffleModeEnabled​(boolean shuffleModeEnabled)
      +
      Deprecated.
      Description copied from interface: Player
      -
      Sets whether shuffling of windows is enabled.
      +
      Sets whether shuffling of media items is enabled.
      Specified by:
      setShuffleModeEnabled in interface Player
      @@ -3148,8 +3220,9 @@ public int getRepeatMode()
    • getShuffleModeEnabled

      public boolean getShuffleModeEnabled()
      +
      Deprecated.
      Description copied from interface: Player
      -
      Returns whether shuffling of windows is enabled.
      +
      Returns whether shuffling of media items is enabled.
      Specified by:
      getShuffleModeEnabled in interface Player
      @@ -3165,6 +3238,7 @@ public int getRepeatMode()
    • isLoading

      public boolean isLoading()
      +
      Deprecated.
      Description copied from interface: Player
      Whether the player is currently loading the source.
      @@ -3183,17 +3257,18 @@ public int getRepeatMode()
      • seekTo

        -
        public void seekTo​(int windowIndex,
        +
        public void seekTo​(int mediaItemIndex,
                            long positionMs)
        +
        Deprecated.
        Description copied from interface: Player
        -
        Seeks to a position specified in milliseconds in the specified window.
        +
        Seeks to a position specified in milliseconds in the specified MediaItem.
        Specified by:
        seekTo in interface Player
        Parameters:
        -
        windowIndex - The index of the window.
        -
        positionMs - The seek position in the specified window, or C.TIME_UNSET to seek to - the window's default position.
        +
        mediaItemIndex - The index of the MediaItem.
        +
        positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
      @@ -3204,6 +3279,7 @@ public int getRepeatMode()
    • getSeekBackIncrement

      public long getSeekBackIncrement()
      +
      Deprecated.
      Description copied from interface: Player
      Returns the Player.seekBack() increment.
      @@ -3223,6 +3299,7 @@ public int getRepeatMode()
    • getSeekForwardIncrement

      public long getSeekForwardIncrement()
      +
      Deprecated.
      Description copied from interface: Player
      Returns the Player.seekForward() increment.
      @@ -3241,17 +3318,17 @@ public int getRepeatMode() @@ -3262,6 +3339,7 @@ public int getRepeatMode()
    • setPlaybackParameters

      public void setPlaybackParameters​(PlaybackParameters playbackParameters)
      +
      Deprecated.
      Description copied from interface: Player
      Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the player to the default, which means there is no speed or pitch adjustment. @@ -3283,6 +3361,7 @@ public int getRepeatMode()
    • getPlaybackParameters

      public PlaybackParameters getPlaybackParameters()
      +
      Deprecated.
      Description copied from interface: Player
      Returns the currently active playback parameters.
      @@ -3301,6 +3380,7 @@ public int getRepeatMode()

      setSeekParameters

      public void setSeekParameters​(@Nullable
                                     SeekParameters seekParameters)
      +
      Deprecated.
      Description copied from interface: ExoPlayer
      Sets the parameters that control how seek operations are performed.
      @@ -3318,6 +3398,7 @@ public int getRepeatMode()
    • getSeekParameters

      public SeekParameters getSeekParameters()
      +
      Deprecated.
      Description copied from interface: ExoPlayer
      Returns the currently active SeekParameters of the player.
      @@ -3333,6 +3414,7 @@ public int getRepeatMode()
    • setForegroundMode

      public void setForegroundMode​(boolean foregroundMode)
      +
      Deprecated.
      Description copied from interface: ExoPlayer
      Sets whether the player is allowed to keep holding limited resources such as video decoders, even when in the idle state. By doing so, the player may be able to reduce latency when @@ -3366,6 +3448,30 @@ public int getRepeatMode()
    + + + +
      +
    • +

      stop

      +
      public void stop()
      +
      Deprecated.
      +
      Description copied from interface: Player
      +
      Stops playback without resetting the player. Use Player.pause() rather than this method if + the intention is to pause playback. + +

      Calling this method will cause the playback state to transition to Player.STATE_IDLE. The + player instance can still be used, and Player.release() must still be called on the player if + it's no longer required. + +

      Calling this method does not clear the playlist, reset the playback position or the playback + error.

      +
      +
      Specified by:
      +
      stop in interface Player
      +
      +
    • +
    @@ -3388,6 +3494,7 @@ public void stop​(boolean reset)
  • release

    public void release()
    +
    Deprecated.
    Description copied from interface: Player
    Releases the player. This method must be called when the player is no longer required. The player must not be used after calling this method.
    @@ -3404,12 +3511,13 @@ public void stop​(boolean reset)
  • createMessage

    public PlayerMessage createMessage​(PlayerMessage.Target target)
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Creates a message that can be sent to a PlayerMessage.Target. By default, the message will be delivered immediately without blocking on the playback thread. The default PlayerMessage.getType() is 0 and the default PlayerMessage.getPayload() is null. If a position is specified with PlayerMessage.setPosition(long), the message will be - delivered at this position in the current window defined by Player.getCurrentWindowIndex(). - Alternatively, the message can be sent at a specific window using PlayerMessage.setPosition(int, long).
    + delivered at this position in the current media item defined by Player.getCurrentMediaItemIndex(). Alternatively, the message can be sent at a specific mediaItem + using PlayerMessage.setPosition(int, long).
    Specified by:
    createMessage in interface ExoPlayer
    @@ -3423,6 +3531,7 @@ public void stop​(boolean reset)
  • getRendererCount

    public int getRendererCount()
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Returns the number of renderers.
    @@ -3437,7 +3546,8 @@ public void stop​(boolean reset)
    • getRendererType

      -
      public int getRendererType​(int index)
      +
      public @com.google.android.exoplayer2.C.TrackType int getRendererType​(int index)
      +
      Deprecated.
      Description copied from interface: ExoPlayer
      Returns the track type that the renderer at a given index handles. @@ -3449,7 +3559,7 @@ public void stop​(boolean reset)
      Parameters:
      index - The index of the renderer.
      Returns:
      -
      One of the TRACK_TYPE_* constants defined in C.
      +
      The track type that the renderer handles.
  • @@ -3461,6 +3571,7 @@ public void stop​(boolean reset)

    getTrackSelector

    @Nullable
     public TrackSelector getTrackSelector()
    +
    Deprecated.
    Description copied from interface: ExoPlayer
    Returns the track selector that this player uses, or null if track selection is not supported.
    @@ -3476,13 +3587,14 @@ public 

    getCurrentTrackGroups

    public TrackGroupArray getCurrentTrackGroups()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the available track groups.
    Specified by:
    getCurrentTrackGroups in interface Player
    See Also:
    -
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
  • @@ -3493,6 +3605,7 @@ public 

    getCurrentTrackSelections

    public TrackSelectionArray getCurrentTrackSelections()
    +
    Deprecated.
    Description copied from interface: Player
    - + + + + + + + + +
      +
    • +

      setTrackSelectionParameters

      +
      public void setTrackSelectionParameters​(TrackSelectionParameters parameters)
      +
      Deprecated.
      +
      Description copied from interface: Player
      +
      Sets the parameters constraining the track selection. + +

      Unsupported parameters will be silently ignored. + +

      Use Player.getTrackSelectionParameters() to retrieve the current parameters. For example, + the following snippet restricts video to SD whilst keep other track selection parameters + unchanged: + +

      
      + player.setTrackSelectionParameters(
      +   player.getTrackSelectionParameters()
      +         .buildUpon()
      +         .setMaxVideoSizeSd()
      +         .build())
      + 
      +
      +
      Specified by:
      +
      setTrackSelectionParameters in interface Player
    @@ -3529,13 +3693,15 @@ public 

    getMediaMetadata

    public MediaMetadata getMediaMetadata()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the current combined MediaMetadata, or MediaMetadata.EMPTY if not supported.

    This MediaMetadata is a combination of the MediaItem.mediaMetadata and the static and dynamic metadata from the track selections' - formats and MetadataOutput.onMetadata(Metadata).

    + formats and Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata, it will be prioritised above the same field coming from static or + dynamic metadata.
    Specified by:
    getMediaMetadata in interface Player
    @@ -3549,6 +3715,7 @@ public 

    getPlaylistMetadata

    public MediaMetadata getPlaylistMetadata()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    @@ -3564,6 +3731,7 @@ public 

    setPlaylistMetadata

    public void setPlaylistMetadata​(MediaMetadata mediaMetadata)
    +
    Deprecated.
    Description copied from interface: Player
    Sets the playlist MediaMetadata.
    @@ -3579,13 +3747,14 @@ public 

    getCurrentTimeline

    public Timeline getCurrentTimeline()
    +
    Deprecated.
    Description copied from interface: Player
    Returns the current Timeline. Never null, but may be empty.
    Specified by:
    getCurrentTimeline in interface Player
    See Also:
    -
    Player.Listener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -3596,6 +3765,7 @@ public 

    getCurrentPeriodIndex

    public int getCurrentPeriodIndex()
    +
    Deprecated.
    Returns the index of the period currently being played.
    @@ -3604,18 +3774,20 @@ public  + @@ -3626,8 +3798,10 @@ public 

    getDuration

    public long getDuration()
    +
    Deprecated.
    -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    +
    Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
    Specified by:
    getDuration in interface Player
    @@ -3641,10 +3815,10 @@ public 

    getCurrentPosition

    public long getCurrentPosition()
    +
    Deprecated.
    -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
    +
    Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
    Specified by:
    getCurrentPosition in interface Player
    @@ -3658,9 +3832,10 @@ public 

    getBufferedPosition

    public long getBufferedPosition()
    +
    Deprecated.
    -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
    Specified by:
    getBufferedPosition in interface Player
    @@ -3674,9 +3849,10 @@ public 

    getTotalBufferedDuration

    public long getTotalBufferedDuration()
    +
    Deprecated.
    Returns an estimate of the total buffered duration from the current position, in milliseconds. - This includes pre-buffered data for subsequent ads and windows.
    + This includes pre-buffered data for subsequent ads and media items.
    Specified by:
    getTotalBufferedDuration in interface Player
    @@ -3690,6 +3866,7 @@ public 

    isPlayingAd

    public boolean isPlayingAd()
    +
    Deprecated.
    Returns whether the player is currently playing an ad.
    @@ -3705,6 +3882,7 @@ public 

    getCurrentAdGroupIndex

    public int getCurrentAdGroupIndex()
    +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the index of the ad group in the period currently being played. Returns C.INDEX_UNSET otherwise.
    @@ -3721,6 +3899,7 @@ public 

    getCurrentAdIndexInAdGroup

    public int getCurrentAdIndexInAdGroup()
    +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the index of the ad in its ad group. Returns C.INDEX_UNSET otherwise.
    @@ -3737,6 +3916,7 @@ public 

    getContentPosition

    public long getContentPosition()
    +
    Deprecated.
    If Player.isPlayingAd() returns true, returns the content position that will be played once all ads in the ad group have finished playing, in milliseconds. If there is no ad @@ -3754,10 +3934,11 @@ public 

    getContentBufferedPosition

    public long getContentBufferedPosition()
    +
    Deprecated.
    If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds. If there is no ad - playing, the returned position is the same as that returned by Player.getBufferedPosition().
    + the current content up to which data is buffered, in milliseconds. If there is no ad playing, + the returned position is the same as that returned by Player.getBufferedPosition().
    Specified by:
    getContentBufferedPosition in interface Player
    @@ -3772,31 +3953,23 @@ public @Deprecated public void setHandleWakeLock​(boolean handleWakeLock) -
    Deprecated. -
    Use setWakeMode(int) instead.
    -
    -
    Sets whether the player should use a PowerManager.WakeLock to ensure the - device stays awake for playback, even when the screen is off. - -

    Enabling this feature requires the Manifest.permission.WAKE_LOCK permission. - It should be used together with a foreground Service for use cases where - playback can occur when the screen is off (e.g. background audio playback). It is not useful if - the screen will always be on during playback (e.g. foreground video playback).

    +
    Deprecated.
    -
    Parameters:
    -
    handleWakeLock - Whether the player should use a PowerManager.WakeLock - to ensure the device stays awake for playback, even when the screen is off.
    +
    Specified by:
    +
    setHandleWakeLock in interface ExoPlayer
    - + - - - - - - - -
    - + - + @@ -627,7 +654,7 @@ implements Returns the number of windows in the timeline. - +
    @@ -1939,7 +1927,7 @@ public final void onStaticMetadataChanged​( + - - - - @@ -1495,7 +1467,7 @@ static final int EVENT_STATIC_METADATA_CHANGED
  • EVENT_POSITION_DISCONTINUITY

    static final int EVENT_POSITION_DISCONTINUITY
    - +
    See Also:
    Constant Field Values
    @@ -2157,7 +2129,7 @@ static final int EVENT_STATIC_METADATA_CHANGED

    Method Detail

    - + - + @@ -340,7 +340,7 @@ public final int usage
  • allowedCapturePolicy

    @AudioAllowedCapturePolicy
    -public final int allowedCapturePolicy
    +public final @com.google.android.exoplayer2.C.AudioAllowedCapturePolicy int allowedCapturePolicy
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioListener.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioListener.html deleted file mode 100644 index 718a4fc3d8..0000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioListener.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - -AudioListener (ExoPlayer library) - - - - - - - - - - - - - -
    - -
    - -
    -
    - -

    Interface AudioListener

    -
    -
    -
    - -
    -
    - -
    -
    -
      -
    • - -
      -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          onAudioSessionIdChanged

          -
          default void onAudioSessionIdChanged​(int audioSessionId)
          -
          Deprecated.
          -
          Called when the audio session ID changes.
          -
          -
          Parameters:
          -
          audioSessionId - The audio session ID.
          -
          -
        • -
        - - - -
          -
        • -

          onAudioAttributesChanged

          -
          default void onAudioAttributesChanged​(AudioAttributes audioAttributes)
          -
          Deprecated.
          -
          Called when the audio attributes change.
          -
          -
          Parameters:
          -
          audioAttributes - The audio attributes.
          -
          -
        • -
        - - - -
          -
        • -

          onVolumeChanged

          -
          default void onVolumeChanged​(float volume)
          -
          Deprecated.
          -
          Called when the volume changes.
          -
          -
          Parameters:
          -
          volume - The new volume, with 0 being silence and 1 being unity gain.
          -
          -
        • -
        - - - -
          -
        • -

          onSkipSilenceEnabledChanged

          -
          default void onSkipSilenceEnabledChanged​(boolean skipSilenceEnabled)
          -
          Deprecated.
          -
          Called when skipping silences is enabled or disabled in the audio stream.
          -
          -
          Parameters:
          -
          skipSilenceEnabled - Whether skipping silences in the audio stream is enabled.
          -
          -
        • -
        -
      • -
      -
      -
    • -
    -
    -
    -
    - -
    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html index eecefafcb3..2297eca1dd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AudioProcessor.html @@ -122,7 +122,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Known Implementing Classes:
    -
    BaseAudioProcessor, GvrAudioProcessor, SilenceSkippingAudioProcessor, SonicAudioProcessor, TeeAudioProcessor
    +
    BaseAudioProcessor, SilenceSkippingAudioProcessor, SonicAudioProcessor, TeeAudioProcessor

    public interface AudioProcessor
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html index 88fb36940c..1ada9e6afa 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/audio/DecoderAudioRenderer.html @@ -114,7 +114,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    -

    Class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleOutputBuffer,​? extends DecoderException>>

    +

    Class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleDecoderOutputBuffer,​? extends DecoderException>>


  • -
    public abstract class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleOutputBuffer,​? extends DecoderException>>
    +
    public abstract class DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleDecoderOutputBuffer,​? extends DecoderException>>
     extends BaseRenderer
     implements MediaClock
    Decodes and renders audio using a Decoder. @@ -154,8 +154,8 @@ implements Renderer.MSG_SET_VOLUME to set the volume. The message payload should be a Float with 0 being silence and 1 being unity gain.
  • Message with type Renderer.MSG_SET_AUDIO_ATTRIBUTES to set the audio attributes. The - message payload should be an AudioAttributes - instance that will configure the underlying audio track. + message payload should be an AudioAttributes instance that will configure the + underlying audio track.
  • Message with type Renderer.MSG_SET_AUX_EFFECT_INFO to set the auxiliary effect. The message payload should be an AuxEffectInfo instance that will configure the underlying audio track. @@ -183,7 +183,7 @@ implements Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener
  • +Renderer.MessageType, Renderer.State, Renderer.WakeupListener
  • - +

    -
    public final class ExoDatabaseProvider
    -extends SQLiteOpenHelper
    -implements DatabaseProvider
    -
    An SQLiteOpenHelper that provides instances of a standalone ExoPlayer database. - -

    Suitable for use by applications that do not already have their own database, or that would - prefer to keep ExoPlayer tables isolated in their own database. Other applications should prefer - to use DefaultDatabaseProvider with their own SQLiteOpenHelper.

    +
    @Deprecated
    +public final class ExoDatabaseProvider
    +extends StandaloneDatabaseProvider
    +
    Deprecated. + +
    @@ -159,21 +156,13 @@ implements -Fields  - -Modifier and Type -Field -Description - - -static String -DATABASE_NAME - -
    The file name used for the standalone ExoPlayer database.
    - - - +
    • @@ -200,8 +189,8 @@ implements ExoDatabaseProvider​(Context context) -
      Provides instances of the database located by passing DATABASE_NAME to Context.getDatabasePath(String).
      - +
      Deprecated.
    • @@ -214,33 +203,13 @@ implements -All Methods Instance Methods Concrete Methods  - -Modifier and Type -Method -Description - - -void -onCreate​(SQLiteDatabase db) -  - - -void -onDowngrade​(SQLiteDatabase db, - int oldVersion, - int newVersion) -  - - -void -onUpgrade​(SQLiteDatabase db, - int oldVersion, - int newVersion) -  - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/database/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/database/package-summary.html index b97fa9d159..a21d902eeb 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/database/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/database/package-summary.html @@ -106,7 +106,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); DatabaseProvider -
      Provides SQLiteDatabase instances to ExoPlayer components, which may read and write +
      Provides SQLiteDatabase instances to media library components, which may read and write tables prefixed with DatabaseProvider.TABLE_PREFIX.
      @@ -129,14 +129,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); ExoDatabaseProvider - -
      An SQLiteOpenHelper that provides instances of a standalone ExoPlayer database.
      +Deprecated. + +StandaloneDatabaseProvider + +
      An SQLiteOpenHelper that provides instances of a standalone database.
      + + + VersionTable -
      Utility methods for accessing versions of ExoPlayer database components.
      +
      Utility methods for accessing versions of media library database components.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/database/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/database/package-tree.html index f1e892e04c..4e0149de18 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/database/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/database/package-tree.html @@ -106,7 +106,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.database.DefaultDatabaseProvider (implements com.google.android.exoplayer2.database.DatabaseProvider)
    • android.database.sqlite.SQLiteOpenHelper (implements java.lang.AutoCloseable)
    • java.lang.Throwable (implements java.io.Serializable) diff --git a/docs/doc/reference/com/google/android/exoplayer2/decoder/Buffer.html b/docs/doc/reference/com/google/android/exoplayer2/decoder/Buffer.html index 0c467e7bf2..9c9d6fa5c1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/decoder/Buffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/decoder/Buffer.html @@ -130,7 +130,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • Direct Known Subclasses:
      -
      DecoderInputBuffer, OutputBuffer
      +
      DecoderInputBuffer, DecoderOutputBuffer

      public abstract class Buffer
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/drm/ExoMediaCrypto.html b/docs/doc/reference/com/google/android/exoplayer2/decoder/CryptoConfig.html
      similarity index 88%
      rename from docs/doc/reference/com/google/android/exoplayer2/drm/ExoMediaCrypto.html
      rename to docs/doc/reference/com/google/android/exoplayer2/decoder/CryptoConfig.html
      index 9e822c4669..618770cff3 100644
      --- a/docs/doc/reference/com/google/android/exoplayer2/drm/ExoMediaCrypto.html
      +++ b/docs/doc/reference/com/google/android/exoplayer2/decoder/CryptoConfig.html
      @@ -2,7 +2,7 @@
       
       
       
      -ExoMediaCrypto (ExoPlayer library)
      +CryptoConfig (ExoPlayer library)
       
       
       
      @@ -19,7 +19,7 @@
       
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      - -
      -
      - -

      Class GvrAudioProcessor

      -
      -
      -
        -
      • java.lang.Object
      • -
      • -
          -
        • com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
        • -
        -
      • -
      -
      -
        -
      • -
        -
        All Implemented Interfaces:
        -
        AudioProcessor
        -
        -
        -
        @Deprecated
        -public class GvrAudioProcessor
        -extends Object
        -implements AudioProcessor
        -
        Deprecated. -
        If you still need this component, please contact us by filing an issue on our issue tracker.
        -
        -
        An AudioProcessor that uses GvrAudioSurround to provide binaural rendering of - surround sound and ambisonic soundfields.
        -
      • -
      -
      -
      - -
      -
      -
        -
      • - -
        -
          -
        • - - -

          Constructor Detail

          - - - -
            -
          • -

            GvrAudioProcessor

            -
            public GvrAudioProcessor()
            -
            Deprecated.
            -
            Creates a new GVR audio processor.
            -
          • -
          -
        • -
        -
        - -
        -
          -
        • - - -

          Method Detail

          - - - -
            -
          • -

            updateOrientation

            -
            public void updateOrientation​(float w,
            -                              float x,
            -                              float y,
            -                              float z)
            -
            Deprecated.
            -
            Updates the listener head orientation. May be called on any thread. See - GvrAudioSurround.updateNativeOrientation.
            -
            -
            Parameters:
            -
            w - The w component of the quaternion.
            -
            x - The x component of the quaternion.
            -
            y - The y component of the quaternion.
            -
            z - The z component of the quaternion.
            -
            -
          • -
          - - - - - - - -
            -
          • -

            isActive

            -
            public boolean isActive()
            -
            Deprecated.
            -
            Description copied from interface: AudioProcessor
            -
            Returns whether the processor is configured and will process input buffers.
            -
            -
            Specified by:
            -
            isActive in interface AudioProcessor
            -
            -
          • -
          - - - -
            -
          • -

            queueInput

            -
            public void queueInput​(ByteBuffer inputBuffer)
            -
            Deprecated.
            -
            Description copied from interface: AudioProcessor
            -
            Queues audio data between the position and limit of the input buffer for processing. - buffer must be a direct byte buffer with native byte order. Its contents are treated as - read-only. Its position will be advanced by the number of bytes consumed (which may be zero). - The caller retains ownership of the provided buffer. Calling this method invalidates any - previous buffer returned by AudioProcessor.getOutput().
            -
            -
            Specified by:
            -
            queueInput in interface AudioProcessor
            -
            Parameters:
            -
            inputBuffer - The input buffer to process.
            -
            -
          • -
          - - - - - - - -
            -
          • -

            getOutput

            -
            public ByteBuffer getOutput()
            -
            Deprecated.
            -
            Description copied from interface: AudioProcessor
            -
            Returns a buffer containing processed output data between its position and limit. The buffer - will always be a direct byte buffer with native byte order. Calling this method invalidates any - previously returned buffer. The buffer will be empty if no output is available.
            -
            -
            Specified by:
            -
            getOutput in interface AudioProcessor
            -
            Returns:
            -
            A buffer containing processed output data between its position and limit.
            -
            -
          • -
          - - - - - - - -
            -
          • -

            flush

            -
            public void flush()
            -
            Deprecated.
            -
            Description copied from interface: AudioProcessor
            -
            Clears any buffered data and pending output. If the audio processor is active, also prepares - the audio processor to receive a new stream of input in the last configured (pending) format.
            -
            -
            Specified by:
            -
            flush in interface AudioProcessor
            -
            -
          • -
          - - - -
            -
          • -

            reset

            -
            public void reset()
            -
            Deprecated.
            -
            Description copied from interface: AudioProcessor
            -
            Resets the processor to its unconfigured state, releasing any resources.
            -
            -
            Specified by:
            -
            reset in interface AudioProcessor
            -
            -
          • -
          -
        • -
        -
        -
      • -
      -
      -
      -
      - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-tree.html deleted file mode 100644 index 3f23cccf8c..0000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-tree.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.gvr Class Hierarchy (ExoPlayer library) - - - - - - - - - - - - - -
      - -
      -
      -
      -

      Hierarchy For Package com.google.android.exoplayer2.ext.gvr

      -Package Hierarchies: - -
      -
      -
      -

      Class Hierarchy

      - -
      -
      -
      - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html index 4991086e65..6350170170 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html @@ -570,7 +570,8 @@ extends
    • setVastLoadTimeoutMs

      -
      public ImaAdsLoader.Builder setVastLoadTimeoutMs​(int vastLoadTimeoutMs)
      +
      public ImaAdsLoader.Builder setVastLoadTimeoutMs​(@IntRange(from=1L)
      +                                                 int vastLoadTimeoutMs)
      Sets the VAST load timeout, in milliseconds.
      Parameters:
      @@ -588,7 +589,8 @@ extends
    • setMediaLoadTimeoutMs

      -
      public ImaAdsLoader.Builder setMediaLoadTimeoutMs​(int mediaLoadTimeoutMs)
      +
      public ImaAdsLoader.Builder setMediaLoadTimeoutMs​(@IntRange(from=1L)
      +                                                  int mediaLoadTimeoutMs)
      Sets the ad media load timeout, in milliseconds.
      Parameters:
      @@ -606,7 +608,8 @@ extends
    • setMaxMediaBitrate

      -
      public ImaAdsLoader.Builder setMaxMediaBitrate​(int bitrate)
      +
      public ImaAdsLoader.Builder setMaxMediaBitrate​(@IntRange(from=1L)
      +                                               int bitrate)
      Sets the media maximum recommended bitrate for ads, in bps.
      Parameters:
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html index 3e436a4b9e..96e20ce38e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html @@ -130,7 +130,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • All Implemented Interfaces:
      -
      AudioListener, DeviceListener, MetadataOutput, Player.EventListener, Player.Listener, AdsLoader, TextOutput, VideoListener
      +
      Player.EventListener, Player.Listener, AdsLoader

      public final class ImaAdsLoader
      @@ -248,16 +248,16 @@ implements 
       void
      -onPositionDiscontinuity​(Player.PositionInfo oldPosition,
      +onPositionDiscontinuity​(Player.PositionInfo oldPosition,
                              Player.PositionInfo newPosition,
      -                       int reason)
      +                       @com.google.android.exoplayer2.Player.DiscontinuityReason int reason)
       
       
      Called when a position discontinuity occurs.
      void -onRepeatModeChanged​(int repeatMode) +onRepeatModeChanged​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
      Called when the value of Player.getRepeatMode() changes.
      @@ -271,8 +271,8 @@ implements void -onTimelineChanged​(Timeline timeline, - int reason) +onTimelineChanged​(Timeline timeline, + @com.google.android.exoplayer2.Player.TimelineChangeReason int reason)
      Called when the timeline has been refreshed.
      @@ -346,21 +346,14 @@ implements Player.EventListener -onLoadingChanged, onMaxSeekToPreviousPositionChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onStaticMetadataChanged
    • +onLoadingChanged, onMaxSeekToPreviousPositionChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onTracksChanged, onTrackSelectionParametersChanged
    - @@ -611,7 +604,7 @@ public com.google.ads.interactivemedia.v3.api.AdDisplayContainer getAd
    - + - + - +
    @@ -341,22 +332,6 @@ implements - - -
      -
    • -

      setControlDispatcher

      -
      @Deprecated
      -public void setControlDispatcher​(@Nullable
      -                                 ControlDispatcher controlDispatcher)
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
    • -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html b/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html index fa266e8b50..a5cdbfe305 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":42,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -226,7 +226,7 @@ extends androidx.media2.common.SessionPlayer

    Method Summary

    - + @@ -359,54 +359,45 @@ extends androidx.media2.common.SessionPlayer - - - - - - + - + - + - + - + - + - + - + @@ -483,21 +474,6 @@ extends androidx.media2.common.SessionPlayer

    Method Detail

    - - - -
      -
    • -

      setControlDispatcher

      -
      @Deprecated
      -public void setControlDispatcher​(ControlDispatcher controlDispatcher)
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
    • -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CaptionCallback.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CaptionCallback.html index 0ff56a6951..51355279c2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CaptionCallback.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CaptionCallback.html @@ -173,7 +173,7 @@ extends MediaSessionConnector.CommandReceiver -onCommand +onCommand diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CommandReceiver.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CommandReceiver.html index b23a996932..1a33f40bc2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CommandReceiver.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CommandReceiver.html @@ -157,8 +157,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); - @@ -183,15 +182,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    Method Detail

    - +
    • onCommand

      boolean onCommand​(Player player,
      -                  @Deprecated
      -                  ControlDispatcher controlDispatcher,
                         String command,
                         @Nullable
                         Bundle extras,
      @@ -202,10 +199,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      Parameters:
      player - The player connected to the media session.
      -
      controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      command - The command name.
      extras - Optional parameters for the command, may be null.
      cb - A result receiver to which a result may be sent by the command, may be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html index 548598963a..73b017ab5f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html @@ -163,8 +163,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    - - + @@ -195,32 +195,29 @@ extends - - + + - + - + - - + @@ -291,7 +291,7 @@ extends - - - + - + - - + - - - - - - - + + + + + @@ -226,21 +225,22 @@ extends

    Method Detail

    - +
    • setLibraries

      -
      public static void setLibraries​(Class<? extends ExoMediaCrypto> exoMediaCryptoType,
      +
      public static void setLibraries​(@com.google.android.exoplayer2.C.CryptoType int cryptoType,
                                       String... libraries)
      Override the names of the Vpx native libraries. If an application wishes to call this method, it must do so before calling any other method defined by this class, and before instantiating a LibvpxVideoRenderer instance.
      Parameters:
      -
      exoMediaCryptoType - The ExoMediaCrypto type required for decoding protected - content.
      +
      cryptoType - The C.CryptoType for which the decoder library supports decrypting + protected content, or C.CRYPTO_TYPE_UNSUPPORTED if the library does not support + decryption.
      libraries - The names of the Vpx native libraries.
    • @@ -288,15 +288,14 @@ public static Returns true if the underlying libvpx library supports high bit depth.
    - +
    • -

      matchesExpectedExoMediaCryptoType

      -
      public static boolean matchesExpectedExoMediaCryptoType​(Class<? extends ExoMediaCrypto> exoMediaCryptoType)
      -
      Returns whether the given ExoMediaCrypto type matches the one required for decoding - protected content.
      +

      supportsCryptoType

      +
      public static boolean supportsCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType)
      +
      Returns whether the library supports the given C.CryptoType.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.SchedulerWorker.html b/docs/doc/reference/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.SchedulerWorker.html index 19fe7b10c4..a8562a193b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.SchedulerWorker.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/workmanager/WorkManagerScheduler.SchedulerWorker.html @@ -223,7 +223,7 @@ extends androidx.work.Worker

    Methods inherited from class androidx.work.ListenableWorker

    -getApplicationContext, getBackgroundExecutor, getId, getInputData, getNetwork, getRunAttemptCount, getTags, getTaskExecutor, getTriggeredContentAuthorities, getTriggeredContentUris, getWorkerFactory, isRunInForeground, isStopped, isUsed, onStopped, setForegroundAsync, setProgressAsync, setUsed, stop +getApplicationContext, getBackgroundExecutor, getForegroundInfoAsync, getId, getInputData, getNetwork, getRunAttemptCount, getTags, getTaskExecutor, getTriggeredContentAuthorities, getTriggeredContentUris, getWorkerFactory, isRunInForeground, isStopped, isUsed, onStopped, setForegroundAsync, setProgressAsync, setRunInForeground, setUsed, stop + + +
    All Methods Instance Methods Concrete Methods Deprecated Methods All Methods Instance Methods Concrete Methods 
    Modifier and Type Method  
    voidsetControlDispatcher​(ControlDispatcher controlDispatcher) -
    Deprecated. -
    Use a ForwardingPlayer and pass it to the constructor instead.
    -
    -
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> setMediaItem​(androidx.media2.common.MediaItem item)
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> setPlaybackSpeed​(float playbackSpeed)  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> setPlaylist​(List<androidx.media2.common.MediaItem> playlist, androidx.media2.common.MediaMetadata metadata)
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> setRepeatMode​(int repeatMode)  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> setShuffleMode​(int shuffleMode)  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> skipToNextPlaylistItem()  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> skipToPlaylistItem​(int index)  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> skipToPreviousPlaylistItem()  
    ListenableFuture<androidx.media2.common.SessionPlayer.PlayerResult> updatePlaylistMetadata​(androidx.media2.common.MediaMetadata metadata)  
    booleanonCommand​(Player player, - ControlDispatcher controlDispatcher, +onCommand​(Player player, String command, Bundle extras, ResultReceiver cb)
    voidonCustomAction​(Player player, - ControlDispatcher controlDispatcher, +onCustomAction​(Player player, String action, Bundle extras) @@ -188,15 +187,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    Method Detail

    - +
    • onCustomAction

      void onCustomAction​(Player player,
      -                    @Deprecated
      -                    ControlDispatcher controlDispatcher,
                           String action,
                           @Nullable
                           Bundle extras)
      @@ -204,10 +201,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parameters:
      player - The player connected to the media session.
      -
      controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      action - The name of the action which was sent by a media controller.
      extras - Optional extras sent by a media controller, may be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.MediaButtonEventHandler.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.MediaButtonEventHandler.html index 55d05bbd05..83fb0e44cd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.MediaButtonEventHandler.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.MediaButtonEventHandler.html @@ -149,8 +149,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    booleanonMediaButtonEvent​(Player player, - ControlDispatcher controlDispatcher, +onMediaButtonEvent​(Player player, Intent mediaButtonEvent)
    See MediaSessionCompat.Callback.onMediaButtonEvent(Intent).
    @@ -173,24 +172,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    Method Detail

    - +
    • onMediaButtonEvent

      boolean onMediaButtonEvent​(Player player,
      -                           @Deprecated
      -                           ControlDispatcher controlDispatcher,
                                  Intent mediaButtonEvent)
      See MediaSessionCompat.Callback.onMediaButtonEvent(Intent).
      Parameters:
      player - The Player.
      -
      controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      mediaButtonEvent - The Intent.
      Returns:
      True if the event was handled, false otherwise.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.PlaybackPreparer.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.PlaybackPreparer.html index d05eda7543..7c5a3db83c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.PlaybackPreparer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.PlaybackPreparer.html @@ -222,7 +222,7 @@ extends MediaSessionConnector.CommandReceiver -onCommand
    • +onCommand
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueEditor.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueEditor.html index 3f1f0f90c5..b0f80a763b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueEditor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueEditor.html @@ -189,7 +189,7 @@ extends MediaSessionConnector.CommandReceiver -onCommand +onCommand diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html index 907cfdb50d..dcb49e58f5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.QueueNavigator.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]}; +var data = {"i0":6,"i1":6,"i2":18,"i3":6,"i4":6,"i5":6,"i6":6}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -174,7 +174,7 @@ extends -
    All Methods Instance Methods Abstract Methods All Methods Instance Methods Abstract Methods Default Methods 
    Modifier and Type MethodvoidonCurrentWindowIndexChanged​(Player player)default voidonCurrentMediaItemIndexChanged​(Player player) -
    Called when the current window index changed.
    +
    Called when the current media item index changed.
    voidonSkipToNext​(Player player, - ControlDispatcher controlDispatcher)onSkipToNext​(Player player)
    See MediaSessionCompat.Callback.onSkipToNext().
    voidonSkipToPrevious​(Player player, - ControlDispatcher controlDispatcher)onSkipToPrevious​(Player player)
    See MediaSessionCompat.Callback.onSkipToPrevious().
    voidonSkipToQueueItem​(Player player, - ControlDispatcher controlDispatcher, +onSkipToQueueItem​(Player player, long id)
    See MediaSessionCompat.Callback.onSkipToQueueItem(long).
    @@ -239,7 +236,7 @@ extends MediaSessionConnector.CommandReceiver -onCommand +onCommand @@ -311,14 +308,14 @@ extends +
    • -

      onCurrentWindowIndexChanged

      -
      void onCurrentWindowIndexChanged​(Player player)
      -
      Called when the current window index changed.
      +

      onCurrentMediaItemIndexChanged

      +
      default void onCurrentMediaItemIndexChanged​(Player player)
      +
      Called when the current media item index changed.
      Parameters:
      player - The player connected to the media session.
      @@ -345,64 +342,46 @@ extends +
      • onSkipToPrevious

        -
        void onSkipToPrevious​(Player player,
        -                      @Deprecated
        -                      ControlDispatcher controlDispatcher)
        +
        void onSkipToPrevious​(Player player)
        See MediaSessionCompat.Callback.onSkipToPrevious().
        Parameters:
        player - The player connected to the media session.
        -
        controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      - +
      • onSkipToQueueItem

        void onSkipToQueueItem​(Player player,
        -                       @Deprecated
        -                       ControlDispatcher controlDispatcher,
                                long id)
        See MediaSessionCompat.Callback.onSkipToQueueItem(long).
        Parameters:
        player - The player connected to the media session.
        -
        controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      - +
      • onSkipToNext

        -
        void onSkipToNext​(Player player,
        -                  @Deprecated
        -                  ControlDispatcher controlDispatcher)
        +
        void onSkipToNext​(Player player)
        See MediaSessionCompat.Callback.onSkipToNext().
        Parameters:
        player - The player connected to the media session.
        -
        controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.RatingCallback.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.RatingCallback.html index c565055f2e..190613ff38 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.RatingCallback.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.RatingCallback.html @@ -175,7 +175,7 @@ extends MediaSessionConnector.CommandReceiver -onCommand
    • +onCommand
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html index 2fbe4eb63f..295eed1c1b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":42,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -338,7 +338,7 @@ extends

    Method Summary

    - + @@ -381,28 +381,19 @@ extends - - - - - - + - + @@ -410,7 +401,7 @@ extends Sets a custom error on the session. - + - + - + - + - + - + - + - + - + - + - + - + - + - - @@ -480,32 +479,26 @@ implements +
    • onCommand

      public boolean onCommand​(Player player,
      -                         @Deprecated
      -                         ControlDispatcher controlDispatcher,
                                String command,
                                @Nullable
                                Bundle extras,
                                @Nullable
                                ResultReceiver cb)
      -
      Description copied from interface: MediaSessionConnector.CommandReceiver
      +
      Description copied from interface: MediaSessionConnector.CommandReceiver
      See MediaSessionCompat.Callback.onCommand(String, Bundle, ResultReceiver). The receiver may handle the command, but is not required to do so.
      Specified by:
      -
      onCommand in interface MediaSessionConnector.CommandReceiver
      +
      onCommand in interface MediaSessionConnector.CommandReceiver
      Parameters:
      player - The player connected to the media session.
      -
      controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      command - The command name.
      extras - Optional parameters for the command, may be null.
      cb - A result receiver to which a result may be sent by the command, may be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html index 35b6029880..a4c81304b2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueNavigator.html @@ -242,8 +242,7 @@ implements
    - @@ -253,31 +252,28 @@ implements - + - + - + - + @@ -192,43 +192,34 @@ implements - - - - - - + - + - + - + - + @@ -293,7 +293,7 @@ extends BaseRenderer -createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation +createRendererException, createRendererException, disable, enable, getCapabilities, getConfiguration, getFormatHolder, getIndex, getLastResetPositionUs, getReadingPositionUs, getState, getStream, getStreamFormats, getTrackType, hasReadStreamToEnd, isCurrentStreamFinal, isSourceReady, maybeThrowStreamError, onReset, onStreamChanged, readSource, replaceStream, reset, resetPosition, setCurrentStreamFinal, setIndex, skipSource, start, stop, supportsMixedMimeTypeAdaptation - + - - - - - - - + - + - + + + + +
    All Methods Instance Methods Concrete Methods Deprecated Methods All Methods Instance Methods Concrete Methods 
    Modifier and Type Method
    voidsetControlDispatcher​(ControlDispatcher controlDispatcher) -
    Deprecated. -
    Use a ForwardingPlayer and pass it to setPlayer(Player) instead.
    -
    -
    void setCustomActionProviders​(MediaSessionConnector.CustomActionProvider... customActionProviders)
    Sets custom action providers.
    void setCustomErrorMessage​(CharSequence message)
    Sets a custom error on the session.
    void setCustomErrorMessage​(CharSequence message, int code)
    void setCustomErrorMessage​(CharSequence message, int code, @@ -419,7 +410,7 @@ extends Sets a custom error on the session.
    void setDispatchUnsupportedActionsEnabled​(boolean dispatchUnsupportedActionsEnabled) @@ -427,35 +418,35 @@ extends
    void setEnabledPlaybackActions​(long enabledPlaybackActions)
    Sets the enabled playback actions.
    void setErrorMessageProvider​(ErrorMessageProvider<? super PlaybackException> errorMessageProvider)
    Sets the optional ErrorMessageProvider.
    void setMediaButtonEventHandler​(MediaSessionConnector.MediaButtonEventHandler mediaButtonEventHandler)
    void setMediaMetadataProvider​(MediaSessionConnector.MediaMetadataProvider mediaMetadataProvider)
    Sets a provider of metadata to be published to the media session.
    void setMetadataDeduplicationEnabled​(boolean metadataDeduplicationEnabled) @@ -463,28 +454,28 @@ extends MediaSessionCompat.setMetadata(MediaMetadataCompat).
    void setPlaybackPreparer​(MediaSessionConnector.PlaybackPreparer playbackPreparer)
    void setPlayer​(Player player)
    Sets the player to be connected to the media session.
    void setQueueEditor​(MediaSessionConnector.QueueEditor queueEditor)
    Sets the MediaSessionConnector.QueueEditor to handle queue edits sent by the media controller.
    void setQueueNavigator​(MediaSessionConnector.QueueNavigator queueNavigator) @@ -492,14 +483,14 @@ extends ACTION_SKIP_TO_PREVIOUS and ACTION_SKIP_TO_QUEUE_ITEM.
    void setRatingCallback​(MediaSessionConnector.RatingCallback ratingCallback)
    Sets the MediaSessionConnector.RatingCallback to handle user ratings.
    void unregisterCustomCommandReceiver​(MediaSessionConnector.CommandReceiver commandReceiver) @@ -648,21 +639,6 @@ extends - - - -
      -
    • -

      setControlDispatcher

      -
      @Deprecated
      -public void setControlDispatcher​(ControlDispatcher controlDispatcher)
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
    • -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html index 32ee306748..4f7834235b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/RepeatModeActionProvider.html @@ -223,8 +223,7 @@ implements
    voidonCustomAction​(Player player, - ControlDispatcher controlDispatcher, +onCustomAction​(Player player, String action, Bundle extras) @@ -323,29 +322,23 @@ public static final int DEFAULT_REPEAT_TOGGLE_MODES

    Method Detail

    - +
    • onCustomAction

      public void onCustomAction​(Player player,
      -                           @Deprecated
      -                           ControlDispatcher controlDispatcher,
                                  String action,
                                  @Nullable
                                  Bundle extras)
      -
      Description copied from interface: MediaSessionConnector.CustomActionProvider
      +
      Description copied from interface: MediaSessionConnector.CustomActionProvider
      Called when a custom action provided by this provider is sent to the media session.
      Specified by:
      -
      onCustomAction in interface MediaSessionConnector.CustomActionProvider
      +
      onCustomAction in interface MediaSessionConnector.CustomActionProvider
      Parameters:
      player - The player connected to the media session.
      -
      controlDispatcher - This parameter is deprecated. Use player instead. Operations - can be customized by passing a ForwardingPlayer to MediaSessionConnector.setPlayer(Player), or - when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      action - The name of the action which was sent by a media controller.
      extras - Optional extras sent by a media controller, may be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html index d7e91f838e..09fa3b99a6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/mediasession/TimelineQueueEditor.html @@ -288,8 +288,7 @@ implements
    booleanonCommand​(Player player, - ControlDispatcher controlDispatcher, +onCommand​(Player player, String command, Bundle extras, ResultReceiver cb) booleanonCommand​(Player player, - ControlDispatcher controlDispatcher, +onCommand​(Player player, String command, Bundle extras, ResultReceiver cb)voidonCurrentWindowIndexChanged​(Player player)onCurrentMediaItemIndexChanged​(Player player) -
    Called when the current window index changed.
    +
    Called when the current media item index changed.
    voidonSkipToNext​(Player player, - ControlDispatcher controlDispatcher)onSkipToNext​(Player player)
    See MediaSessionCompat.Callback.onSkipToNext().
    voidonSkipToPrevious​(Player player, - ControlDispatcher controlDispatcher)onSkipToPrevious​(Player player)
    See MediaSessionCompat.Callback.onSkipToPrevious().
    voidonSkipToQueueItem​(Player player, - ControlDispatcher controlDispatcher, +onSkipToQueueItem​(Player player, long id)
    See MediaSessionCompat.Callback.onSkipToQueueItem(long).
    @@ -442,18 +438,18 @@ implements +
    All Methods Instance Methods Concrete Methods Deprecated Methods All Methods Instance Methods Concrete Methods 
    Modifier and Type MethodHttpDataSource.RequestPropertiesgetDefaultRequestProperties() -
    Deprecated. - -
    -
    OkHttpDataSource.Factory setCacheControl​(okhttp3.CacheControl cacheControl)
    Sets the CacheControl that will be used.
    OkHttpDataSource.Factory setContentTypePredicate​(Predicate<String> contentTypePredicate)
    Sets a content type Predicate.
    OkHttpDataSource.Factory setDefaultRequestProperties​(Map<String,​String> defaultRequestProperties)
    Sets the default request headers for HttpDataSource instances created by the factory.
    OkHttpDataSource.Factory setTransferListener​(TransferListener transferListener)
    Sets the TransferListener that will be used.
    OkHttpDataSource.Factory setUserAgent​(String userAgent) @@ -284,23 +275,6 @@ implements - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.html b/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.html index ce15a16cd4..829907dceb 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.html @@ -238,7 +238,7 @@ extends HttpDataSource.BaseFactory -createDataSource, getDefaultRequestProperties, setDefaultRequestProperties +createDataSource, setDefaultRequestProperties protected OpusDecodercreateDecoder​(Format format, - ExoMediaCrypto mediaCrypto)createDecoder​(Format format, + CryptoConfig cryptoConfig)
    Creates a decoder for the given format.
    OpusDecoder​(int numInputBuffers, +OpusDecoder​(int numInputBuffers, int numOutputBuffers, int initialInputBufferSize, List<byte[]> initializationData, - ExoMediaCrypto exoMediaCrypto, + CryptoConfig cryptoConfig, boolean outputFloat)
    Creates an Opus decoder.
    @@ -225,7 +225,7 @@ extends -
    protected SimpleOutputBufferprotected SimpleDecoderOutputBuffer createOutputBuffer()
    Creates a new output buffer.
    @@ -240,8 +240,8 @@ extends
    protected OpusDecoderExceptiondecode​(DecoderInputBuffer inputBuffer, - SimpleOutputBuffer outputBuffer, +decode​(DecoderInputBuffer inputBuffer, + SimpleDecoderOutputBuffer outputBuffer, boolean reset)
    Decodes the inputBuffer and stores any decoded output in outputBuffer.
    @@ -320,7 +320,7 @@ extends + @@ -397,12 +397,12 @@ extends
  • createOutputBuffer

    -
    protected SimpleOutputBuffer createOutputBuffer()
    +
    protected SimpleDecoderOutputBuffer createOutputBuffer()
    Description copied from class: SimpleDecoder
    Creates a new output buffer.
    Specified by:
    -
    createOutputBuffer in class SimpleDecoder<DecoderInputBuffer,​SimpleOutputBuffer,​OpusDecoderException>
    +
    createOutputBuffer in class SimpleDecoder<DecoderInputBuffer,​SimpleDecoderOutputBuffer,​OpusDecoderException>
  • @@ -417,7 +417,7 @@ extends Creates an exception to propagate for an unexpected decode error.
    Specified by:
    -
    createUnexpectedDecodeException in class SimpleDecoder<DecoderInputBuffer,​SimpleOutputBuffer,​OpusDecoderException>
    +
    createUnexpectedDecodeException in class SimpleDecoder<DecoderInputBuffer,​SimpleDecoderOutputBuffer,​OpusDecoderException>
    Parameters:
    error - The unexpected decode error.
    Returns:
    @@ -425,7 +425,7 @@ extends + diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/opus/OpusLibrary.html b/docs/doc/reference/com/google/android/exoplayer2/ext/opus/OpusLibrary.html index df28b57af1..1444d4d081 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/opus/OpusLibrary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/opus/OpusLibrary.html @@ -167,31 +167,30 @@ extends
    static booleanmatchesExpectedExoMediaCryptoType​(Class<? extends ExoMediaCrypto> exoMediaCryptoType) -
    Returns whether the given ExoMediaCrypto type matches the one required for decoding - protected content.
    -
    static String opusGetVersion()  
    static boolean opusIsSecureDecodeSupported()  
    static voidsetLibraries​(Class<? extends ExoMediaCrypto> exoMediaCryptoType, +setLibraries​(@com.google.android.exoplayer2.C.CryptoType int cryptoType, String... libraries)
    Override the names of the Opus native libraries.
    static booleansupportsCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType) +
    Returns whether the library supports the given C.CryptoType.
    +
    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 0ed5d79010..3acae48ed6 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 @@ -164,7 +164,7 @@ extends Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener +Renderer.MessageType, Renderer.State, Renderer.WakeupListener
    protected VpxDecodercreateDecoder​(Format format, - ExoMediaCrypto mediaCrypto)createDecoder​(Format format, + CryptoConfig cryptoConfig)
    Creates a decoder for the given format.
    protected voidrenderOutputBufferToSurface​(VideoDecoderOutputBuffer outputBuffer, +renderOutputBufferToSurface​(VideoDecoderOutputBuffer outputBuffer, Surface surface)
    Renders the specified output buffer to the passed surface.
    @@ -317,14 +317,14 @@ extends DecoderVideoRenderer -dropOutputBuffer, flushDecoder, handleMessage, isEnded, isReady, maybeDropBuffersToKeyframe, onDisabled, onEnabled, onInputFormatChanged, onPositionReset, onProcessedOutputBuffer, onQueueInputBuffer, onStarted, onStopped, onStreamChanged, releaseDecoder, render, renderOutputBuffer, setOutput, shouldDropBuffersToKeyframe, shouldDropOutputBuffer, shouldForceRenderOutputBuffer, skipOutputBuffer, updateDroppedBufferCounters +dropOutputBuffer, flushDecoder, handleMessage, isEnded, isReady, maybeDropBuffersToKeyframe, onDisabled, onEnabled, onInputFormatChanged, onPositionReset, onProcessedOutputBuffer, onQueueInputBuffer, onStarted, onStopped, onStreamChanged, releaseDecoder, render, renderOutputBuffer, setOutput, shouldDropBuffersToKeyframe, shouldDropOutputBuffer, shouldForceRenderOutputBuffer, skipOutputBuffer, updateDroppedBufferCounters - + - + @@ -161,10 +161,10 @@ extends Description
    VpxDecoder​(int numInputBuffers, +VpxDecoder​(int numInputBuffers, int numOutputBuffers, int initialInputBufferSize, - ExoMediaCrypto exoMediaCrypto, + CryptoConfig cryptoConfig, int threads)
    Creates a VP9 decoder.
    @@ -189,14 +189,14 @@ extends Description
    protected VideoDecoderInputBufferprotected DecoderInputBuffer createInputBuffer()
    Creates a new input buffer.
    protected VideoDecoderOutputBufferprotected VideoDecoderOutputBuffer createOutputBuffer()
    Creates a new output buffer.
    @@ -211,8 +211,8 @@ extends
    protected VpxDecoderExceptiondecode​(VideoDecoderInputBuffer inputBuffer, - VideoDecoderOutputBuffer outputBuffer, +decode​(DecoderInputBuffer inputBuffer, + VideoDecoderOutputBuffer outputBuffer, boolean reset)
    Decodes the inputBuffer and stores any decoded output in outputBuffer.
    @@ -234,14 +234,14 @@ extends
    protected voidreleaseOutputBuffer​(VideoDecoderOutputBuffer buffer)releaseOutputBuffer​(VideoDecoderOutputBuffer buffer)
    Releases an output buffer back to the decoder.
    voidrenderToSurface​(VideoDecoderOutputBuffer outputBuffer, +renderToSurface​(VideoDecoderOutputBuffer outputBuffer, Surface surface)
    Renders the outputBuffer to the surface.
    @@ -285,7 +285,7 @@ extends + @@ -358,27 +358,27 @@ extends
  • createOutputBuffer

    -
    protected VideoDecoderOutputBuffer createOutputBuffer()
    +
    protected VideoDecoderOutputBuffer createOutputBuffer()
    Description copied from class: SimpleDecoder
    Creates a new output buffer.
    Specified by:
    -
    createOutputBuffer in class SimpleDecoder<VideoDecoderInputBuffer,​VideoDecoderOutputBuffer,​VpxDecoderException>
    +
    createOutputBuffer in class SimpleDecoder<DecoderInputBuffer,​VideoDecoderOutputBuffer,​VpxDecoderException>
  • - +
    static booleanmatchesExpectedExoMediaCryptoType​(Class<? extends ExoMediaCrypto> exoMediaCryptoType) -
    Returns whether the given ExoMediaCrypto type matches the one required for decoding - protected content.
    -
    static voidsetLibraries​(Class<? extends ExoMediaCrypto> exoMediaCryptoType, +setLibraries​(@com.google.android.exoplayer2.C.CryptoType int cryptoType, String... libraries)
    Override the names of the Vpx native libraries.
    static booleansupportsCryptoType​(@com.google.android.exoplayer2.C.CryptoType int cryptoType) +
    Returns whether the library supports the given C.CryptoType.
    +
    static boolean vpxIsSecureDecodeSupported()
    ConstantBitrateSeekMap​(long inputLength, + long firstFrameBytePosition, + int bitrate, + int frameSize, + boolean allowSeeksIfLengthUnknown) +
    Creates an instance.
    @@ -257,14 +267,14 @@ implements - diff --git a/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html index f288a7c4e8..9788c27ead 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/extractor/amr/AmrExtractor.html @@ -207,6 +207,14 @@ implements +static int +FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS + +
    Like FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, except that seeking is also enabled in + cases where the content length (and hence the duration of the media) is unknown.
    + + @@ -281,7 +281,7 @@ extends Size of the FLAC stream info block (header included) in bytes.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -295,7 +295,7 @@ extends Minimum size of a FLAC frame header in bytes.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -309,7 +309,7 @@ extends Maximum size of a FLAC frame header in bytes.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -323,7 +323,7 @@ extends Stream info metadata block type.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -337,7 +337,7 @@ extends Seek table metadata block type.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -351,7 +351,7 @@ extends Vorbis comment metadata block type.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -365,7 +365,7 @@ extends Picture metadata block type.
    See Also:
    -
    Constant Field Values
    +
    Constant Field Values
    @@ -389,18 +389,18 @@ extends diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.Factory.html index f335fe5099..0efbdc1d72 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.Factory.html @@ -122,7 +122,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Known Implementing Classes:
    -
    SynchronousMediaCodecAdapter.Factory
    +
    DefaultMediaCodecAdapterFactory, SynchronousMediaCodecAdapter.Factory
    Enclosing interface:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html index 0487ffd65e..70e564c229 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6}; +var data = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -218,27 +218,34 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +Surface +getInputSurface() + +
    Returns the input Surface, or null if the input is not a surface.
    + + + ByteBuffer getOutputBuffer​(int index)
    Returns a read-only ByteBuffer for a dequeued output buffer index.
    - + MediaFormat getOutputFormat()
    Gets the MediaFormat that was output from the MediaCodec.
    - + boolean needsReconfiguration()
    Whether the adapter needs to be reconfigured before it is used.
    - + void queueInputBuffer​(int index, int offset, @@ -249,7 +256,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Submit an input buffer for decoding.
    - + void queueSecureInputBuffer​(int index, int offset, @@ -260,14 +267,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Submit an input buffer that is potentially encrypted for decoding.
    - + void release()
    Releases the adapter and the underlying MediaCodec.
    - + void releaseOutputBuffer​(int index, boolean render) @@ -275,7 +282,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Returns the buffer to the MediaCodec.
    - + void releaseOutputBuffer​(int index, long renderTimeStampNs) @@ -284,7 +291,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); it on the output surface. - + void setOnFrameRenderedListener​(MediaCodecAdapter.OnFrameRenderedListener listener, Handler handler) @@ -292,27 +299,34 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    Registers a callback to be invoked when an output frame is rendered on the output surface.
    - + void setOutputSurface​(Surface surface)
    Dynamically sets the output surface of a MediaCodec.
    - + void setParameters​(Bundle params)
    Communicate additional parameter changes to the MediaCodec instance.
    - + void setVideoScalingMode​(int scalingMode)
    Specifies the scaling mode to use, if a surface was specified when the codec was created.
    + +void +signalEndOfInputStream() + +
    Signals the encoder of end-of-stream on input.
    + +
  • @@ -387,6 +401,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    + + + + @@ -567,13 +596,29 @@ void setParameters​( -
      +
      • needsReconfiguration

        boolean needsReconfiguration()
        Whether the adapter needs to be reconfigured before it is used.
      + + + +
        +
      • +

        signalEndOfInputStream

        +
        @RequiresApi(18)
        +void signalEndOfInputStream()
        +
        Signals the encoder of end-of-stream on input. The call can only be used when the encoder + receives its input from a surface.
        +
        +
        See Also:
        +
        MediaCodec.signalEndOfInputStream()
        +
        +
      • +
    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 1d886e6561..6c6aa82f26 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":6,"i14":6,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":6,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":6,"i50":9,"i51":10,"i52":10,"i53":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":6,"i11":6,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":6,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":6,"i47":9,"i48":10,"i49":10,"i50":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -178,7 +178,7 @@ extends Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener +Renderer.MessageType, Renderer.State, Renderer.WakeupListener +
  • com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory (implements com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory)
  • com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
  • com.google.android.exoplayer2.mediacodec.MediaCodecInfo
  • com.google.android.exoplayer2.mediacodec.MediaCodecUtil
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/Metadata.Entry.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/Metadata.Entry.html index 1ca5ab2ed7..c4938c36c7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/Metadata.Entry.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/Metadata.Entry.html @@ -126,7 +126,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    All Known Implementing Classes:
    -
    ApicFrame, AppInfoTable, BinaryFrame, ChapterFrame, ChapterTocFrame, CommentFrame, EventMessage, GeobFrame, HlsTrackMetadataEntry, IcyHeaders, IcyInfo, Id3Frame, InternalFrame, MdtaMetadataEntry, MlltFrame, MotionPhotoMetadata, PictureFrame, PrivateCommand, PrivFrame, SlowMotionData, SmtaMetadataEntry, SpliceCommand, SpliceInsertCommand, SpliceNullCommand, SpliceScheduleCommand, TextInformationFrame, TimeSignalCommand, UrlLinkFrame, VorbisComment
    +
    ApicFrame, AppInfoTable, BinaryFrame, ChapterFrame, ChapterTocFrame, CommentFrame, EventMessage, FakeMetadataEntry, GeobFrame, HlsTrackMetadataEntry, IcyHeaders, IcyInfo, Id3Frame, InternalFrame, MdtaMetadataEntry, MlltFrame, MotionPhotoMetadata, PictureFrame, PrivateCommand, PrivFrame, SlowMotionData, SmtaMetadataEntry, SpliceCommand, SpliceInsertCommand, SpliceNullCommand, SpliceScheduleCommand, TextInformationFrame, TimeSignalCommand, UrlLinkFrame, VorbisComment
    Enclosing class:
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html index af7bb84d43..aae1d0ef8d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataInputBuffer.html @@ -186,7 +186,7 @@ extends DecoderInputBuffer -BUFFER_REPLACEMENT_MODE_DIRECT, BUFFER_REPLACEMENT_MODE_DISABLED, BUFFER_REPLACEMENT_MODE_NORMAL, cryptoInfo, data, supplementalData, timeUs, waitingForKeys +BUFFER_REPLACEMENT_MODE_DIRECT, BUFFER_REPLACEMENT_MODE_DISABLED, BUFFER_REPLACEMENT_MODE_NORMAL, cryptoInfo, data, format, supplementalData, timeUs, waitingForKeys diff --git a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataOutput.html b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataOutput.html index 91cd1db0ad..6e70217434 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataOutput.html +++ b/docs/doc/reference/com/google/android/exoplayer2/metadata/MetadataOutput.html @@ -120,14 +120,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    - + static void sendAddDownload​(Context context, Class<? extends DownloadService> clazz, @@ -549,7 +532,7 @@ extends Starts the service if not started already and adds a new download. - + static void sendPauseDownloads​(Context context, Class<? extends DownloadService> clazz, @@ -558,7 +541,7 @@ extends Starts the service if not started already and pauses all downloads. - + static void sendRemoveAllDownloads​(Context context, Class<? extends DownloadService> clazz, @@ -567,7 +550,7 @@ extends Starts the service if not started already and removes all downloads. - + static void sendRemoveDownload​(Context context, Class<? extends DownloadService> clazz, @@ -577,7 +560,7 @@ extends Starts the service if not started already and removes a download. - + static void sendResumeDownloads​(Context context, Class<? extends DownloadService> clazz, @@ -586,7 +569,7 @@ extends Starts the service if not started already and resumes all downloads. - + static void sendSetRequirements​(Context context, Class<? extends DownloadService> clazz, @@ -597,7 +580,7 @@ extends + static void sendSetStopReason​(Context context, Class<? extends DownloadService> clazz, @@ -608,7 +591,7 @@ extends Starts the service if not started already and sets the stop reason for one or all downloads. - + static void start​(Context context, Class<? extends DownloadService> clazz) @@ -616,7 +599,7 @@ extends Starts a download service to resume any ongoing downloads. - + static void startForeground​(Context context, Class<? extends DownloadService> clazz) @@ -637,7 +620,7 @@ extends ContextWrapper -bindIsolatedService, bindService, bindService, bindServiceAsUser, checkCallingOrSelfPermission, checkCallingOrSelfUriPermission, checkCallingPermission, checkCallingUriPermission, checkPermission, checkSelfPermission, checkUriPermission, checkUriPermission, clearWallpaper, createAttributionContext, createConfigurationContext, createContextForSplit, createDeviceProtectedStorageContext, createDisplayContext, createPackageContext, createWindowContext, databaseList, deleteDatabase, deleteFile, deleteSharedPreferences, enforceCallingOrSelfPermission, enforceCallingOrSelfUriPermission, enforceCallingPermission, enforceCallingUriPermission, enforcePermission, enforceUriPermission, enforceUriPermission, fileList, getApplicationContext, getApplicationInfo, getAssets, getAttributionTag, getBaseContext, getCacheDir, getClassLoader, getCodeCacheDir, getContentResolver, getDatabasePath, getDataDir, getDir, getDisplay, getExternalCacheDir, getExternalCacheDirs, getExternalFilesDir, getExternalFilesDirs, getExternalMediaDirs, getFilesDir, getFileStreamPath, getMainExecutor, getMainLooper, getNoBackupFilesDir, getObbDir, getObbDirs, getOpPackageName, getPackageCodePath, getPackageManager, getPackageName, getPackageResourcePath, getResources, getSharedPreferences, getSystemService, getSystemServiceName, getTheme, getWallpaper, getWallpaperDesiredMinimumHeight, getWallpaperDesiredMinimumWidth, grantUriPermission, isDeviceProtectedStorage, isRestricted, moveDatabaseFrom, moveSharedPreferencesFrom, openFileInput, openFileOutput, openOrCreateDatabase, openOrCreateDatabase, peekWallpaper, registerReceiver, registerReceiver, registerReceiver, registerReceiver, removeStickyBroadcast, removeStickyBroadcastAsUser, revokeUriPermission, revokeUriPermission, sendBroadcast, sendBroadcast, sendBroadcastAsUser, sendBroadcastAsUser, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcastAsUser, sendStickyBroadcast, sendStickyBroadcastAsUser, sendStickyOrderedBroadcast, sendStickyOrderedBroadcastAsUser, setTheme, setWallpaper, setWallpaper, startActivities, startActivities, startActivity, startActivity, startForegroundService, startInstrumentation, startIntentSender, startIntentSender, startService, stopService, unbindService, unregisterReceiver, updateServiceGroup +bindIsolatedService, bindService, bindService, bindServiceAsUser, checkCallingOrSelfPermission, checkCallingOrSelfUriPermission, checkCallingOrSelfUriPermissions, checkCallingPermission, checkCallingUriPermission, checkCallingUriPermissions, checkPermission, checkSelfPermission, checkUriPermission, checkUriPermission, checkUriPermissions, clearWallpaper, createAttributionContext, createConfigurationContext, createContext, createContextForSplit, createDeviceProtectedStorageContext, createDisplayContext, createPackageContext, createWindowContext, createWindowContext, databaseList, deleteDatabase, deleteFile, deleteSharedPreferences, enforceCallingOrSelfPermission, enforceCallingOrSelfUriPermission, enforceCallingPermission, enforceCallingUriPermission, enforcePermission, enforceUriPermission, enforceUriPermission, fileList, getApplicationContext, getApplicationInfo, getAssets, getAttributionSource, getAttributionTag, getBaseContext, getCacheDir, getClassLoader, getCodeCacheDir, getContentResolver, getDatabasePath, getDataDir, getDir, getDisplay, getExternalCacheDir, getExternalCacheDirs, getExternalFilesDir, getExternalFilesDirs, getExternalMediaDirs, getFilesDir, getFileStreamPath, getMainExecutor, getMainLooper, getNoBackupFilesDir, getObbDir, getObbDirs, getOpPackageName, getPackageCodePath, getPackageManager, getPackageName, getPackageResourcePath, getParams, getResources, getSharedPreferences, getSystemService, getSystemServiceName, getTheme, getWallpaper, getWallpaperDesiredMinimumHeight, getWallpaperDesiredMinimumWidth, grantUriPermission, isDeviceProtectedStorage, isRestricted, isUiContext, moveDatabaseFrom, moveSharedPreferencesFrom, openFileInput, openFileOutput, openOrCreateDatabase, openOrCreateDatabase, peekWallpaper, registerReceiver, registerReceiver, registerReceiver, registerReceiver, removeStickyBroadcast, removeStickyBroadcastAsUser, revokeUriPermission, revokeUriPermission, sendBroadcast, sendBroadcast, sendBroadcastAsUser, sendBroadcastAsUser, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcast, sendOrderedBroadcastAsUser, sendStickyBroadcast, sendStickyBroadcast, sendStickyBroadcastAsUser, sendStickyOrderedBroadcast, sendStickyOrderedBroadcastAsUser, setTheme, setWallpaper, setWallpaper, startActivities, startActivities, startActivity, startActivity, startForegroundService, startInstrumentation, startIntentSender, startIntentSender, startService, stopService, unbindService, unregisterReceiver, updateServiceGroup
    • @@ -941,8 +924,7 @@ extends Creates a DownloadService.

      If foregroundNotificationId is FOREGROUND_NOTIFICATION_ID_NONE then the - service will only ever run in the background. No foreground notification will be displayed and - getScheduler() will not be called. + service will only ever run in the background, and no foreground notification will be displayed.

      If foregroundNotificationId is not FOREGROUND_NOTIFICATION_ID_NONE then the service will run in the foreground. The foreground notification will be updated at least as @@ -1502,23 +1484,43 @@ public final @Nullable protected abstract Scheduler getScheduler() -

      Returns a Scheduler to restart the service when requirements allowing downloads to take - place are met. If null, the service will only be restarted if the process is still in - memory when the requirements are met. +
      Returns a Scheduler to restart the service when requirements for downloads to continue + are met. -

      This method is not called for services whose foregroundNotificationId is set to - FOREGROUND_NOTIFICATION_ID_NONE. Such services will only be restarted if the process - is still in memory and considered non-idle, meaning that it's either in the foreground or was - backgrounded within the last few minutes.

      +

      This method is not called on all devices or for all service configurations. When it is + called, it's called only once in the life cycle of the process. If a service has unfinished + downloads that cannot make progress due to unmet requirements, it will behave according to the + first matching case below: + +

        +
      • If the service has foregroundNotificationId set to FOREGROUND_NOTIFICATION_ID_NONE, then this method will not be called. The service will + remain in the background until the downloads are able to continue to completion or the + service is killed by the platform. +
      • If the device API level is less than 31, a Scheduler is returned from this + method, and the returned Scheduler supports all of the requirements that have been specified for downloads to continue, + then the service will stop itself and the Scheduler will be used to restart it in + the foreground when the requirements are met. +
      • If the device API level is less than 31 and either null or a Scheduler + that does not support all of the requirements + is returned from this method, then the service will remain in the foreground until the + downloads are able to continue to completion. +
      • If the device API level is 31 or above, then this method will not be called and the + service will remain in the foreground until the downloads are able to continue to + completion. A Scheduler cannot be used for this case due to Android 12 + foreground service launch restrictions. +
      • +
    - +
    @@ -1535,40 +1538,11 @@ protected abstract  - @@ -199,32 +218,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    Interface Hierarchy

    @@ -263,6 +255,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.C.AudioContentType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.AudioFlags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.AudioFocusGain (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.AudioManagerOffloadMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.AudioUsage (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.BufferFlags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.ColorRange (implements java.lang.annotation.Annotation)
  • @@ -270,6 +263,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.C.ColorTransfer (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.ContentType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.CryptoMode (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.CryptoType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.DataType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.Encoding (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.FormatSupport (implements java.lang.annotation.Annotation)
  • @@ -278,12 +272,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.C.Projection (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.RoleFlags (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.SelectionFlags (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.SelectionReason (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.StereoMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.StreamType (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.TrackType (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.VideoOutputMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.VideoScalingMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.C.WakeMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.DefaultRenderersFactory.ExtensionRendererMode (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.DeviceInfo.PlaybackType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.ExoPlaybackException.Type (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.ExoTimeoutException.TimeoutOperation (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.MediaMetadata.FolderType (implements java.lang.annotation.Annotation)
  • @@ -299,8 +297,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.Player.RepeatMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.State (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Player.TimelineChangeReason (implements java.lang.annotation.Annotation)
  • +
  • com.google.android.exoplayer2.Renderer.MessageType (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.Renderer.State (implements java.lang.annotation.Annotation)
  • -
  • com.google.android.exoplayer2.Renderer.VideoScalingMode (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.RendererCapabilities.Capabilities (implements java.lang.annotation.Annotation)
  • com.google.android.exoplayer2.RendererCapabilities.FormatSupport (implements java.lang.annotation.Annotation)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/robolectric/PlaybackOutput.html b/docs/doc/reference/com/google/android/exoplayer2/robolectric/PlaybackOutput.html index eddeb7b254..9e50aee779 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/robolectric/PlaybackOutput.html +++ b/docs/doc/reference/com/google/android/exoplayer2/robolectric/PlaybackOutput.html @@ -169,7 +169,7 @@ implements static PlaybackOutput -register​(SimpleExoPlayer player, +register​(ExoPlayer player, CapturingRenderersFactory capturingRenderersFactory)
    Create an instance that captures the metadata and text output from player and the audio @@ -200,13 +200,13 @@ implements +
    • register

      -
      public static PlaybackOutput register​(SimpleExoPlayer player,
      +
      public static PlaybackOutput register​(ExoPlayer player,
                                             CapturingRenderersFactory capturingRenderersFactory)
      Create an instance that captures the metadata and text output from player and the audio and video output via capturingRenderersFactory. @@ -215,7 +215,7 @@ implements Parameters: -
      player - The SimpleExoPlayer to capture metadata and text output from.
      +
      player - The ExoPlayer to capture metadata and text output from.
      capturingRenderersFactory - The CapturingRenderersFactory to capture audio and video output from.
      Returns:
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.html b/docs/doc/reference/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.html index 6a48791aee..36b4271a78 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.html +++ b/docs/doc/reference/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.html @@ -131,8 +131,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      public class TestPlayerRunHelper
       extends Object
      -
      Helper methods to block the calling thread until the provided SimpleExoPlayer instance - reaches a particular state.
      +
      Helper methods to block the calling thread until the provided ExoPlayer instance reaches + a particular state.
    @@ -156,7 +156,7 @@ extends static void playUntilPosition​(ExoPlayer player, - int windowIndex, + int mediaItemIndex, long positionMs)
    Calls Player.play(), runs tasks of the main Looper until the player @@ -165,11 +165,12 @@ extends static void -playUntilStartOfWindow​(ExoPlayer player, - int windowIndex) +playUntilStartOfMediaItem​(ExoPlayer player, + int mediaItemIndex)
    Calls Player.play(), runs tasks of the main Looper until the player - reaches the specified window or a playback error occurs, and then pauses the player.
    + reaches the specified media item or a playback error occurs, and then pauses the + player.
    @@ -189,8 +190,8 @@ extends static void -runUntilPlaybackState​(Player player, - int expectedState) +runUntilPlaybackState​(Player player, + @com.google.android.exoplayer2.Player.State int expectedState)
    Runs tasks of the main Looper until Player.getPlaybackState() matches the expected state or a playback error occurs.
    @@ -207,10 +208,10 @@ extends static void -runUntilPositionDiscontinuity​(Player player, - int expectedReason) +runUntilPositionDiscontinuity​(Player player, + @com.google.android.exoplayer2.Player.DiscontinuityReason int expectedReason) -
    Runs tasks of the main Looper until Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) is +
    Runs tasks of the main Looper until Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) is called with the specified Player.DiscontinuityReason or a playback error occurs.
    @@ -224,9 +225,9 @@ extends static void -runUntilRenderedFirstFrame​(SimpleExoPlayer player) +runUntilRenderedFirstFrame​(ExoPlayer player) -
    Runs tasks of the main Looper until the VideoListener.onRenderedFirstFrame() +
    Runs tasks of the main Looper until the Player.Listener.onRenderedFirstFrame() callback is called or a playback error occurs.
    @@ -279,7 +280,7 @@ extends

    Method Detail

    - + - + - +
    - +

    public static interface DefaultMediaSourceFactory.AdsLoaderProvider
    -
    Provides AdsLoader instances for media items that have ad tag URIs.
    +
    Provides AdsLoader instances for media items that have ad tag URIs.
    @@ -151,7 +151,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); AdsLoader getAdsLoader​(MediaItem.AdsConfiguration adsConfiguration) -
    Returns an AdsLoader for the given ads configuration, or null if no ads +
    Returns an AdsLoader for the given ads configuration, or null if no ads loader is available for the given ads configuration.
    @@ -180,11 +180,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    getAdsLoader

    @Nullable
     AdsLoader getAdsLoader​(MediaItem.AdsConfiguration adsConfiguration)
    -
    Returns an AdsLoader for the given ads configuration, or null if no ads +
    Returns an AdsLoader for the given ads configuration, or null if no ads loader is available for the given ads configuration.

    This method is called each time a MediaSource is created from a MediaItem - that defines an ads configuration.

    + that defines an ads configuration.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html index c88e4910f6..cd59556427 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":42}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":42}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -87,7 +87,7 @@ loadScripts(document, 'script'); @@ -142,25 +142,25 @@ implements uri - ends in '.mpd' or if its mimeType field is +
  • DashMediaSource.Factory if the item's uri + ends in '.mpd' or if its mimeType field is explicitly set to MimeTypes.APPLICATION_MPD (Requires the exoplayer-dash module to be added to the app). -
  • HlsMediaSource.Factory if the item's uri - ends in '.m3u8' or if its mimeType field is +
  • HlsMediaSource.Factory if the item's uri + ends in '.m3u8' or if its mimeType field is explicitly set to MimeTypes.APPLICATION_M3U8 (Requires the exoplayer-hls module to be added to the app). -
  • SsMediaSource.Factory if the item's uri - ends in '.ism', '.ism/Manifest' or if its mimeType field is explicitly set to MimeTypes.APPLICATION_SS (Requires the +
  • SsMediaSource.Factory if the item's uri + ends in '.ism', '.ism/Manifest' or if its mimeType field is explicitly set to MimeTypes.APPLICATION_SS (Requires the exoplayer-smoothstreaming module to be added to the app). -
  • ProgressiveMediaSource.Factory serves as a fallback if the item's uri doesn't match one of the above. It tries to infer the +
  • ProgressiveMediaSource.Factory serves as a fallback if the item's uri doesn't match one of the above. It tries to infer the required extractor by using the DefaultExtractorsFactory or the ExtractorsFactory provided in the constructor. An UnrecognizedInputFormatException is thrown if none of the available extractors can read the stream.

    Ad support for media items with ad tag URIs

    -

    To support media items with ads +

    To support media items with ads configuration, setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider) and setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider) need to be called to configure the factory with the required providers.

  • @@ -187,13 +187,30 @@ implements static interface  DefaultMediaSourceFactory.AdsLoaderProvider -
    Provides AdsLoader instances for media items that have ad tag URIs.
    +
    Provides AdsLoader instances for media items that have ad tag URIs.
    + +
    + +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html index feb29f196e..c998caf5f3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ForwardingTimeline.html @@ -265,8 +265,8 @@ extends int -getNextWindowIndex​(int windowIndex, - int repeatMode, +getNextWindowIndex​(int windowIndex, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
    Returns the index of the window after the window at index windowIndex depending on the @@ -291,8 +291,8 @@ extends int -getPreviousWindowIndex​(int windowIndex, - int repeatMode, +getPreviousWindowIndex​(int windowIndex, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
    Returns the index of the window before the window at index windowIndex depending on the @@ -328,7 +328,7 @@ extends Timeline -equals, getNextPeriodIndex, getPeriod, getPeriodByUid, getPeriodPosition, getPeriodPosition, getWindow, hashCode, isEmpty, isLastPeriod, toBundle, toBundle +equals, getNextPeriodIndex, getPeriod, getPeriodByUid, getPeriodPosition, getPeriodPosition, getPeriodPositionUs, getPeriodPositionUs, getWindow, hashCode, isEmpty, isLastPeriod, toBundle, toBundle
    - +
      @@ -375,9 +374,10 @@ public final @DataType int dataType, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, @Nullable Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.html index ec0395ff23..34102fdef1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSource.html @@ -126,8 +126,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public interface MediaSource
    -
    Defines and provides media to be played by an ExoPlayer. A - MediaSource has two main responsibilities: +
    Defines and provides media to be played by an ExoPlayer. A MediaSource has two main + responsibilities:
    • To provide the player with a Timeline defining the structure of its media, and to @@ -140,8 +140,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); way for the player to load and read the media.
    - All methods are called on the player's internal playback thread, as described in the ExoPlayer Javadoc. They should not be called directly from - application code. Instances can be re-used, but only for one ExoPlayer instance simultaneously.
    + All methods are called on the player's internal playback thread, as described in the ExoPlayer Javadoc. They should not be called directly from application code. Instances can be + re-used, but only for one ExoPlayer instance simultaneously.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSourceEventListener.EventDispatcher.html b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSourceEventListener.EventDispatcher.html index 2ea776b688..b06cfc388a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/MediaSourceEventListener.EventDispatcher.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/MediaSourceEventListener.EventDispatcher.html @@ -221,7 +221,7 @@ extends void -downstreamFormatChanged​(int trackType, +downstreamFormatChanged​(@com.google.android.exoplayer2.C.TrackType int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, @@ -247,9 +247,9 @@ extends void -loadCanceled​(LoadEventInfo loadEventInfo, +loadCanceled​(LoadEventInfo loadEventInfo, int dataType, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, @@ -277,9 +277,9 @@ extends void -loadCompleted​(LoadEventInfo loadEventInfo, +loadCompleted​(LoadEventInfo loadEventInfo, int dataType, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, @@ -299,9 +299,9 @@ extends void -loadError​(LoadEventInfo loadEventInfo, +loadError​(LoadEventInfo loadEventInfo, int dataType, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, @@ -346,9 +346,9 @@ extends void -loadStarted​(LoadEventInfo loadEventInfo, +loadStarted​(LoadEventInfo loadEventInfo, int dataType, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, @@ -539,7 +539,7 @@ public Dispatches MediaSourceEventListener.onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData). - + - + - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html index 299689a652..3278ee9cd5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html @@ -87,7 +87,7 @@ loadScripts(document, 'script'); @@ -147,6 +147,23 @@ implements
    @@ -598,7 +615,7 @@ public Returns:
    The new ProgressiveMediaSource.
    Throws:
    -
    NullPointerException - if MediaItem.playbackProperties is null.
    +
    NullPointerException - if MediaItem.localConfiguration is null.
    @@ -670,7 +687,7 @@ public 
  • Summary: 
  • Nested | 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/SilenceMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/SilenceMediaSource.Factory.html index bd35fb95ea..9edf514063 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/SilenceMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/SilenceMediaSource.Factory.html @@ -195,7 +195,8 @@ extends SilenceMediaSource.Factory setTag​(Object tag) -
    Sets a tag for the media source which will be published in the Timeline of the source as Window#mediaItem.playbackProperties.tag.
    +
    Sets a tag for the media source which will be published in the Timeline of the source + as Window#mediaItem.localConfiguration.tag.
    @@ -247,7 +248,8 @@ extends
  • setDurationUs

    -
    public SilenceMediaSource.Factory setDurationUs​(long durationUs)
    +
    public SilenceMediaSource.Factory setDurationUs​(@IntRange(from=1L)
    +                                                long durationUs)
    Sets the duration of the silent audio. The value needs to be a positive value.
    Parameters:
    @@ -265,7 +267,8 @@ extends setTag
    public SilenceMediaSource.Factory setTag​(@Nullable
                                              Object tag)
    -
    Sets a tag for the media source which will be published in the Timeline of the source as Window#mediaItem.playbackProperties.tag.
    +
    Sets a tag for the media source which will be published in the Timeline of the source + as Window#mediaItem.localConfiguration.tag.
    Parameters:
    tag - A tag for the media source.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/SinglePeriodTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/SinglePeriodTimeline.html index c657561f8c..9052d5822d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/SinglePeriodTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/SinglePeriodTimeline.html @@ -387,7 +387,7 @@ extends Timeline -equals, getFirstWindowIndex, getLastWindowIndex, getNextPeriodIndex, getNextWindowIndex, getPeriod, getPeriodByUid, getPeriodPosition, getPeriodPosition, getPreviousWindowIndex, getWindow, hashCode, isEmpty, isLastPeriod, toBundle, toBundle
  • +equals, getFirstWindowIndex, getLastWindowIndex, getNextPeriodIndex, getNextWindowIndex, getPeriod, getPeriodByUid, getPeriodPosition, getPeriodPosition, getPeriodPositionUs, getPeriodPositionUs, getPreviousWindowIndex, getWindow, hashCode, isEmpty, isLastPeriod, toBundle, toBundle
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/SingleSampleMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/SingleSampleMediaSource.Factory.html index 90da393734..13f64d6167 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/SingleSampleMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/SingleSampleMediaSource.Factory.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -173,7 +173,7 @@ extends

    Method Summary

    - + @@ -181,46 +181,35 @@ extends - - - - - - - + - + - + - + - + - + @@ -187,13 +189,6 @@ implements -
  • - - -

    Fields inherited from interface android.os.Parcelable

    -CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
  • - @@ -212,7 +207,9 @@ implements - +
    All Methods Instance Methods Concrete Methods Deprecated Methods All Methods Instance Methods Concrete Methods 
    Modifier and Type Method
    SingleSampleMediaSourcecreateMediaSource​(Uri uri, - Format format, - long durationUs) - -
    SingleSampleMediaSourcecreateMediaSource​(MediaItem.Subtitle subtitle, +createMediaSource​(MediaItem.SubtitleConfiguration subtitleConfiguration, long durationUs)
    Returns a new SingleSampleMediaSource using the current parameters.
    SingleSampleMediaSource.Factory setLoadErrorHandlingPolicy​(LoadErrorHandlingPolicy loadErrorHandlingPolicy)
    SingleSampleMediaSource.Factory setTag​(Object tag)
    Sets a tag for the media source which will be published in the Timeline of the source - as Window#mediaItem.playbackProperties.tag.
    + as Window#mediaItem.localConfiguration.tag.
    SingleSampleMediaSource.Factory setTrackId​(String trackId)
    Sets an optional track id to be used.
    SingleSampleMediaSource.Factory setTreatLoadErrorsAsEndOfStream​(boolean treatLoadErrorsAsEndOfStream) @@ -286,7 +275,7 @@ extends public SingleSampleMediaSource.Factory setTag​(@Nullable Object tag)
    Sets a tag for the media source which will be published in the Timeline of the source - as Window#mediaItem.playbackProperties.tag.
    + as Window#mediaItem.localConfiguration.tag.
    Parameters:
    tag - A tag for the media source.
    @@ -348,37 +337,22 @@ extends - - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroup.html b/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroup.html index dff3b570b3..12aa645ca4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroup.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroup.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,12 +130,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    Parcelable
    +
    Bundleable

    public final class TrackGroup
     extends Object
    -implements Parcelable
    +implements Bundleable
    Defines an immutable group of tracks identified by their format identity.
  • @@ -151,11 +151,11 @@ implements -
  • +
  • -

    Nested classes/interfaces inherited from interface android.os.Parcelable

    -Parcelable.ClassLoaderCreator<T extends Object>, Parcelable.Creator<T extends Object>
  • +

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Bundleable

    +Bundleable.Creator<T extends Bundleable> @@ -175,9 +175,11 @@ implements Description
    static Parcelable.Creator<TrackGroup>static Bundleable.Creator<TrackGroup> CREATOR  +
    Object that can restore TrackGroup from a Bundle.
    +
    int TrackGroup​(Format... formats)  +
    Constructs an instance TrackGroup containing the provided formats.
    +
    @@ -233,39 +230,35 @@ implements Description -int -describeContents() -  - - boolean equals​(Object obj)   - + Format getFormat​(int index)
    Returns the format of the track at a given index.
    - + int hashCode()   - + int indexOf​(Format format)
    Returns the index of the track with the given format in the group.
    - -void -writeToParcel​(Parcel dest, - int flags) -  + +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + @@ -327,9 +321,10 @@ implements

    TrackGroup

    public TrackGroup​(Format... formats)
    +
    Constructs an instance TrackGroup containing the provided formats.
    Parameters:
    -
    formats - The track formats. At least one Format must be provided.
    +
    formats - Non empty array of format.
    @@ -404,30 +399,18 @@ implements - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroupArray.html b/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroupArray.html index 18fb9da3af..ddd782c0ff 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroupArray.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/TrackGroupArray.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,12 +130,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    Parcelable
    +
    Bundleable

    public final class TrackGroupArray
     extends Object
    -implements Parcelable
    +implements Bundleable
    An immutable array of TrackGroups.
  • @@ -151,11 +151,11 @@ implements -
  • +
  • -

    Nested classes/interfaces inherited from interface android.os.Parcelable

    -Parcelable.ClassLoaderCreator<T extends Object>, Parcelable.Creator<T extends Object>
  • +

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Bundleable

    +Bundleable.Creator<T extends Bundleable> @@ -175,9 +175,11 @@ implements Description -static Parcelable.Creator<TrackGroupArray> +static Bundleable.Creator<TrackGroupArray> CREATOR -  + +
    Object that can restores a TrackGroupArray from a Bundle.
    + static TrackGroupArray @@ -194,13 +196,6 @@ implements -
  • - - -

    Fields inherited from interface android.os.Parcelable

    -CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
  • - @@ -219,7 +214,9 @@ implements TrackGroupArray​(TrackGroup... trackGroups) -  + +
    Construct a TrackGroupArray from an array of (possibly empty) trackGroups.
    + @@ -240,46 +237,42 @@ implements Description -int -describeContents() -  - - boolean equals​(Object obj)   - + TrackGroup get​(int index)
    Returns the group at a given index.
    - + int hashCode()   - + int indexOf​(TrackGroup group)
    Returns the index of a group within the array.
    - + boolean isEmpty()
    Returns whether this track group array is empty.
    - -void -writeToParcel​(Parcel dest, - int flags) -  + +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + @@ -351,10 +345,7 @@ implements

    TrackGroupArray

    public TrackGroupArray​(TrackGroup... trackGroups)
    -
    -
    Parameters:
    -
    trackGroups - The groups. May be empty.
    -
    +
    Construct a TrackGroupArray from an array of (possibly empty) trackGroups.
    @@ -436,30 +427,18 @@ implements - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.AdGroup.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.AdGroup.html index 69e37b98aa..a31da04f95 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.AdGroup.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.AdGroup.html @@ -228,8 +228,7 @@ implements long timeUs -
    The time of the ad group in the Timeline.Period, in - microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    +
    The time of the ad group in the Timeline.Period, in microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    @@ -417,8 +416,7 @@ implements

    timeUs

    public final long timeUs
    -
    The time of the ad group in the Timeline.Period, in - microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    +
    The time of the ad group in the Timeline.Period, in microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    @@ -513,7 +511,8 @@ public final int[] states
    Creates a new ad group with an unspecified number of ads.
    Parameters:
    -
    timeUs - The time of the ad group in the Timeline.Period, in microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
    +
    timeUs - The time of the ad group in the Timeline.Period, in microseconds, or + C.TIME_END_OF_SOURCE to indicate a postroll ad.
    @@ -544,9 +543,11 @@ public final int[] states
    • getNextAdIndexToPlay

      -
      public int getNextAdIndexToPlay​(int lastPlayedAdIndex)
      +
      public int getNextAdIndexToPlay​(@IntRange(from=-1L)
      +                                int lastPlayedAdIndex)
      Returns the index of the next ad in the ad group that should be played after playing - lastPlayedAdIndex, or count if no later ads should be played.
      + lastPlayedAdIndex
      , or count if no later ads should be played. If no ads have been + played, pass -1 to get the index of the first ad to play.
    @@ -626,6 +627,7 @@ public @CheckResult public AdPlaybackState.AdGroup withAdUri​(Uri uri, + @IntRange(from=0L) int index)
    Returns a new instance with the specified uri set for the specified ad, and the ad marked as AdPlaybackState.AD_STATE_AVAILABLE.
    @@ -640,6 +642,7 @@ public @CheckResult public AdPlaybackState.AdGroup withAdState​(@AdState int state, + @IntRange(from=0L) int index)
    Returns a new instance with the specified ad set to the specified state. The ad specified must currently either be in AdPlaybackState.AD_STATE_UNAVAILABLE or AdPlaybackState.AD_STATE_AVAILABLE. diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html index 56acc34b48..51526fcf7d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/AdPlaybackState.html @@ -693,8 +693,7 @@ public final Parameters:
    adsId - The opaque identifier for ads with which this instance is associated.
    adGroupTimesUs - The times of ad groups in microseconds, relative to the start of the - Timeline.Period they belong to. A final element with - the value C.TIME_END_OF_SOURCE indicates that there is a postroll ad.
    + Timeline.Period they belong to. A final element with the value C.TIME_END_OF_SOURCE indicates that there is a postroll ad.
    @@ -714,7 +713,8 @@ public final 
  • getAdGroup

    -
    public AdPlaybackState.AdGroup getAdGroup​(int adGroupIndex)
    +
    public AdPlaybackState.AdGroup getAdGroup​(@IntRange(from=0L)
    +                                          int adGroupIndex)
    Returns the specified AdPlaybackState.AdGroup.
  • @@ -769,7 +769,9 @@ public final 
  • isAdInErrorState

    -
    public boolean isAdInErrorState​(int adGroupIndex,
    +
    public boolean isAdInErrorState​(@IntRange(from=0L)
    +                                int adGroupIndex,
    +                                @IntRange(from=0L)
                                     int adIndexInAdGroup)
  • @@ -781,7 +783,8 @@ public final 

    withAdGroupTimeUs

    @CheckResult
    -public AdPlaybackState withAdGroupTimeUs​(int adGroupIndex,
    +public AdPlaybackState withAdGroupTimeUs​(@IntRange(from=0L)
    +                                         int adGroupIndex,
                                              long adGroupTimeUs)
    Returns an instance with the specified ad group time.
    @@ -801,7 +804,8 @@ public 

    withNewAdGroup

    @CheckResult
    -public AdPlaybackState withNewAdGroup​(int adGroupIndex,
    +public AdPlaybackState withNewAdGroup​(@IntRange(from=0L)
    +                                      int adGroupIndex,
                                           long adGroupTimeUs)
    Returns an instance with a new ad group.
    @@ -821,7 +825,9 @@ public 

    withAdCount

    @CheckResult
    -public AdPlaybackState withAdCount​(int adGroupIndex,
    +public AdPlaybackState withAdCount​(@IntRange(from=0L)
    +                                   int adGroupIndex,
    +                                   @IntRange(from=1L)
                                        int adCount)
    Returns an instance with the number of ads in adGroupIndex resolved to adCount. The ad count must be greater than zero.
    @@ -834,7 +840,9 @@ public 

    withAdUri

    @CheckResult
    -public AdPlaybackState withAdUri​(int adGroupIndex,
    +public AdPlaybackState withAdUri​(@IntRange(from=0L)
    +                                 int adGroupIndex,
    +                                 @IntRange(from=0L)
                                      int adIndexInAdGroup,
                                      Uri uri)
    Returns an instance with the specified ad URI.
    @@ -847,7 +855,9 @@ public 

    withPlayedAd

    @CheckResult
    -public AdPlaybackState withPlayedAd​(int adGroupIndex,
    +public AdPlaybackState withPlayedAd​(@IntRange(from=0L)
    +                                    int adGroupIndex,
    +                                    @IntRange(from=0L)
                                         int adIndexInAdGroup)
    Returns an instance with the specified ad marked as played.
    @@ -859,7 +869,9 @@ public 

    withSkippedAd

    @CheckResult
    -public AdPlaybackState withSkippedAd​(int adGroupIndex,
    +public AdPlaybackState withSkippedAd​(@IntRange(from=0L)
    +                                     int adGroupIndex,
    +                                     @IntRange(from=0L)
                                          int adIndexInAdGroup)
    Returns an instance with the specified ad marked as skipped.
    @@ -871,7 +883,9 @@ public 

    withAdLoadError

    @CheckResult
    -public AdPlaybackState withAdLoadError​(int adGroupIndex,
    +public AdPlaybackState withAdLoadError​(@IntRange(from=0L)
    +                                       int adGroupIndex,
    +                                       @IntRange(from=0L)
                                            int adIndexInAdGroup)
    Returns an instance with the specified ad marked as having a load error.
    @@ -883,7 +897,8 @@ public 

    withSkippedAdGroup

    @CheckResult
    -public AdPlaybackState withSkippedAdGroup​(int adGroupIndex)
    +public AdPlaybackState withSkippedAdGroup​(@IntRange(from=0L) + int adGroupIndex)
    Returns an instance with all ads in the specified ad group skipped (except for those already marked as played or in the error state).
    @@ -908,7 +923,8 @@ public 

    withAdDurationsUs

    @CheckResult
    -public AdPlaybackState withAdDurationsUs​(int adGroupIndex,
    +public AdPlaybackState withAdDurationsUs​(@IntRange(from=0L)
    +                                         int adGroupIndex,
                                              long... adDurationsUs)
    Returns an instance with the specified ad durations, in microseconds, in the specified ad group.
    @@ -944,7 +960,8 @@ public 

    withRemovedAdGroupCount

    @CheckResult
    -public AdPlaybackState withRemovedAdGroupCount​(int removedAdGroupCount)
    +public AdPlaybackState withRemovedAdGroupCount​(@IntRange(from=0L) + int removedAdGroupCount)
    Returns an instance with the specified number of removed ad groups. @@ -959,7 +976,8 @@ public 

    withContentResumeOffsetUs

    @CheckResult
    -public AdPlaybackState withContentResumeOffsetUs​(int adGroupIndex,
    +public AdPlaybackState withContentResumeOffsetUs​(@IntRange(from=0L)
    +                                                 int adGroupIndex,
                                                      long contentResumeOffsetUs)
    Returns an instance with the specified AdPlaybackState.AdGroup.contentResumeOffsetUs, in microseconds, for the specified ad group.
    @@ -972,7 +990,8 @@ public 

    withIsServerSideInserted

    @CheckResult
    -public AdPlaybackState withIsServerSideInserted​(int adGroupIndex,
    +public AdPlaybackState withIsServerSideInserted​(@IntRange(from=0L)
    +                                                int adGroupIndex,
                                                     boolean isServerSideInserted)
    Returns an instance with the specified value for AdPlaybackState.AdGroup.isServerSideInserted in the specified ad group.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html b/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html index 7bc877dc8c..4a644c4bd8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/ads/SinglePeriodAdTimeline.html @@ -253,14 +253,14 @@ extends ForwardingTimeline -getFirstWindowIndex, getIndexOfPeriod, getLastWindowIndex, getNextWindowIndex, getPeriodCount, getPreviousWindowIndex, getUidOfPeriod, getWindow, getWindowCount +getFirstWindowIndex, getIndexOfPeriod, getLastWindowIndex, getNextWindowIndex, getPeriodCount, getPreviousWindowIndex, getUidOfPeriod, getWindow, getWindowCount
    @@ -336,20 +336,20 @@ implements +
    • BundledChunkExtractor

      public BundledChunkExtractor​(Extractor extractor,
      -                             int primaryTrackType,
      +                             @com.google.android.exoplayer2.C.TrackType int primaryTrackType,
                                    Format primaryTrackManifestFormat)
      Creates an instance.
      Parameters:
      extractor - The extractor to wrap.
      -
      primaryTrackType - The type of the primary track. Typically one of the C TRACK_TYPE_* constants.
      +
      primaryTrackType - The type of the primary track.
      primaryTrackManifestFormat - A manifest defined Format whose data should be merged into any sample Format output from the Extractor for the primary track.
      @@ -468,18 +468,17 @@ public public TrackOutput track​(int id, int type) -
      Description copied from interface: ExtractorOutput
      +
      Description copied from interface: ExtractorOutput
      Called by the Extractor to get the TrackOutput for a specific track.

      The same TrackOutput is returned if multiple calls are made with the same id.

      Specified by:
      -
      track in interface ExtractorOutput
      +
      track in interface ExtractorOutput
      Parameters:
      id - A track identifier.
      -
      type - The type of the track. Typically one of the C - TRACK_TYPE_* constants.
      +
      type - The track type.
      Returns:
      The TrackOutput for the given track identifier.
      @@ -494,7 +493,7 @@ public public void endTracks()
      Called when all tracks have been identified, meaning no new trackId values will be - passed to ExtractorOutput.track(int, int).
      + passed to ExtractorOutput.track(int, int).
      Specified by:
      endTracks in interface ExtractorOutput
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html index be9b9b9637..c03339a84d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/Chunk.html @@ -215,7 +215,7 @@ implements int trackSelectionReason -
      One of the C SELECTION_REASON_* constants if the chunk belongs to a track.
      +
      One of the selection reasons if the chunk belongs to a track.
      @@ -377,10 +377,10 @@ public final int type
      • trackSelectionReason

        -
        public final int trackSelectionReason
        -
        One of the C SELECTION_REASON_* constants if the chunk belongs to a track. - C.SELECTION_REASON_UNKNOWN if the chunk does not belong to a track, or if the selection - reason is unknown.
        +
        @SelectionReason
        +public final int trackSelectionReason
        +
        One of the selection reasons if the chunk belongs to a track. C.SELECTION_REASON_UNKNOWN if the chunk does not belong to a track, or if the selection reason + is unknown.
      @@ -447,6 +447,7 @@ public final @DataType int type, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.Factory.html index 659df88c70..276103876c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.Factory.html @@ -149,7 +149,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); ChunkExtractor -createProgressiveMediaExtractor​(int primaryTrackType, +createProgressiveMediaExtractor​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType, Format representationFormat, boolean enableEventMessageTrack, List<Format> closedCaptionFormats, @@ -175,14 +175,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      Method Detail

      - +
      • createProgressiveMediaExtractor

        @Nullable
        -ChunkExtractor createProgressiveMediaExtractor​(int primaryTrackType,
        +ChunkExtractor createProgressiveMediaExtractor​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType,
                                                        Format representationFormat,
                                                        boolean enableEventMessageTrack,
                                                        List<Format> closedCaptionFormats,
        @@ -191,7 +191,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
         
        Returns a new ChunkExtractor instance.
        Parameters:
        -
        primaryTrackType - The type of the primary track. One of C.TRACK_TYPE_*.
        +
        primaryTrackType - The type of the primary track.
        representationFormat - The format of the representation to extract from.
        enableEventMessageTrack - Whether to enable the event message track.
        closedCaptionFormats - The Formats of the Closed-Caption tracks.
        diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.TrackOutputProvider.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.TrackOutputProvider.html index ba08fc5c52..ca99f386b0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.TrackOutputProvider.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkExtractor.TrackOutputProvider.html @@ -153,8 +153,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); TrackOutput -track​(int id, - int type) +track​(int id, + @com.google.android.exoplayer2.C.TrackType int type)
        Called to get the TrackOutput for a specific track.
        @@ -176,14 +176,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

        Method Detail

        - +
        • track

          TrackOutput track​(int id,
          -                  int type)
          + @com.google.android.exoplayer2.C.TrackType int type)
        Called to get the TrackOutput for a specific track.

        The same TrackOutput is returned if multiple calls are made with the same @@ -191,8 +191,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

        Parameters:
        id - A track identifier.
        -
        type - The type of the track. Typically one of the C TRACK_TYPE_* - constants.
        +
        type - The type of the track.
        Returns:
        The TrackOutput for the given track identifier.
        diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html index 70678ae3e4..0128a190f8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.html @@ -205,7 +205,7 @@ implements Description -int +@com.google.android.exoplayer2.C.TrackType int primaryTrackType   @@ -234,7 +234,7 @@ implements Description -ChunkSampleStream​(int primaryTrackType, +ChunkSampleStream​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType, int[] embeddedTrackTypes, Format[] embeddedTrackFormats, T chunkSource, @@ -453,7 +453,7 @@ implements
      • primaryTrackType

        -
        public final int primaryTrackType
        +
        public final @com.google.android.exoplayer2.C.TrackType int primaryTrackType
    • @@ -466,15 +466,15 @@ implements + - +
      • ChunkSampleStream

        -
        public ChunkSampleStream​(int primaryTrackType,
        +
        public ChunkSampleStream​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType,
                                  @Nullable
                                  int[] embeddedTrackTypes,
                                  @Nullable
        @@ -490,8 +490,7 @@ implements Constructs an instance.
         
        Parameters:
        -
        primaryTrackType - The type of the primary track. One of the C - TRACK_TYPE_* constants.
        +
        primaryTrackType - The type of the primary track.
        embeddedTrackTypes - The types of any embedded tracks, or null.
        embeddedTrackFormats - The formats of the embedded tracks, or null.
        chunkSource - A ChunkSource from which chunks to load are obtained.
        diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.html index b875d2f7d9..95ca36b4fc 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.html @@ -317,6 +317,7 @@ extends DataSource dataSource, DataSpec dataSpec, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html index 38aacb6ca6..f118ee4cc1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/DataChunk.html @@ -277,6 +277,7 @@ extends @DataType int type, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/InitializationChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/InitializationChunk.html index c65a3e6025..1bec691171 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/InitializationChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/InitializationChunk.html @@ -266,6 +266,7 @@ extends DataSource dataSource, DataSpec dataSpec, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaChunk.html index 39362613fa..da46a0fc78 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaChunk.html @@ -306,6 +306,7 @@ extends DataSource dataSource, DataSpec dataSpec, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html index f16a756590..7312e4fa3d 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/MediaParserChunkExtractor.html @@ -198,7 +198,7 @@ implements Description -MediaParserChunkExtractor​(int primaryTrackType, +MediaParserChunkExtractor​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType, Format manifestFormat, List<Format> closedCaptionFormats) @@ -304,20 +304,19 @@ implements +
        • MediaParserChunkExtractor

          -
          public MediaParserChunkExtractor​(int primaryTrackType,
          +
          public MediaParserChunkExtractor​(@com.google.android.exoplayer2.C.TrackType int primaryTrackType,
                                            Format manifestFormat,
                                            List<Format> closedCaptionFormats)
          Creates a new instance.
          Parameters:
          -
          primaryTrackType - The type of the primary track, or C.TRACK_TYPE_NONE if there is - no primary track. Must be one of the C.TRACK_TYPE_* constants.
          +
          primaryTrackType - The type of the primary track. C.TRACK_TYPE_NONE if there is no primary track.
          manifestFormat - The chunks Format as obtained from the manifest.
          closedCaptionFormats - A list containing the Formats of the closed-caption tracks in the chunks.
          diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.html b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.html index 7249fd35c0..806a241073 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.html @@ -202,7 +202,7 @@ extends Description -SingleSampleMediaChunk​(DataSource dataSource, +SingleSampleMediaChunk​(DataSource dataSource, DataSpec dataSpec, Format trackFormat, int trackSelectionReason, @@ -210,7 +210,7 @@ extends Format sampleFormat)   @@ -298,7 +298,7 @@ extends +
            @@ -307,13 +307,14 @@ extends DataSource dataSource, DataSpec dataSpec, Format trackFormat, + @SelectionReason int trackSelectionReason, @Nullable Object trackSelectionData, long startTimeUs, long endTimeUs, long chunkIndex, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, Format sampleFormat)
          Parameters:
          @@ -325,8 +326,7 @@ extends C.INDEX_UNSET if it is not known. -
          trackType - The type of the chunk. Typically one of the C TRACK_TYPE_* - constants.
          +
          trackType - The track type of the chunk.
          sampleFormat - The Format of the sample in the chunk.
        • 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 4fb04686e4..715a926983 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 @@ -153,13 +153,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); DashChunkSource -createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, +createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int type, + @com.google.android.exoplayer2.C.TrackType int trackType, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List<Format> closedCaptionFormats, @@ -184,7 +184,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

          Method Detail

          - +
            @@ -196,7 +196,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int type, + @com.google.android.exoplayer2.C.TrackType int trackType, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List<Format> closedCaptionFormats, @@ -212,9 +212,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
            periodIndex - The index of the corresponding period in the manifest.
            adaptationSetIndices - The indices of the corresponding adaptation sets in the period.
            trackSelection - The track selection.
            +
            trackType - The track type.
            elapsedRealtimeOffsetMs - If known, an estimate of the instantaneous difference between server-side unix time and SystemClock.elapsedRealtime() in milliseconds, - specified as the server's unix time minus the local elapsed time. Or C.TIME_UNSET if unknown.
            + specified as the server's unix time minus the local elapsed time. Or C.TIME_UNSET + if unknown.
            enableEventMessageTrack - Whether to output an event message track.
            closedCaptionFormats - The Formats of closed caption tracks to be output.
            transferListener - The transfer listener which should be informed of any data transfers. diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html index 07374b8fc0..15130b4b64 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html @@ -87,7 +87,7 @@ loadScripts(document, 'script'); @@ -147,6 +147,23 @@ implements
        @@ -553,7 +571,8 @@ public DashMediaSource.Factory setLivePresentationDelayMs​(long livePresentationDelayMs, boolean overridesManifest)
      • @@ -686,7 +705,7 @@ public Returns:
        The new DashMediaSource.
        Throws:
        -
        NullPointerException - if MediaItem.playbackProperties is null.
        +
        NullPointerException - if MediaItem.localConfiguration is null.
    @@ -758,7 +777,7 @@ public 
  • Summary: 
  • Nested | 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html index 66e631b456..0426145cf0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/DashUtil.html @@ -371,7 +371,7 @@ public static Parameters:
    dataSource - The source from which the data should be loaded.
    -
    trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
    +
    trackType - The type of the representation. Typically one of the com.google.android.exoplayer2.C TRACK_TYPE_* constants.
    representation - The representation which initialization chunk belongs to.
    baseUrlIndex - The index of the base URL to be picked from the list of base URLs.
    Returns:
    @@ -398,7 +398,7 @@ public static Parameters:
    dataSource - The source from which the data should be loaded.
    -
    trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
    +
    trackType - The type of the representation. Typically one of the com.google.android.exoplayer2.C TRACK_TYPE_* constants.
    representation - The representation which initialization chunk belongs to.
    Returns:
    the sample Format of the given representation.
    @@ -423,7 +423,7 @@ public static Parameters:
    dataSource - The source from which the data should be loaded.
    -
    trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
    +
    trackType - The type of the representation. Typically one of the com.google.android.exoplayer2.C TRACK_TYPE_* constants.
    representation - The representation which initialization chunk belongs to.
    baseUrlIndex - The index of the base URL with which to resolve the request URI.
    Returns:
    @@ -451,7 +451,7 @@ public static Parameters:
    dataSource - The source from which the data should be loaded.
    -
    trackType - The type of the representation. Typically one of the C TRACK_TYPE_* constants.
    +
    trackType - The type of the representation. Typically one of the com.google.android.exoplayer2.C TRACK_TYPE_* constants.
    representation - The representation which initialization chunk belongs to.
    Returns:
    The ChunkIndex of the given representation, or null if no initialization or 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 8cfbd412b4..5e3826aff3 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 @@ -202,13 +202,13 @@ implements DashChunkSource -createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, +createDashChunkSource​(LoaderErrorThrower manifestLoaderErrorThrower, DashManifest manifest, BaseUrlExclusionList baseUrlExclusionList, int periodIndex, int[] adaptationSetIndices, ExoTrackSelection trackSelection, - int trackType, + @com.google.android.exoplayer2.C.TrackType int trackType, long elapsedRealtimeOffsetMs, boolean enableEventMessageTrack, List<Format> closedCaptionFormats, @@ -278,7 +278,7 @@ implements ChunkExtractor instances to use for extracting chunks.
    dataSourceFactory - Creates the DataSource to use for downloading chunks.
    -
    maxSegmentsPerLoad - See DefaultDashChunkSource(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory, com.google.android.exoplayer2.upstream.LoaderErrorThrower, com.google.android.exoplayer2.source.dash.manifest.DashManifest, com.google.android.exoplayer2.source.dash.BaseUrlExclusionList, int, int[], com.google.android.exoplayer2.trackselection.ExoTrackSelection, int, com.google.android.exoplayer2.upstream.DataSource, long, int, boolean, java.util.List<com.google.android.exoplayer2.Format>, com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler).
    +
    maxSegmentsPerLoad - See DefaultDashChunkSource(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory, com.google.android.exoplayer2.upstream.LoaderErrorThrower, com.google.android.exoplayer2.source.dash.manifest.DashManifest, com.google.android.exoplayer2.source.dash.BaseUrlExclusionList, int, int[], com.google.android.exoplayer2.trackselection.ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, com.google.android.exoplayer2.upstream.DataSource, long, int, boolean, java.util.List<com.google.android.exoplayer2.Format>, com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler).
    @@ -292,7 +292,7 @@ implements + - + @@ -342,14 +341,14 @@ extends

    Constructor Detail

    - + @@ -1470,8 +1470,8 @@ protected int parseSelectionFlagsFromRoleDescriptors​(

    parseSelectionFlagsFromDashRoleScheme

    @SelectionFlags
    -protected int parseSelectionFlagsFromDashRoleScheme​(@Nullable
    -                                                    String value)
    +protected @com.google.android.exoplayer2.C.SelectionFlags int parseSelectionFlagsFromDashRoleScheme​(@Nullable + String value) @@ -1481,7 +1481,7 @@ protected int parseSelectionFlagsFromDashRoleScheme​(@Nullable
  • parseRoleFlagsFromRoleDescriptors

    @RoleFlags
    -protected int parseRoleFlagsFromRoleDescriptors​(List<Descriptor> roleDescriptors)
    +protected @com.google.android.exoplayer2.C.RoleFlags int parseRoleFlagsFromRoleDescriptors​(List<Descriptor> roleDescriptors)
  • @@ -1491,7 +1491,7 @@ protected int parseRoleFlagsFromRoleDescriptors​(

    parseRoleFlagsFromAccessibilityDescriptors

    @RoleFlags
    -protected int parseRoleFlagsFromAccessibilityDescriptors​(List<Descriptor> accessibilityDescriptors)
    +protected @com.google.android.exoplayer2.C.RoleFlags int parseRoleFlagsFromAccessibilityDescriptors​(List<Descriptor> accessibilityDescriptors) @@ -1501,7 +1501,7 @@ protected int parseRoleFlagsFromAccessibilityDescriptors​(

    parseRoleFlagsFromProperties

    @RoleFlags
    -protected int parseRoleFlagsFromProperties​(List<Descriptor> accessibilityDescriptors)
    +protected @com.google.android.exoplayer2.C.RoleFlags int parseRoleFlagsFromProperties​(List<Descriptor> accessibilityDescriptors) @@ -1511,8 +1511,8 @@ protected int parseRoleFlagsFromProperties​(

    parseRoleFlagsFromDashRoleScheme

    @RoleFlags
    -protected int parseRoleFlagsFromDashRoleScheme​(@Nullable
    -                                               String value)
    +protected @com.google.android.exoplayer2.C.RoleFlags int parseRoleFlagsFromDashRoleScheme​(@Nullable + String value) @@ -1522,8 +1522,8 @@ protected int parseRoleFlagsFromDashRoleScheme​(@Nullable
  • parseTvaAudioPurposeCsValue

    @RoleFlags
    -protected int parseTvaAudioPurposeCsValue​(@Nullable
    -                                          String value)
    +protected @com.google.android.exoplayer2.C.RoleFlags int parseTvaAudioPurposeCsValue​(@Nullable + String value)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/dash/offline/DashDownloader.html b/docs/doc/reference/com/google/android/exoplayer2/source/dash/offline/DashDownloader.html index 38834cc617..da11d4a0cf 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/dash/offline/DashDownloader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/dash/offline/DashDownloader.html @@ -149,7 +149,7 @@ extends Description -HlsMediaPeriod​(HlsExtractorFactory extractorFactory, +HlsMediaPeriod​(HlsExtractorFactory extractorFactory, HlsPlaylistTracker playlistTracker, HlsDataSourceFactory dataSourceFactory, TransferListener mediaTransferListener, @@ -185,7 +185,7 @@ implements Allocator allocator, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, boolean allowChunklessPreparation, - int metadataType, + @com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType int metadataType, boolean useSessionKeys)
    Creates an HLS media period.
    @@ -384,7 +384,7 @@ implements +
    @@ -778,7 +794,7 @@ public 
  • Summary: 
  • Nested | 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaSource.MetadataType.html b/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaSource.MetadataType.html index a7882ab665..e72c27836b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaSource.MetadataType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/hls/HlsMediaSource.MetadataType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    @Documented
     @Retention(SOURCE)
    +@Target(TYPE_USE)
     public static @interface HlsMediaSource.MetadataType
    The types of metadata that can be extracted from HLS streams. @@ -125,7 +126,7 @@ public static @interface HlsMediaSource.MetadataTy
  • HlsMediaSource.METADATA_TYPE_EMSG -

    See HlsMediaSource.Factory.setMetadataType(int).

  • +

    See HlsMediaSource.Factory.setMetadataType(int). diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.html b/docs/doc/reference/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.html index 0eb9418bdd..172efd8dad 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.html @@ -149,7 +149,7 @@ extends OutputConsumerAdapterV30() -

    Equivalent to OutputConsumerAdapterV30(primaryTrackManifestFormat= null, primaryTrackType= C.TRACK_TYPE_NONE, + -OutputConsumerAdapterV30​(Format primaryTrackManifestFormat, - int primaryTrackType, +OutputConsumerAdapterV30​(Format primaryTrackManifestFormat, + @com.google.android.exoplayer2.C.TrackType int primaryTrackType, boolean expectDummySeekMap)
    Creates a new instance.
    @@ -324,11 +324,11 @@ implements

    OutputConsumerAdapterV30

    public OutputConsumerAdapterV30()
    -
    Equivalent to OutputConsumerAdapterV30(primaryTrackManifestFormat= null, primaryTrackType= C.TRACK_TYPE_NONE, + - +
      @@ -336,15 +336,14 @@ implements Format primaryTrackManifestFormat, - int primaryTrackType, + @com.google.android.exoplayer2.C.TrackType int primaryTrackType, boolean expectDummySeekMap)
      Creates a new instance.
      Parameters:
      primaryTrackManifestFormat - The manifest-obtained format of the primary track, or null if not applicable.
      -
      primaryTrackType - The type of the primary track, or C.TRACK_TYPE_NONE if there is - no primary track. Must be one of the C.TRACK_TYPE_* constants.
      +
      primaryTrackType - The type of the primary track. C.TRACK_TYPE_NONE if there is no primary track.
      expectDummySeekMap - Whether the output consumer should expect an initial dummy seek map which should be exposed through getDummySeekMap().
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/source/package-summary.html index fae543fbd6..b661f639c0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/package-summary.html @@ -112,7 +112,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); DefaultMediaSourceFactory.AdsLoaderProvider -
      Provides AdsLoader instances for media items that have ad tag URIs.
      +
      Provides AdsLoader instances for media items that have ad tag URIs.
      @@ -288,7 +288,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); LoopingMediaSource Deprecated. -
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) +
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/source/package-tree.html index 1bc073bbd3..2f64e1f7de 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/package-tree.html @@ -168,8 +168,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.source.SinglePeriodTimeline
    -
  • com.google.android.exoplayer2.source.TrackGroup (implements android.os.Parcelable)
  • -
  • com.google.android.exoplayer2.source.TrackGroupArray (implements android.os.Parcelable)
  • +
  • com.google.android.exoplayer2.source.TrackGroup (implements com.google.android.exoplayer2.Bundleable)
  • +
  • com.google.android.exoplayer2.source.TrackGroupArray (implements com.google.android.exoplayer2.Bundleable)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html index d792cd6754..eca7ec1dff 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":42,"i3":42,"i4":10,"i5":42,"i6":10,"i7":10,"i8":10,"i9":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":42,"i4":42,"i5":10,"i6":42,"i7":10,"i8":10,"i9":10,"i10":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -87,7 +87,7 @@ loadScripts(document, 'script'); @@ -157,6 +157,23 @@ implements
    @@ -515,7 +558,7 @@ public Returns:
    The new RtspMediaSource.
    Throws:
    -
    NullPointerException - if MediaItem.playbackProperties is null.
    +
    NullPointerException - if MediaItem.localConfiguration is null.
    @@ -571,7 +614,7 @@ public 
  • Summary: 
  • Nested | 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html index 27e12c8905..d8c91e621b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html @@ -87,7 +87,7 @@ loadScripts(document, 'script'); @@ -147,6 +147,23 @@ implements
    @@ -659,7 +676,7 @@ public Returns:
    The new SsMediaSource.
    Throws:
    -
    NullPointerException - if MediaItem.playbackProperties is null.
    +
    NullPointerException - if MediaItem.localConfiguration is null.
    @@ -731,7 +748,7 @@ public 
  • Summary: 
  • Nested | 
  • -
  • Field | 
  • +
  • Field | 
  • Constr | 
  • Method
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html index 140f5f1b33..d5fe292c2e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html @@ -207,7 +207,7 @@ extends   -int +@com.google.android.exoplayer2.C.TrackType int type   @@ -229,9 +229,9 @@ extends Description -StreamElement​(String baseUri, +StreamElement​(String baseUri, String chunkTemplate, - int type, + @com.google.android.exoplayer2.C.TrackType int type, String subType, long timescale, String name, @@ -329,7 +329,7 @@ extends
  • type

    -
    public final int type
    +
    public final @com.google.android.exoplayer2.C.TrackType int type
  • @@ -433,7 +433,7 @@ public final  +
      @@ -441,7 +441,7 @@ public final String baseUri, String chunkTemplate, - int type, + @com.google.android.exoplayer2.C.TrackType int type, String subType, long timescale, String name, diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.html index 73c741b16a..e4974a23d2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.html @@ -149,7 +149,7 @@ extends
      public static final class Action.AddMediaItems
       extends Action
      - +
    @@ -202,11 +202,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -216,7 +216,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -201,11 +201,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -215,7 +215,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -201,11 +201,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -215,7 +215,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -203,11 +203,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -217,7 +217,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -203,11 +203,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -217,7 +217,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -203,11 +203,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -217,7 +217,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -179,7 +179,7 @@ extends SetMediaItems​(String tag, - int windowIndex, + int mediaItemIndex, long positionMs, MediaSource... mediaSources)   @@ -204,11 +204,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -218,7 +218,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -203,11 +203,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -217,7 +217,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -178,8 +178,8 @@ extends Description -SetRepeatMode​(String tag, - int repeatMode) +SetRepeatMode​(String tag, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode)   @@ -202,11 +202,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -216,7 +216,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    @@ -201,11 +201,11 @@ extends protected void -doActionImpl​(SimpleExoPlayer player, +doActionImpl​(ExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) -
    Called by Action.doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, + @@ -215,7 +215,7 @@ extends Action -doActionAndScheduleNext, doActionAndScheduleNextImpl +doActionAndScheduleNext, doActionAndScheduleNextImpl
    Specified by:
    @@ -678,9 +678,9 @@ implements
  • buildExoPlayer

    -
    protected SimpleExoPlayer buildExoPlayer​(HostActivity host,
    -                                         Surface surface,
    -                                         MappingTrackSelector trackSelector)
    +
    protected ExoPlayer buildExoPlayer​(HostActivity host,
    +                                   Surface surface,
    +                                   MappingTrackSelector trackSelector)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.Builder.html index c672ef49d6..f3208e376e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.Builder.html @@ -135,7 +135,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public static final class ExoPlayerTestRunner.Builder
     extends Object
    -
    Builder to set-up a ExoPlayerTestRunner. Default fake implementations will be used for +
    Builder to set-up an ExoPlayerTestRunner. Default fake implementations will be used for unset test properties.
    @@ -187,7 +187,7 @@ extends ExoPlayerTestRunner.Builder -initialSeek​(int windowIndex, +initialSeek​(int mediaItemIndex, long positionMs)
    Seeks before setting the media sources and preparing the player.
    @@ -304,8 +304,7 @@ extends ExoPlayerTestRunner.Builder skipSettingMediaSources() -
    Skips calling ExoPlayer.setMediaSources(List) before - preparing.
    +
    Skips calling ExoPlayer.setMediaSources(List) before preparing.
    @@ -393,12 +392,12 @@ extends
  • initialSeek

    -
    public ExoPlayerTestRunner.Builder initialSeek​(int windowIndex,
    +
    public ExoPlayerTestRunner.Builder initialSeek​(int mediaItemIndex,
                                                    long positionMs)
    Seeks before setting the media sources and preparing the player.
    Parameters:
    -
    windowIndex - The window index to seek to.
    +
    mediaItemIndex - The media item index to seek to.
    positionMs - The position in milliseconds to seek to.
    Returns:
    This builder.
    @@ -448,8 +447,8 @@ extends

    skipSettingMediaSources

    public ExoPlayerTestRunner.Builder skipSettingMediaSources()
    -
    Skips calling ExoPlayer.setMediaSources(List) before - preparing. Calling this method is not allowed after calls to setMediaSources(MediaSource...), setTimeline(Timeline) and/or setManifest(Object).
    +
    Skips calling ExoPlayer.setMediaSources(List) before preparing. Calling this method + is not allowed after calls to setMediaSources(MediaSource...), setTimeline(Timeline) and/or setManifest(Object).
    Returns:
    This builder.
    @@ -585,7 +584,7 @@ extends setActionSchedule
    public ExoPlayerTestRunner.Builder setActionSchedule​(ActionSchedule actionSchedule)
    Sets an ActionSchedule to be run by the test runner. The first action will be - executed immediately before SimpleExoPlayer.prepare().
    + executed immediately before Player.prepare().
  • Parameters:
    actionSchedule - An ActionSchedule to be used by the test runner.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html index 998861c593..45d546ed4b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,7 +130,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    AudioListener, DeviceListener, MetadataOutput, Player.EventListener, Player.Listener, ActionSchedule.Callback, TextOutput, VideoListener
    +
    Player.EventListener, Player.Listener, ActionSchedule.Callback

    public final class ExoPlayerTestRunner
    @@ -161,7 +161,7 @@ implements static class 
     ExoPlayerTestRunner.Builder
     
    -
    Builder to set-up a ExoPlayerTestRunner.
    +
    Builder to set-up an ExoPlayerTestRunner.
    @@ -216,150 +216,119 @@ implements void -assertMediaItemsTransitionedSame​(MediaItem... mediaItems) +assertNoPositionDiscontinuities() -
    Asserts that the media items reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided media - items.
    + void -assertMediaItemsTransitionReasonsEqual​(Integer... reasons) +assertPlaybackStatesEqual​(Integer... states) -
    Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
    +
    Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
    void -assertNoPositionDiscontinuities() - - - - - -void -assertPlaybackStatesEqual​(Integer... states) - -
    Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
    - - - -void assertPlayedPeriodIndices​(Integer... periodIndices)
    Asserts that the indices of played periods is equal to the provided list of periods.
    - + void assertPositionDiscontinuityReasonsEqual​(Integer... discontinuityReasons) -
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
    - + void assertTimelineChangeReasonsEqual​(Integer... reasons) -
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
    - + void assertTimelinesSame​(Timeline... timelines) -
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) +
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines.
    - -void -assertTrackGroupsEqual​(TrackGroupArray trackGroupArray) - -
    Asserts that the last track group array reported by Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided - track group array.
    - - - + ExoPlayerTestRunner blockUntilActionScheduleFinished​(long timeoutMs)
    Blocks the current thread until the action schedule finished.
    - + ExoPlayerTestRunner blockUntilEnded​(long timeoutMs)
    Blocks the current thread until the test runner finishes.
    - + void onActionScheduleFinished()
    Called when action schedule finished executing all its actions.
    - + void -onMediaItemTransition​(MediaItem mediaItem, - int reason) +onMediaItemTransition​(MediaItem mediaItem, + @com.google.android.exoplayer2.Player.MediaItemTransitionReason int reason)
    Called when playback transitions to a media item or starts repeating a media item according to the current repeat mode.
    - + void -onPlaybackStateChanged​(int playbackState) +onPlaybackStateChanged​(@com.google.android.exoplayer2.Player.State int playbackState)
    Called when the value returned from Player.getPlaybackState() changes.
    - + void onPlayerError​(PlaybackException error)
    Called when an error occurs.
    - + void -onPositionDiscontinuity​(Player.PositionInfo oldPosition, +onPositionDiscontinuity​(Player.PositionInfo oldPosition, Player.PositionInfo newPosition, - int reason) + @com.google.android.exoplayer2.Player.DiscontinuityReason int reason)
    Called when a position discontinuity occurs.
    - + void -onTimelineChanged​(Timeline timeline, - int reason) +onTimelineChanged​(Timeline timeline, + @com.google.android.exoplayer2.Player.TimelineChangeReason int reason)
    Called when the timeline has been refreshed.
    - -void -onTracksChanged​(TrackGroupArray trackGroups, - TrackSelectionArray trackSelections) - -
    Called when the available or selected tracks change.
    - - - + ExoPlayerTestRunner start()
    Starts the test runner on its own thread.
    - + ExoPlayerTestRunner start​(boolean doPrepare) @@ -379,21 +348,14 @@ implements Player.EventListener -onLoadingChanged, onMaxSeekToPreviousPositionChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onStaticMetadataChanged
  • +onLoadingChanged, onMaxSeekToPreviousPositionChanged, onPlayerStateChanged, onPositionDiscontinuity, onSeekProcessed, onTracksChanged, onTrackSelectionParametersChanged - @@ -526,7 +488,7 @@ implements

    assertTimelinesSame

    public void assertTimelinesSame​(Timeline... timelines)
    -
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) +
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines. This assert differs from testing equality by not comparing period ids which may be different due to id mapping of child source period ids.
    @@ -542,39 +504,10 @@ implements

    assertTimelineChangeReasonsEqual

    public void assertTimelineChangeReasonsEqual​(Integer... reasons)
    -
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
    - - - - - - - -
      -
    • -

      assertMediaItemsTransitionReasonsEqual

      -
      public void assertMediaItemsTransitionReasonsEqual​(Integer... reasons)
      -
      Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
      -
      -
      Parameters:
      -
      reasons - A list of expected transition reasons.
      -
      -
    • -
    @@ -582,22 +515,7 @@ implements

    assertPlaybackStatesEqual

    public void assertPlaybackStatesEqual​(Integer... states)
    -
    Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
    - - - - - - @@ -607,7 +525,7 @@ implements

    assertNoPositionDiscontinuities

    public void assertNoPositionDiscontinuities()
    -
    Asserts that Player.Listener.onPositionDiscontinuity(Player.PositionInfo, + @@ -618,7 +536,7 @@ implements

    assertPositionDiscontinuityReasonsEqual

    public void assertPositionDiscontinuityReasonsEqual​(Integer... discontinuityReasons)
    -
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
    Parameters:
    @@ -643,7 +561,7 @@ implements + - + - - - -
      -
    • -

      onTracksChanged

      -
      public void onTracksChanged​(TrackGroupArray trackGroups,
      -                            TrackSelectionArray trackSelections)
      -
      Description copied from interface: Player.EventListener
      -
      Called when the available or selected tracks change. - -

      Player.EventListener.onEvents(Player, Events) will also be called to report this event along with - other events that happen in the same Looper message queue iteration.

      -
      -
      Specified by:
      -
      onTracksChanged in interface Player.EventListener
      -
      Specified by:
      -
      onTracksChanged in interface Player.Listener
      -
      Parameters:
      -
      trackGroups - The available tracks. Never null, but may be of length zero.
      -
      trackSelections - The selected tracks. Never null, but may contain null elements. A - concrete implementation may include null elements if it has a fixed number of renderer - components, wishes to report a TrackSelection for each of them, and has one or more - renderer components that is not assigned any selected tracks.
      -
      -
    • -
    - +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.LicenseServer.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.LicenseServer.html index 66ed5c64c3..c7c54432bd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.LicenseServer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.LicenseServer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":10,"i2":10,"i3":10}; +var data = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":10,"i5":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -183,10 +183,20 @@ implements +ImmutableList<ImmutableList<Byte>> +getReceivedProvisionRequests() +  + + ImmutableList<ImmutableList<DrmInitData.SchemeData>> getReceivedSchemeDatas()   + +static FakeExoMediaDrm.LicenseServer +requiringProvisioningThenAllowingSchemeDatas​(List<DrmInitData.SchemeData>... schemeDatas) +  + + + + + + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html index 795140981e..f04c4224c1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -305,17 +305,18 @@ implements -ExoMediaCrypto -createMediaCrypto​(byte[] sessionId) +CryptoConfig +createCryptoConfig​(byte[] sessionId) -
    Creates an ExoMediaCrypto for a given session.
    +
    Creates a CryptoConfig that can be passed to a compatible decoder to allow decryption + of protected content using the specified session.
    -Class<com.google.android.exoplayer2.testutil.FakeExoMediaDrm.FakeExoMediaCrypto> -getExoMediaCryptoType() +@com.google.android.exoplayer2.C.CryptoType int +getCryptoType() - +
    Returns the type of CryptoConfig instances returned by ExoMediaDrm.createCryptoConfig(byte[]).
    @@ -398,6 +399,14 @@ implements +boolean +requiresSecureDecoder​(byte[] sessionId, + String mimeType) + +
    Returns whether the given session requires use of a secure decoder for the given MIME type.
    + + + void resetProvisioning() @@ -405,7 +414,7 @@ implements + void restoreKeys​(byte[] sessionId, byte[] keySetId) @@ -413,28 +422,28 @@ implements Restores persisted offline keys into a session.
    - + void setOnEventListener​(ExoMediaDrm.OnEventListener listener)
    Sets the listener for DRM events.
    - + void setOnExpirationUpdateListener​(ExoMediaDrm.OnExpirationUpdateListener listener)
    Sets the listener for session expiration events.
    - + void setOnKeyStatusChangeListener​(ExoMediaDrm.OnKeyStatusChangeListener listener)
    Sets the listener for key status change events.
    - + void setPropertyByteArray​(String propertyName, byte[] value) @@ -442,7 +451,7 @@ implements Sets the value of a byte array property.
    - + void setPropertyString​(String propertyName, String value) @@ -450,7 +459,7 @@ implements Sets the value of a string property.
    - + void triggerEvent​(Predicate<byte[]> sessionIdPredicate, int event, @@ -744,8 +753,7 @@ public FakeExoMediaDrm​(int maxConcurrentSessions)
    • provideKeyResponse

      -
      @Nullable
      -public byte[] provideKeyResponse​(byte[] scope,
      +
      public byte[] provideKeyResponse​(byte[] scope,
                                        byte[] response)
                                 throws NotProvisionedException,
                                        DeniedByServerException
      @@ -825,6 +833,26 @@ public byte[] provideKeyResponse​(byte[] scope,
    + + + +
      +
    • +

      requiresSecureDecoder

      +
      public boolean requiresSecureDecoder​(byte[] sessionId,
      +                                     String mimeType)
      +
      Description copied from interface: ExoMediaDrm
      +
      Returns whether the given session requires use of a secure decoder for the given MIME type. + Assumes a license policy that requires the highest level of security supported by the session.
      +
      +
      Specified by:
      +
      requiresSecureDecoder in interface ExoMediaDrm
      +
      Parameters:
      +
      sessionId - The ID of the session.
      +
      mimeType - The content MIME type to query.
      +
      +
    • +
    @@ -971,40 +999,41 @@ public  + - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExtractorOutput.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExtractorOutput.html index 5d69d2361b..aeaab83381 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExtractorOutput.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExtractorOutput.html @@ -244,7 +244,7 @@ implements endTracks()
    Called when all tracks have been identified, meaning no new trackId values will be - passed to ExtractorOutput.track(int, int).
    + passed to ExtractorOutput.track(int, int). @@ -368,18 +368,17 @@ implements public FakeTrackOutput track​(int id, int type) -
    Description copied from interface: ExtractorOutput
    +
    Description copied from interface: ExtractorOutput
    Called by the Extractor to get the TrackOutput for a specific track.

    The same TrackOutput is returned if multiple calls are made with the same id.

    Specified by:
    -
    track in interface ExtractorOutput
    +
    track in interface ExtractorOutput
    Parameters:
    id - A track identifier.
    -
    type - The type of the track. Typically one of the C - TRACK_TYPE_* constants.
    +
    type - The track type.
    Returns:
    The TrackOutput for the given track identifier.
    @@ -394,7 +393,7 @@ implements public void endTracks()
    Called when all tracks have been identified, meaning no new trackId values will be - passed to ExtractorOutput.track(int, int).
    + passed to ExtractorOutput.track(int, int).
    Specified by:
    endTracks in interface ExtractorOutput
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaChunk.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaChunk.html index 0bbaea92f4..3432d8ac6a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaChunk.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaChunk.html @@ -310,6 +310,7 @@ extends Format trackFormat, long startTimeUs, long endTimeUs, + @SelectionReason int selectionReason)
    Creates a fake media chunk.
    @@ -317,7 +318,7 @@ extends Format.
    startTimeUs - The start time of the media, in microseconds.
    endTimeUs - The end time of the media, in microseconds.
    -
    selectionReason - The reason for selecting this format.
    +
    selectionReason - One of the selection reasons.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.html index 5e9896d0f9..748ddb8f5b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeMediaClockRenderer.html @@ -165,7 +165,7 @@ implements Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener +Renderer.MessageType, Renderer.State, Renderer.WakeupListener + +
    • @@ -139,7 +144,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

    public class StubExoPlayer
    -extends BasePlayer
    +extends StubPlayer
     implements ExoPlayer
    An abstract ExoPlayer implementation that throws UnsupportedOperationException from every method.
    @@ -161,7 +166,7 @@ implements ExoPlayer -ExoPlayer.AudioComponent, ExoPlayer.AudioOffloadListener, ExoPlayer.Builder, ExoPlayer.DeviceComponent, ExoPlayer.MetadataComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent +ExoPlayer.AudioComponent, ExoPlayer.AudioOffloadListener, ExoPlayer.Builder, ExoPlayer.DeviceComponent, ExoPlayer.TextComponent, ExoPlayer.VideoComponent @@ -241,49 +246,41 @@ implements void +addAnalyticsListener​(AnalyticsListener listener) + +
    Adds an AnalyticsListener to receive analytics events.
    + + + +void addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    Adds a listener to receive audio offload events.
    - + void addListener​(Player.EventListener listener)
    Registers a listener to receive events from the player.
    - -void -addListener​(Player.Listener listener) - -
    Registers a listener to receive all events from the player.
    - - void -addMediaItems​(int index, - List<MediaItem> mediaItems) - -
    Adds a list of media items at the given index of the playlist.
    - - - -void addMediaSource​(int index, MediaSource mediaSource)
    Adds a media source at the given index of the playlist.
    - + void addMediaSource​(MediaSource mediaSource)
    Adds a media source to the end of the playlist.
    - + void addMediaSources​(int index, List<MediaSource> mediaSources) @@ -291,546 +288,276 @@ implements Adds a list of media sources at the given index of the playlist. - + void addMediaSources​(List<MediaSource> mediaSources)
    Adds a list of media sources to the end of the playlist.
    + +void +clearAuxEffectInfo() + +
    Detaches any previously attached auxiliary audio effect from the underlying audio track.
    + + void -clearVideoSurface() +clearCameraMotionListener​(CameraMotionListener listener) -
    Clears any Surface, SurfaceHolder, SurfaceView or TextureView - currently set on the player.
    +
    Clears the listener which receives camera motion events if it matches the one passed.
    void -clearVideoSurface​(Surface surface) +clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener) -
    Clears the Surface onto which video is being rendered if it matches the one passed.
    +
    Clears the listener which receives video frame metadata events if it matches the one passed.
    -void -clearVideoSurfaceHolder​(SurfaceHolder surfaceHolder) - -
    Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed.
    - - - -void -clearVideoSurfaceView​(SurfaceView surfaceView) - -
    Clears the SurfaceView onto which video is being rendered if it matches the one passed.
    - - - -void -clearVideoTextureView​(TextureView textureView) - -
    Clears the TextureView onto which video is being rendered if it matches the one passed.
    - - - PlayerMessage createMessage​(PlayerMessage.Target target)
    Creates a message that can be sent to a PlayerMessage.Target.
    - -void -decreaseDeviceVolume() - -
    Decreases the volume of the device.
    - - - + boolean experimentalIsSleepingForOffload()
    Returns whether the player has paused its main loop to save power in offload scheduling mode.
    - + void experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled)
    Sets whether audio offload scheduling is enabled.
    - -Looper -getApplicationLooper() + +AnalyticsCollector +getAnalyticsCollector() -
    Returns the Looper associated with the application thread that's used to access the - player and on which player events are received.
    +
    Returns the AnalyticsCollector used for collecting analytics events.
    - -AudioAttributes -getAudioAttributes() - -
    Returns the attributes for audio playback.
    - - - + ExoPlayer.AudioComponent getAudioComponent() -
    Returns the component of this player for audio output, or null if audio is not supported.
    +
    Deprecated.
    - -Player.Commands -getAvailableCommands() + +DecoderCounters +getAudioDecoderCounters() -
    Returns the player's currently available Player.Commands.
    +
    Returns DecoderCounters for audio, or null if no audio is being played.
    - -long -getBufferedPosition() + +Format +getAudioFormat() -
    Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
    +
    Returns the audio format currently being played, or null if no audio is being played.
    - + +int +getAudioSessionId() + +
    Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
    + + + Clock getClock()
    Returns the Clock used for playback.
    - -long -getContentBufferedPosition() - -
    If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds.
    - - - -long -getContentPosition() - -
    If Player.isPlayingAd() returns true, returns the content position that will be - played once all ads in the ad group have finished playing, in milliseconds.
    - - - -int -getCurrentAdGroupIndex() - -
    If Player.isPlayingAd() returns true, returns the index of the ad group in the period - currently being played.
    - - - -int -getCurrentAdIndexInAdGroup() - -
    If Player.isPlayingAd() returns true, returns the index of the ad in its ad group.
    - - - -List<Cue> -getCurrentCues() - -
    Returns the current Cues.
    - - - -int -getCurrentPeriodIndex() - -
    Returns the index of the period currently being played.
    - - - -long -getCurrentPosition() - -
    Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
    - - - -List<Metadata> -getCurrentStaticMetadata() + +ExoPlayer.DeviceComponent +getDeviceComponent()
    Deprecated.
    - -Timeline -getCurrentTimeline() - -
    Returns the current Timeline.
    - - - -TrackGroupArray -getCurrentTrackGroups() - -
    Returns the available track groups.
    - - - -TrackSelectionArray -getCurrentTrackSelections() - -
    Returns the current track selections.
    - - - -int -getCurrentWindowIndex() - -
    Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
    - - - -ExoPlayer.DeviceComponent -getDeviceComponent() - -
    Returns the component of this player for playback device, or null if it's not supported.
    - - - -DeviceInfo -getDeviceInfo() - -
    Gets the device information.
    - - - -int -getDeviceVolume() - -
    Gets the current volume of the device.
    - - - -long -getDuration() - -
    Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
    - - - -int -getMaxSeekToPreviousPosition() - -
    Returns the maximum position for which Player.seekToPrevious() seeks to the previous window, - in milliseconds.
    - - - -MediaMetadata -getMediaMetadata() - -
    Returns the current combined MediaMetadata, or MediaMetadata.EMPTY if not - supported.
    - - - -ExoPlayer.MetadataComponent -getMetadataComponent() - -
    Returns the component of this player for metadata output, or null if metadata is not supported.
    - - - + boolean getPauseAtEndOfMediaItems()
    Returns whether the player pauses playback at the end of each media item.
    - + Looper getPlaybackLooper()
    Returns the Looper associated with the playback thread.
    - -PlaybackParameters -getPlaybackParameters() - -
    Returns the currently active playback parameters.
    - - - -int -getPlaybackState() - -
    Returns the current playback state of the player.
    - - - -int -getPlaybackSuppressionReason() - -
    Returns the reason why playback is suppressed even though Player.getPlayWhenReady() is - true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
    - - - + ExoPlaybackException getPlayerError() -
    Equivalent to Player.getPlayerError(), except the exception is guaranteed to be an - ExoPlaybackException.
    +
    Returns the error that caused playback to fail.
    - -MediaMetadata -getPlaylistMetadata() - -
    Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
    - - - -boolean -getPlayWhenReady() - -
    Whether playback will proceed when Player.getPlaybackState() == Player.STATE_READY.
    - - - + int getRendererCount()
    Returns the number of renderers.
    - + int getRendererType​(int index)
    Returns the track type that the renderer at a given index handles.
    - -int -getRepeatMode() - -
    Returns the current Player.RepeatMode used for playback.
    - - - -long -getSeekBackIncrement() - -
    Returns the Player.seekBack() increment.
    - - - -long -getSeekForwardIncrement() - -
    Returns the Player.seekForward() increment.
    - - - + SeekParameters getSeekParameters()
    Returns the currently active SeekParameters of the player.
    - + boolean -getShuffleModeEnabled() +getSkipSilenceEnabled() -
    Returns whether shuffling of windows is enabled.
    +
    Returns whether skipping silences in the audio stream is enabled.
    - + ExoPlayer.TextComponent getTextComponent() -
    Returns the component of this player for text output, or null if text is not supported.
    +
    Deprecated.
    - -long -getTotalBufferedDuration() - -
    Returns an estimate of the total buffered duration from the current position, in milliseconds.
    - - - + TrackSelector getTrackSelector()
    Returns the track selector that this player uses, or null if track selection is not supported.
    - + +int +getVideoChangeFrameRateStrategy() + + + + + ExoPlayer.VideoComponent getVideoComponent() -
    Returns the component of this player for video output, or null if video is not supported.
    +
    Deprecated.
    - -VideoSize -getVideoSize() + +DecoderCounters +getVideoDecoderCounters() -
    Gets the size of the video.
    +
    Returns DecoderCounters for video, or null if no video is being played.
    - -float -getVolume() + +Format +getVideoFormat() -
    Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    +
    Returns the video format currently being played, or null if no video is being played.
    - -void -increaseDeviceVolume() + +int +getVideoScalingMode() -
    Increases the volume of the device.
    +
    Returns the C.VideoScalingMode.
    - -boolean -isDeviceMuted() - -
    Gets whether the device is muted or not.
    - - - -boolean -isLoading() - -
    Whether the player is currently loading the source.
    - - - -boolean -isPlayingAd() - -
    Returns whether the player is currently playing an ad.
    - - - -void -moveMediaItems​(int fromIndex, - int toIndex, - int newIndex) - -
    Moves the media item range to the new index.
    - - - -void -prepare() - -
    Deprecated. - -
    - - - + void prepare​(MediaSource mediaSource) -
    Deprecated. - -
    +
    Deprecated.
    - + void prepare​(MediaSource mediaSource, boolean resetPosition, boolean resetState) -
    Deprecated. - -
    +
    Deprecated.
    - + void -release() +removeAnalyticsListener​(AnalyticsListener listener) -
    Releases the player.
    +
    Removes an AnalyticsListener.
    - + void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)
    Removes a listener of audio offload events.
    - + void removeListener​(Player.EventListener listener) -
    Unregister a listener registered through Player.addListener(EventListener).
    +
    Unregister a listener registered through ExoPlayer.addListener(EventListener).
    - -void -removeListener​(Player.Listener listener) - -
    Unregister a listener registered through Player.addListener(Listener).
    - - - -void -removeMediaItems​(int fromIndex, - int toIndex) - -
    Removes a range of media items from the playlist.
    - - - + void retry() -
    Deprecated. -
    Use prepare() instead.
    -
    +
    Deprecated.
    - + void -seekTo​(int windowIndex, - long positionMs) +setAudioAttributes​(AudioAttributes audioAttributes, + boolean handleAudioFocus) -
    Seeks to a position specified in milliseconds in the specified window.
    +
    Sets the attributes for audio playback, used by the underlying audio track.
    - + void -setDeviceMuted​(boolean muted) +setAudioSessionId​(int audioSessionId) -
    Sets the mute state of the device.
    +
    Sets the ID of the audio session to attach to the underlying AudioTrack.
    - + void -setDeviceVolume​(int volume) +setAuxEffectInfo​(AuxEffectInfo auxEffectInfo) -
    Sets the volume of the device.
    +
    Sets information on an auxiliary audio effect to attach to the underlying audio track.
    - + +void +setCameraMotionListener​(CameraMotionListener listener) + +
    Sets a listener of camera motion events.
    + + + void setForegroundMode​(boolean foregroundMode) @@ -838,24 +565,22 @@ implements + void -setMediaItems​(List<MediaItem> mediaItems, - boolean resetPosition) +setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy) -
    Clears the playlist and adds the specified MediaItems.
    +
    Sets whether the player should pause automatically when audio is rerouted from a headset to + device speakers.
    - + void -setMediaItems​(List<MediaItem> mediaItems, - int startWindowIndex, - long startPositionMs) +setHandleWakeLock​(boolean handleWakeLock) -
    Clears the playlist and adds the specified MediaItems.
    +
    Deprecated.
    - + void setMediaSource​(MediaSource mediaSource) @@ -863,7 +588,7 @@ implements + void setMediaSource​(MediaSource mediaSource, boolean resetPosition) @@ -871,7 +596,7 @@ implements Clears the playlist and adds the specified MediaSource. - + void setMediaSource​(MediaSource mediaSource, long startPositionMs) @@ -879,7 +604,7 @@ implements Clears the playlist and adds the specified MediaSource. - + void setMediaSources​(List<MediaSource> mediaSources) @@ -887,7 +612,7 @@ implements + void setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition) @@ -895,119 +620,100 @@ implements Clears the playlist and adds the specified MediaSources. - + void setMediaSources​(List<MediaSource> mediaSources, - int startWindowIndex, + int startMediaItemIndex, long startPositionMs)
    Clears the playlist and adds the specified MediaSources.
    - + void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    Sets whether to pause playback at the end of each media item.
    - + void -setPlaybackParameters​(PlaybackParameters playbackParameters) +setPriorityTaskManager​(PriorityTaskManager priorityTaskManager) -
    Attempts to set the playback parameters.
    +
    Sets a PriorityTaskManager, or null to clear a previously set priority task manager.
    - -void -setPlaylistMetadata​(MediaMetadata mediaMetadata) - -
    Sets the playlist MediaMetadata.
    - - - -void -setPlayWhenReady​(boolean playWhenReady) - -
    Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
    - - - -void -setRepeatMode​(int repeatMode) - -
    Sets the Player.RepeatMode to be used for playback.
    - - - + void setSeekParameters​(SeekParameters seekParameters)
    Sets the parameters that control how seek operations are performed.
    - -void -setShuffleModeEnabled​(boolean shuffleModeEnabled) - -
    Sets whether shuffling of windows is enabled.
    - - - + void setShuffleOrder​(ShuffleOrder shuffleOrder)
    Sets the shuffle order.
    - + void -setVideoSurface​(Surface surface) +setSkipSilenceEnabled​(boolean skipSilenceEnabled) -
    Sets the Surface onto which video will be rendered.
    +
    Sets whether skipping silences in the audio stream is enabled.
    - + void -setVideoSurfaceHolder​(SurfaceHolder surfaceHolder) +setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread) -
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered.
    +
    Deprecated.
    - + void -setVideoSurfaceView​(SurfaceView surfaceView) +setVideoChangeFrameRateStrategy​(int videoChangeFrameRateStrategy) -
    Sets the SurfaceView onto which video will be rendered.
    +
    Sets a C.VideoChangeFrameRateStrategy that will be used by the player when provided + with a video output Surface.
    - + void -setVideoTextureView​(TextureView textureView) +setVideoFrameMetadataListener​(VideoFrameMetadataListener listener) -
    Sets the TextureView onto which video will be rendered.
    +
    Sets a listener to receive video frame metadata events.
    - + void -setVolume​(float audioVolume) +setVideoScalingMode​(int videoScalingMode) -
    Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
    + - + void -stop​(boolean reset) -  +setWakeMode​(int wakeMode) + +
    Sets how the player should keep the device awake for playback when the screen is off.
    + + @@ -1064,9 +770,9 @@ implements
  • getAudioComponent

    -
    public ExoPlayer.AudioComponent getAudioComponent()
    -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for audio output, or null if audio is not supported.
    +
    @Deprecated
    +public ExoPlayer.AudioComponent getAudioComponent()
    +
    Deprecated.
    Specified by:
    getAudioComponent in interface ExoPlayer
    @@ -1079,9 +785,9 @@ implements
  • getVideoComponent

    -
    public ExoPlayer.VideoComponent getVideoComponent()
    -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for video output, or null if video is not supported.
    +
    @Deprecated
    +public ExoPlayer.VideoComponent getVideoComponent()
    +
    Deprecated.
    Specified by:
    getVideoComponent in interface ExoPlayer
    @@ -1094,39 +800,24 @@ implements
  • getTextComponent

    -
    public ExoPlayer.TextComponent getTextComponent()
    -
    Description copied from interface: ExoPlayer
    -
    Returns the component of this player for text output, or null if text is not supported.
    +
    @Deprecated
    +public ExoPlayer.TextComponent getTextComponent()
    +
    Deprecated.
    Specified by:
    getTextComponent in interface ExoPlayer
  • - - - -
    • getDeviceComponent

      -
      public ExoPlayer.DeviceComponent getDeviceComponent()
      -
      Description copied from interface: ExoPlayer
      -
      Returns the component of this player for playback device, or null if it's not supported.
      +
      @Deprecated
      +public ExoPlayer.DeviceComponent getDeviceComponent()
      +
      Deprecated.
      Specified by:
      getDeviceComponent in interface ExoPlayer
      @@ -1148,22 +839,6 @@ implements - - -
        -
      • -

        getApplicationLooper

        -
        public Looper getApplicationLooper()
        -
        Description copied from interface: Player
        -
        Returns the Looper associated with the application thread that's used to access the - player and on which player events are received.
        -
        -
        Specified by:
        -
        getApplicationLooper in interface Player
        -
        -
      • -
      @@ -1179,27 +854,6 @@ implements - - -
        -
      • -

        addListener

        -
        public void addListener​(Player.Listener listener)
        -
        Description copied from interface: Player
        -
        Registers a listener to receive all events from the player. - -

        The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

        -
        -
        Specified by:
        -
        addListener in interface Player
        -
        Parameters:
        -
        listener - The listener to register.
        -
        -
      • -
      @@ -1207,38 +861,18 @@ implements

      addListener

      public void addListener​(Player.EventListener listener)
      -
      Description copied from interface: Player
      +
      Description copied from interface: ExoPlayer
      Registers a listener to receive events from the player. -

      The listener's methods will be called on the thread that was used to construct the player. - However, if the thread used to construct the player does not have a Looper, then the - listener will be called on the main thread.

      +

      The listener's methods will be called on the thread associated with Player.getApplicationLooper().

      Specified by:
      -
      addListener in interface Player
      +
      addListener in interface ExoPlayer
      Parameters:
      listener - The listener to register.
    - - - -
      -
    • -

      removeListener

      -
      public void removeListener​(Player.Listener listener)
      -
      Description copied from interface: Player
      -
      Unregister a listener registered through Player.addListener(Listener). The listener will no - longer receive events.
      -
      -
      Specified by:
      -
      removeListener in interface Player
      -
      Parameters:
      -
      listener - The listener to unregister.
      -
      -
    • -
    @@ -1246,12 +880,12 @@ implements

    removeListener

    public void removeListener​(Player.EventListener listener)
    -
    Description copied from interface: Player
    -
    Unregister a listener registered through Player.addListener(EventListener). The listener will +
    Description copied from interface: ExoPlayer
    +
    Unregister a listener registered through ExoPlayer.addListener(EventListener). The listener will no longer receive events from the player.
    Specified by:
    -
    removeListener in interface Player
    +
    removeListener in interface ExoPlayer
    Parameters:
    listener - The listener to unregister.
    @@ -1291,44 +925,52 @@ implements + - + + + + + @@ -1339,14 +981,20 @@ public int getPlaybackSuppressionReason()
  • getPlayerError

    public ExoPlaybackException getPlayerError()
    -
    Description copied from interface: ExoPlayer
    -
    Equivalent to Player.getPlayerError(), except the exception is guaranteed to be an - ExoPlaybackException.
    +
    Description copied from interface: Player
    +
    Returns the error that caused playback to fail. This is the same error that will have been + reported via Player.Listener.onPlayerError(PlaybackException) at the time of failure. It can + be queried using this method until the player is re-prepared. + +

    Note that this method will always return null if Player.getPlaybackState() is not + Player.STATE_IDLE.

    Specified by:
    getPlayerError in interface ExoPlayer
    Specified by:
    getPlayerError in interface Player
    +
    Overrides:
    +
    getPlayerError in class StubPlayer
    Returns:
    The error, or null.
    See Also:
    @@ -1362,34 +1010,13 @@ public int getPlaybackSuppressionReason()

    retry

    @Deprecated
     public void retry()
    -
    Deprecated. -
    Use prepare() instead.
    -
    +
    Deprecated.
    Specified by:
    retry in interface ExoPlayer
  • - - - - @@ -1398,9 +1025,7 @@ public void prepare()

    prepare

    @Deprecated
     public void prepare​(MediaSource mediaSource)
    -
    Deprecated. - -
    +
    Deprecated.
    Specified by:
    prepare in interface ExoPlayer
    @@ -1417,61 +1042,13 @@ public void prepare​(MediaSource mediaSource, boolean resetPosition, boolean resetState) -
    Deprecated. - -
    +
    Deprecated.
    Specified by:
    prepare in interface ExoPlayer
  • - - - - - - - -
      -
    • -

      setMediaItems

      -
      public void setMediaItems​(List<MediaItem> mediaItems,
      -                          int startWindowIndex,
      -                          long startPositionMs)
      -
      Description copied from interface: Player
      -
      Clears the playlist and adds the specified MediaItems.
      -
      -
      Specified by:
      -
      setMediaItems in interface Player
      -
      Parameters:
      -
      mediaItems - The new MediaItems.
      -
      startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
      -
      startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
      -
      -
    • -
    @@ -1525,7 +1102,7 @@ public void prepare​(Parameters:
    mediaSource - The new MediaSource.
    resetPosition - Whether the playback position should be reset to the default position. If - false, playback will start from the position defined by Player.getCurrentWindowIndex() + false, playback will start from the position defined by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
  • @@ -1565,7 +1142,7 @@ public void prepare​(mediaSources - The new MediaSources.
    resetPosition - Whether the playback position should be reset to the default position in the first Timeline.Window. If false, playback will start from the position defined - by Player.getCurrentWindowIndex() and Player.getCurrentPosition().
    + by Player.getCurrentMediaItemIndex() and Player.getCurrentPosition().
    @@ -1576,7 +1153,7 @@ public void prepare​(

    setMediaSources

    public void setMediaSources​(List<MediaSource> mediaSources,
    -                            int startWindowIndex,
    +                            int startMediaItemIndex,
                                 long startPositionMs)
    Description copied from interface: ExoPlayer
    Clears the playlist and adds the specified MediaSources.
    @@ -1585,31 +1162,10 @@ public void prepare​(setMediaSources in interface ExoPlayer
    Parameters:
    mediaSources - The new MediaSources.
    -
    startWindowIndex - The window index to start playback from. If C.INDEX_UNSET is - passed, the current position is not reset.
    -
    startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given window is used. In any case, if - startWindowIndex is set to C.INDEX_UNSET, this parameter is ignored and the - position is not reset at all.
    -
    - - - - - -
      -
    • -

      addMediaItems

      -
      public void addMediaItems​(int index,
      -                          List<MediaItem> mediaItems)
      -
      Description copied from interface: Player
      -
      Adds a list of media items at the given index of the playlist.
      -
      -
      Specified by:
      -
      addMediaItems in interface Player
      -
      Parameters:
      -
      index - The index at which to add the media items. If the index is larger than the size of - the playlist, the media items are added to the end of the playlist.
      -
      mediaItems - The MediaItems to add.
      +
      startMediaItemIndex - The media item index to start playback from. If C.INDEX_UNSET is passed, the current position is not reset.
      +
      startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given media item is used. In any case, + if startMediaItemIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
    @@ -1685,153 +1241,6 @@ public void prepare​( - - - -
      -
    • -

      moveMediaItems

      -
      public void moveMediaItems​(int fromIndex,
      -                           int toIndex,
      -                           int newIndex)
      -
      Description copied from interface: Player
      -
      Moves the media item range to the new index.
      -
      -
      Specified by:
      -
      moveMediaItems in interface Player
      -
      Parameters:
      -
      fromIndex - The start of the range to move.
      -
      toIndex - The first item not to be included in the range (exclusive).
      -
      newIndex - The new index of the first media item of the range. If the new index is larger - than the size of the remaining playlist after removing the range, the range is moved to the - end of the playlist.
      -
      -
    • -
    - - - -
      -
    • -

      removeMediaItems

      -
      public void removeMediaItems​(int fromIndex,
      -                             int toIndex)
      -
      Description copied from interface: Player
      -
      Removes a range of media items from the playlist.
      -
      -
      Specified by:
      -
      removeMediaItems in interface Player
      -
      Parameters:
      -
      fromIndex - The index at which to start removing media items.
      -
      toIndex - The index of the first item to be kept (exclusive). If the index is larger than - the size of the playlist, media items to the end of the playlist are removed.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      setPlayWhenReady

      -
      public void setPlayWhenReady​(boolean playWhenReady)
      -
      Description copied from interface: Player
      -
      Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY. - -

      If the player is already in the ready state then this method pauses and resumes playback.

      -
      -
      Specified by:
      -
      setPlayWhenReady in interface Player
      -
      Parameters:
      -
      playWhenReady - Whether playback should proceed when ready.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      setRepeatMode

      -
      public void setRepeatMode​(@RepeatMode
      -                          int repeatMode)
      -
      Description copied from interface: Player
      -
      Sets the Player.RepeatMode to be used for playback.
      -
      -
      Specified by:
      -
      setRepeatMode in interface Player
      -
      Parameters:
      -
      repeatMode - The repeat mode.
      -
      -
    • -
    - - - - @@ -1849,172 +1258,281 @@ public void prepare​( - +
    • -

      setShuffleModeEnabled

      -
      public void setShuffleModeEnabled​(boolean shuffleModeEnabled)
      -
      Description copied from interface: Player
      -
      Sets whether shuffling of windows is enabled.
      -
      -
      Specified by:
      -
      setShuffleModeEnabled in interface Player
      -
      Parameters:
      -
      shuffleModeEnabled - Whether shuffling is enabled.
      -
      -
    • -
    - - - - - - - - - - - -
      -
    • -

      seekTo

      -
      public void seekTo​(int windowIndex,
      -                   long positionMs)
      -
      Description copied from interface: Player
      -
      Seeks to a position specified in milliseconds in the specified window.
      -
      -
      Specified by:
      -
      seekTo in interface Player
      -
      Parameters:
      -
      windowIndex - The index of the window.
      -
      positionMs - The seek position in the specified window, or C.TIME_UNSET to seek to - the window's default position.
      -
      -
    • -
    - - - - - - - - - - - - - - - -
      -
    • -

      setPlaybackParameters

      -
      public void setPlaybackParameters​(PlaybackParameters playbackParameters)
      -
      Description copied from interface: Player
      -
      Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the - player to the default, which means there is no speed or pitch adjustment. +

      setAudioAttributes

      +
      public void setAudioAttributes​(AudioAttributes audioAttributes,
      +                               boolean handleAudioFocus)
      +
      Description copied from interface: ExoPlayer
      +
      Sets the attributes for audio playback, used by the underlying audio track. If not set, the + default audio attributes will be used. They are suitable for general media playback. -

      Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently - active playback parameters change.

      +

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

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

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

      If audio focus should be handled, the AudioAttributes.usage must be C.USAGE_MEDIA or C.USAGE_GAME. Other usages will throw an IllegalArgumentException.

      Specified by:
      -
      setPlaybackParameters in interface Player
      +
      setAudioAttributes in interface ExoPlayer
      Parameters:
      -
      playbackParameters - The playback parameters.
      +
      audioAttributes - The attributes to use for audio playback.
      +
      handleAudioFocus - True if the player should handle audio focus, false otherwise.
    - + + + + + + + + +
      +
    • +

      setAuxEffectInfo

      +
      public void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)
      +
      Description copied from interface: ExoPlayer
      +
      Sets information on an auxiliary audio effect to attach to the underlying audio track.
      +
      +
      Specified by:
      +
      setAuxEffectInfo in interface ExoPlayer
      +
      +
    • +
    + + + +
      +
    • +

      clearAuxEffectInfo

      +
      public void clearAuxEffectInfo()
      +
      Description copied from interface: ExoPlayer
      +
      Detaches any previously attached auxiliary audio effect from the underlying audio track.
      +
      +
      Specified by:
      +
      clearAuxEffectInfo in interface ExoPlayer
      +
      +
    • +
    + + + +
      +
    • +

      setSkipSilenceEnabled

      +
      public void setSkipSilenceEnabled​(boolean skipSilenceEnabled)
      +
      Description copied from interface: ExoPlayer
      +
      Sets whether skipping silences in the audio stream is enabled.
      +
      +
      Specified by:
      +
      setSkipSilenceEnabled in interface ExoPlayer
      +
      Parameters:
      +
      skipSilenceEnabled - Whether skipping silences in the audio stream is enabled.
      +
      +
    • +
    + + + +
      +
    • +

      getSkipSilenceEnabled

      +
      public boolean getSkipSilenceEnabled()
      +
      Description copied from interface: ExoPlayer
      +
      Returns whether skipping silences in the audio stream is enabled.
      +
      +
      Specified by:
      +
      getSkipSilenceEnabled in interface ExoPlayer
      +
      +
    • +
    + + + + + + + + + + + + + + + + + + + +
      +
    • +

      setVideoFrameMetadataListener

      +
      public void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
      +
      Description copied from interface: ExoPlayer
      +
      Sets a listener to receive video frame metadata events. + +

      This method is intended to be called by the same component that sets the Surface + onto which video will be rendered. If using ExoPlayer's standard UI components, this method + should not be called directly from application code.

      +
      +
      Specified by:
      +
      setVideoFrameMetadataListener in interface ExoPlayer
      +
      Parameters:
      +
      listener - The listener.
      +
      +
    • +
    + + + +
      +
    • +

      clearVideoFrameMetadataListener

      +
      public void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
      +
      Description copied from interface: ExoPlayer
      +
      Clears the listener which receives video frame metadata events if it matches the one passed. + Else does nothing.
      +
      +
      Specified by:
      +
      clearVideoFrameMetadataListener in interface ExoPlayer
      +
      Parameters:
      +
      listener - The listener to clear.
      +
      +
    • +
    + + + + + + + +
      +
    • +

      clearCameraMotionListener

      +
      public void clearCameraMotionListener​(CameraMotionListener listener)
      +
      Description copied from interface: ExoPlayer
      +
      Clears the listener which receives camera motion events if it matches the one passed. Else does + nothing.
      +
      +
      Specified by:
      +
      clearCameraMotionListener in interface ExoPlayer
      +
      Parameters:
      +
      listener - The listener to clear.
    @@ -2051,35 +1569,6 @@ public void prepare​( - - - -
      -
    • -

      stop

      -
      public void stop​(boolean reset)
      -
      -
      Specified by:
      -
      stop in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      release

      -
      public void release()
      -
      Description copied from interface: Player
      -
      Releases the player. This method must be called when the player is no longer required. The - player must not be used after calling this method.
      -
      -
      Specified by:
      -
      release in interface Player
      -
      -
    • -
    @@ -2091,8 +1580,8 @@ public void prepare​(Creates a message that can be sent to a PlayerMessage.Target. By default, the message will be delivered immediately without blocking on the playback thread. The default PlayerMessage.getType() is 0 and the default PlayerMessage.getPayload() is null. If a position is specified with PlayerMessage.setPosition(long), the message will be - delivered at this position in the current window defined by Player.getCurrentWindowIndex(). - Alternatively, the message can be sent at a specific window using PlayerMessage.setPosition(int, long). + delivered at this position in the current media item defined by Player.getCurrentMediaItemIndex(). Alternatively, the message can be sent at a specific mediaItem + using PlayerMessage.setPosition(int, long).
    Specified by:
    createMessage in interface ExoPlayer
    @@ -2132,7 +1621,7 @@ public void prepare​(Parameters:
    index - The index of the renderer.
    Returns:
    -
    One of the TRACK_TYPE_* constants defined in C.
    +
    The track type that the renderer handles.
    @@ -2152,682 +1641,6 @@ public  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
    • -

      getCurrentPeriodIndex

      -
      public int getCurrentPeriodIndex()
      -
      Description copied from interface: Player
      -
      Returns the index of the period currently being played.
      -
      -
      Specified by:
      -
      getCurrentPeriodIndex in interface Player
      -
      -
    • -
    - - - - - - - -
      -
    • -

      getDuration

      -
      public long getDuration()
      -
      Description copied from interface: Player
      -
      Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
      -
      -
      Specified by:
      -
      getDuration in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      getCurrentPosition

      -
      public long getCurrentPosition()
      -
      Description copied from interface: Player
      -
      Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
      -
      -
      Specified by:
      -
      getCurrentPosition in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      getBufferedPosition

      -
      public long getBufferedPosition()
      -
      Description copied from interface: Player
      -
      Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
      -
      -
      Specified by:
      -
      getBufferedPosition in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      getTotalBufferedDuration

      -
      public long getTotalBufferedDuration()
      -
      Description copied from interface: Player
      -
      Returns an estimate of the total buffered duration from the current position, in milliseconds. - This includes pre-buffered data for subsequent ads and windows.
      -
      -
      Specified by:
      -
      getTotalBufferedDuration in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      isPlayingAd

      -
      public boolean isPlayingAd()
      -
      Description copied from interface: Player
      -
      Returns whether the player is currently playing an ad.
      -
      -
      Specified by:
      -
      isPlayingAd in interface Player
      -
      -
    • -
    - - - - - - - - - - - -
      -
    • -

      getContentPosition

      -
      public long getContentPosition()
      -
      Description copied from interface: Player
      -
      If Player.isPlayingAd() returns true, returns the content position that will be - played once all ads in the ad group have finished playing, in milliseconds. If there is no ad - playing, the returned position is the same as that returned by Player.getCurrentPosition().
      -
      -
      Specified by:
      -
      getContentPosition in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      getContentBufferedPosition

      -
      public long getContentBufferedPosition()
      -
      Description copied from interface: Player
      -
      If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds. If there is no ad - playing, the returned position is the same as that returned by Player.getBufferedPosition().
      -
      -
      Specified by:
      -
      getContentBufferedPosition in interface Player
      -
      -
    • -
    - - - - - - - -
      -
    • -

      setVolume

      -
      public void setVolume​(float audioVolume)
      -
      Description copied from interface: Player
      -
      Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      -
      -
      Specified by:
      -
      setVolume in interface Player
      -
      Parameters:
      -
      audioVolume - Linear output gain to apply to all audio channels.
      -
      -
    • -
    - - - -
      -
    • -

      getVolume

      -
      public float getVolume()
      -
      Description copied from interface: Player
      -
      Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      -
      -
      Specified by:
      -
      getVolume in interface Player
      -
      Returns:
      -
      The linear gain applied to all audio channels.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      clearVideoSurface

      -
      public void clearVideoSurface​(@Nullable
      -                              Surface surface)
      -
      Description copied from interface: Player
      -
      Clears the Surface onto which video is being rendered if it matches the one passed. - Else does nothing.
      -
      -
      Specified by:
      -
      clearVideoSurface in interface Player
      -
      Parameters:
      -
      surface - The surface to clear.
      -
      -
    • -
    - - - - - - - - - - - -
      -
    • -

      clearVideoSurfaceHolder

      -
      public void clearVideoSurfaceHolder​(@Nullable
      -                                    SurfaceHolder surfaceHolder)
      -
      Description copied from interface: Player
      -
      Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed. Else does nothing.
      -
      -
      Specified by:
      -
      clearVideoSurfaceHolder in interface Player
      -
      Parameters:
      -
      surfaceHolder - The surface holder to clear.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      clearVideoSurfaceView

      -
      public void clearVideoSurfaceView​(@Nullable
      -                                  SurfaceView surfaceView)
      -
      Description copied from interface: Player
      -
      Clears the SurfaceView onto which video is being rendered if it matches the one passed. - Else does nothing.
      -
      -
      Specified by:
      -
      clearVideoSurfaceView in interface Player
      -
      Parameters:
      -
      surfaceView - The texture view to clear.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      clearVideoTextureView

      -
      public void clearVideoTextureView​(@Nullable
      -                                  TextureView textureView)
      -
      Description copied from interface: Player
      -
      Clears the TextureView onto which video is being rendered if it matches the one passed. - Else does nothing.
      -
      -
      Specified by:
      -
      clearVideoTextureView in interface Player
      -
      Parameters:
      -
      textureView - The texture view to clear.
      -
      -
    • -
    - - - - - - - -
      -
    • -

      getCurrentCues

      -
      public List<Cue> getCurrentCues()
      -
      Description copied from interface: Player
      -
      Returns the current Cues. This list may be empty.
      -
      -
      Specified by:
      -
      getCurrentCues in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      getDeviceInfo

      -
      public DeviceInfo getDeviceInfo()
      -
      Description copied from interface: Player
      -
      Gets the device information.
      -
      -
      Specified by:
      -
      getDeviceInfo in interface Player
      -
      -
    • -
    - - - - - - - -
      -
    • -

      isDeviceMuted

      -
      public boolean isDeviceMuted()
      -
      Description copied from interface: Player
      -
      Gets whether the device is muted or not.
      -
      -
      Specified by:
      -
      isDeviceMuted in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      setDeviceVolume

      -
      public void setDeviceVolume​(int volume)
      -
      Description copied from interface: Player
      -
      Sets the volume of the device.
      -
      -
      Specified by:
      -
      setDeviceVolume in interface Player
      -
      Parameters:
      -
      volume - The volume to set.
      -
      -
    • -
    - - - -
      -
    • -

      increaseDeviceVolume

      -
      public void increaseDeviceVolume()
      -
      Description copied from interface: Player
      -
      Increases the volume of the device.
      -
      -
      Specified by:
      -
      increaseDeviceVolume in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      decreaseDeviceVolume

      -
      public void decreaseDeviceVolume()
      -
      Description copied from interface: Player
      -
      Decreases the volume of the device.
      -
      -
      Specified by:
      -
      decreaseDeviceVolume in interface Player
      -
      -
    • -
    - - - -
      -
    • -

      setDeviceMuted

      -
      public void setDeviceMuted​(boolean muted)
      -
      Description copied from interface: Player
      -
      Sets the mute state of the device.
      -
      -
      Specified by:
      -
      setDeviceMuted in interface Player
      -
      -
    • -
    @@ -2878,7 +1691,7 @@ public Description copied from interface: ExoPlayer
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Specified by:
    setPauseAtEndOfMediaItems in interface ExoPlayer
    @@ -2904,6 +1717,173 @@ public  + + +
      +
    • +

      getAudioFormat

      +
      @Nullable
      +public Format getAudioFormat()
      +
      Description copied from interface: ExoPlayer
      +
      Returns the audio format currently being played, or null if no audio is being played.
      +
      +
      Specified by:
      +
      getAudioFormat in interface ExoPlayer
      +
      +
    • +
    + + + +
      +
    • +

      getVideoFormat

      +
      @Nullable
      +public Format getVideoFormat()
      +
      Description copied from interface: ExoPlayer
      +
      Returns the video format currently being played, or null if no video is being played.
      +
      +
      Specified by:
      +
      getVideoFormat in interface ExoPlayer
      +
      +
    • +
    + + + + + + + + + + + +
      +
    • +

      setHandleAudioBecomingNoisy

      +
      public void setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)
      +
      Description copied from interface: ExoPlayer
      +
      Sets whether the player should pause automatically when audio is rerouted from a headset to + device speakers. See the audio + becoming noisy documentation for more information.
      +
      +
      Specified by:
      +
      setHandleAudioBecomingNoisy in interface ExoPlayer
      +
      Parameters:
      +
      handleAudioBecomingNoisy - Whether the player should pause automatically when audio is + rerouted from a headset to device speakers.
      +
      +
    • +
    + + + + + + + +
      +
    • +

      setWakeMode

      +
      public void setWakeMode​(int wakeMode)
      +
      Description copied from interface: ExoPlayer
      +
      Sets how the player should keep the device awake for playback when the screen is off. + +

      Enabling this feature requires the Manifest.permission.WAKE_LOCK permission. + It should be used together with a foreground Service for use cases where + playback occurs and the screen is off (e.g. background audio playback). It is not useful when + the screen will be kept on during playback (e.g. foreground video playback). + +

      When enabled, the locks (PowerManager.WakeLock / WifiManager.WifiLock) will be held whenever the player is in the Player.STATE_READY or Player.STATE_BUFFERING states with playWhenReady = true. The locks + held depends on the specified C.WakeMode.

      +
      +
      Specified by:
      +
      setWakeMode in interface ExoPlayer
      +
      Parameters:
      +
      wakeMode - The C.WakeMode option to keep the device awake during playback.
      +
      +
    • +
    + + + + + + + +
      +
    • +

      setThrowsWhenUsingWrongThread

      +
      @Deprecated
      +public void setThrowsWhenUsingWrongThread​(boolean throwsWhenUsingWrongThread)
      +
      Deprecated.
      +
      Description copied from interface: ExoPlayer
      +
      Sets whether the player should throw an IllegalStateException when methods are called + from a thread other than the one associated with Player.getApplicationLooper(). + +

      The default is true and this method will be removed in the future.

      +
      +
      Specified by:
      +
      setThrowsWhenUsingWrongThread in interface ExoPlayer
      +
      Parameters:
      +
      throwsWhenUsingWrongThread - Whether to throw when methods are called from a wrong thread.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/StubPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/StubPlayer.html new file mode 100644 index 0000000000..b1e6c14dcb --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/StubPlayer.html @@ -0,0 +1,1958 @@ + + + + +StubPlayer (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class StubPlayer

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StubPlayer

          +
          public StubPlayer()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getApplicationLooper

          +
          public Looper getApplicationLooper()
          +
          Description copied from interface: Player
          +
          Returns the Looper associated with the application thread that's used to access the + player and on which player events are received.
          +
        • +
        + + + +
          +
        • +

          addListener

          +
          public void addListener​(Player.Listener listener)
          +
          Description copied from interface: Player
          +
          Registers a listener to receive all events from the player. + +

          The listener's methods will be called on the thread associated with Player.getApplicationLooper().

          +
          +
          Parameters:
          +
          listener - The listener to register.
          +
          +
        • +
        + + + +
          +
        • +

          removeListener

          +
          public void removeListener​(Player.Listener listener)
          +
          Description copied from interface: Player
          +
          Unregister a listener registered through Player.addListener(Listener). The listener will no + longer receive events.
          +
          +
          Parameters:
          +
          listener - The listener to unregister.
          +
          +
        • +
        + + + + + + + + + + + + + + + +
          +
        • +

          prepare

          +
          public void prepare()
          +
          Description copied from interface: Player
          +
          Prepares the player.
          +
        • +
        + + + + + + + +
          +
        • +

          setMediaItems

          +
          public void setMediaItems​(List<MediaItem> mediaItems,
          +                          int startIndex,
          +                          long startPositionMs)
          +
          Description copied from interface: Player
          +
          Clears the playlist and adds the specified MediaItems.
          +
          +
          Parameters:
          +
          mediaItems - The new MediaItems.
          +
          startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET + is passed, the current position is not reset.
          +
          startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In + any case, if startIndex is set to C.INDEX_UNSET, this parameter is ignored + and the position is not reset at all.
          +
          +
        • +
        + + + +
          +
        • +

          addMediaItems

          +
          public void addMediaItems​(int index,
          +                          List<MediaItem> mediaItems)
          +
          Description copied from interface: Player
          +
          Adds a list of media items at the given index of the playlist.
          +
          +
          Parameters:
          +
          index - The index at which to add the media items. If the index is larger than the size of + the playlist, the media items are added to the end of the playlist.
          +
          mediaItems - The MediaItems to add.
          +
          +
        • +
        + + + +
          +
        • +

          moveMediaItems

          +
          public void moveMediaItems​(int fromIndex,
          +                           int toIndex,
          +                           int newIndex)
          +
          Description copied from interface: Player
          +
          Moves the media item range to the new index.
          +
          +
          Parameters:
          +
          fromIndex - The start of the range to move.
          +
          toIndex - The first item not to be included in the range (exclusive).
          +
          newIndex - The new index of the first media item of the range. If the new index is larger + than the size of the remaining playlist after removing the range, the range is moved to the + end of the playlist.
          +
          +
        • +
        + + + +
          +
        • +

          removeMediaItems

          +
          public void removeMediaItems​(int fromIndex,
          +                             int toIndex)
          +
          Description copied from interface: Player
          +
          Removes a range of media items from the playlist.
          +
          +
          Parameters:
          +
          fromIndex - The index at which to start removing media items.
          +
          toIndex - The index of the first item to be kept (exclusive). If the index is larger than + the size of the playlist, media items to the end of the playlist are removed.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setPlayWhenReady

          +
          public void setPlayWhenReady​(boolean playWhenReady)
          +
          Description copied from interface: Player
          +
          Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY. + +

          If the player is already in the ready state then this method pauses and resumes playback.

          +
          +
          Parameters:
          +
          playWhenReady - Whether playback should proceed when ready.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setRepeatMode

          +
          public void setRepeatMode​(@RepeatMode
          +                          @com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
          +
          Description copied from interface: Player
          +
          Sets the Player.RepeatMode to be used for playback.
          +
          +
          Parameters:
          +
          repeatMode - The repeat mode.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setShuffleModeEnabled

          +
          public void setShuffleModeEnabled​(boolean shuffleModeEnabled)
          +
          Description copied from interface: Player
          +
          Sets whether shuffling of media items is enabled.
          +
          +
          Parameters:
          +
          shuffleModeEnabled - Whether shuffling is enabled.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          isLoading

          +
          public boolean isLoading()
          +
          Description copied from interface: Player
          +
          Whether the player is currently loading the source.
          +
          +
          Returns:
          +
          Whether the player is currently loading the source.
          +
          See Also:
          +
          Player.Listener.onIsLoadingChanged(boolean)
          +
          +
        • +
        + + + +
          +
        • +

          seekTo

          +
          public void seekTo​(int mediaItemIndex,
          +                   long positionMs)
          +
          Description copied from interface: Player
          +
          Seeks to a position specified in milliseconds in the specified MediaItem.
          +
          +
          Parameters:
          +
          mediaItemIndex - The index of the MediaItem.
          +
          positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET + to seek to the media item's default position.
          +
          +
        • +
        + + + + + + + + + + + + + + + +
          +
        • +

          setPlaybackParameters

          +
          public void setPlaybackParameters​(PlaybackParameters playbackParameters)
          +
          Description copied from interface: Player
          +
          Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the + player to the default, which means there is no speed or pitch adjustment. + +

          Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently + active playback parameters change.

          +
          +
          Parameters:
          +
          playbackParameters - The playback parameters.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          stop

          +
          public void stop()
          +
          Description copied from interface: Player
          +
          Stops playback without resetting the player. Use Player.pause() rather than this method if + the intention is to pause playback. + +

          Calling this method will cause the playback state to transition to Player.STATE_IDLE. The + player instance can still be used, and Player.release() must still be called on the player if + it's no longer required. + +

          Calling this method does not clear the playlist, reset the playback position or the playback + error.

          +
        • +
        + + + +
          +
        • +

          stop

          +
          @Deprecated
          +public void stop​(boolean reset)
          +
          Deprecated.
          +
        • +
        + + + +
          +
        • +

          release

          +
          public void release()
          +
          Description copied from interface: Player
          +
          Releases the player. This method must be called when the player is no longer required. The + player must not be used after calling this method.
          +
        • +
        + + + + + + + +
          +
        • +

          getCurrentTrackSelections

          +
          public TrackSelectionArray getCurrentTrackSelections()
          +
          Description copied from interface: Player
          +
          Returns the current track selections. + +

          A concrete implementation may include null elements if it has a fixed number of renderer + components, wishes to report a TrackSelection for each of them, and has one or more renderer + components that is not assigned any selected tracks.

          +
          +
          See Also:
          +
          Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getTrackSelectionParameters

          +
          public TrackSelectionParameters getTrackSelectionParameters()
          +
          Description copied from interface: Player
          +
          Returns the parameters constraining the track selection.
          +
          +
          See Also:
          +
          }
          +
          +
        • +
        + + + +
          +
        • +

          setTrackSelectionParameters

          +
          public void setTrackSelectionParameters​(TrackSelectionParameters parameters)
          +
          Description copied from interface: Player
          +
          Sets the parameters constraining the track selection. + +

          Unsupported parameters will be silently ignored. + +

          Use Player.getTrackSelectionParameters() to retrieve the current parameters. For example, + the following snippet restricts video to SD whilst keep other track selection parameters + unchanged: + +

          
          + player.setTrackSelectionParameters(
          +   player.getTrackSelectionParameters()
          +         .buildUpon()
          +         .setMaxVideoSizeSd()
          +         .build())
          + 
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          setPlaylistMetadata

          +
          public void setPlaylistMetadata​(MediaMetadata mediaMetadata)
          +
          Description copied from interface: Player
          +
          Sets the playlist MediaMetadata.
          +
        • +
        + + + + + + + +
          +
        • +

          getCurrentPeriodIndex

          +
          public int getCurrentPeriodIndex()
          +
          Description copied from interface: Player
          +
          Returns the index of the period currently being played.
          +
        • +
        + + + +
          +
        • +

          getCurrentMediaItemIndex

          +
          public int getCurrentMediaItemIndex()
          +
          Description copied from interface: Player
          +
          Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is + empty.
          +
        • +
        + + + +
          +
        • +

          getDuration

          +
          public long getDuration()
          +
          Description copied from interface: Player
          +
          Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
          +
        • +
        + + + +
          +
        • +

          getCurrentPosition

          +
          public long getCurrentPosition()
          +
          Description copied from interface: Player
          +
          Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
          +
        • +
        + + + +
          +
        • +

          getBufferedPosition

          +
          public long getBufferedPosition()
          +
          Description copied from interface: Player
          +
          Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
          +
        • +
        + + + +
          +
        • +

          getTotalBufferedDuration

          +
          public long getTotalBufferedDuration()
          +
          Description copied from interface: Player
          +
          Returns an estimate of the total buffered duration from the current position, in milliseconds. + This includes pre-buffered data for subsequent ads and media items.
          +
        • +
        + + + +
          +
        • +

          isPlayingAd

          +
          public boolean isPlayingAd()
          +
          Description copied from interface: Player
          +
          Returns whether the player is currently playing an ad.
          +
        • +
        + + + +
          +
        • +

          getCurrentAdGroupIndex

          +
          public int getCurrentAdGroupIndex()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns the index of the ad group in the period + currently being played. Returns C.INDEX_UNSET otherwise.
          +
        • +
        + + + +
          +
        • +

          getCurrentAdIndexInAdGroup

          +
          public int getCurrentAdIndexInAdGroup()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns the index of the ad in its ad group. Returns + C.INDEX_UNSET otherwise.
          +
        • +
        + + + +
          +
        • +

          getContentPosition

          +
          public long getContentPosition()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns the content position that will be + played once all ads in the ad group have finished playing, in milliseconds. If there is no ad + playing, the returned position is the same as that returned by Player.getCurrentPosition().
          +
        • +
        + + + +
          +
        • +

          getContentBufferedPosition

          +
          public long getContentBufferedPosition()
          +
          Description copied from interface: Player
          +
          If Player.isPlayingAd() returns true, returns an estimate of the content position in + the current content up to which data is buffered, in milliseconds. If there is no ad playing, + the returned position is the same as that returned by Player.getBufferedPosition().
          +
        • +
        + + + +
          +
        • +

          getAudioAttributes

          +
          public AudioAttributes getAudioAttributes()
          +
          Description copied from interface: Player
          +
          Returns the attributes for audio playback.
          +
        • +
        + + + +
          +
        • +

          setVolume

          +
          public void setVolume​(float volume)
          +
          Description copied from interface: Player
          +
          Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
          +
          +
          Parameters:
          +
          volume - Linear output gain to apply to all audio channels.
          +
          +
        • +
        + + + +
          +
        • +

          getVolume

          +
          public float getVolume()
          +
          Description copied from interface: Player
          +
          Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
          +
          +
          Returns:
          +
          The linear gain applied to all audio channels.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          clearVideoSurface

          +
          public void clearVideoSurface​(@Nullable
          +                              Surface surface)
          +
          Description copied from interface: Player
          +
          Clears the Surface onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Parameters:
          +
          surface - The surface to clear.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          setVideoSurfaceHolder

          +
          public void setVideoSurfaceHolder​(@Nullable
          +                                  SurfaceHolder surfaceHolder)
          +
          Description copied from interface: Player
          +
          Sets the SurfaceHolder that holds the Surface onto which video will be + rendered. The player will track the lifecycle of the surface automatically. + +

          The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

          +
          +
          Parameters:
          +
          surfaceHolder - The surface holder.
          +
          +
        • +
        + + + +
          +
        • +

          clearVideoSurfaceHolder

          +
          public void clearVideoSurfaceHolder​(@Nullable
          +                                    SurfaceHolder surfaceHolder)
          +
          Description copied from interface: Player
          +
          Clears the SurfaceHolder that holds the Surface onto which video is being + rendered if it matches the one passed. Else does nothing.
          +
          +
          Parameters:
          +
          surfaceHolder - The surface holder to clear.
          +
          +
        • +
        + + + +
          +
        • +

          setVideoSurfaceView

          +
          public void setVideoSurfaceView​(@Nullable
          +                                SurfaceView surfaceView)
          +
          Description copied from interface: Player
          +
          Sets the SurfaceView onto which video will be rendered. The player will track the + lifecycle of the surface automatically. + +

          The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

          +
          +
          Parameters:
          +
          surfaceView - The surface view.
          +
          +
        • +
        + + + +
          +
        • +

          clearVideoSurfaceView

          +
          public void clearVideoSurfaceView​(@Nullable
          +                                  SurfaceView surfaceView)
          +
          Description copied from interface: Player
          +
          Clears the SurfaceView onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Parameters:
          +
          surfaceView - The texture view to clear.
          +
          +
        • +
        + + + +
          +
        • +

          setVideoTextureView

          +
          public void setVideoTextureView​(@Nullable
          +                                TextureView textureView)
          +
          Description copied from interface: Player
          +
          Sets the TextureView onto which video will be rendered. The player will track the + lifecycle of the surface automatically. + +

          The thread that calls the TextureView.SurfaceTextureListener methods must be the + thread associated with Player.getApplicationLooper().

          +
          +
          Parameters:
          +
          textureView - The texture view.
          +
          +
        • +
        + + + +
          +
        • +

          clearVideoTextureView

          +
          public void clearVideoTextureView​(@Nullable
          +                                  TextureView textureView)
          +
          Description copied from interface: Player
          +
          Clears the TextureView onto which video is being rendered if it matches the one passed. + Else does nothing.
          +
          +
          Parameters:
          +
          textureView - The texture view to clear.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          getCurrentCues

          +
          public List<Cue> getCurrentCues()
          +
          Description copied from interface: Player
          +
          Returns the current Cues. This list may be empty.
          +
        • +
        + + + +
          +
        • +

          getDeviceInfo

          +
          public DeviceInfo getDeviceInfo()
          +
          Description copied from interface: Player
          +
          Gets the device information.
          +
        • +
        + + + + + + + +
          +
        • +

          isDeviceMuted

          +
          public boolean isDeviceMuted()
          +
          Description copied from interface: Player
          +
          Gets whether the device is muted or not.
          +
        • +
        + + + +
          +
        • +

          setDeviceVolume

          +
          public void setDeviceVolume​(int volume)
          +
          Description copied from interface: Player
          +
          Sets the volume of the device.
          +
          +
          Parameters:
          +
          volume - The volume to set.
          +
          +
        • +
        + + + +
          +
        • +

          increaseDeviceVolume

          +
          public void increaseDeviceVolume()
          +
          Description copied from interface: Player
          +
          Increases the volume of the device.
          +
        • +
        + + + +
          +
        • +

          decreaseDeviceVolume

          +
          public void decreaseDeviceVolume()
          +
          Description copied from interface: Player
          +
          Decreases the volume of the device.
          +
        • +
        + + + +
          +
        • +

          setDeviceMuted

          +
          public void setDeviceMuted​(boolean muted)
          +
          Description copied from interface: Player
          +
          Sets the mute state of the device.
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.html index 44255b405d..35579becf9 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/TestExoPlayerBuilder.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -210,6 +210,13 @@ extends +MediaSourceFactory +getMediaSourceFactory() + +
    Returns the MediaSourceFactory that will be used by the player, or null if no MediaSourceFactory has been set yet and no default is available.
    + + + Renderer[] getRenderers() @@ -217,7 +224,7 @@ extends Renderers have been explicitly set. - + RenderersFactory getRenderersFactory() @@ -225,98 +232,105 @@ extends - + long getSeekBackIncrementMs()
    Returns the seek back increment used by the player.
    - + long getSeekForwardIncrementMs()
    Returns the seek forward increment used by the player.
    - + DefaultTrackSelector getTrackSelector()
    Returns the track selector used by the player.
    - + boolean getUseLazyPreparation()
    Returns whether the player will use lazy preparation.
    - + TestExoPlayerBuilder setBandwidthMeter​(BandwidthMeter bandwidthMeter)
    Sets the BandwidthMeter.
    - + TestExoPlayerBuilder setClock​(Clock clock)
    Sets the Clock to be used by the player.
    - + TestExoPlayerBuilder setLoadControl​(LoadControl loadControl)
    Sets a LoadControl to be used by the player.
    - + TestExoPlayerBuilder setLooper​(Looper looper)
    Sets the Looper to be used by the player.
    - + +TestExoPlayerBuilder +setMediaSourceFactory​(MediaSourceFactory mediaSourceFactory) + +
    Sets the MediaSourceFactory to be used by the player.
    + + + TestExoPlayerBuilder setRenderers​(Renderer... renderers)
    Sets the Renderers.
    - + TestExoPlayerBuilder setRenderersFactory​(RenderersFactory renderersFactory) - + TestExoPlayerBuilder setSeekBackIncrementMs​(long seekBackIncrementMs)
    Sets the seek back increment to be used by the player.
    - + TestExoPlayerBuilder setSeekForwardIncrementMs​(long seekForwardIncrementMs)
    Sets the seek forward increment to be used by the player.
    - + TestExoPlayerBuilder setTrackSelector​(DefaultTrackSelector trackSelector) - + TestExoPlayerBuilder setUseLazyPreparation​(boolean useLazyPreparation) @@ -585,6 +599,33 @@ public  + + + + + + + @@ -645,10 +686,6 @@ public public SimpleExoPlayer build()
    Builds an SimpleExoPlayer using the provided values or their defaults.
    -
    -
    Returns:
    -
    The built ExoPlayerTestRunner.
    -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/TestUtil.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/TestUtil.html index 0eb30f2d9b..67441c8699 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/TestUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/TestUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -180,20 +180,28 @@ extends +static void +assertTimelinesSame​(List<Timeline> actualTimelines, + List<Timeline> expectedTimelines) + +
    Asserts that the actual timelines are the same to the expected timelines.
    + + + static Uri buildAssetUri​(String assetPath)
    Returns the Uri for the given asset path.
    - + static byte[] buildTestData​(int length)
    Equivalent to buildTestData(length, length).
    - + static byte[] buildTestData​(int length, int seed) @@ -201,7 +209,7 @@ extends Generates an array of random bytes with the specified length. - + static byte[] buildTestData​(int length, Random random) @@ -209,7 +217,7 @@ extends Generates an array of random bytes with the specified length. - + static String buildTestString​(int length, Random random) @@ -217,28 +225,28 @@ extends Generates a random string with the specified length. - + static byte[] createByteArray​(int... bytes)
    Converts an array of integers in the range [0, 255] into an equivalent byte array.
    - + static ImmutableList<Byte> createByteList​(int... bytes)
    Converts an array of integers in the range [0, 255] into an equivalent byte list.
    - + static MetadataInputBuffer createMetadataInputBuffer​(byte[] data)
    Create a new MetadataInputBuffer and copy data into the backing ByteBuffer.
    - + static File createTestFile​(File file, long length) @@ -246,7 +254,7 @@ extends Writes test data with the specified length to the file and returns it. - + static File createTestFile​(File directory, String name) @@ -254,7 +262,7 @@ extends Writes one byte long test data to the file and returns it. - + static File createTestFile​(File directory, String name, @@ -263,7 +271,7 @@ extends Writes test data with the specified length to the file and returns it. - + static FakeExtractorOutput extractAllSamplesFromFile​(Extractor extractor, Context context, @@ -272,7 +280,7 @@ extends Extracts all samples from the given file into a FakeTrackOutput. - + static SeekMap extractSeekMap​(Extractor extractor, FakeExtractorOutput output, @@ -283,7 +291,7 @@ extends - + static Bitmap getBitmap​(Context context, String fileName) @@ -291,7 +299,7 @@ extends Returns a Bitmap read from an asset file. - + static byte[] getByteArray​(Context context, String fileName) @@ -299,7 +307,7 @@ extends Returns the bytes of an asset file. - + static ExtractorInput getExtractorInputFromPosition​(DataSource dataSource, long position, @@ -308,14 +316,14 @@ extends Returns an ExtractorInput to read from the given input at given position. - + static DatabaseProvider getInMemoryDatabaseProvider()
    Returns a DatabaseProvider that provides an in-memory database.
    - + static InputStream getInputStream​(Context context, String fileName) @@ -323,7 +331,7 @@ extends Returns an InputStream for reading from an asset file. - + static String getString​(Context context, String fileName) @@ -331,7 +339,7 @@ extends Returns a String read from an asset file. - + static int seekToTimeUs​(Extractor extractor, SeekMap seekMap, @@ -594,6 +602,24 @@ extends Returns a DatabaseProvider that provides an in-memory database. + + + +
      +
    • +

      assertTimelinesSame

      +
      public static void assertTimelinesSame​(List<Timeline> actualTimelines,
      +                                       List<Timeline> expectedTimelines)
      +
      Asserts that the actual timelines are the same to the expected timelines. This assert differs + from testing equality by not comparing period ids which may be different due to id mapping of + child source period ids.
      +
      +
      Parameters:
      +
      actualTimelines - A list of actual timelines.
      +
      expectedTimelines - A list of expected timelines.
      +
      +
    • +
    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 f54b01ef26..58767ef775 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/TimelineAsserts.html @@ -169,9 +169,9 @@ extends static void -assertEqualNextWindowIndices​(Timeline expectedTimeline, +assertEqualNextWindowIndices​(Timeline expectedTimeline, Timeline actualTimeline, - int repeatMode, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
    Asserts that next window indices for each window of the actual timeline are equal to the @@ -180,9 +180,9 @@ extends static void -assertEqualPreviousWindowIndices​(Timeline expectedTimeline, +assertEqualPreviousWindowIndices​(Timeline expectedTimeline, Timeline actualTimeline, - int repeatMode, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
    Asserts that previous window indices for each window of the actual timeline are equal to the @@ -199,8 +199,8 @@ extends static void -assertNextWindowIndices​(Timeline timeline, - int repeatMode, +assertNextWindowIndices​(Timeline timeline, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled, int... expectedNextWindowIndices) @@ -235,8 +235,8 @@ extends static void -assertPreviousWindowIndices​(Timeline timeline, - int repeatMode, +assertPreviousWindowIndices​(Timeline timeline, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled, int... expectedPreviousWindowIndices) @@ -329,7 +329,7 @@ extends Asserts that window properties Timeline.Window.isDynamic are set correctly.
    - + - + - +
      @@ -368,13 +368,13 @@ extends public static void assertEqualPreviousWindowIndices​(Timeline expectedTimeline, Timeline actualTimeline, @RepeatMode - int repeatMode, + @com.google.android.exoplayer2.Player.RepeatMode int repeatMode, boolean shuffleModeEnabled)
      Asserts that previous window indices for each window of the actual timeline are equal to the indices of the expected timeline depending on the repeat mode and the shuffle mode.
    - +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html index 9f805fe524..f5167b8b35 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html @@ -177,19 +177,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.AddMediaItems - + Action.ClearMediaItems - + Action.ClearVideoSurface - + @@ -201,7 +201,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.MoveMediaItem - + @@ -220,13 +220,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.RemoveMediaItem - + Action.RemoveMediaItems - + @@ -244,19 +244,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.SetAudioAttributes - + Action.SetMediaItems - + Action.SetMediaItemsResetPosition - + @@ -281,7 +281,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.SetRepeatMode - + @@ -299,7 +299,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.SetVideoSurface - + @@ -335,27 +335,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); Action.WaitForPlaybackState -
    Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
    +
    Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
    Action.WaitForPlayWhenReady
    Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.Listener.onPlayWhenReadyChanged(boolean, int).
    + Player.Listener.onPlayWhenReadyChanged(boolean, int). Action.WaitForPositionDiscontinuity -
    Waits for Player.Listener.onPositionDiscontinuity(Player.PositionInfo, + Action.WaitForTimelineChanged - + @@ -389,205 +389,217 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +AssetContentProvider + +
    A ContentProvider for reading asset data.
    + + + CacheAsserts
    Assertion methods for Cache.
    - + CacheAsserts.RequestSet
    Defines a set of data requests.
    - + CapturingAudioSink
    A ForwardingAudioSink that captures configuration, discontinuity and buffer events.
    - + CapturingRenderersFactory
    A RenderersFactory that captures interactions with the audio and video MediaCodecAdapter instances.
    - + DataSourceContractTest
    A collection of contract tests for DataSource implementations.
    - + DataSourceContractTest.FakeTransferListener
    A TransferListener that only keeps track of the transferred bytes.
    - + DataSourceContractTest.TestResource
    Information about a resource that can be used to test the DataSource instance.
    - + DataSourceContractTest.TestResource.Builder - + DecoderCountersUtil
    Assertions for DecoderCounters.
    - + DefaultRenderersFactoryAsserts
    Assertions for DefaultRenderersFactory.
    - + DownloadBuilder
    Builder for Download.
    - + DummyMainThread
    Helper class to simulate main/UI thread in tests.
    - + DumpableFormat
    Wraps a Format to allow dumping it.
    - + Dumper
    Helper utility to dump field values.
    - + DumpFileAsserts
    Helper class to enable assertions based on golden-data dump files.
    - + ExoHostedTest
    A HostActivity.HostedTest for ExoPlayer playback tests.
    - + ExoPlayerTestRunner
    Helper class to run an ExoPlayer test.
    - + ExoPlayerTestRunner.Builder -
    Builder to set-up a ExoPlayerTestRunner.
    +
    Builder to set-up an ExoPlayerTestRunner.
    - + ExtractorAsserts
    Assertion methods for Extractor.
    - + ExtractorAsserts.AssertionConfig
    A config for the assertions made (e.g.
    - + ExtractorAsserts.AssertionConfig.Builder
    Builder for ExtractorAsserts.AssertionConfig instances.
    - + ExtractorAsserts.SimulationConfig
    A config of different environments to simulate and extractor behaviours to test.
    - + FailOnCloseDataSink
    A DataSink that can simulate caching the bytes being written to it, and then failing to persist them when FailOnCloseDataSink.close() is called.
    - + FailOnCloseDataSink.Factory
    Factory to create a FailOnCloseDataSink.
    - + FakeAdaptiveDataSet
    Fake data set emulating the data of an adaptive media source.
    - + FakeAdaptiveDataSet.Factory
    Factory for FakeAdaptiveDataSets.
    - + FakeAdaptiveDataSet.Iterator
    MediaChunkIterator for the chunks defined by a fake adaptive data set.
    - + FakeAdaptiveMediaPeriod
    Fake MediaPeriod that provides tracks from the given TrackGroupArray.
    - + FakeAdaptiveMediaSource
    Fake MediaSource that provides a given timeline.
    - + FakeAudioRenderer - + FakeChunkSource
    Fake ChunkSource with adaptive media chunks of a given duration.
    - + FakeChunkSource.Factory
    Factory for a FakeChunkSource.
    - + FakeClock
    Fake Clock implementation that allows to advance the time manually to trigger pending timed messages.
    + +FakeCryptoConfig + + + + FakeDataSet @@ -691,6 +703,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +FakeMediaSourceFactory + +
    Fake MediaSourceFactory that creates a FakeMediaSource.
    + + + +FakeMetadataEntry + + + + + FakeRenderer
    Fake Renderer that supports any format with the matching track type.
    @@ -789,37 +813,44 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +StubPlayer + +
    An abstract Player implementation that throws UnsupportedOperationException from + every method.
    + + + TestExoPlayerBuilder
    A builder of SimpleExoPlayer instances for testing.
    - + TestUtil
    Utility methods for tests.
    - + TimelineAsserts
    Assertion methods for Timeline.
    - + WebServerDispatcher
    A Dispatcher for MockWebServer that allows per-path customisation of the static data served.
    - + WebServerDispatcher.Resource
    A resource served by WebServerDispatcher.
    - + WebServerDispatcher.Resource.Builder diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html index 1962b15df7..55bc854cd1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html @@ -164,9 +164,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.BasePlayer (implements com.google.android.exoplayer2.Player)
      +
    • com.google.android.exoplayer2.testutil.StubPlayer +
    • +
    +
  • com.google.android.exoplayer2.BaseRenderer (implements com.google.android.exoplayer2.Renderer, com.google.android.exoplayer2.RendererCapabilities)
    • com.google.android.exoplayer2.testutil.FakeRenderer @@ -190,6 +194,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • +
  • android.content.ContentProvider (implements android.content.ComponentCallbacks2) + +
  • android.content.Context
    • android.content.ContextWrapper @@ -243,6 +252,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.testutil.FakeChunkSource.Factory
    • com.google.android.exoplayer2.testutil.FakeClock (implements com.google.android.exoplayer2.util.Clock)
    • com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage (implements java.lang.Comparable<T>, com.google.android.exoplayer2.util.HandlerWrapper.Message)
    • +
    • com.google.android.exoplayer2.testutil.FakeCryptoConfig (implements com.google.android.exoplayer2.decoder.CryptoConfig)
    • com.google.android.exoplayer2.testutil.FakeDataSet
      • com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet
      • @@ -258,6 +268,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      • com.google.android.exoplayer2.testutil.FakeExtractorInput.Builder
      • com.google.android.exoplayer2.testutil.FakeExtractorOutput (implements com.google.android.exoplayer2.testutil.Dumper.Dumpable, com.google.android.exoplayer2.extractor.ExtractorOutput)
      • com.google.android.exoplayer2.testutil.FakeMediaPeriod (implements com.google.android.exoplayer2.source.MediaPeriod)
      • +
      • com.google.android.exoplayer2.testutil.FakeMediaSourceFactory (implements com.google.android.exoplayer2.source.MediaSourceFactory)
      • +
      • com.google.android.exoplayer2.testutil.FakeMetadataEntry (implements com.google.android.exoplayer2.metadata.Metadata.Entry)
      • com.google.android.exoplayer2.testutil.FakeSampleStream (implements com.google.android.exoplayer2.source.SampleStream)
      • com.google.android.exoplayer2.testutil.FakeSampleStream.FakeSampleStreamItem
      • com.google.android.exoplayer2.testutil.FakeShuffleOrder (implements com.google.android.exoplayer2.source.ShuffleOrder)
      • diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.AnchorType.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.AnchorType.html index 6eb23858c9..273b95a2dd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.AnchorType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.AnchorType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
        @Documented
         @Retention(SOURCE)
        +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
         public static @interface Cue.AnchorType
        The type of anchor, which may be unset. One of Cue.TYPE_UNSET, Cue.ANCHOR_TYPE_START, Cue.ANCHOR_TYPE_MIDDLE or Cue.ANCHOR_TYPE_END.
        diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.Builder.html index 9cd6a35fdb..3e903c8d40 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.Builder.html @@ -214,14 +214,14 @@ extends -int +@com.google.android.exoplayer2.text.Cue.AnchorType int getLineAnchor() -
        Gets the cue box anchor positioned by line.
        +
        Gets the cue box anchor positioned by line.
        -int +@com.google.android.exoplayer2.text.Cue.LineType int getLineType()
        Gets the type of the value of getLine().
        @@ -231,12 +231,12 @@ extends float getPosition() -
        Gets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
        +
        Gets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
        -int +@com.google.android.exoplayer2.text.Cue.AnchorType int getPositionAnchor()
        Gets the cue box anchor positioned by position.
        @@ -272,14 +272,14 @@ extends -int +@com.google.android.exoplayer2.text.Cue.TextSizeType int getTextSizeType()
        Gets the default text size type for this cue's text.
        -int +@com.google.android.exoplayer2.text.Cue.VerticalType int getVerticalType()
        Gets the vertical formatting for this Cue.
        @@ -315,8 +315,8 @@ extends Cue.Builder -setLine​(float line, - int lineType) +setLine​(float line, + @com.google.android.exoplayer2.text.Cue.LineType int lineType)
        Sets the position of the cue box within the viewport in the direction orthogonal to the writing direction.
        @@ -324,9 +324,9 @@ extends Cue.Builder -setLineAnchor​(int lineAnchor) +setLineAnchor​(@com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor) -
        Sets the cue box anchor positioned by line.
        +
        Sets the cue box anchor positioned by line.
        @@ -340,13 +340,13 @@ extends Cue.Builder setPosition​(float position) -
        Sets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
        +
        Sets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
        Cue.Builder -setPositionAnchor​(int positionAnchor) +setPositionAnchor​(@com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor)
        Sets the cue box anchor positioned by position.
        @@ -382,15 +382,15 @@ extends Cue.Builder -setTextSize​(float textSize, - int textSizeType) +setTextSize​(float textSize, + @com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType)
        Sets the default text size and type for this cue's text.
        Cue.Builder -setVerticalType​(int verticalType) +setVerticalType​(@com.google.android.exoplayer2.text.Cue.VerticalType int verticalType)
        Sets the vertical formatting for this Cue.
        @@ -557,7 +557,7 @@ public  +
          @@ -565,7 +565,7 @@ public public Cue.Builder setLine​(float line, @LineType - int lineType) + @com.google.android.exoplayer2.text.Cue.LineType int lineType)
          Sets the position of the cue box within the viewport in the direction orthogonal to the writing direction.
          @@ -599,7 +599,7 @@ public float getLine()

          getLineType

          @Pure
           @LineType
          -public int getLineType()
          +public @com.google.android.exoplayer2.text.Cue.LineType int getLineType()
          Gets the type of the value of getLine().
          See Also:
          @@ -607,15 +607,15 @@ public int getLineType()
        - +
        • setLineAnchor

          public Cue.Builder setLineAnchor​(@AnchorType
          -                                 int lineAnchor)
          -
          Sets the cue box anchor positioned by line.
          + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor) +
          Sets the cue box anchor positioned by line.
          See Also:
          Cue.lineAnchor
          @@ -630,8 +630,8 @@ public int getLineType()

          getLineAnchor

          @Pure
           @AnchorType
          -public int getLineAnchor()
          -
          Gets the cue box anchor positioned by line.
          +public @com.google.android.exoplayer2.text.Cue.AnchorType int getLineAnchor() +
          Gets the cue box anchor positioned by line.
          See Also:
          Cue.lineAnchor
          @@ -645,8 +645,8 @@ public int getLineAnchor()
        • setPosition

          public Cue.Builder setPosition​(float position)
          -
          Sets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
          +
          Sets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
          See Also:
          Cue.position
          @@ -661,22 +661,22 @@ public int getLineAnchor()

          getPosition

          @Pure
           public float getPosition()
          -
          Gets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
          +
          Gets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
          See Also:
          Cue.position
        - +
        • setPositionAnchor

          public Cue.Builder setPositionAnchor​(@AnchorType
          -                                     int positionAnchor)
          + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor)
          Sets the cue box anchor positioned by position.
          See Also:
          @@ -692,7 +692,7 @@ public float getPosition()

          getPositionAnchor

          @Pure
           @AnchorType
          -public int getPositionAnchor()
          +public @com.google.android.exoplayer2.text.Cue.AnchorType int getPositionAnchor()
          Gets the cue box anchor positioned by position.
          See Also:
          @@ -700,7 +700,7 @@ public int getPositionAnchor()
        - +
          @@ -708,7 +708,7 @@ public int getPositionAnchor()

          setTextSize

          public Cue.Builder setTextSize​(float textSize,
                                          @TextSizeType
          -                               int textSizeType)
          + @com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType)
          Sets the default text size and type for this cue's text.
          See Also:
          @@ -725,7 +725,7 @@ public int getPositionAnchor()

          getTextSizeType

          @Pure
           @TextSizeType
          -public int getTextSizeType()
          +public @com.google.android.exoplayer2.text.Cue.TextSizeType int getTextSizeType()
          Gets the default text size type for this cue's text.
          See Also:
          @@ -866,14 +866,14 @@ public int getWindowColor()
        - +
        • setVerticalType

          public Cue.Builder setVerticalType​(@VerticalType
          -                                   int verticalType)
          + @com.google.android.exoplayer2.text.Cue.VerticalType int verticalType)
          Sets the vertical formatting for this Cue.
          See Also:
          @@ -899,7 +899,7 @@ public int getWindowColor()

          getVerticalType

          @Pure
           @VerticalType
          -public int getVerticalType()
          +public @com.google.android.exoplayer2.text.Cue.VerticalType int getVerticalType()
          Gets the vertical formatting for this Cue.
          See Also:
          diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.LineType.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.LineType.html index 632df7691c..ab5f914c7b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.LineType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.LineType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
          @Documented
           @Retention(SOURCE)
          +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
           public static @interface Cue.LineType
          The type of line, which may be unset. One of Cue.TYPE_UNSET, Cue.LINE_TYPE_FRACTION or Cue.LINE_TYPE_NUMBER.
          diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.TextSizeType.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.TextSizeType.html index 9cd2ad0ae6..b7ea166bb5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.TextSizeType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.TextSizeType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
          @Documented
           @Retention(SOURCE)
          +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
           public static @interface Cue.TextSizeType
          The type of default text size for this cue, which may be unset. One of Cue.TYPE_UNSET, Cue.TEXT_SIZE_TYPE_FRACTIONAL, Cue.TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING or Cue.TEXT_SIZE_TYPE_ABSOLUTE.
          diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.VerticalType.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.VerticalType.html index 8ffed3f999..d10ea25ec3 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.VerticalType.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.VerticalType.html @@ -115,6 +115,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
          @Documented
           @Retention(SOURCE)
          +@Target({FIELD,METHOD,PARAMETER,LOCAL_VARIABLE,TYPE_USE})
           public static @interface Cue.VerticalType
          The type of vertical layout for this cue, which may be unset (i.e. horizontal). One of Cue.TYPE_UNSET, Cue.VERTICAL_TYPE_RL or Cue.VERTICAL_TYPE_LR.
        • diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.html b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.html index 71fde14006..4f2f64667c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/Cue.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/Cue.html @@ -298,14 +298,14 @@ implements -int +@com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor
          The cue box anchor positioned by line when lineType is LINE_TYPE_FRACTION.
          -int +@com.google.android.exoplayer2.text.Cue.LineType int lineType
          The type of the line value.
          @@ -328,7 +328,7 @@ implements -int +@com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor
          The cue box anchor positioned by position.
          @@ -393,7 +393,7 @@ implements -int +@com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType
          The default text size type for this cue's text, or TYPE_UNSET if this cue has no @@ -422,7 +422,7 @@ implements -int +@com.google.android.exoplayer2.text.Cue.VerticalType int verticalType
          The vertical formatting of this Cue, or TYPE_UNSET if the cue has no vertical setting @@ -469,13 +469,13 @@ implements -Cue​(CharSequence text, +Cue​(CharSequence text, Layout.Alignment textAlignment, float line, - int lineType, - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size)
          Deprecated. @@ -484,16 +484,16 @@ implements -Cue​(CharSequence text, +Cue​(CharSequence text, Layout.Alignment textAlignment, float line, - int lineType, - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size, - boolean windowColorSet, - int windowColor) + @com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType, + float textSize)
          Deprecated. @@ -501,16 +501,16 @@ implements -Cue​(CharSequence text, +Cue​(CharSequence text, Layout.Alignment textAlignment, float line, - int lineType, - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size, - int textSizeType, - float textSize) + boolean windowColorSet, + int windowColor)
          Deprecated. @@ -839,7 +839,7 @@ public final 

          lineType

          @LineType
          -public final int lineType
          +public final @com.google.android.exoplayer2.text.Cue.LineType int lineType
          The type of the line value.
            @@ -867,7 +867,7 @@ public final int lineType
          • lineAnchor

            @AnchorType
            -public final int lineAnchor
            +public final @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor
            The cue box anchor positioned by line when lineType is LINE_TYPE_FRACTION.

            One of: @@ -911,7 +911,7 @@ public final int lineAnchor

          • positionAnchor

            @AnchorType
            -public final int positionAnchor
            +public final @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor
            The cue box anchor positioned by position. One of ANCHOR_TYPE_START, ANCHOR_TYPE_MIDDLE, ANCHOR_TYPE_END and TYPE_UNSET.

            For the normal case of horizontal text, ANCHOR_TYPE_START, ANCHOR_TYPE_MIDDLE and ANCHOR_TYPE_END correspond to the left, middle and right of @@ -968,7 +968,7 @@ public final int positionAnchor

          • textSizeType

            @TextSizeType
            -public final int textSizeType
            +public final @com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType
            The default text size type for this cue's text, or TYPE_UNSET if this cue has no default text size.
          • @@ -991,7 +991,7 @@ public final int textSizeType
          • verticalType

            @VerticalType
            -public final int verticalType
            +public final @com.google.android.exoplayer2.text.Cue.VerticalType int verticalType
            The vertical formatting of this Cue, or TYPE_UNSET if the cue has no vertical setting (and so should be horizontal).
          • @@ -1045,7 +1045,7 @@ public Cue​( +
              @@ -1057,12 +1057,12 @@ public Cue​(Layout.Alignment textAlignment, float line, @LineType - int lineType, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, @AnchorType - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, @AnchorType - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size)
              Deprecated. @@ -1081,7 +1081,7 @@ public Cue​( +
                @@ -1093,15 +1093,15 @@ public Cue​(Layout.Alignment textAlignment, float line, @LineType - int lineType, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, @AnchorType - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, @AnchorType - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size, @TextSizeType - int textSizeType, + @com.google.android.exoplayer2.text.Cue.TextSizeType int textSizeType, float textSize)
                Deprecated. @@ -1122,7 +1122,7 @@ public Cue​( +
                  @@ -1134,12 +1134,12 @@ public Cue​(Layout.Alignment textAlignment, float line, @LineType - int lineType, + @com.google.android.exoplayer2.text.Cue.LineType int lineType, @AnchorType - int lineAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int lineAnchor, float position, @AnchorType - int positionAnchor, + @com.google.android.exoplayer2.text.Cue.AnchorType int positionAnchor, float size, boolean windowColorSet, int windowColor) diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/IntArrayQueue.html b/docs/doc/reference/com/google/android/exoplayer2/text/CueDecoder.html similarity index 72% rename from docs/doc/reference/com/google/android/exoplayer2/util/IntArrayQueue.html rename to docs/doc/reference/com/google/android/exoplayer2/text/CueDecoder.html index adf9c49028..7a845cd713 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/IntArrayQueue.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/CueDecoder.html @@ -2,7 +2,7 @@ -IntArrayQueue (ExoPlayer library) +CueDecoder (ExoPlayer library) @@ -19,13 +19,13 @@ + + + + + + + + + +
                  + +
                  + +
                  +
                  + +

                  Class CueEncoder

                  +
                  +
                  + +
                  +
                    +
                  • +
                    +
                    public final class CueEncoder
                    +extends Object
                    +
                    Encodes data that can be decoded by CueDecoder.
                    +
                  • +
                  +
                  +
                  + +
                  +
                  +
                    +
                  • + +
                    +
                      +
                    • + + +

                      Constructor Detail

                      + + + +
                        +
                      • +

                        CueEncoder

                        +
                        public CueEncoder()
                        +
                      • +
                      +
                    • +
                    +
                    + +
                    +
                      +
                    • + + +

                      Method Detail

                      + + + +
                        +
                      • +

                        encode

                        +
                        public byte[] encode​(List<Cue> cues)
                        +
                        Encodes an List of Cue to a byte array that can be decoded by CueDecoder.
                        +
                        +
                        Parameters:
                        +
                        cues - Cues to be encoded.
                        +
                        Returns:
                        +
                        The serialized byte array.
                        +
                        +
                      • +
                      +
                    • +
                    +
                    +
                  • +
                  +
                  +
                  +
                  + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.html new file mode 100644 index 0000000000..ca24d1adde --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/text/ExoplayerCuesDecoder.html @@ -0,0 +1,472 @@ + + + + +ExoplayerCuesDecoder (ExoPlayer library) + + + + + + + + + + + + + +
                  + +
                  + +
                  +
                  + +

                  Class ExoplayerCuesDecoder

                  +
                  +
                  +
                    +
                  • java.lang.Object
                  • +
                  • +
                      +
                    • com.google.android.exoplayer2.text.ExoplayerCuesDecoder
                    • +
                    +
                  • +
                  +
                  + +
                  +
                  + +
                  +
                  + +
                  +
                  +
                  + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html index 9adf827c7c..92be05fc3c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoder.html @@ -126,7 +126,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Known Implementing Classes:
    -
    Cea608Decoder, Cea708Decoder, DvbDecoder, Mp4WebvttDecoder, PgsDecoder, SimpleSubtitleDecoder, SsaDecoder, SubripDecoder, TtmlDecoder, Tx3gDecoder, WebvttDecoder
    +
    Cea608Decoder, Cea708Decoder, DvbDecoder, ExoplayerCuesDecoder, Mp4WebvttDecoder, PgsDecoder, SimpleSubtitleDecoder, SsaDecoder, SubripDecoder, TtmlDecoder, Tx3gDecoder, WebvttDecoder

    public interface SubtitleDecoder
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoderFactory.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoderFactory.html
    index 86680e3a65..0fb0e3b828 100644
    --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoderFactory.html
    +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleDecoderFactory.html
    @@ -222,6 +222,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
        
  • Cea708 (Cea708Decoder)
  • DVB (DvbDecoder)
  • PGS (PgsDecoder) +
  • Exoplayer Cues (ExoplayerCuesDecoder)
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleExtractor.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleExtractor.html new file mode 100644 index 0000000000..a565d2e869 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleExtractor.html @@ -0,0 +1,493 @@ + + + + +SubtitleExtractor (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class SubtitleExtractor

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.text.SubtitleExtractor
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      Extractor
      +
      +
      +
      public class SubtitleExtractor
      +extends Object
      +implements Extractor
      +
      Generic extractor for extracting subtitles from various subtitle formats.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          SubtitleExtractor

          +
          public SubtitleExtractor​(SubtitleDecoder subtitleDecoder,
          +                         Format format)
          +
          +
          Parameters:
          +
          subtitleDecoder - The decoder used for decoding the subtitle data. The extractor will + release the decoder in release().
          +
          format - Format that describes subtitle data.
          +
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          sniff

          +
          public boolean sniff​(ExtractorInput input)
          +              throws IOException
          +
          Description copied from interface: Extractor
          +
          Returns whether this extractor can extract samples from the ExtractorInput, which must + provide data from the start of the stream. + +

          If true is returned, the input's reading position may have been modified. + Otherwise, only its peek position may have been modified.

          +
          +
          Specified by:
          +
          sniff in interface Extractor
          +
          Parameters:
          +
          input - The ExtractorInput from which data should be peeked/read.
          +
          Returns:
          +
          Whether this extractor can read the provided input.
          +
          Throws:
          +
          IOException - If an error occurred reading from the input.
          +
          +
        • +
        + + + + + + + +
          +
        • +

          read

          +
          public int read​(ExtractorInput input,
          +                PositionHolder seekPosition)
          +         throws IOException
          +
          Description copied from interface: Extractor
          +
          Extracts data read from a provided ExtractorInput. Must not be called before Extractor.init(ExtractorOutput). + +

          A single call to this method will block until some progress has been made, but will not + block for longer than this. Hence each call will consume only a small amount of input data. + +

          In the common case, Extractor.RESULT_CONTINUE is returned to indicate that the ExtractorInput passed to the next read is required to provide data continuing from the + position in the stream reached by the returning call. If the extractor requires data to be + provided from a different position, then that position is set in seekPosition and + Extractor.RESULT_SEEK is returned. If the extractor reached the end of the data provided by the + ExtractorInput, then Extractor.RESULT_END_OF_INPUT is returned. + +

          When this method throws an IOException, extraction may continue by providing an + ExtractorInput with an unchanged read position to + a subsequent call to this method.

          +
          +
          Specified by:
          +
          read in interface Extractor
          +
          Parameters:
          +
          input - The ExtractorInput from which data should be read.
          +
          seekPosition - If Extractor.RESULT_SEEK is returned, this holder is updated to hold the + position of the required data.
          +
          Returns:
          +
          One of the RESULT_ values defined in this interface.
          +
          Throws:
          +
          IOException - If an error occurred reading from or parsing the input.
          +
          +
        • +
        + + + +
          +
        • +

          seek

          +
          public void seek​(long position,
          +                 long timeUs)
          +
          Description copied from interface: Extractor
          +
          Notifies the extractor that a seek has occurred. + +

          Following a call to this method, the ExtractorInput passed to the next invocation of + Extractor.read(ExtractorInput, PositionHolder) is required to provide data starting from + position in the stream. Valid random access positions are the start of the stream and + positions that can be obtained from any SeekMap passed to the ExtractorOutput.

          +
          +
          Specified by:
          +
          seek in interface Extractor
          +
          Parameters:
          +
          position - The byte offset in the stream from which data will be provided.
          +
          timeUs - The seek time in microseconds.
          +
          +
        • +
        + + + +
          +
        • +

          release

          +
          public void release()
          +
          Releases the extractor's resources, including the SubtitleDecoder.
          +
          +
          Specified by:
          +
          release in interface Extractor
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html index c1fc18ff01..86f34c676f 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleInputBuffer.html @@ -186,7 +186,7 @@ extends DecoderInputBuffer -BUFFER_REPLACEMENT_MODE_DIRECT, BUFFER_REPLACEMENT_MODE_DISABLED, BUFFER_REPLACEMENT_MODE_NORMAL, cryptoInfo, data, supplementalData, timeUs, waitingForKeys +BUFFER_REPLACEMENT_MODE_DIRECT, BUFFER_REPLACEMENT_MODE_DISABLED, BUFFER_REPLACEMENT_MODE_NORMAL, cryptoInfo, data, format, supplementalData, timeUs, waitingForKeys diff --git a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html index 41665a12c8..410332b356 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/text/SubtitleOutputBuffer.html @@ -124,7 +124,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.decoder.Buffer

  • public abstract class SubtitleOutputBuffer
    -extends OutputBuffer
    +extends DecoderOutputBuffer
     implements Subtitle
    Base class for SubtitleDecoder output buffers.
    @@ -161,11 +161,11 @@ implements -
  • +
  • -

    Nested classes/interfaces inherited from class com.google.android.exoplayer2.decoder.OutputBuffer

    -OutputBuffer.Owner<S extends OutputBuffer>
  • +

    Nested classes/interfaces inherited from class com.google.android.exoplayer2.decoder.DecoderOutputBuffer

    +DecoderOutputBuffer.Owner<S extends DecoderOutputBuffer> @@ -178,11 +178,11 @@ implements -
  • +
  • -

    Fields inherited from class com.google.android.exoplayer2.decoder.OutputBuffer

    -skippedOutputBufferCount, timeUs
  • +

    Fields inherited from class com.google.android.exoplayer2.decoder.DecoderOutputBuffer

    +skippedOutputBufferCount, timeUs @@ -270,11 +270,11 @@ implements -
  • +
  • -

    Methods inherited from class com.google.android.exoplayer2.decoder.OutputBuffer

    -release
  • +

    Methods inherited from class com.google.android.exoplayer2.decoder.DecoderOutputBuffer

    +release @@ -218,6 +225,16 @@ extends static int +DEFAULT_MAX_HEIGHT_TO_DISCARD +  + + +static int +DEFAULT_MAX_WIDTH_TO_DISCARD +  + + +static int DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS   @@ -260,13 +277,15 @@ extends protected -AdaptiveTrackSelection​(TrackGroup group, +AdaptiveTrackSelection​(TrackGroup group, int[] tracks, - int type, + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type, BandwidthMeter bandwidthMeter, long minDurationForQualityIncreaseMs, long maxDurationForQualityDecreaseMs, long minDurationToRetainAfterDiscardMs, + int maxWidthToDiscard, + int maxHeightToDiscard, float bandwidthFraction, float bufferedFractionToLiveEdgeForQualityIncrease, List<AdaptiveTrackSelection.AdaptationCheckpoint> adaptationCheckpoints, @@ -462,6 +481,32 @@ extends + + +
      +
    • +

      DEFAULT_MAX_WIDTH_TO_DISCARD

      +
      public static final int DEFAULT_MAX_WIDTH_TO_DISCARD
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    + + + +
      +
    • +

      DEFAULT_MAX_HEIGHT_TO_DISCARD

      +
      public static final int DEFAULT_MAX_HEIGHT_TO_DISCARD
      +
      +
      See Also:
      +
      Constant Field Values
      +
      +
    • +
    @@ -516,7 +561,7 @@ extends + + @@ -229,9 +236,9 @@ implements   -BaseTrackSelection​(TrackGroup group, +BaseTrackSelection​(TrackGroup group, int[] tracks, - int type) + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type)   @@ -460,7 +467,7 @@ implements +
      @@ -468,7 +475,7 @@ implements TrackGroup group, int[] tracks, - int type) + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type)
      Parameters:
      group - The TrackGroup. Must not be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html index d02f0486da..d855721581 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10}; +var data = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -135,7 +135,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • All Implemented Interfaces:
      -
      Parcelable
      +
      Bundleable
      Enclosing class:
      @@ -144,7 +144,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      public static final class DefaultTrackSelector.Parameters
       extends TrackSelectionParameters
      -implements Parcelable
      +implements Bundleable
      Extends DefaultTrackSelector.Parameters by adding fields that are specific to DefaultTrackSelector.
    @@ -167,11 +167,11 @@ implements TrackSelectionParameters.Builder
    @@ -233,9 +233,11 @@ implements -static Parcelable.Creator<DefaultTrackSelector.Parameters> +static Bundleable.Creator<DefaultTrackSelector.Parameters> CREATOR -  + +
    Object that can restore Parameters from a Bundle.
    + static DefaultTrackSelector.Parameters @@ -254,7 +256,7 @@ implements -int +@com.google.android.exoplayer2.C.SelectionFlags int disabledTextTrackSelectionFlags
    Bitmask of selection flags that are disabled for text track selections.
    @@ -295,14 +297,7 @@ implements TrackSelectionParameters -forceHighestSupportedBitrate, forceLowestBitrate, maxAudioBitrate, maxAudioChannelCount, maxVideoBitrate, maxVideoFrameRate, maxVideoHeight, maxVideoWidth, minVideoBitrate, minVideoFrameRate, minVideoHeight, minVideoWidth, preferredAudioLanguages, preferredAudioMimeTypes, preferredAudioRoleFlags, preferredTextLanguages, preferredTextRoleFlags, preferredVideoMimeTypes, selectUndeterminedTextLanguage, viewportHeight, viewportOrientationMayChange, viewportWidth - - @@ -329,30 +324,25 @@ implements -int -describeContents() -  - - boolean equals​(Object obj)   - + static DefaultTrackSelector.Parameters getDefaults​(Context context)
    Returns an instance configured with default values.
    - + boolean getRendererDisabled​(int rendererIndex)
    Returns whether the renderer is disabled.
    - + DefaultTrackSelector.SelectionOverride getSelectionOverride​(int rendererIndex, TrackGroupArray groups) @@ -360,12 +350,12 @@ implements Returns the override for the specified renderer and TrackGroupArray. - + int hashCode()   - + boolean hasSelectionOverride​(int rendererIndex, TrackGroupArray groups) @@ -373,11 +363,12 @@ implements Returns whether there is an override for the specified renderer and TrackGroupArray. - -void -writeToParcel​(Parcel dest, - int flags) -  + +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + @@ -564,7 +546,7 @@ public final int disabledTextTrackSelectionFlags -
      +
      • allowMultipleAdaptiveSelections

        public final boolean allowMultipleAdaptiveSelections
        @@ -576,6 +558,16 @@ public final int disabledTextTrackSelectionFlags other track selection parameters.
      + + + +
    @@ -690,34 +682,20 @@ public final  - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html index 168ceb60a4..dda76457ee 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html @@ -25,8 +25,8 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10}; -var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; +var data = {"i0":10,"i1":42,"i2":42,"i3":42,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":42,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10}; +var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; var tableTab = "tableTab"; @@ -187,7 +187,7 @@ extends -All Methods Instance Methods Concrete Methods  +All Methods Instance Methods Concrete Methods Deprecated Methods  Modifier and Type Method @@ -205,21 +205,27 @@ extends clearSelectionOverride​(int rendererIndex, TrackGroupArray groups) -
    Clears a track selection override for the specified renderer and TrackGroupArray.
    + DefaultTrackSelector.ParametersBuilder clearSelectionOverrides() -
    Clears all track selection overrides for all renderers.
    + DefaultTrackSelector.ParametersBuilder clearSelectionOverrides​(int rendererIndex) -
    Clears all track selection overrides for the specified renderer.
    + @@ -238,41 +244,48 @@ extends +protected DefaultTrackSelector.ParametersBuilder +set​(TrackSelectionParameters parameters) + +
    Overrides the value of the builder with the value of TrackSelectionParameters.
    + + + DefaultTrackSelector.ParametersBuilder setAllowAudioMixedChannelCountAdaptiveness​(boolean allowAudioMixedChannelCountAdaptiveness)
    Sets whether to allow adaptive audio selections containing mixed channel counts.
    - + DefaultTrackSelector.ParametersBuilder setAllowAudioMixedMimeTypeAdaptiveness​(boolean allowAudioMixedMimeTypeAdaptiveness)
    Sets whether to allow adaptive audio selections containing mixed MIME types.
    - + DefaultTrackSelector.ParametersBuilder setAllowAudioMixedSampleRateAdaptiveness​(boolean allowAudioMixedSampleRateAdaptiveness)
    Sets whether to allow adaptive audio selections containing mixed sample rates.
    - + DefaultTrackSelector.ParametersBuilder setAllowMultipleAdaptiveSelections​(boolean allowMultipleAdaptiveSelections)
    Sets whether multiple adaptive selections with more than one track are allowed.
    - + DefaultTrackSelector.ParametersBuilder setAllowVideoMixedMimeTypeAdaptiveness​(boolean allowVideoMixedMimeTypeAdaptiveness)
    Sets whether to allow adaptive video selections containing mixed MIME types.
    - + DefaultTrackSelector.ParametersBuilder setAllowVideoNonSeamlessAdaptiveness​(boolean allowVideoNonSeamlessAdaptiveness) @@ -280,28 +293,36 @@ extends + DefaultTrackSelector.ParametersBuilder -setDisabledTextTrackSelectionFlags​(int disabledTextTrackSelectionFlags) +setDisabledTextTrackSelectionFlags​(@com.google.android.exoplayer2.C.SelectionFlags int disabledTextTrackSelectionFlags)
    Sets a bitmask of selection flags that are disabled for text track selections.
    - + +DefaultTrackSelector.ParametersBuilder +setDisabledTrackTypes​(Set<@TrackType Integer> disabledTrackTypes) + +
    Sets the disabled track types, preventing all tracks of those types from being selected for + playback.
    + + + DefaultTrackSelector.ParametersBuilder setExceedAudioConstraintsIfNecessary​(boolean exceedAudioConstraintsIfNecessary)
    Sets whether to exceed the setMaxAudioChannelCount(int) and setMaxAudioBitrate(int) constraints when no selection can be made otherwise.
    - + DefaultTrackSelector.ParametersBuilder setExceedRendererCapabilitiesIfNecessary​(boolean exceedRendererCapabilitiesIfNecessary)
    Sets whether to exceed renderer capabilities when no selection can be made otherwise.
    - + DefaultTrackSelector.ParametersBuilder setExceedVideoConstraintsIfNecessary​(boolean exceedVideoConstraintsIfNecessary) @@ -309,7 +330,7 @@ extends setMaxVideoFrameRate(int) constraints when no selection can be made otherwise. - + DefaultTrackSelector.ParametersBuilder setForceHighestSupportedBitrate​(boolean forceHighestSupportedBitrate) @@ -317,7 +338,7 @@ extends + DefaultTrackSelector.ParametersBuilder setForceLowestBitrate​(boolean forceLowestBitrate) @@ -325,35 +346,35 @@ extends + DefaultTrackSelector.ParametersBuilder setMaxAudioBitrate​(int maxAudioBitrate)
    Sets the maximum allowed audio bitrate.
    - + DefaultTrackSelector.ParametersBuilder setMaxAudioChannelCount​(int maxAudioChannelCount)
    Sets the maximum allowed audio channel count.
    - + DefaultTrackSelector.ParametersBuilder setMaxVideoBitrate​(int maxVideoBitrate)
    Sets the maximum allowed video bitrate.
    - + DefaultTrackSelector.ParametersBuilder setMaxVideoFrameRate​(int maxVideoFrameRate)
    Sets the maximum allowed video frame rate.
    - + DefaultTrackSelector.ParametersBuilder setMaxVideoSize​(int maxVideoWidth, int maxVideoHeight) @@ -361,28 +382,28 @@ extends Sets the maximum allowed video width and height. - + DefaultTrackSelector.ParametersBuilder setMaxVideoSizeSd() - + DefaultTrackSelector.ParametersBuilder setMinVideoBitrate​(int minVideoBitrate)
    Sets the minimum allowed video bitrate.
    - + DefaultTrackSelector.ParametersBuilder setMinVideoFrameRate​(int minVideoFrameRate)
    Sets the minimum allowed video frame rate.
    - + DefaultTrackSelector.ParametersBuilder setMinVideoSize​(int minVideoWidth, int minVideoHeight) @@ -390,49 +411,49 @@ extends Sets the minimum allowed video width and height. - + DefaultTrackSelector.ParametersBuilder setPreferredAudioLanguage​(String preferredAudioLanguage)
    Sets the preferred language for audio and forced text tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredAudioLanguages​(String... preferredAudioLanguages)
    Sets the preferred languages for audio and forced text tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredAudioMimeType​(String mimeType)
    Sets the preferred sample MIME type for audio tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredAudioMimeTypes​(String... mimeTypes)
    Sets the preferred sample MIME types for audio tracks.
    - + DefaultTrackSelector.ParametersBuilder -setPreferredAudioRoleFlags​(int preferredAudioRoleFlags) +setPreferredAudioRoleFlags​(@com.google.android.exoplayer2.C.RoleFlags int preferredAudioRoleFlags)
    Sets the preferred C.RoleFlags for audio tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredTextLanguage​(String preferredTextLanguage)
    Sets the preferred language for text tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings​(Context context) @@ -440,35 +461,35 @@ extends CaptioningManager. - + DefaultTrackSelector.ParametersBuilder setPreferredTextLanguages​(String... preferredTextLanguages)
    Sets the preferred languages for text tracks.
    - + DefaultTrackSelector.ParametersBuilder -setPreferredTextRoleFlags​(int preferredTextRoleFlags) +setPreferredTextRoleFlags​(@com.google.android.exoplayer2.C.RoleFlags int preferredTextRoleFlags)
    Sets the preferred C.RoleFlags for text tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredVideoMimeType​(String mimeType)
    Sets the preferred sample MIME type for video tracks.
    - + DefaultTrackSelector.ParametersBuilder setPreferredVideoMimeTypes​(String... mimeTypes)
    Sets the preferred sample MIME types for video tracks.
    - + DefaultTrackSelector.ParametersBuilder setRendererDisabled​(int rendererIndex, boolean disabled) @@ -476,16 +497,18 @@ extends Sets whether the renderer at the specified index is disabled. - + DefaultTrackSelector.ParametersBuilder setSelectionOverride​(int rendererIndex, TrackGroupArray groups, DefaultTrackSelector.SelectionOverride override) -
    Overrides the track selection for the renderer at the specified index.
    + - + DefaultTrackSelector.ParametersBuilder setSelectUndeterminedTextLanguage​(boolean selectUndeterminedTextLanguage) @@ -494,14 +517,21 @@ extends + +DefaultTrackSelector.ParametersBuilder +setTrackSelectionOverrides​(TrackSelectionOverrides trackSelectionOverrides) + +
    Sets the selection overrides.
    + + + DefaultTrackSelector.ParametersBuilder setTunnelingEnabled​(boolean tunnelingEnabled)
    Sets whether to enable tunneling if possible.
    - + DefaultTrackSelector.ParametersBuilder setViewportSize​(int viewportWidth, int viewportHeight, @@ -511,7 +541,7 @@ extends + DefaultTrackSelector.ParametersBuilder setViewportSizeToPhysicalDisplaySize​(Context context, boolean viewportOrientationMayChange) @@ -581,6 +611,21 @@ public ParametersBuilder()

    Method Detail

    + + + + @@ -939,19 +984,19 @@ public ParametersBuilder()
    - + - + - +
    • setDisabledTextTrackSelectionFlags

      public DefaultTrackSelector.ParametersBuilder setDisabledTextTrackSelectionFlags​(@SelectionFlags
      -                                                                                 int disabledTextTrackSelectionFlags)
      + @com.google.android.exoplayer2.C.SelectionFlags int disabledTextTrackSelectionFlags)
      Sets a bitmask of selection flags that are disabled for text track selections.
      Parameters:
      @@ -1278,6 +1323,45 @@ public ParametersBuilder()
    + + + + + + + + @@ -1358,10 +1442,14 @@ public ParametersBuilder() @@ -230,13 +225,17 @@ implements SelectionOverride​(int groupIndex, int... tracks) -  + +
    Constructs a SelectionOverride to override tracks of a group.
    + -SelectionOverride​(int groupIndex, +SelectionOverride​(int groupIndex, int[] tracks, - int type) -  + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type) + +
    Constructs a SelectionOverride of the given type to override tracks of a group.
    + @@ -264,25 +263,21 @@ implements -int -describeContents() -  - - boolean equals​(Object obj)   - + int hashCode()   - -void -writeToParcel​(Parcel dest, - int flags) -  + +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + @@ -350,7 +345,8 @@ implements
  • CREATOR

    -
    public static final Parcelable.Creator<DefaultTrackSelector.SelectionOverride> CREATOR
    +
    public static final Bundleable.Creator<DefaultTrackSelector.SelectionOverride> CREATOR
    +
    Object that can restore SelectionOverride from a Bundle.
  • @@ -371,6 +367,7 @@ implements Constructs a SelectionOverride to override tracks of a group.
    Parameters:
    groupIndex - The overriding track group index.
    @@ -378,7 +375,7 @@ implements
    + @@ -289,7 +289,7 @@ extends - +
      @@ -297,7 +297,7 @@ extends Definition
      public Definition​(TrackGroup group,
                         int[] tracks,
      -                  int type)
      + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type)
      Parameters:
      group - The TrackGroup. Must not be null.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/ExoTrackSelection.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/ExoTrackSelection.html index 3d1c5ea47c..10e07433b1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/ExoTrackSelection.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/ExoTrackSelection.html @@ -168,6 +168,13 @@ extends +
    • + + +

      Nested classes/interfaces inherited from interface com.google.android.exoplayer2.trackselection.TrackSelection

      +TrackSelection.Type
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/FixedTrackSelection.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/FixedTrackSelection.html index da40da4b81..cd0d6e34ac 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/FixedTrackSelection.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/FixedTrackSelection.html @@ -161,6 +161,13 @@ extends ExoTrackSelection ExoTrackSelection.Definition, ExoTrackSelection.Factory + @@ -207,15 +214,15 @@ extends   -FixedTrackSelection​(TrackGroup group, +FixedTrackSelection​(TrackGroup group, int track, - int type) + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type)   -FixedTrackSelection​(TrackGroup group, +FixedTrackSelection​(TrackGroup group, int track, - int type, + @com.google.android.exoplayer2.trackselection.TrackSelection.Type int type, int reason, Object data)   @@ -323,7 +330,7 @@ extends + - +
    • getTypeSupport

      @RendererSupport
      -public int getTypeSupport​(int trackType)
      +public int getTypeSupport​(@com.google.android.exoplayer2.C.TrackType int trackType)
      Returns the extent to which tracks of a specified type are supported. This is the best level of support obtained from getRendererSupport(int) for all renderers that handle the specified type. If no such renderers exist then RENDERER_SUPPORT_NO_TRACKS is returned.
      Parameters:
      -
      trackType - The track type. One of the C TRACK_TYPE_* constants.
      +
      trackType - The track type.
      Returns:
      The MappingTrackSelector.MappedTrackInfo.RendererSupport.
      diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html index cb94cbd21e..0ed5d7f45c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/MappingTrackSelector.html @@ -258,7 +258,7 @@ extends TrackSelector -getBandwidthMeter, init, invalidate
    • +getBandwidthMeter, getParameters, init, invalidate, isSetParametersSupported, setParameters
    + diff --git a/docs/doc/reference/com/google/android/exoplayer2/device/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelection.Type.html similarity index 66% rename from docs/doc/reference/com/google/android/exoplayer2/device/package-summary.html rename to docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelection.Type.html index 4b3d17cefc..f6817691e2 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/device/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelection.Type.html @@ -2,7 +2,7 @@ -com.google.android.exoplayer2.device (ExoPlayer library) +TrackSelection.Type (ExoPlayer library) @@ -19,7 +19,7 @@
    - +
    • setPreferredAudioRoleFlags

      public TrackSelectionParameters.Builder setPreferredAudioRoleFlags​(@RoleFlags
      -                                                                   int preferredAudioRoleFlags)
      + @com.google.android.exoplayer2.C.RoleFlags int preferredAudioRoleFlags)
      Sets the preferred C.RoleFlags for audio tracks.
      Parameters:
      @@ -879,14 +926,14 @@ public Builder()
    - +
    • setPreferredTextRoleFlags

      public TrackSelectionParameters.Builder setPreferredTextRoleFlags​(@RoleFlags
      -                                                                  int preferredTextRoleFlags)
      + @com.google.android.exoplayer2.C.RoleFlags int preferredTextRoleFlags)
      Sets the preferred C.RoleFlags for text tracks.
      Parameters:
      @@ -951,6 +998,39 @@ public Builder()
    + + + +
      +
    • +

      setTrackSelectionOverrides

      +
      public TrackSelectionParameters.Builder setTrackSelectionOverrides​(TrackSelectionOverrides trackSelectionOverrides)
      +
      Sets the selection overrides.
      +
      +
      Parameters:
      +
      trackSelectionOverrides - The track selection overrides.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    + + + +
      +
    • +

      setDisabledTrackTypes

      +
      public TrackSelectionParameters.Builder setDisabledTrackTypes​(Set<@TrackType Integer> disabledTrackTypes)
      +
      Sets the disabled track types, preventing all tracks of those types from being selected for + playback.
      +
      +
      Parameters:
      +
      disabledTrackTypes - The track types to disable.
      +
      Returns:
      +
      This builder.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html index fcfdea1465..390d48545b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10}; +var data = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,7 +130,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    Parcelable
    +
    Bundleable
    Direct Known Subclasses:
    @@ -139,8 +139,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public class TrackSelectionParameters
     extends Object
    -implements Parcelable
    -
    Constraint parameters for track selection.
    +implements Bundleable +
    Constraint parameters for track selection. + +

    For example the following code modifies the parameters to restrict video track selections to + SD, and to select a German audio track if there is one: + +

    
    + // Build on the current parameters.
    + TrackSelectionParameters currentParameters = player.getTrackSelectionParameters()
    + // Build the resulting parameters.
    + TrackSelectionParameters newParameters = currentParameters
    +     .buildUpon()
    +     .setMaxVideoSizeSd()
    +     .setPreferredAudioLanguage("deu")
    +     .build();
    + // Set the new parameters.
    + player.setTrackSelectionParameters(newParameters);
    + 
  • @@ -170,11 +186,11 @@ implements -
  • +
  • -

    Nested classes/interfaces inherited from interface android.os.Parcelable

    -Parcelable.ClassLoaderCreator<T extends Object>, Parcelable.Creator<T extends Object>
  • +

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Bundleable

    +Bundleable.Creator<T extends Bundleable> @@ -194,9 +210,11 @@ implements Description -static Parcelable.Creator<TrackSelectionParameters> +static Bundleable.Creator<TrackSelectionParameters> CREATOR -  + +
    Object that can restore TrackSelectionParameters from a Bundle.
    + static TrackSelectionParameters @@ -215,6 +233,13 @@ implements +ImmutableSet<@TrackType Integer> +disabledTrackTypes + +
    The track types that are disabled.
    + + + boolean forceHighestSupportedBitrate @@ -222,7 +247,7 @@ implements + boolean forceLowestBitrate @@ -230,77 +255,77 @@ implements + int maxAudioBitrate
    Maximum allowed audio bitrate in bits per second.
    - + int maxAudioChannelCount
    Maximum allowed audio channel count.
    - + int maxVideoBitrate
    Maximum allowed video bitrate in bits per second.
    - + int maxVideoFrameRate
    Maximum allowed video frame rate in hertz.
    - + int maxVideoHeight
    Maximum allowed video height in pixels.
    - + int maxVideoWidth
    Maximum allowed video width in pixels.
    - + int minVideoBitrate
    Minimum allowed video bitrate in bits per second.
    - + int minVideoFrameRate
    Minimum allowed video frame rate in hertz.
    - + int minVideoHeight
    Minimum allowed video height in pixels.
    - + int minVideoWidth
    Minimum allowed video width in pixels.
    - + ImmutableList<String> preferredAudioLanguages @@ -308,7 +333,7 @@ implements + ImmutableList<String> preferredAudioMimeTypes @@ -316,28 +341,28 @@ implements -int + +@com.google.android.exoplayer2.C.RoleFlags int preferredAudioRoleFlags
    The preferred C.RoleFlags for audio tracks.
    - + ImmutableList<String> preferredTextLanguages
    The preferred languages for text tracks as IETF BCP 47 conformant tags in order of preference.
    - -int + +@com.google.android.exoplayer2.C.RoleFlags int preferredTextRoleFlags
    The preferred C.RoleFlags for text tracks.
    - + ImmutableList<String> preferredVideoMimeTypes @@ -345,13 +370,20 @@ implements + boolean selectUndeterminedTextLanguage
    Whether a text track with undetermined language should be selected if no track with preferredTextLanguages is available, or if preferredTextLanguages is unset.
    + +TrackSelectionOverrides +trackSelectionOverrides + +
    Overrides to force tracks to be selected.
    + + int viewportHeight @@ -374,13 +406,6 @@ implements -
  • - - -

    Fields inherited from interface android.os.Parcelable

    -CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
  • - @@ -429,32 +454,28 @@ implements -int -describeContents() -  - - boolean equals​(Object obj)   - + static TrackSelectionParameters getDefaults​(Context context)
    Returns an instance configured with default values.
    - + int hashCode()   - -void -writeToParcel​(Parcel dest, - int flags) -  + +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    +
      @@ -514,15 +535,6 @@ public static final  - - - @@ -678,7 +690,7 @@ public static final 

      preferredAudioRoleFlags

      @RoleFlags
      -public final int preferredAudioRoleFlags
      +public final @com.google.android.exoplayer2.C.RoleFlags int preferredAudioRoleFlags
      The preferred C.RoleFlags for audio tracks. 0 selects the default track if there is one, or the first track if there's no default. The default value is 0.
      @@ -735,7 +747,7 @@ public final int preferredAudioRoleFlags
    • preferredTextRoleFlags

      @RoleFlags
      -public final int preferredTextRoleFlags
      +public final @com.google.android.exoplayer2.C.RoleFlags int preferredTextRoleFlags
      The preferred C.RoleFlags for text tracks. 0 selects the default track if there is one, or no track otherwise. The default value is 0, or C.ROLE_FLAG_SUBTITLE | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND if the accessibility CaptioningManager @@ -767,7 +779,7 @@ public final int preferredTextRoleFlags -
        +
        • forceHighestSupportedBitrate

          public final boolean forceHighestSupportedBitrate
          @@ -775,6 +787,38 @@ public final int preferredTextRoleFlags other constraints. The default value is false.
    + + + +
      +
    • +

      trackSelectionOverrides

      +
      public final TrackSelectionOverrides trackSelectionOverrides
      +
      Overrides to force tracks to be selected.
      +
    • +
    + + + +
      +
    • +

      disabledTrackTypes

      +
      public final ImmutableSet<@TrackType Integer> disabledTrackTypes
      +
      The track types that are disabled. No track of a disabled type will be selected, thus no track + type contained in the set will be played. The default value is that no track type is disabled + (empty set).
      +
    • +
    + + + + @@ -851,30 +895,18 @@ public final int preferredTextRoleFlags
    - - - - - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html index aa3d848324..e6cfb850dd 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9}; +var data = {"i0":9,"i1":9,"i2":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -195,14 +195,6 @@ extends -static boolean -hasTrackOfType​(TrackSelectionArray trackSelections, - int trackType) - -
    Returns if a TrackSelectionArray has at least one track of the given type.
    - - - static DefaultTrackSelector.Parameters updateParametersWithOverride​(DefaultTrackSelector.Parameters parameters, int rendererIndex, @@ -284,17 +276,6 @@ extends - - - -
      -
    • -

      hasTrackOfType

      -
      public static boolean hasTrackOfType​(TrackSelectionArray trackSelections,
      -                                     int trackType)
      -
      Returns if a TrackSelectionArray has at least one track of the given type.
      -
    • -
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html index 78f23a7318..2e8741f757 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelector.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":6,"i4":6}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":6,"i6":6,"i7":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -259,6 +259,13 @@ extends +TrackSelectionParameters +getParameters() + +
    Returns the current parameters for track selection.
    + + + void init​(TrackSelector.InvalidationListener listener, BandwidthMeter bandwidthMeter) @@ -266,7 +273,7 @@ extends Called by the player to initialize the selector. - + protected void invalidate() @@ -274,14 +281,21 @@ extends - + +boolean +isSetParametersSupported() + +
    Returns if this TrackSelector supports setParameters(TrackSelectionParameters).
    + + + abstract void onSelectionActivated​(Object info)
    Called by the player when a TrackSelectorResult previously generated by selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId, Timeline) is activated.
    - + abstract TrackSelectorResult selectTracks​(RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, @@ -291,6 +305,13 @@ extends Called by the player to perform a track selection. + +void +setParameters​(TrackSelectionParameters parameters) + +
    Called by the player to provide parameters for track selection.
    + + + + + +
      +
    • +

      getParameters

      +
      public TrackSelectionParameters getParameters()
      +
      Returns the current parameters for track selection.
      +
    • +
    + + + +
      +
    • +

      setParameters

      +
      public void setParameters​(TrackSelectionParameters parameters)
      +
      Called by the player to provide parameters for track selection. + +

      Only supported if isSetParametersSupported() returns true.

      +
      +
      Parameters:
      +
      parameters - The parameters for track selection.
      +
      +
    • +
    + + + +
      +
    • +

      isSetParametersSupported

      +
      public boolean isSetParametersSupported()
      +
      Returns if this TrackSelector supports setParameters(TrackSelectionParameters). + +

      The same value is always returned for a given TrackSelector instance.

      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectorResult.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectorResult.html index 8746eb6f88..4273f16111 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectorResult.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/TrackSelectorResult.html @@ -181,6 +181,13 @@ extends A ExoTrackSelection array containing the track selection for each renderer. + +TracksInfo +tracksInfo + +
    Describe the tracks and which one were selected.
    + + @@ -199,10 +206,22 @@ extends Description +TrackSelectorResult​(@NullableType RendererConfiguration[] rendererConfigurations, + @NullableType ExoTrackSelection[] selections, + TracksInfo tracksInfo, + Object info) +  + + TrackSelectorResult​(@NullableType RendererConfiguration[] rendererConfigurations, @NullableType ExoTrackSelection[] selections, Object info) -  + + + @@ -299,6 +318,16 @@ extends A ExoTrackSelection array containing the track selection for each renderer. + + + +
      +
    • +

      tracksInfo

      +
      public final TracksInfo tracksInfo
      +
      Describe the tracks and which one were selected.
      +
    • +
    @@ -324,11 +353,37 @@ public final  + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html index 7464e1a1b0..d513b87acc 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/trackselection/package-tree.html @@ -114,16 +114,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore (implements java.lang.Comparable<T>)
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore (implements java.lang.Comparable<T>)
  • -
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride (implements android.os.Parcelable)
  • +
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride (implements com.google.android.exoplayer2.Bundleable)
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore (implements java.lang.Comparable<T>)
  • com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore (implements java.lang.Comparable<T>)
  • com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition
  • com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
  • com.google.android.exoplayer2.trackselection.RandomTrackSelection.Factory (implements com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)
  • com.google.android.exoplayer2.trackselection.TrackSelectionArray
  • -
  • com.google.android.exoplayer2.trackselection.TrackSelectionParameters (implements android.os.Parcelable) +
  • com.google.android.exoplayer2.trackselection.TrackSelectionOverrides (implements com.google.android.exoplayer2.Bundleable)
  • +
  • com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
  • +
  • com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride (implements com.google.android.exoplayer2.Bundleable)
  • +
  • com.google.android.exoplayer2.trackselection.TrackSelectionParameters (implements com.google.android.exoplayer2.Bundleable)
  • com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder @@ -159,6 +162,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener
  • +
    +

    Annotation Type Hierarchy

    + +
    @@ -293,7 +293,7 @@ implements See Also: -
    Constant Field Values
    +
    Constant Field Values
    @@ -313,9 +313,9 @@ implements
  • CachedRegionTracker

    -
    public CachedRegionTracker​(Cache cache,
    +
    public CachedRegionTracker​(Cache cache,
                                String cacheKey,
    -                           ChunkIndex chunkIndex)
    + ChunkIndex chunkIndex)
  • @@ -362,16 +362,16 @@ implements
  • onSpanAdded

    -
    public void onSpanAdded​(Cache cache,
    -                        CacheSpan span)
    -
    Description copied from interface: Cache.Listener
    -
    Called when a CacheSpan is added to the cache.
    +
    public void onSpanAdded​(Cache cache,
    +                        CacheSpan span)
    +
    Description copied from interface: Cache.Listener
    +
    Called when a CacheSpan is added to the cache.
    Specified by:
    -
    onSpanAdded in interface Cache.Listener
    +
    onSpanAdded in interface Cache.Listener
    Parameters:
    cache - The source of the event.
    -
    span - The added CacheSpan.
    +
    span - The added CacheSpan.
  • @@ -381,16 +381,16 @@ implements
  • onSpanRemoved

    -
    public void onSpanRemoved​(Cache cache,
    -                          CacheSpan span)
    -
    Description copied from interface: Cache.Listener
    -
    Called when a CacheSpan is removed from the cache.
    +
    public void onSpanRemoved​(Cache cache,
    +                          CacheSpan span)
    +
    Description copied from interface: Cache.Listener
    +
    Called when a CacheSpan is removed from the cache.
    Specified by:
    -
    onSpanRemoved in interface Cache.Listener
    +
    onSpanRemoved in interface Cache.Listener
    Parameters:
    cache - The source of the event.
    -
    span - The removed CacheSpan.
    +
    span - The removed CacheSpan.
  • @@ -400,22 +400,22 @@ implements
  • onSpanTouched

    -
    public void onSpanTouched​(Cache cache,
    -                          CacheSpan oldSpan,
    -                          CacheSpan newSpan)
    -
    Description copied from interface: Cache.Listener
    -
    Called when an existing CacheSpan is touched, causing it to be replaced. The new - CacheSpan is guaranteed to represent the same data as the one it replaces, however - CacheSpan.file and CacheSpan.lastTouchTimestamp may have changed. +
    public void onSpanTouched​(Cache cache,
    +                          CacheSpan oldSpan,
    +                          CacheSpan newSpan)
    +
    Description copied from interface: Cache.Listener
    +
    Called when an existing CacheSpan is touched, causing it to be replaced. The new + CacheSpan is guaranteed to represent the same data as the one it replaces, however + CacheSpan.file and CacheSpan.lastTouchTimestamp may have changed. -

    Note that for span replacement, Cache.Listener.onSpanAdded(Cache, CacheSpan) and Cache.Listener.onSpanRemoved(Cache, CacheSpan) are not called in addition to this method.

    +

    Note that for span replacement, Cache.Listener.onSpanAdded(Cache, CacheSpan) and Cache.Listener.onSpanRemoved(Cache, CacheSpan) are not called in addition to this method.

    Specified by:
    -
    onSpanTouched in interface Cache.Listener
    +
    onSpanTouched in interface Cache.Listener
    Parameters:
    cache - The source of the event.
    -
    oldSpan - The old CacheSpan, which has been removed from the cache.
    -
    newSpan - The new CacheSpan, which has been added to the cache.
    +
    oldSpan - The old CacheSpan, which has been removed from the cache.
    +
    newSpan - The new CacheSpan, which has been added to the cache.
  • @@ -439,18 +439,18 @@ implements -
  • Overview
  • +
  • Overview
  • Package
  • Tree
  • -
  • Deprecated
  • -
  • Index
  • -
  • Help
  • +
  • Deprecated
  • +
  • Index
  • +
  • Help
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/MimeTypes.html b/docs/doc/reference/com/google/android/exoplayer2/util/MimeTypes.html index 06c1158bbb..2498a680c7 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/MimeTypes.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/MimeTypes.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -334,7 +334,7 @@ extends static String -AUDIO_DTS_UHD +AUDIO_DTS_X   @@ -464,9 +464,21 @@ extends static String +CODEC_E_AC3_JOC + +
    A non-standard codec string for E-AC3-JOC.
    + + + +static String IMAGE_JPEG   + +static String +TEXT_EXOPLAYER_CUES +  + static String TEXT_SSA @@ -474,105 +486,110 @@ extends static String -TEXT_VTT +TEXT_UNKNOWN   static String +TEXT_VTT +  + + +static String VIDEO_AV1   - + static String VIDEO_DIVX   - + static String VIDEO_DOLBY_VISION   - + static String VIDEO_FLV   - + static String VIDEO_H263   - + static String VIDEO_H264   - + static String VIDEO_H265   - + static String VIDEO_MATROSKA   - + static String VIDEO_MP2T   - + static String VIDEO_MP4   - + static String VIDEO_MP4V   - + static String VIDEO_MPEG   - + static String VIDEO_MPEG2   - + static String VIDEO_OGG   - + static String VIDEO_PS   - + static String VIDEO_UNKNOWN   - + static String VIDEO_VC1   - + static String VIDEO_VP8   - + static String VIDEO_VP9   - + static String VIDEO_WEBM   @@ -664,15 +681,15 @@ extends -static int +static @com.google.android.exoplayer2.C.TrackType int getTrackType​(String mimeType) -
    Returns the C.TRACK_TYPE_* constant corresponding to a specified MIME type, or - C.TRACK_TYPE_UNKNOWN if it could not be determined.
    +
    Returns the track type constant corresponding to a specified MIME type, + which may be C.TRACK_TYPE_UNKNOWN if it could not be determined.
    -static int +static @com.google.android.exoplayer2.C.TrackType int getTrackTypeOfCodec​(String codec)
    Equivalent to getTrackType(getMediaMimeType(codec)).
    @@ -694,12 +711,19 @@ extends static boolean +isImage​(String mimeType) + +
    Returns whether the given string is an image MIME type.
    + + + +static boolean isMatroska​(String mimeType)
    Returns whether the given mimeType is a Matroska MIME type, including WebM.
    - + static boolean isText​(String mimeType) @@ -707,25 +731,25 @@ extends - + static boolean isVideo​(String mimeType)
    Returns whether the given string is a video MIME type.
    - + static String normalizeMimeType​(String mimeType)
    Normalizes the MIME type provided so that equivalent MIME types are uniquely represented.
    - + static void -registerCustomMimeType​(String mimeType, +registerCustomMimeType​(String mimeType, String codecPrefix, - int trackType) + @com.google.android.exoplayer2.C.TrackType int trackType)
    Registers a custom MIME type.
    @@ -1339,16 +1363,16 @@ extends - + @@ -1521,6 +1545,32 @@ extends + + + + + + + + @@ -1849,7 +1899,7 @@ extends -
      +
      • IMAGE_JPEG

        public static final String IMAGE_JPEG
        @@ -1859,6 +1909,23 @@ extends
      + + + +
        +
      • +

        CODEC_E_AC3_JOC

        +
        public static final String CODEC_E_AC3_JOC
        +
        A non-standard codec string for E-AC3-JOC. Use of this constant allows for disambiguation + between regular E-AC3 ("ec-3") and E-AC3-JOC ("ec+3") streams from the codec string alone. The + standard is to use "ec-3" for both, as per the MP4RA + registered codec types.
        +
        +
        See Also:
        +
        Constant Field Values
        +
        +
      • +
    @@ -1869,7 +1936,7 @@ extends

    Method Detail

    - + @@ -1924,6 +1991,17 @@ extends + + + +
      +
    • +

      isImage

      +
      public static boolean isImage​(@Nullable
      +                              String mimeType)
      +
      Returns whether the given string is an image MIME type.
      +
    • +
    @@ -2089,16 +2167,15 @@ public static 
  • getTrackType

    -
    public static int getTrackType​(@Nullable
    -                               String mimeType)
    -
    Returns the C.TRACK_TYPE_* constant corresponding to a specified MIME type, or - C.TRACK_TYPE_UNKNOWN if it could not be determined.
    +
    public static @com.google.android.exoplayer2.C.TrackType int getTrackType​(@Nullable
    +                                                                          String mimeType)
    +
    Returns the track type constant corresponding to a specified MIME type, + which may be C.TRACK_TYPE_UNKNOWN if it could not be determined.
    Parameters:
    mimeType - A MIME type.
    Returns:
    -
    The corresponding C.TRACK_TYPE_*, or C.TRACK_TYPE_UNKNOWN if it - could not be determined.
    +
    The corresponding track type, which may be C.TRACK_TYPE_UNKNOWN if it could not be determined.
  • @@ -2130,14 +2207,13 @@ public static int getEncoding​(
  • getTrackTypeOfCodec

    -
    public static int getTrackTypeOfCodec​(String codec)
    +
    public static @com.google.android.exoplayer2.C.TrackType int getTrackTypeOfCodec​(String codec)
    Equivalent to getTrackType(getMediaMimeType(codec)).
    Parameters:
    codec - An RFC 6381 codec string.
    Returns:
    -
    The corresponding C.TRACK_TYPE_*, or C.TRACK_TYPE_UNKNOWN if it - could not be determined.
    +
    The corresponding track type, which may be C.TRACK_TYPE_UNKNOWN if it could not be determined.
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.H265SpsData.html b/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.H265SpsData.html new file mode 100644 index 0000000000..df14c99a8a --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.H265SpsData.html @@ -0,0 +1,455 @@ + + + + +NalUnitUtil.H265SpsData (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class NalUnitUtil.H265SpsData

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Enclosing class:
      +
      NalUnitUtil
      +
      +
      +
      public static final class NalUnitUtil.H265SpsData
      +extends Object
      +
      Holds data parsed from a H.265 sequence parameter set NAL unit.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          generalProfileSpace

          +
          public final int generalProfileSpace
          +
        • +
        + + + +
          +
        • +

          generalTierFlag

          +
          public final boolean generalTierFlag
          +
        • +
        + + + +
          +
        • +

          generalProfileIdc

          +
          public final int generalProfileIdc
          +
        • +
        + + + +
          +
        • +

          generalProfileCompatibilityFlags

          +
          public final int generalProfileCompatibilityFlags
          +
        • +
        + + + +
          +
        • +

          constraintBytes

          +
          public final int[] constraintBytes
          +
        • +
        + + + +
          +
        • +

          generalLevelIdc

          +
          public final int generalLevelIdc
          +
        • +
        + + + +
          +
        • +

          seqParameterSetId

          +
          public final int seqParameterSetId
          +
        • +
        + + + +
          +
        • +

          width

          +
          public final int width
          +
        • +
        + + + +
          +
        • +

          height

          +
          public final int height
          +
        • +
        + + + +
          +
        • +

          pixelWidthHeightRatio

          +
          public final float pixelWidthHeightRatio
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          H265SpsData

          +
          public H265SpsData​(int generalProfileSpace,
          +                   boolean generalTierFlag,
          +                   int generalProfileIdc,
          +                   int generalProfileCompatibilityFlags,
          +                   int[] constraintBytes,
          +                   int generalLevelIdc,
          +                   int seqParameterSetId,
          +                   int width,
          +                   int height,
          +                   float pixelWidthHeightRatio)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.SpsData.html b/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.SpsData.html index 00b4aa9c16..88ec973072 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.SpsData.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/NalUnitUtil.SpsData.html @@ -129,7 +129,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    public static final class NalUnitUtil.SpsData
     extends Object
    -
    Holds data parsed from a sequence parameter set NAL unit.
    +
    Holds data parsed from a H.264 sequence parameter set NAL unit.
    @@ -192,7 +192,7 @@ extends float -pixelWidthAspectRatio +pixelWidthHeightRatio   @@ -239,7 +239,7 @@ extends public final int height - +
    • -

      pixelWidthAspectRatio

      -
      public final float pixelWidthAspectRatio
      +

      pixelWidthHeightRatio

      +
      public final float pixelWidthHeightRatio
    @@ -421,7 +421,7 @@ extends -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -154,16 +154,23 @@ extends static class  +NalUnitUtil.H265SpsData + +
    Holds data parsed from a H.265 sequence parameter set NAL unit.
    + + + +static class  NalUnitUtil.PpsData
    Holds data parsed from a picture parameter set NAL unit.
    - + static class  NalUnitUtil.SpsData -
    Holds data parsed from a sequence parameter set NAL unit.
    +
    Holds data parsed from a H.264 sequence parameter set NAL unit.
    @@ -274,6 +281,26 @@ extends +static NalUnitUtil.H265SpsData +parseH265SpsNalUnit​(byte[] nalData, + int nalOffset, + int nalLimit) + +
    Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) + subsection 7.3.2.2.1.
    + + + +static NalUnitUtil.H265SpsData +parseH265SpsNalUnitPayload​(byte[] nalData, + int nalOffset, + int nalLimit) + +
    Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in + ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.
    + + + static NalUnitUtil.PpsData parsePpsNalUnit​(byte[] nalData, int nalOffset, @@ -283,17 +310,37 @@ extends - + +static NalUnitUtil.PpsData +parsePpsNalUnitPayload​(byte[] nalData, + int nalOffset, + int nalLimit) + +
    Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.2.
    + + + static NalUnitUtil.SpsData parseSpsNalUnit​(byte[] nalData, int nalOffset, int nalLimit) -
    Parses an SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection +
    Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.
    - + +static NalUnitUtil.SpsData +parseSpsNalUnitPayload​(byte[] nalData, + int nalOffset, + int nalLimit) + +
    Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.1.1.
    + + + static int unescapeStream​(byte[] data, int limit) @@ -478,7 +525,7 @@ extends public static NalUnitUtil.SpsData parseSpsNalUnit​(byte[] nalData, int nalOffset, int nalLimit) -
    Parses an SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection +
    Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.
    Parameters:
    @@ -490,6 +537,69 @@ extends + + + +
      +
    • +

      parseSpsNalUnitPayload

      +
      public static NalUnitUtil.SpsData parseSpsNalUnitPayload​(byte[] nalData,
      +                                                         int nalOffset,
      +                                                         int nalLimit)
      +
      Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.1.1.
      +
      +
      Parameters:
      +
      nalData - A buffer containing escaped SPS data.
      +
      nalOffset - The offset of the NAL unit payload in nalData.
      +
      nalLimit - The limit of the NAL unit in nalData.
      +
      Returns:
      +
      A parsed representation of the SPS data.
      +
      +
    • +
    + + + +
      +
    • +

      parseH265SpsNalUnit

      +
      public static NalUnitUtil.H265SpsData parseH265SpsNalUnit​(byte[] nalData,
      +                                                          int nalOffset,
      +                                                          int nalLimit)
      +
      Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) + subsection 7.3.2.2.1.
      +
      +
      Parameters:
      +
      nalData - A buffer containing escaped SPS data.
      +
      nalOffset - The offset of the NAL unit header in nalData.
      +
      nalLimit - The limit of the NAL unit in nalData.
      +
      Returns:
      +
      A parsed representation of the SPS data.
      +
      +
    • +
    + + + +
      +
    • +

      parseH265SpsNalUnitPayload

      +
      public static NalUnitUtil.H265SpsData parseH265SpsNalUnitPayload​(byte[] nalData,
      +                                                                 int nalOffset,
      +                                                                 int nalLimit)
      +
      Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in + ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.
      +
      +
      Parameters:
      +
      nalData - A buffer containing escaped SPS data.
      +
      nalOffset - The offset of the NAL unit payload in nalData.
      +
      nalLimit - The limit of the NAL unit in nalData.
      +
      Returns:
      +
      A parsed representation of the SPS data.
      +
      +
    • +
    @@ -511,6 +621,27 @@ extends + + + +
      +
    • +

      parsePpsNalUnitPayload

      +
      public static NalUnitUtil.PpsData parsePpsNalUnitPayload​(byte[] nalData,
      +                                                         int nalOffset,
      +                                                         int nalLimit)
      +
      Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.2.
      +
      +
      Parameters:
      +
      nalData - A buffer containing escaped PPS data.
      +
      nalOffset - The offset of the NAL unit payload in nalData.
      +
      nalLimit - The limit of the NAL unit in nalData.
      +
      Returns:
      +
      A parsed representation of the PPS data.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/util/RepeatModeUtil.html b/docs/doc/reference/com/google/android/exoplayer2/util/RepeatModeUtil.html index 6c32fcf454..16e23d68d1 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/RepeatModeUtil.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/RepeatModeUtil.html @@ -217,8 +217,8 @@ extends Description -static int -getNextRepeatMode​(int currentMode, +static @com.google.android.exoplayer2.Player.RepeatMode int +getNextRepeatMode​(@com.google.android.exoplayer2.Player.RepeatMode int currentMode, int enabledModes)
    Gets the next repeat mode out of enabledModes starting from currentMode.
    @@ -226,7 +226,7 @@ extends static boolean -isRepeatModeEnabled​(int repeatMode, +isRepeatModeEnabled​(@com.google.android.exoplayer2.Player.RepeatMode int repeatMode, int enabledModes)
    Verifies whether a given repeatMode is enabled in the bitmask enabledModes.
    @@ -308,16 +308,16 @@ extends

    Method Detail

    - +
    • getNextRepeatMode

      @RepeatMode
      -public static int getNextRepeatMode​(@RepeatMode
      -                                    int currentMode,
      -                                    int enabledModes)
      +public static @com.google.android.exoplayer2.Player.RepeatMode int getNextRepeatMode​(@RepeatMode + @com.google.android.exoplayer2.Player.RepeatMode int currentMode, + int enabledModes)
      Gets the next repeat mode out of enabledModes starting from currentMode.
      Parameters:
      @@ -328,14 +328,14 @@ public static int getNextRepeatMode​( +
      • isRepeatModeEnabled

        public static boolean isRepeatModeEnabled​(@RepeatMode
        -                                          int repeatMode,
        +                                          @com.google.android.exoplayer2.Player.RepeatMode int repeatMode,
                                                   int enabledModes)
        Verifies whether a given repeatMode is enabled in the bitmask enabledModes.
        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 01e0e37fed..a97d1cc028 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/util/Util.html +++ b/docs/doc/reference/com/google/android/exoplayer2/util/Util.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9,"i47":9,"i48":9,"i49":9,"i50":9,"i51":9,"i52":9,"i53":9,"i54":9,"i55":9,"i56":9,"i57":9,"i58":9,"i59":9,"i60":9,"i61":9,"i62":9,"i63":9,"i64":9,"i65":9,"i66":9,"i67":9,"i68":9,"i69":9,"i70":9,"i71":9,"i72":9,"i73":9,"i74":9,"i75":9,"i76":9,"i77":9,"i78":9,"i79":9,"i80":9,"i81":9,"i82":9,"i83":9,"i84":9,"i85":9,"i86":9,"i87":9,"i88":9,"i89":9,"i90":9,"i91":9,"i92":9,"i93":9,"i94":9,"i95":9,"i96":9,"i97":9,"i98":9,"i99":9,"i100":9,"i101":9,"i102":9,"i103":9,"i104":9,"i105":9,"i106":9,"i107":9,"i108":9,"i109":9,"i110":9,"i111":9,"i112":9,"i113":9}; +var data = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9,"i47":9,"i48":9,"i49":9,"i50":9,"i51":9,"i52":9,"i53":9,"i54":9,"i55":9,"i56":9,"i57":9,"i58":9,"i59":9,"i60":9,"i61":9,"i62":9,"i63":9,"i64":9,"i65":9,"i66":9,"i67":9,"i68":9,"i69":9,"i70":9,"i71":9,"i72":9,"i73":9,"i74":9,"i75":9,"i76":9,"i77":9,"i78":9,"i79":9,"i80":9,"i81":9,"i82":9,"i83":9,"i84":9,"i85":9,"i86":9,"i87":9,"i88":9,"i89":9,"i90":9,"i91":9,"i92":9,"i93":9,"i94":9,"i95":9,"i96":9,"i97":9,"i98":9,"i99":9,"i100":9,"i101":9,"i102":9,"i103":9,"i104":9,"i105":9,"i106":9,"i107":9,"i108":9,"i109":9,"i110":9,"i111":9,"i112":9,"i113":9,"i114":9,"i115":9,"i116":9,"i117":9}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -351,19 +351,12 @@ extends static void -closeQuietly​(DataSource dataSource) - -
        Closes a DataSource, suppressing any IOException that may occur.
        - - - -static void closeQuietly​(Closeable closeable)
        Closes a Closeable, suppressing any IOException that may occur.
        - + static int compareLong​(long left, long right) @@ -371,7 +364,7 @@ extends Compares two long values and returns the same value as Long.compare(long, long).
    - + static float constrainValue​(float value, float min, @@ -380,7 +373,7 @@ extends Constrains a value to the specified bounds.
    - + static int constrainValue​(int value, int min, @@ -389,7 +382,7 @@ extends Constrains a value to the specified bounds. - + static long constrainValue​(long value, long min, @@ -398,7 +391,7 @@ extends Constrains a value to the specified bounds. - + static boolean contains​(@NullableType Object[] items, Object item) @@ -407,7 +400,7 @@ extends Object.equals(Object). - + static int crc32​(byte[] bytes, int start, @@ -418,7 +411,7 @@ extends - + static int crc8​(byte[] bytes, int start, @@ -429,7 +422,7 @@ extends - + static Handler createHandler​(Looper looper, @UnknownInitialization Handler.Callback callback) @@ -437,35 +430,35 @@ extends Creates a Handler with the specified Handler.Callback on the specified Looper thread. - + static Handler createHandlerForCurrentLooper()
    Creates a Handler on the current Looper thread.
    - + static Handler createHandlerForCurrentLooper​(@UnknownInitialization Handler.Callback callback)
    Creates a Handler with the specified Handler.Callback on the current Looper thread.
    - + static Handler createHandlerForCurrentOrMainLooper()
    Creates a Handler on the current Looper thread.
    - + static Handler createHandlerForCurrentOrMainLooper​(@UnknownInitialization Handler.Callback callback)
    Creates a Handler with the specified Handler.Callback on the current Looper thread.
    - + static File createTempDirectory​(Context context, String prefix) @@ -473,7 +466,7 @@ extends Creates an empty directory in the directory returned by Context.getCacheDir(). - + static File createTempFile​(Context context, String prefix) @@ -481,7 +474,7 @@ extends Creates a new empty file in the directory returned by Context.getCacheDir(). - + static String escapeFileName​(String fileName) @@ -489,7 +482,7 @@ extends - + static Uri fixSmoothStreamingIsmManifestUri​(Uri uri) @@ -497,7 +490,7 @@ extends - + static String formatInvariant​(String format, Object... args) @@ -505,14 +498,14 @@ extends Formats a string using Locale.US. - + static String fromUtf8Bytes​(byte[] bytes)
    Returns a new String constructed by decoding UTF-8 encoded bytes.
    - + static String fromUtf8Bytes​(byte[] bytes, int offset, @@ -521,6 +514,14 @@ extends Returns a new String constructed by decoding UTF-8 encoded bytes in a subarray. + +static int +generateAudioSessionIdV21​(Context context) + +
    Returns a newly generated audio session identifier, or AudioManager.ERROR if an error + occurred in which case audio playback may fail.
    + + static String getAdaptiveMimeTypeForContentType​(int contentType) @@ -530,7 +531,7 @@ extends -static int +static @com.google.android.exoplayer2.C.AudioContentType int getAudioContentTypeForStreamType​(int streamType)
    Returns the C.AudioContentType corresponding to the specified C.StreamType.
    @@ -544,7 +545,7 @@ extends -static int +static @com.google.android.exoplayer2.C.AudioUsage int getAudioUsageForStreamType​(int streamType)
    Returns the C.AudioUsage corresponding to the specified C.StreamType.
    @@ -567,16 +568,16 @@ extends static int -getCodecCountOfType​(String codecs, - int trackType) +getCodecCountOfType​(String codecs, + @com.google.android.exoplayer2.C.TrackType int trackType)
    Returns the number of codec strings in codecs whose type matches trackType.
    static String -getCodecsOfType​(String codecs, - int trackType) +getCodecsOfType​(String codecs, + @com.google.android.exoplayer2.C.TrackType int trackType)
    Returns a copy of codecs without the codecs whose track type doesn't match trackType.
    @@ -629,20 +630,41 @@ extends +static Locale +getDefaultDisplayLocale() + +
    Returns the default DISPLAY Locale.
    + + + static UUID getDrmUuid​(String drmScheme)
    Derives a DRM UUID from drmScheme.
    - + +static @com.google.android.exoplayer2.PlaybackException.ErrorCode int +getErrorCodeForMediaDrmErrorCode​(int mediaDrmErrorCode) + +
    Returns a PlaybackException.ErrorCode value that corresponds to the provided MediaDrm.ErrorCodes value.
    + + + static int getErrorCodeFromPlatformDiagnosticsInfo​(String diagnosticsInfo)
    Attempts to parse an error code from a diagnostic string found in framework media exceptions.
    - + +static String +getFormatSupportString​(int formatSupport) + +
    Returns string representation of a C.FormatSupport flag.
    + + + static int getIntegerCodeForString​(String string) @@ -650,14 +672,14 @@ extends - + static String getLocaleLanguageTag​(Locale locale)
    Returns the language tag for a Locale.
    - + static long getMediaDurationForPlayoutDuration​(long playoutDuration, float speed) @@ -665,21 +687,21 @@ extends Returns the duration of media that will elapse in playoutDuration. - + static long getNowUnixTimeMs​(long elapsedRealtimeEpochOffsetMs)
    Returns the current time in milliseconds since the epoch.
    - + static int getPcmEncoding​(int bitDepth)
    Converts a sample bit depth to a corresponding PCM encoding constant.
    - + static Format getPcmFormat​(int pcmEncoding, int channels, @@ -688,7 +710,7 @@ extends Gets a PCM Format with the specified parameters. - + static int getPcmFrameSize​(int pcmEncoding, int channelCount) @@ -696,7 +718,7 @@ extends Returns the frame size for audio with channelCount channels in the specified encoding. - + static long getPlayoutDurationForMediaDuration​(long mediaDuration, float speed) @@ -704,14 +726,14 @@ extends Returns the playout duration of mediaDuration of media. - + static int -getStreamTypeForAudioUsage​(int usage) +getStreamTypeForAudioUsage​(@com.google.android.exoplayer2.C.AudioUsage int usage)
    Returns the C.StreamType corresponding to the specified C.AudioUsage.
    - + static String getStringForTime​(StringBuilder builder, Formatter formatter, @@ -720,7 +742,7 @@ extends Returns the specified millisecond time formatted as a string. - + static String[] getSystemLanguageCodes() @@ -728,14 +750,14 @@ extends - + static String -getTrackTypeString​(int trackType) +getTrackTypeString​(@com.google.android.exoplayer2.C.TrackType int trackType) -
    Returns a string representation of a TRACK_TYPE_* constant defined in C.
    +
    Returns a string representation of a C.TrackType.
    - + static String getUserAgent​(Context context, String applicationName) @@ -743,28 +765,28 @@ extends Returns a user agent string based on the given application name and the library version. - + static byte[] getUtf8Bytes​(String value)
    Returns a new byte array containing the code points of a String encoded using UTF-8.
    - + static byte[] gzip​(byte[] input)
    Compresses input using gzip and returns the result in a newly allocated byte array.
    - + static int inferContentType​(Uri uri)
    Makes a best guess to infer the C.ContentType from a Uri.
    - + static int inferContentType​(Uri uri, String overrideExtension) @@ -772,14 +794,14 @@ extends Makes a best guess to infer the C.ContentType from a Uri. - + static int inferContentType​(String fileName)
    Makes a best guess to infer the C.ContentType from a file name.
    - + static int inferContentTypeForUriAndMimeType​(Uri uri, String mimeType) @@ -787,7 +809,7 @@ extends Makes a best guess to infer the C.ContentType from a Uri and optional MIME type. - + static boolean inflate​(ParsableByteArray input, ParsableByteArray output, @@ -796,42 +818,49 @@ extends Uncompresses the data in input. - + +static boolean +isAutomotive​(Context context) + +
    Returns whether the app is running on an automotive device.
    + + + static boolean isEncodingHighResolutionPcm​(int encoding)
    Returns whether encoding is high resolution (> 16-bit) PCM.
    - + static boolean isEncodingLinearPcm​(int encoding)
    Returns whether encoding is one of the linear PCM encodings.
    - + static boolean isLinebreak​(int c)
    Returns whether the given character is a carriage return ('\r') or a line feed ('\n').
    - + static boolean isLocalFileUri​(Uri uri)
    Returns true if the URI is a path to a local file or a reference to a local file.
    - + static boolean isTv​(Context context)
    Returns whether the app is running on a TV device.
    - + static int linearSearch​(int[] array, int value) @@ -839,7 +868,7 @@ extends Returns the index of the first occurrence of value in array, or C.INDEX_UNSET if value is not contained in array. - + static int linearSearch​(long[] array, long value) @@ -847,7 +876,7 @@ extends Returns the index of the first occurrence of value in array, or C.INDEX_UNSET if value is not contained in array. - + static boolean maybeRequestReadExternalStoragePermission​(Activity activity, Uri... uris) @@ -856,7 +885,7 @@ extends Uris, requesting the permission if necessary. - + static boolean maybeRequestReadExternalStoragePermission​(Activity activity, MediaItem... mediaItems) @@ -866,14 +895,14 @@ extends - + static long minValue​(SparseLongArray sparseLongArray)
    Returns the minimum value in the given SparseLongArray.
    - + static <T> void moveItems​(List<T> items, int fromIndex, @@ -883,21 +912,28 @@ extends Moves the elements starting at fromIndex to newFromIndex. - + +static long +msToUs​(long timeMs) + +
    Converts a time in milliseconds to the corresponding time in microseconds, preserving C.TIME_UNSET values and C.TIME_END_OF_SOURCE values.
    + + + static ExecutorService newSingleThreadExecutor​(String threadName)
    Instantiates a new single threaded executor whose thread has the specified name.
    - + static @PolyNull String normalizeLanguageCode​(@PolyNull String language)
    Returns a normalized IETF BCP 47 language tag for language.
    - + static <T> T[] nullSafeArrayAppend​(T[] original, T newElement) @@ -905,7 +941,7 @@ extends Creates a new array containing original with newElement appended. - + static <T> T[] nullSafeArrayConcatenation​(T[] first, T[] second) @@ -913,7 +949,7 @@ extends Creates a new array containing the concatenation of two non-null type arrays. - + static <T> T[] nullSafeArrayCopy​(T[] input, int length) @@ -921,7 +957,7 @@ extends Copies and optionally truncates an array. - + static <T> T[] nullSafeArrayCopyOfRange​(T[] input, int from, @@ -930,7 +966,7 @@ extends Copies a subset of an array. - + static <T> void nullSafeListToArray​(List<T> list, T[] array) @@ -938,7 +974,7 @@ extends Copies the contents of list into array. - + static long parseXsDateTime​(String value) @@ -946,14 +982,14 @@ extends - + static long parseXsDuration​(String value)
    Parses an xs:duration attribute value, returning the parsed duration in milliseconds.
    - + static boolean postOrRun​(Handler handler, Runnable runnable) @@ -961,7 +997,7 @@ extends Posts the Runnable if the calling thread differs with the Looper of the Handler. - + static boolean readBoolean​(Parcel parcel) @@ -969,31 +1005,14 @@ extends - -static byte[] -readExactly​(DataSource dataSource, - int length) - -
    Reads length bytes from the specified opened DataSource, and returns a byte - array containing the read data.
    - - - -static byte[] -readToEnd​(DataSource dataSource) - -
    Reads data from the specified opened DataSource until it ends, and returns a byte array - containing the read data.
    - - - + static void recursiveDelete​(File fileOrDirectory)
    Recursively deletes a directory and its content.
    - + static <T> void removeRange​(List<T> list, int fromIndex, @@ -1002,7 +1021,7 @@ extends Removes an indexed range from a List. - + static long scaleLargeTimestamp​(long timestamp, long multiplier, @@ -1011,7 +1030,7 @@ extends Scales a large timestamp. - + static long[] scaleLargeTimestamps​(List<Long> timestamps, long multiplier, @@ -1020,7 +1039,7 @@ extends Applies scaleLargeTimestamp(long, long, long) to a list of unscaled timestamps. - + static void scaleLargeTimestampsInPlace​(long[] timestamps, long multiplier, @@ -1029,7 +1048,7 @@ extends Applies scaleLargeTimestamp(long, long, long) to an array of unscaled timestamps. - + static void sneakyThrow​(Throwable t) @@ -1037,7 +1056,7 @@ extends - + static String[] split​(String value, String regex) @@ -1045,7 +1064,7 @@ extends Splits a string using value.split(regex, -1). - + static String[] splitAtFirst​(String value, String regex) @@ -1053,14 +1072,14 @@ extends Splits the string at the first occurrence of the delimiter regex. - + static String[] splitCodecs​(String codecs)
    Splits a codecs sequence string, as defined in RFC 6381, into individual codec strings.
    - + static ComponentName startForegroundService​(Context context, Intent intent) @@ -1069,7 +1088,7 @@ extends Context.startService(Intent) otherwise. - + static long subtractWithOverflowDefault​(long x, long y, @@ -1078,7 +1097,7 @@ extends Returns the difference between two arguments, or a third argument if the result overflows. - + static boolean tableExists​(SQLiteDatabase database, String tableName) @@ -1086,36 +1105,36 @@ extends Returns whether the table exists in the database. - + static byte[] toByteArray​(InputStream inputStream)
    Converts the entirety of an InputStream to a byte array.
    - + static String toHexString​(byte[] bytes)
    Returns a string containing a lower-case hex representation of the bytes provided.
    - + static long toLong​(int mostSignificantBits, int leastSignificantBits) -
    Return the long that is composed of the bits of the 2 specified integers.
    +
    Returns the long that is composed of the bits of the 2 specified integers.
    - + static long toUnsignedLong​(int x)
    Converts an integer to a long by unsigned conversion.
    - + static CharSequence truncateAscii​(CharSequence sequence, int maxLength) @@ -1123,14 +1142,21 @@ extends Truncates a sequence of ASCII characters to a maximum length. - + static String unescapeFileName​(String fileName)
    Unescapes an escaped file or directory name back to its original value.
    - + +static long +usToMs​(long timeUs) + +
    Converts a time in microseconds to the corresponding time in milliseconds, preserving C.TIME_UNSET and C.TIME_END_OF_SOURCE values.
    + + + static void writeBoolean​(Parcel parcel, boolean value) @@ -1685,64 +1711,6 @@ public static <T> T[] castNonNullTypeArray​(@Nullable - - - -
      -
    • -

      readToEnd

      -
      public static byte[] readToEnd​(DataSource dataSource)
      -                        throws IOException
      -
      Reads data from the specified opened DataSource until it ends, and returns a byte array - containing the read data.
      -
      -
      Parameters:
      -
      dataSource - The source from which to read.
      -
      Returns:
      -
      The concatenation of all read data.
      -
      Throws:
      -
      IOException - If an error occurs reading from the source.
      -
      -
    • -
    - - - -
      -
    • -

      readExactly

      -
      public static byte[] readExactly​(DataSource dataSource,
      -                                 int length)
      -                          throws IOException
      -
      Reads length bytes from the specified opened DataSource, and returns a byte - array containing the read data.
      -
      -
      Parameters:
      -
      dataSource - The source from which to read.
      -
      Returns:
      -
      The read data.
      -
      Throws:
      -
      IOException - If an error occurs reading from the source.
      -
      IllegalStateException - If the end of the source was reached before length bytes - could be read.
      -
      -
    • -
    - - - -
      -
    • -

      closeQuietly

      -
      public static void closeQuietly​(@Nullable
      -                                DataSource dataSource)
      -
      Closes a DataSource, suppressing any IOException that may occur.
      -
      -
      Parameters:
      -
      dataSource - The DataSource to close.
      -
      -
    • -
    @@ -2391,6 +2359,38 @@ public static long minValue​( + + +
      +
    • +

      usToMs

      +
      public static long usToMs​(long timeUs)
      +
      Converts a time in microseconds to the corresponding time in milliseconds, preserving C.TIME_UNSET and C.TIME_END_OF_SOURCE values.
      +
      +
      Parameters:
      +
      timeUs - The time in microseconds.
      +
      Returns:
      +
      The corresponding time in milliseconds.
      +
      +
    • +
    + + + +
      +
    • +

      msToUs

      +
      public static long msToUs​(long timeMs)
      +
      Converts a time in milliseconds to the corresponding time in microseconds, preserving C.TIME_UNSET values and C.TIME_END_OF_SOURCE values.
      +
      +
      Parameters:
      +
      timeMs - The time in milliseconds.
      +
      Returns:
      +
      The corresponding time in microseconds.
      +
      +
    • +
    @@ -2558,7 +2558,7 @@ public static long minValue​(public static long toLong​(int mostSignificantBits, int leastSignificantBits) -
    Return the long that is composed of the bits of the 2 specified integers.
    +
    Returns the long that is composed of the bits of the 2 specified integers.
    Parameters:
    mostSignificantBits - The 32 most significant bits of the long to return.
    @@ -2659,7 +2659,7 @@ public static long minValue​(
    + - +
      @@ -2680,16 +2680,16 @@ public static long minValue​(@Nullable public static String getCodecsOfType​(@Nullable String codecs, - int trackType) + @com.google.android.exoplayer2.C.TrackType int trackType)
      Returns a copy of codecs without the codecs whose track type doesn't match trackType.
      Parameters:
      codecs - A codec sequence string, as defined in RFC 6381.
      -
      trackType - One of C.TRACK_TYPE_*.
      +
      trackType - The track type.
      Returns:
      A copy of codecs without the codecs whose track type doesn't match - trackType. If this ends up empty, or codecs is null, return null.
      + trackType
      . If this ends up empty, or codecs is null, returns null.
    @@ -2826,8 +2826,8 @@ public static int getPcmEncoding​(int bitDepth)
  • getAudioUsageForStreamType

    @AudioUsage
    -public static int getAudioUsageForStreamType​(@StreamType
    -                                             int streamType)
    +public static @com.google.android.exoplayer2.C.AudioUsage int getAudioUsageForStreamType​(@StreamType + int streamType)
    Returns the C.AudioUsage corresponding to the specified C.StreamType.
  • @@ -2838,12 +2838,12 @@ public static int getAudioUsageForStreamType​(

    getAudioContentTypeForStreamType

    @AudioContentType
    -public static int getAudioContentTypeForStreamType​(@StreamType
    -                                                   int streamType)
    +public static @com.google.android.exoplayer2.C.AudioContentType int getAudioContentTypeForStreamType​(@StreamType + int streamType)
    Returns the C.AudioContentType corresponding to the specified C.StreamType.
    - +
      @@ -2851,10 +2851,26 @@ public static int getAudioContentTypeForStreamType​(@StreamType public static int getStreamTypeForAudioUsage​(@AudioUsage - int usage) + @com.google.android.exoplayer2.C.AudioUsage int usage)
      Returns the C.StreamType corresponding to the specified C.AudioUsage.
    + + + +
      +
    • +

      generateAudioSessionIdV21

      +
      @RequiresApi(21)
      +public static int generateAudioSessionIdV21​(Context context)
      +
      Returns a newly generated audio session identifier, or AudioManager.ERROR if an error + occurred in which case audio playback may fail.
      +
      +
      See Also:
      +
      AudioManager.generateAudioSessionId()
      +
      +
    • +
    @@ -2873,6 +2889,18 @@ public static  + + + @@ -3207,6 +3235,16 @@ public static  + + +
      +
    • +

      getDefaultDisplayLocale

      +
      public static Locale getDefaultDisplayLocale()
      +
      Returns the default DISPLAY Locale.
      +
    • +
    @@ -3248,6 +3286,22 @@ public static  + + +
      +
    • +

      isAutomotive

      +
      public static boolean isAutomotive​(Context context)
      +
      Returns whether the app is running on an automotive device.
      +
      +
      Parameters:
      +
      context - Any context.
      +
      Returns:
      +
      Whether the app is running on an automotive device.
      +
      +
    • +
    @@ -3294,17 +3348,17 @@ public static  + diff --git a/docs/doc/reference/com/google/android/exoplayer2/video/ColorInfo.html b/docs/doc/reference/com/google/android/exoplayer2/video/ColorInfo.html index 67bc295291..a934ce098a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/video/ColorInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/video/ColorInfo.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":9,"i5":10,"i6":10}; +var data = {"i0":10,"i1":10,"i2":9,"i3":9,"i4":10,"i5":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -130,12 +130,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
  • All Implemented Interfaces:
    -
    Parcelable
    +
    Bundleable

    public final class ColorInfo
     extends Object
    -implements Parcelable
    +implements Bundleable
    Stores color info.
  • @@ -151,11 +151,11 @@ implements -
  • +
  • -

    Nested classes/interfaces inherited from interface android.os.Parcelable

    -Parcelable.ClassLoaderCreator<T extends Object>, Parcelable.Creator<T extends Object>
  • +

    Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Bundleable

    +Bundleable.Creator<T extends Bundleable> @@ -196,7 +196,7 @@ implements -static Parcelable.Creator<ColorInfo> +static Bundleable.Creator<ColorInfo> CREATOR   @@ -208,13 +208,6 @@ implements -
  • - - -

    Fields inherited from interface android.os.Parcelable

    -CONTENTS_FILE_DESCRIPTOR, PARCELABLE_WRITE_RETURN_VALUE
  • - @@ -259,21 +252,16 @@ implements Description -int -describeContents() -  - - boolean equals​(Object obj)   - + int hashCode()   - + static int isoColorPrimariesToColorSpace​(int isoColorPrimaries) @@ -281,7 +269,7 @@ implements + static int isoTransferCharacteristicsToColorTransfer​(int isoTransferCharacteristics) @@ -289,17 +277,18 @@ implements +Bundle +toBundle() + +
    Returns a Bundle representing the information stored in this object.
    + + String toString()   - -void -writeToParcel​(Parcel dest, - int flags) -  -
    - - - - - + 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 f25139f7d3..92c4f908dc 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/video/DecoderVideoRenderer.html @@ -174,7 +174,7 @@ extends Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener +Renderer.MessageType, Renderer.State, Renderer.WakeupListener @@ -249,6 +265,36 @@ public final The length of the NAL unit length field in the bitstream's container, in bytes. + + + +
      +
    • +

      width

      +
      public final int width
      +
      The width of each decoded frame, or Format.NO_VALUE if unknown.
      +
    • +
    + + + +
      +
    • +

      height

      +
      public final int height
      +
      The height of each decoded frame, or Format.NO_VALUE if unknown.
      +
    • +
    + + + +
      +
    • +

      pixelWidthHeightRatio

      +
      public final float pixelWidthHeightRatio
      +
      The pixel width to height ratio.
      +
    • +
    @@ -257,11 +303,9 @@ public final String codecs -
    An RFC 6381 codecs string representing the video format, or null if not known.
    -
    -
    See Also:
    -
    Format.codecs
    -
    +
    An RFC 6381 codecs string representing the video format, or null if not known. + +

    See Format.codecs.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.html b/docs/doc/reference/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.html index 324c425e85..547f4fe6e4 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.html @@ -158,6 +158,8 @@ extends C.VideoScalingMode. Note that the scaling mode only applies if the Surface targeted by this renderer is owned by a SurfaceView. +
  • Message with type Renderer.MSG_SET_CHANGE_FRAME_RATE_STRATEGY to set the strategy used to + call Surface.setFrameRate(float, int, int).
  • Message with type Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER to set a listener for metadata associated with frames being rendered. The message payload should be the VideoFrameMetadataListener, or null. @@ -199,7 +201,7 @@ extends Renderer -Renderer.State, Renderer.VideoScalingMode, Renderer.WakeupListener
  • +Renderer.MessageType, Renderer.State, Renderer.WakeupListener
    @@ -259,7 +259,7 @@ implements void -setOutputBuffer​(VideoDecoderOutputBuffer outputBuffer) +setOutputBuffer​(VideoDecoderOutputBuffer outputBuffer)
    Sets the output buffer to be rendered.
    @@ -277,14 +277,14 @@ implements SurfaceView -dispatchDraw, draw, gatherTransparentRegion, getHolder, getHostToken, getImportantForAccessibility, getSurfaceControl, onMeasure, onWindowVisibilityChanged, setAlpha, setChildSurfacePackage, setClipBounds, setSecure, setVisibility, setZOrderMediaOverlay, setZOrderOnTop +dispatchDraw, draw, gatherTransparentRegion, getHolder, getHostToken, getImportantForAccessibility, getSurfaceControl, onFocusChanged, onMeasure, onWindowVisibilityChanged, setAlpha, setChildSurfacePackage, setClipBounds, setSecure, setVisibility, setZOrderMediaOverlay, setZOrderOnTop @@ -345,14 +345,14 @@ extends SurfaceView -dispatchDraw, draw, gatherTransparentRegion, getHolder, getHostToken, getImportantForAccessibility, getSurfaceControl, onMeasure, onWindowVisibilityChanged, setAlpha, setChildSurfacePackage, setClipBounds, setSecure, setVisibility, setZOrderMediaOverlay, setZOrderOnTop +dispatchDraw, draw, gatherTransparentRegion, getHolder, getHostToken, getImportantForAccessibility, getSurfaceControl, onFocusChanged, onMeasure, onWindowVisibilityChanged, setAlpha, setChildSurfacePackage, setClipBounds, setSecure, setVisibility, setZOrderMediaOverlay, setZOrderOnTop -
    • - + @@ -4657,19 +4697,33 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); - - - + + - - + + + + + + + + + + +
      com.google.android.exoplayer2.device.DeviceInfo com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer 
      Modifier and Type Constant Field
      + public static final intPLAYBACK_TYPE_LOCAL0COLORSPACE_BT20203
      + public static final intPLAYBACK_TYPE_REMOTECOLORSPACE_BT601 1
      + +public static final intCOLORSPACE_BT7092
      + +public static final intCOLORSPACE_UNKNOWN0
    • @@ -5476,6 +5530,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 1 + + + +public static final int +FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS +2 + @@ -5483,6 +5544,81 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); - diff --git a/docs/doc/reference/deprecated-list.html b/docs/doc/reference/deprecated-list.html index 79f9854e95..572cccacc5 100644 --- a/docs/doc/reference/deprecated-list.html +++ b/docs/doc/reference/deprecated-list.html @@ -115,35 +115,39 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.audio.AudioListener +com.google.android.exoplayer2.ExoPlayer.AudioComponent - +
      Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
      -com.google.android.exoplayer2.ControlDispatcher +com.google.android.exoplayer2.ExoPlayer.DeviceComponent -
      Use a ForwardingPlayer or configure the player to customize operations.
      +
      Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
      -com.google.android.exoplayer2.device.DeviceListener +com.google.android.exoplayer2.ExoPlayer.TextComponent - +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      +com.google.android.exoplayer2.ExoPlayer.VideoComponent + +
      Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
      + + + com.google.android.exoplayer2.Player.EventListener - -com.google.android.exoplayer2.video.VideoListener - - - - @@ -161,36 +165,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.DefaultControlDispatcher +com.google.android.exoplayer2.database.ExoDatabaseProvider -
      Use a ForwardingPlayer or configure the player to customize operations.
      + -com.google.android.exoplayer2.ExoPlayer.Builder - - - - - com.google.android.exoplayer2.ext.cronet.CronetDataSourceFactory - + com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
      Use CronetEngine directly. See the Android developer guide to learn how to instantiate a CronetEngine for use by your application. You - can also use CronetUtil.buildCronetEngine(android.content.Context, java.lang.String, boolean) to build a CronetEngine suitable - for use by ExoPlayer.
      - - - -com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor - -
      If you still need this component, please contact us by filing an issue on our issue tracker.
      + can also use CronetUtil.buildCronetEngine(android.content.Context) to build a CronetEngine suitable + for use with CronetDataSource. @@ -206,9 +198,39 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +com.google.android.exoplayer2.MediaItem.ClippingProperties + + + + + +com.google.android.exoplayer2.MediaItem.PlaybackProperties + + + + + +com.google.android.exoplayer2.MediaItem.Subtitle + + + + + +com.google.android.exoplayer2.SimpleExoPlayer + +
      Use ExoPlayer instead.
      + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder + +
      Use ExoPlayer.Builder instead.
      + + + com.google.android.exoplayer2.source.LoopingMediaSource -
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) +
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class. To add a MediaSource a specific number of times to the playlist, use ExoPlayer.addMediaSource(com.google.android.exoplayer2.source.MediaSource) in a loop with the same MediaSource. To combine repeated MediaSource instances into one MediaSource, for example @@ -217,28 +239,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); times.
      - -com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory - - - - -com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory +com.google.android.exoplayer2.upstream.DefaultDataSourceFactory - + -com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory +com.google.android.exoplayer2.upstream.PriorityDataSourceFactory - - - - -com.google.android.exoplayer2.upstream.FileDataSourceFactory - - + @@ -258,12 +268,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.Renderer.VideoScalingMode - - - - - com.google.android.exoplayer2.RendererCapabilities.FormatSupport
      Use C.FormatSupport instead.
      @@ -286,99 +290,75 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.analytics.AnalyticsListener.EVENT_STATIC_METADATA_CHANGED - - - - - com.google.android.exoplayer2.C.ASCII_NAME
      Use StandardCharsets or Charsets instead.
      - + com.google.android.exoplayer2.C.ISO88591_NAME
      Use StandardCharsets or Charsets instead.
      - -com.google.android.exoplayer2.C.MSG_CUSTOM_BASE - -
      Use Renderer.MSG_CUSTOM_BASE.
      - - -com.google.android.exoplayer2.C.MSG_SET_AUDIO_ATTRIBUTES - -
      Use Renderer.MSG_SET_AUDIO_ATTRIBUTES.
      - - - -com.google.android.exoplayer2.C.MSG_SET_AUX_EFFECT_INFO - -
      Use Renderer.MSG_SET_AUX_EFFECT_INFO.
      - - - -com.google.android.exoplayer2.C.MSG_SET_CAMERA_MOTION_LISTENER - -
      Use Renderer.MSG_SET_CAMERA_MOTION_LISTENER.
      - - - -com.google.android.exoplayer2.C.MSG_SET_SCALING_MODE - -
      Use Renderer.MSG_SET_SCALING_MODE.
      - - - -com.google.android.exoplayer2.C.MSG_SET_SURFACE - -
      Use Renderer.MSG_SET_VIDEO_OUTPUT.
      - - - -com.google.android.exoplayer2.C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER - -
      Use Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER.
      - - - -com.google.android.exoplayer2.C.MSG_SET_VOLUME - -
      Use Renderer.MSG_SET_VOLUME.
      - - - com.google.android.exoplayer2.C.UTF16_NAME
      Use StandardCharsets or Charsets instead.
      - + com.google.android.exoplayer2.C.UTF16LE_NAME
      Use StandardCharsets or Charsets instead.
      - + com.google.android.exoplayer2.C.UTF8_NAME
      Use StandardCharsets or Charsets instead.
      - + com.google.android.exoplayer2.drm.DrmSessionManager.DUMMY - -com.google.android.exoplayer2.ExoPlayerLibraryInfo.DEFAULT_USER_AGENT + +com.google.android.exoplayer2.MediaItem.clippingProperties -
      ExoPlayer now uses the user agent of the underlying network stack by default.
      + + + + +com.google.android.exoplayer2.MediaItem.DrmConfiguration.requestHeaders + + + + + +com.google.android.exoplayer2.MediaItem.DrmConfiguration.sessionForClearTypes + + + + + +com.google.android.exoplayer2.MediaItem.DrmConfiguration.uuid + + + + + +com.google.android.exoplayer2.MediaItem.LocalConfiguration.subtitles + + + + + +com.google.android.exoplayer2.MediaItem.playbackProperties + + @@ -406,96 +386,102 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.Player.EVENT_STATIC_METADATA_CHANGED +com.google.android.exoplayer2.Player.COMMAND_SEEK_IN_CURRENT_WINDOW -
      Use Player.EVENT_MEDIA_METADATA_CHANGED for structured metadata changes.
      + -com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_DEFAULT +com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_NEXT_WINDOW -
      Use C.VIDEO_SCALING_MODE_DEFAULT.
      + -com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_SCALE_TO_FIT +com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_PREVIOUS_WINDOW - + -com.google.android.exoplayer2.Renderer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING +com.google.android.exoplayer2.Player.COMMAND_SEEK_TO_WINDOW - + +com.google.android.exoplayer2.Player.PositionInfo.windowIndex + + + + + com.google.android.exoplayer2.RendererCapabilities.FORMAT_EXCEEDS_CAPABILITIES - + com.google.android.exoplayer2.RendererCapabilities.FORMAT_HANDLED
      Use C.FORMAT_HANDLED instead.
      - + com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_DRM - + com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_SUBTYPE - + com.google.android.exoplayer2.RendererCapabilities.FORMAT_UNSUPPORTED_TYPE - + com.google.android.exoplayer2.source.dash.DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS - + com.google.android.exoplayer2.Timeline.Window.isLive - + com.google.android.exoplayer2.Timeline.Window.tag - + com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters.DEFAULT
      This instance is not configured using Context constraints. Use DefaultTrackSelector.Parameters.getDefaults(Context) instead.
      - + com.google.android.exoplayer2.trackselection.TrackSelectionParameters.DEFAULT
      This instance is not configured using Context constraints. Use TrackSelectionParameters.getDefaults(Context) instead.
      - + com.google.android.exoplayer2.upstream.DataSourceException.POSITION_OUT_OF_RANGE - + com.google.android.exoplayer2.upstream.DataSpec.absoluteStreamPosition
      Use DataSpec.position except for specific use cases where the absolute position @@ -503,7 +489,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); position is required, use uriPositionOffset + position.
      - + com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS @@ -526,134 +512,198 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.analytics.AnalyticsCollector.onStaticMetadataChanged​(List<Metadata>) - - - com.google.android.exoplayer2.analytics.AnalyticsListener.onAudioDecoderInitialized​(AnalyticsListener.EventTime, String, long) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onAudioInputFormatChanged​(AnalyticsListener.EventTime, Format) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onDecoderDisabled​(AnalyticsListener.EventTime, int, DecoderCounters) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onDecoderEnabled​(AnalyticsListener.EventTime, int, DecoderCounters) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onDecoderInitialized​(AnalyticsListener.EventTime, int, String, long) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onDecoderInputFormatChanged​(AnalyticsListener.EventTime, int, Format) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onDrmSessionAcquired​(AnalyticsListener.EventTime) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onLoadingChanged​(AnalyticsListener.EventTime, boolean) - -com.google.android.exoplayer2.analytics.AnalyticsListener.onPlayerStateChanged​(AnalyticsListener.EventTime, boolean, int) + +com.google.android.exoplayer2.analytics.AnalyticsListener.onPlayerStateChanged​(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.State int) - + - -com.google.android.exoplayer2.analytics.AnalyticsListener.onPositionDiscontinuity​(AnalyticsListener.EventTime, int) + +com.google.android.exoplayer2.analytics.AnalyticsListener.onPositionDiscontinuity​(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int) -
      Use AnalyticsListener.onPositionDiscontinuity(EventTime, Player.PositionInfo, + - + com.google.android.exoplayer2.analytics.AnalyticsListener.onSeekProcessed​(AnalyticsListener.EventTime) -
      Seeks are processed without delay. Use AnalyticsListener.onPositionDiscontinuity(EventTime, + - + com.google.android.exoplayer2.analytics.AnalyticsListener.onSeekStarted​(AnalyticsListener.EventTime) -
      Use AnalyticsListener.onPositionDiscontinuity(EventTime, Player.PositionInfo, + - -com.google.android.exoplayer2.analytics.AnalyticsListener.onStaticMetadataChanged​(AnalyticsListener.EventTime, List<Metadata>) + +com.google.android.exoplayer2.analytics.AnalyticsListener.onTracksChanged​(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray) -
      Use Player.getMediaMetadata() and AnalyticsListener.onMediaMetadataChanged(EventTime, - MediaMetadata) for access to structured metadata, or access the raw static metadata - directly from the track selections' formats.
      + - + com.google.android.exoplayer2.analytics.AnalyticsListener.onVideoDecoderInitialized​(AnalyticsListener.EventTime, String, long) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onVideoInputFormatChanged​(AnalyticsListener.EventTime, Format) - + com.google.android.exoplayer2.analytics.AnalyticsListener.onVideoSizeChanged​(AnalyticsListener.EventTime, int, int, int, float) - + com.google.android.exoplayer2.audio.AudioRendererEventListener.onAudioInputFormatChanged​(Format) + +com.google.android.exoplayer2.BasePlayer.getCurrentWindowIndex() + + + +com.google.android.exoplayer2.BasePlayer.getNextWindowIndex() + + + +com.google.android.exoplayer2.BasePlayer.getPreviousWindowIndex() + + com.google.android.exoplayer2.BasePlayer.hasNext() -com.google.android.exoplayer2.BasePlayer.hasPrevious() +com.google.android.exoplayer2.BasePlayer.hasNextWindow() -com.google.android.exoplayer2.BasePlayer.next() +com.google.android.exoplayer2.BasePlayer.hasPrevious() +com.google.android.exoplayer2.BasePlayer.hasPreviousWindow() + + + +com.google.android.exoplayer2.BasePlayer.isCurrentWindowDynamic() + + + +com.google.android.exoplayer2.BasePlayer.isCurrentWindowLive() + + + +com.google.android.exoplayer2.BasePlayer.isCurrentWindowSeekable() + + + +com.google.android.exoplayer2.BasePlayer.next() + + + com.google.android.exoplayer2.BasePlayer.previous() + +com.google.android.exoplayer2.BasePlayer.seekToNextWindow() + + + +com.google.android.exoplayer2.BasePlayer.seekToPreviousWindow() + + + +com.google.android.exoplayer2.C.generateAudioSessionIdV21​(Context) + + + + + +com.google.android.exoplayer2.C.getErrorCodeForMediaDrmErrorCode​(int) + + + + + +com.google.android.exoplayer2.C.getFormatSupportString​(int) + + + + + +com.google.android.exoplayer2.C.msToUs​(long) + + + + + +com.google.android.exoplayer2.C.usToMs​(long) + + + + com.google.android.exoplayer2.DefaultLoadControl.Builder.createDefaultLoadControl() @@ -675,43 +725,143 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); com.google.android.exoplayer2.ExoPlaybackException.createForUnexpected​(RuntimeException) - + -com.google.android.exoplayer2.ExoPlayer.AudioComponent.addAudioListener​(AudioListener) +com.google.android.exoplayer2.ExoPlayer.addListener​(Player.EventListener) - + -com.google.android.exoplayer2.ExoPlayer.AudioComponent.removeAudioListener​(AudioListener) +com.google.android.exoplayer2.ExoPlayer.AudioComponent.clearAuxEffectInfo() - + -com.google.android.exoplayer2.ExoPlayer.DeviceComponent.addDeviceListener​(DeviceListener) +com.google.android.exoplayer2.ExoPlayer.AudioComponent.getAudioAttributes() - + -com.google.android.exoplayer2.ExoPlayer.DeviceComponent.removeDeviceListener​(DeviceListener) +com.google.android.exoplayer2.ExoPlayer.AudioComponent.getAudioSessionId() - + -com.google.android.exoplayer2.ExoPlayer.MetadataComponent.addMetadataOutput​(MetadataOutput) +com.google.android.exoplayer2.ExoPlayer.AudioComponent.getSkipSilenceEnabled() - + -com.google.android.exoplayer2.ExoPlayer.MetadataComponent.removeMetadataOutput​(MetadataOutput) +com.google.android.exoplayer2.ExoPlayer.AudioComponent.getVolume() - +
      Use Player.getVolume() instead.
      + + + +com.google.android.exoplayer2.ExoPlayer.AudioComponent.setAudioAttributes​(AudioAttributes, boolean) + + + + + +com.google.android.exoplayer2.ExoPlayer.AudioComponent.setAudioSessionId​(int) + + + + + +com.google.android.exoplayer2.ExoPlayer.AudioComponent.setAuxEffectInfo​(AuxEffectInfo) + + + + + +com.google.android.exoplayer2.ExoPlayer.AudioComponent.setSkipSilenceEnabled​(boolean) + + + + + +com.google.android.exoplayer2.ExoPlayer.AudioComponent.setVolume​(float) + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.decreaseDeviceVolume() + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.getDeviceInfo() + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.getDeviceVolume() + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.increaseDeviceVolume() + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.isDeviceMuted() + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.setDeviceMuted​(boolean) + + + + + +com.google.android.exoplayer2.ExoPlayer.DeviceComponent.setDeviceVolume​(int) + + + + + +com.google.android.exoplayer2.ExoPlayer.getAudioComponent() + +
      Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
      + + + +com.google.android.exoplayer2.ExoPlayer.getDeviceComponent() + +
      Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
      + + + +com.google.android.exoplayer2.ExoPlayer.getTextComponent() + +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      + + + +com.google.android.exoplayer2.ExoPlayer.getVideoComponent() + +
      Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
      @@ -721,45 +871,156 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +com.google.android.exoplayer2.ExoPlayer.removeListener​(Player.EventListener) + + + + + com.google.android.exoplayer2.ExoPlayer.retry()
      Use Player.prepare() instead.
      - -com.google.android.exoplayer2.ExoPlayer.TextComponent.addTextOutput​(TextOutput) + +com.google.android.exoplayer2.ExoPlayer.setHandleWakeLock​(boolean) - + + + + +com.google.android.exoplayer2.ExoPlayer.setThrowsWhenUsingWrongThread​(boolean) + +
      Disabling the enforcement can result in hard-to-detect bugs. Do not use this method + except to ease the transition while wrong thread access problems are fixed.
      -com.google.android.exoplayer2.ExoPlayer.TextComponent.removeTextOutput​(TextOutput) +com.google.android.exoplayer2.ExoPlayer.TextComponent.getCurrentCues() - + -com.google.android.exoplayer2.ExoPlayer.VideoComponent.addVideoListener​(VideoListener) +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearCameraMotionListener​(CameraMotionListener) - + -com.google.android.exoplayer2.ExoPlayer.VideoComponent.removeVideoListener​(VideoListener) +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearVideoFrameMetadataListener​(VideoFrameMetadataListener) - + -com.google.android.exoplayer2.ext.cast.CastPlayer.getCurrentStaticMetadata() +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearVideoSurface() + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearVideoSurfaceHolder​(SurfaceHolder) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearVideoSurfaceView​(SurfaceView) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.clearVideoTextureView​(TextureView) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.getVideoChangeFrameRateStrategy() + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.getVideoScalingMode() + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.getVideoSize() + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setCameraMotionListener​(CameraMotionListener) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoChangeFrameRateStrategy​(int) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoFrameMetadataListener​(VideoFrameMetadataListener) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoScalingMode​(int) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoSurface​(Surface) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoSurfaceHolder​(SurfaceHolder) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoSurfaceView​(SurfaceView) + + + + + +com.google.android.exoplayer2.ExoPlayer.VideoComponent.setVideoTextureView​(TextureView) + + + + + +com.google.android.exoplayer2.ext.cast.CastPlayer.addListener​(Player.EventListener) + + + + + +com.google.android.exoplayer2.ext.cast.CastPlayer.removeListener​(Player.EventListener) + + + + + +com.google.android.exoplayer2.ext.cast.CastPlayer.stop​(boolean) - -com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory.getDefaultRequestProperties() - - - - com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory.setFallbackFactory​(HttpDataSource.Factory) @@ -772,36 +1033,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter.setControlDispatcher​(ControlDispatcher) - -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      - - - -com.google.android.exoplayer2.ext.media2.SessionPlayerConnector.setControlDispatcher​(ControlDispatcher) - -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      - - - -com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.setControlDispatcher​(ControlDispatcher) - -
      Use a ForwardingPlayer and pass it to MediaSessionConnector.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      - - - -com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource.Factory.getDefaultRequestProperties() - - - - - com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource.setContentTypePredicate​(Predicate<String>) @@ -868,13 +1099,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.Format.createAudioSampleFormat​(String, String, String, int, int, int, int, List<byte[]>, DrmInitData, int, String) +com.google.android.exoplayer2.Format.createAudioSampleFormat​(String, String, String, int, int, int, int, List<byte[]>, DrmInitData, @com.google.android.exoplayer2.C.SelectionFlags int, String) -com.google.android.exoplayer2.Format.createContainerFormat​(String, String, String, String, String, int, int, int, String) +com.google.android.exoplayer2.Format.createContainerFormat​(String, String, String, String, String, int, @com.google.android.exoplayer2.C.SelectionFlags int, @com.google.android.exoplayer2.C.RoleFlags int, String) @@ -892,22 +1123,54 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.ForwardingPlayer.addListener​(Player.EventListener) +com.google.android.exoplayer2.ForwardingPlayer.addListener​(Player.Listener) -com.google.android.exoplayer2.ForwardingPlayer.getCurrentStaticMetadata() +com.google.android.exoplayer2.ForwardingPlayer.getApplicationLooper() +com.google.android.exoplayer2.ForwardingPlayer.getCurrentWindowIndex() + + + +com.google.android.exoplayer2.ForwardingPlayer.getNextWindowIndex() + + + +com.google.android.exoplayer2.ForwardingPlayer.getPreviousWindowIndex() + + + com.google.android.exoplayer2.ForwardingPlayer.hasNext() + +com.google.android.exoplayer2.ForwardingPlayer.hasNextWindow() + + com.google.android.exoplayer2.ForwardingPlayer.hasPrevious() +com.google.android.exoplayer2.ForwardingPlayer.hasPreviousWindow() + + + +com.google.android.exoplayer2.ForwardingPlayer.isCurrentWindowDynamic() + + + +com.google.android.exoplayer2.ForwardingPlayer.isCurrentWindowLive() + + + +com.google.android.exoplayer2.ForwardingPlayer.isCurrentWindowSeekable() + + + com.google.android.exoplayer2.ForwardingPlayer.next() @@ -916,79 +1179,199 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.ForwardingPlayer.removeListener​(Player.EventListener) +com.google.android.exoplayer2.ForwardingPlayer.seekToNextWindow() -com.google.android.exoplayer2.ForwardingPlayer.stop​(boolean) +com.google.android.exoplayer2.ForwardingPlayer.seekToPreviousWindow() +com.google.android.exoplayer2.ForwardingPlayer.stop​(boolean) + + + com.google.android.exoplayer2.mediacodec.MediaCodecInfo.isSeamlessAdaptationSupported​(Format, Format, boolean) - -com.google.android.exoplayer2.MediaMetadata.Builder.setArtworkData​(byte[]) + +com.google.android.exoplayer2.MediaItem.Builder.setAdTagUri​(String) - +
      Use MediaItem.Builder.setAdsConfiguration(AdsConfiguration), parse the adTagUri + with Uri.parse(String) and pass the result to Builder(Uri) instead.
      + + + +com.google.android.exoplayer2.MediaItem.Builder.setClipEndPositionMs​(long) + + +com.google.android.exoplayer2.MediaItem.Builder.setClipRelativeToDefaultPosition​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setClipRelativeToLiveWindow​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setClipStartPositionMs​(long) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setClipStartsAtKeyFrame​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmForceDefaultLicenseUri​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmKeySetId​(byte[]) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmLicenseRequestHeaders​(Map<String, String>) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmLicenseUri​(Uri) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmMultiSession​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmPlayClearContentWithoutKey​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmSessionForClearPeriods​(boolean) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmSessionForClearTypes​(List<Integer>) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setDrmUuid​(UUID) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setLiveMaxOffsetMs​(long) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setLiveMaxPlaybackSpeed​(float) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setLiveMinOffsetMs​(long) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setLiveMinPlaybackSpeed​(float) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setLiveTargetOffsetMs​(long) + + + + + +com.google.android.exoplayer2.MediaItem.Builder.setSubtitles​(List<MediaItem.Subtitle>) + +
      Use MediaItem.Builder.setSubtitleConfigurations(List) instead. Note that MediaItem.Builder.setSubtitleConfigurations(List) doesn't accept null, use an empty list to clear the + contents.
      + + + +com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder.buildClippingProperties() + + + + + +com.google.android.exoplayer2.MediaMetadata.Builder.setArtworkData​(byte[]) + + + + + com.google.android.exoplayer2.MediaMetadata.Builder.setYear​(Integer) - + com.google.android.exoplayer2.offline.DownloadHelper.forDash​(Context, Uri, DataSource.Factory, RenderersFactory) - + com.google.android.exoplayer2.offline.DownloadHelper.forHls​(Context, Uri, DataSource.Factory, RenderersFactory) - + com.google.android.exoplayer2.offline.DownloadHelper.forProgressive​(Context, Uri) - + com.google.android.exoplayer2.offline.DownloadHelper.forSmoothStreaming​(Uri, DataSource.Factory, RenderersFactory) - -com.google.android.exoplayer2.offline.DownloadService.onDownloadChanged​(Download) - -
      Some state change events may not be delivered to this method. Instead, use DownloadManager.addListener(DownloadManager.Listener) to register a listener directly to - the DownloadManager that you return through DownloadService.getDownloadManager().
      - - - -com.google.android.exoplayer2.offline.DownloadService.onDownloadRemoved​(Download) - -
      Some download removal events may not be delivered to this method. Instead, use - DownloadManager.addListener(DownloadManager.Listener) to register a listener - directly to the DownloadManager that you return through DownloadService.getDownloadManager().
      - - - -com.google.android.exoplayer2.Player.addListener​(Player.EventListener) - - - - com.google.android.exoplayer2.Player.EventListener.onLoadingChanged​(boolean) @@ -996,67 +1379,123 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.Player.EventListener.onPlayerStateChanged​(boolean, int) +com.google.android.exoplayer2.Player.EventListener.onPlayerStateChanged​(boolean, @com.google.android.exoplayer2.Player.State int) - + -com.google.android.exoplayer2.Player.EventListener.onPositionDiscontinuity​(int) +com.google.android.exoplayer2.Player.EventListener.onPositionDiscontinuity​(@com.google.android.exoplayer2.Player.DiscontinuityReason int) - + com.google.android.exoplayer2.Player.EventListener.onSeekProcessed() - + -com.google.android.exoplayer2.Player.EventListener.onStaticMetadataChanged​(List<Metadata>) +com.google.android.exoplayer2.Player.EventListener.onTracksChanged​(TrackGroupArray, TrackSelectionArray) -
      Use Player.getMediaMetadata() and Player.EventListener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or access the - raw static metadata directly from the track - selections' formats.
      + -com.google.android.exoplayer2.Player.getCurrentStaticMetadata() +com.google.android.exoplayer2.Player.getCurrentTrackGroups() -
      Use Player.getMediaMetadata() and Player.Listener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or - access the raw static metadata directly from the track - selections' formats.
      + + + + +com.google.android.exoplayer2.Player.getCurrentTrackSelections() + + + + + +com.google.android.exoplayer2.Player.getCurrentWindowIndex() + + + + + +com.google.android.exoplayer2.Player.getNextWindowIndex() + + + + + +com.google.android.exoplayer2.Player.getPreviousWindowIndex() + + com.google.android.exoplayer2.Player.hasNext() - + +com.google.android.exoplayer2.Player.hasNextWindow() + + + + + com.google.android.exoplayer2.Player.hasPrevious() - - - - -com.google.android.exoplayer2.Player.next() - - + -com.google.android.exoplayer2.Player.previous() +com.google.android.exoplayer2.Player.hasPreviousWindow() - + -com.google.android.exoplayer2.Player.removeListener​(Player.EventListener) +com.google.android.exoplayer2.Player.isCurrentWindowDynamic() - + + + + +com.google.android.exoplayer2.Player.isCurrentWindowLive() + + + + + +com.google.android.exoplayer2.Player.isCurrentWindowSeekable() + + + + + +com.google.android.exoplayer2.Player.next() + + + + + +com.google.android.exoplayer2.Player.previous() + + + + + +com.google.android.exoplayer2.Player.seekToNextWindow() + + + + + +com.google.android.exoplayer2.Player.seekToPreviousWindow() + + @@ -1074,32 +1513,155 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.SimpleExoPlayer.addAudioListener​(AudioListener) - - - -com.google.android.exoplayer2.SimpleExoPlayer.addDeviceListener​(DeviceListener) - - - com.google.android.exoplayer2.SimpleExoPlayer.addListener​(Player.EventListener) -com.google.android.exoplayer2.SimpleExoPlayer.addMetadataOutput​(MetadataOutput) - +com.google.android.exoplayer2.SimpleExoPlayer.Builder.build() + + + -com.google.android.exoplayer2.SimpleExoPlayer.addTextOutput​(TextOutput) - +com.google.android.exoplayer2.SimpleExoPlayer.Builder.experimentalSetForegroundModeTimeoutMs​(long) + + + -com.google.android.exoplayer2.SimpleExoPlayer.addVideoListener​(VideoListener) - +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setAnalyticsCollector​(AnalyticsCollector) + + + -com.google.android.exoplayer2.SimpleExoPlayer.getCurrentStaticMetadata() - +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setAudioAttributes​(AudioAttributes, boolean) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setBandwidthMeter​(BandwidthMeter) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setClock​(Clock) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setDetachSurfaceTimeoutMs​(long) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setHandleAudioBecomingNoisy​(boolean) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setLivePlaybackSpeedControl​(LivePlaybackSpeedControl) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setLoadControl​(LoadControl) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setLooper​(Looper) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setMediaSourceFactory​(MediaSourceFactory) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setPauseAtEndOfMediaItems​(boolean) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setPriorityTaskManager​(PriorityTaskManager) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setReleaseTimeoutMs​(long) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setSeekBackIncrementMs​(long) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setSeekForwardIncrementMs​(long) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setSeekParameters​(SeekParameters) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setSkipSilenceEnabled​(boolean) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setTrackSelector​(TrackSelector) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setUseLazyPreparation​(boolean) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setVideoChangeFrameRateStrategy​(int) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setVideoScalingMode​(int) + + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder.setWakeMode​(@com.google.android.exoplayer2.C.WakeMode int) + + + com.google.android.exoplayer2.SimpleExoPlayer.prepare​(MediaSource) @@ -1108,108 +1670,84 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.SimpleExoPlayer.removeAudioListener​(AudioListener) - - - -com.google.android.exoplayer2.SimpleExoPlayer.removeDeviceListener​(DeviceListener) - - - com.google.android.exoplayer2.SimpleExoPlayer.removeListener​(Player.EventListener) -com.google.android.exoplayer2.SimpleExoPlayer.removeMetadataOutput​(MetadataOutput) - - - -com.google.android.exoplayer2.SimpleExoPlayer.removeTextOutput​(TextOutput) - - - -com.google.android.exoplayer2.SimpleExoPlayer.removeVideoListener​(VideoListener) - - - com.google.android.exoplayer2.SimpleExoPlayer.retry() - -com.google.android.exoplayer2.SimpleExoPlayer.setHandleWakeLock​(boolean) - - - - -com.google.android.exoplayer2.SimpleExoPlayer.setThrowsWhenUsingWrongThread​(boolean) - -
      Disabling the enforcement can result in hard-to-detect bugs. Do not use this method - except to ease the transition while wrong thread access problems are fixed.
      - +com.google.android.exoplayer2.SimpleExoPlayer.setHandleWakeLock​(boolean) + -com.google.android.exoplayer2.SimpleExoPlayer.stop​(boolean) +com.google.android.exoplayer2.SimpleExoPlayer.setThrowsWhenUsingWrongThread​(boolean) +com.google.android.exoplayer2.SimpleExoPlayer.stop​(boolean) + + + com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.createMediaSource​(Uri) - + com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setLivePresentationDelayMs​(long, boolean) -
      Use MediaItem.Builder.setLiveTargetOffsetMs(long) to override the + - + com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setStreamKeys​(List<StreamKey>) - + com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setTag​(Object) - + com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setStreamKeys​(List<StreamKey>) - + com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.createMediaSource​(Uri) - + com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setStreamKeys​(List<StreamKey>) - + com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setTag​(Object) - + com.google.android.exoplayer2.source.MediaSourceFactory.createMediaSource​(Uri) - + com.google.android.exoplayer2.source.MediaSourceFactory.setDrmHttpDataSourceFactory​(HttpDataSource.Factory)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an @@ -1217,14 +1755,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); HttpDataSource.Factory.
      - + com.google.android.exoplayer2.source.MediaSourceFactory.setDrmSessionManager​(DrmSessionManager)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an implementation that always returns the same instance.
      - + com.google.android.exoplayer2.source.MediaSourceFactory.setDrmUserAgent​(String)
      Use MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider) and pass an @@ -1232,25 +1770,25 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); userAgent.
      - + com.google.android.exoplayer2.source.MediaSourceFactory.setStreamKeys​(List<StreamKey>) - + - + com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.createMediaSource​(Uri) - + com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setCustomCacheKey​(String) - + com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setExtractorsFactory​(ExtractorsFactory) - + com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setTag​(Object) - + com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmHttpDataSourceFactory​(HttpDataSource.Factory)
      RtspMediaSource does not support DRM.
      - + com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmSessionManager​(DrmSessionManager)
      RtspMediaSource does not support DRM.
      - + com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory.setDrmUserAgent​(String)
      RtspMediaSource does not support DRM.
      - -com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory.createMediaSource​(Uri, Format, long) - - - - com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.createMediaSource​(Uri) @@ -1307,67 +1839,82 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.testutil.StubExoPlayer.getCurrentStaticMetadata() +com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmHttpDataSourceFactory​(HttpDataSource.Factory) -com.google.android.exoplayer2.testutil.StubExoPlayer.prepare() - - - +com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmSessionManager​(DrmSessionManager) + + + +com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmUserAgent​(String) + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.getAudioComponent() + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.getDeviceComponent() + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.getTextComponent() + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.getVideoComponent() + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.prepare​(MediaSource) + com.google.android.exoplayer2.testutil.StubExoPlayer.retry() + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.setHandleWakeLock​(boolean) + + + +com.google.android.exoplayer2.testutil.StubExoPlayer.setThrowsWhenUsingWrongThread​(boolean) + + + +com.google.android.exoplayer2.testutil.StubPlayer.stop​(boolean) + + + +com.google.android.exoplayer2.Timeline.getPeriodPosition​(Timeline.Window, Timeline.Period, int, long) - + -com.google.android.exoplayer2.ui.PlayerControlView.setControlDispatcher​(ControlDispatcher) +com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverride​(int, TrackGroupArray) -
      Use a ForwardingPlayer and pass it to PlayerControlView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      + -com.google.android.exoplayer2.ui.PlayerNotificationManager.setControlDispatcher​(ControlDispatcher) +com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverrides​(int) -
      Use a ForwardingPlayer and pass it to PlayerNotificationManager.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)), or configure whether the - rewind and fast forward actions should be used with {PlayerNotificationManager.setUseRewindAction(boolean)} - and PlayerNotificationManager.setUseFastForwardAction(boolean).
      + -com.google.android.exoplayer2.ui.PlayerView.setControlDispatcher​(ControlDispatcher) +com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.setSelectionOverride​(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride) -
      Use a ForwardingPlayer and pass it to PlayerView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      + -com.google.android.exoplayer2.ui.StyledPlayerControlView.setControlDispatcher​(ControlDispatcher) +com.google.android.exoplayer2.ui.DownloadNotificationHelper.buildProgressNotification​(Context, int, PendingIntent, String, List<Download>) -
      Use a ForwardingPlayer and pass it to StyledPlayerControlView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      - - - -com.google.android.exoplayer2.ui.StyledPlayerView.setControlDispatcher​(ControlDispatcher) - -
      Use a ForwardingPlayer and pass it to StyledPlayerView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      - - - -com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory.getDefaultRequestProperties() - - + @@ -1378,30 +1925,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory.getDefaultRequestProperties() - - - - - -com.google.android.exoplayer2.upstream.HttpDataSource.Factory.getDefaultRequestProperties() - - - - - com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView.getVideoDecoderOutputBufferRenderer()
      This class implements VideoDecoderOutputBufferRenderer directly.
      -com.google.android.exoplayer2.video.VideoListener.onVideoSizeChanged​(int, int, int, float) - - - - - com.google.android.exoplayer2.video.VideoRendererEventListener.onVideoInputFormatChanged​(Format) @@ -1457,7 +1986,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException​(IOException, DataSpec, int) - + @@ -1473,6 +2002,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +com.google.android.exoplayer2.MediaItem.LiveConfiguration​(long, long, long, float, float) + + + + + +com.google.android.exoplayer2.MediaItem.Subtitle​(Uri, String, String) + + + + + com.google.android.exoplayer2.offline.DefaultDownloaderFactory​(CacheDataSource.Factory) @@ -1491,9 +2032,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +com.google.android.exoplayer2.Player.PositionInfo​(Object, int, Object, int, long, long, int, int) + + + + + com.google.android.exoplayer2.SimpleExoPlayer​(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper) - + + + + +com.google.android.exoplayer2.SimpleExoPlayer.Builder​(Context) + +
      Use Builder(Context) instead.
      @@ -1534,70 +2088,77 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +com.google.android.exoplayer2.trackselection.TrackSelectorResult​(RendererConfiguration[], ExoTrackSelection[], Object) + + + + + com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder​(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter) - + com.google.android.exoplayer2.upstream.AssetDataSource.AssetDataSourceException​(IOException) - + - + com.google.android.exoplayer2.upstream.cache.SimpleCache​(File, CacheEvictor)
      Use a constructor that takes a DatabaseProvider for improved performance.
      - + com.google.android.exoplayer2.upstream.ContentDataSource.ContentDataSourceException​(IOException) - + - + com.google.android.exoplayer2.upstream.DataSpec​(Uri, int) - + com.google.android.exoplayer2.upstream.DefaultBandwidthMeter() - + com.google.android.exoplayer2.upstream.DefaultHttpDataSource() - + com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException​(Exception) - + + + + +com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException​(DataSpec, int) + + -com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException​(DataSpec, int) - - - - - com.google.android.exoplayer2.upstream.HttpDataSource.InvalidResponseCodeException​(int, Map<String, List<String>>, DataSpec) - + com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException​(String) - + diff --git a/docs/doc/reference/element-list b/docs/doc/reference/element-list index 989e4aaf79..340a9725c4 100644 --- a/docs/doc/reference/element-list +++ b/docs/doc/reference/element-list @@ -3,14 +3,12 @@ com.google.android.exoplayer2.analytics com.google.android.exoplayer2.audio com.google.android.exoplayer2.database com.google.android.exoplayer2.decoder -com.google.android.exoplayer2.device com.google.android.exoplayer2.drm com.google.android.exoplayer2.ext.av1 com.google.android.exoplayer2.ext.cast com.google.android.exoplayer2.ext.cronet com.google.android.exoplayer2.ext.ffmpeg com.google.android.exoplayer2.ext.flac -com.google.android.exoplayer2.ext.gvr com.google.android.exoplayer2.ext.ima com.google.android.exoplayer2.ext.leanback com.google.android.exoplayer2.ext.media2 diff --git a/docs/doc/reference/index-all.html b/docs/doc/reference/index-all.html index 5d4ed97aaf..fc984d31f3 100644 --- a/docs/doc/reference/index-all.html +++ b/docs/doc/reference/index-all.html @@ -308,7 +308,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ACTION_NEXT - Static variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager
      -
      The action which skips to the next window.
      +
      The action which skips to the next media item.
      ACTION_PAUSE - Static variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager
      @@ -324,7 +324,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ACTION_PREVIOUS - Static variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager
      -
      The action which skips to the previous window.
      +
      The action which skips to the previous media item.
      ACTION_REMOVE_ALL_DOWNLOADS - Static variable in class com.google.android.exoplayer2.offline.DownloadService
      @@ -356,15 +356,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.AddMediaItems - Class in com.google.android.exoplayer2.testutil
      - +
      Action.ClearMediaItems - Class in com.google.android.exoplayer2.testutil
      - +
      Action.ClearVideoSurface - Class in com.google.android.exoplayer2.testutil
      - +
      Action.ExecuteRunnable - Class in com.google.android.exoplayer2.testutil
      @@ -372,7 +372,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.MoveMediaItem - Class in com.google.android.exoplayer2.testutil
      - +
      Action.PlayUntilPosition - Class in com.google.android.exoplayer2.testutil
      @@ -385,11 +385,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.RemoveMediaItem - Class in com.google.android.exoplayer2.testutil
      - +
      Action.RemoveMediaItems - Class in com.google.android.exoplayer2.testutil
      - +
      Action.Seek - Class in com.google.android.exoplayer2.testutil
      @@ -401,15 +401,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.SetAudioAttributes - Class in com.google.android.exoplayer2.testutil
      - +
      Action.SetMediaItems - Class in com.google.android.exoplayer2.testutil
      - +
      Action.SetMediaItemsResetPosition - Class in com.google.android.exoplayer2.testutil
      - +
      Action.SetPlaybackParameters - Class in com.google.android.exoplayer2.testutil
      @@ -426,7 +426,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.SetRepeatMode - Class in com.google.android.exoplayer2.testutil
      - +
      Action.SetShuffleModeEnabled - Class in com.google.android.exoplayer2.testutil
      @@ -438,7 +438,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.SetVideoSurface - Class in com.google.android.exoplayer2.testutil
      - +
      Action.Stop - Class in com.google.android.exoplayer2.testutil
      @@ -462,21 +462,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Action.WaitForPlaybackState - Class in com.google.android.exoplayer2.testutil
      -
      Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
      +
      Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
      Action.WaitForPlayWhenReady - Class in com.google.android.exoplayer2.testutil
      Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.Listener.onPlayWhenReadyChanged(boolean, int).
      + Player.Listener.onPlayWhenReadyChanged(boolean, int).
      Action.WaitForPositionDiscontinuity - Class in com.google.android.exoplayer2.testutil
      -
      Action.WaitForTimelineChanged - Class in com.google.android.exoplayer2.testutil
      - +
      ActionFileUpgradeUtil - Class in com.google.android.exoplayer2.offline
      @@ -544,7 +544,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Represents a set of interchangeable encoded versions of a media content component.
      -
      AdaptationSet(int, int, List<Representation>, List<Descriptor>, List<Descriptor>, List<Descriptor>) - Constructor for class com.google.android.exoplayer2.source.dash.manifest.AdaptationSet
      +
      AdaptationSet(int, @com.google.android.exoplayer2.C.TrackType int, List<Representation>, List<Descriptor>, List<Descriptor>, List<Descriptor>) - Constructor for class com.google.android.exoplayer2.source.dash.manifest.AdaptationSet
       
      adaptationSets - Variable in class com.google.android.exoplayer2.source.dash.manifest.Period
      @@ -576,7 +576,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A bandwidth based adaptive ExoTrackSelection, whose selected track is updated to be the one of highest quality given the current network conditions and the state of the buffer.
      -
      AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List<AdaptiveTrackSelection.AdaptationCheckpoint>, Clock) - Constructor for class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
      +
      AdaptiveTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, BandwidthMeter, long, long, long, int, int, float, float, List<AdaptiveTrackSelection.AdaptationCheckpoint>, Clock) - Constructor for class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
       
      AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter) - Constructor for class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
       
      @@ -588,7 +588,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Factory for AdaptiveTrackSelection instances.
      -
      add(int) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      +
      add(@com.google.android.exoplayer2.Player.Command int) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      @@ -596,10 +596,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a flag.
      -
      add(int) - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      -
      -
      Add a new item to the queue.
      -
      add(int) - Method in class com.google.android.exoplayer2.util.PriorityTaskManager
      Register a new task.
      @@ -634,7 +630,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a new server-side inserted ad group to an AdPlaybackState.
      -
      addAll(int...) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      +
      addAll(@com.google.android.exoplayer2.Player.Command int...) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      Adds commands.
      @@ -654,42 +650,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds all existing commands.
      -
      addAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      addAnalyticsListener(AnalyticsListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Adds an AnalyticsListener to receive analytics events.
      +
      addAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      addAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      addAudioLanguagesToSelection(String...) - Method in class com.google.android.exoplayer2.offline.DownloadHelper
      Convenience method to add selections of tracks for all specified audio languages.
      -
      addAudioListener(AudioListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      -
      Deprecated. - -
      -
      -
      addAudioListener(AudioListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      addAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Adds a listener to receive audio offload events.
      addAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      addAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      -
      addDeviceListener(DeviceListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      -
      Deprecated. - -
      -
      -
      addDeviceListener(DeviceListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated.
      -
      +  +
      addAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      addDownload(DownloadRequest) - Method in class com.google.android.exoplayer2.offline.DownloadManager
      Adds a download defined by the given request.
      @@ -730,7 +714,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds the flag to this buffer's flags.
      -
      addIf(int, boolean) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      +
      addIf(@com.google.android.exoplayer2.Player.Command int, boolean) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      Adds a Player.Command if the provided condition is true.
      @@ -758,18 +742,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
       
      -
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
      -
      Deprecated.
      -
      -
      addListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.Player
      +
      addListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
      + +
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated.
      @@ -779,14 +763,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      addListener(Player.Listener) - Method in interface com.google.android.exoplayer2.Player
      Registers a listener to receive all events from the player.
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      addListener(HlsPlaylistTracker.PlaylistEventListener) - Method in class com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker
       
      @@ -831,8 +819,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a list of media items at the given index of the playlist.
      addMediaItems(int, List<MediaItem>) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      addMediaItems(int, List<MediaItem>) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      addMediaItems(int, List<MediaItem>) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      addMediaItems(List<MediaItem>) - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -849,7 +839,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a media source at the given index of the playlist.
      addMediaSource(int, MediaSource) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      addMediaSource(int, MediaSource) - Method in class com.google.android.exoplayer2.source.ConcatenatingMediaSource
      Adds a MediaSource to the playlist.
      @@ -865,7 +857,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a media source to the end of the playlist.
      addMediaSource(MediaSource) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      addMediaSource(MediaSource) - Method in class com.google.android.exoplayer2.source.ConcatenatingMediaSource
      Appends a MediaSource to the playlist.
      @@ -889,7 +883,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a list of media sources at the given index of the playlist.
      addMediaSources(int, List<MediaSource>) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      addMediaSources(int, List<MediaSource>) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      addMediaSources(MediaSource...) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      @@ -910,30 +906,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a list of media sources to the end of the playlist.
      addMediaSources(List<MediaSource>) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      addMediaSources(List<MediaSource>) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      -
      addMetadataOutput(MetadataOutput) - Method in interface com.google.android.exoplayer2.ExoPlayer.MetadataComponent
      -
      -
      Deprecated. - -
      -
      -
      addMetadataOutput(MetadataOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated.
      -
      +  +
      addMediaSources(List<MediaSource>) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      addOrReplaceSpan(Spannable, Object, int, int, int) - Static method in class com.google.android.exoplayer2.text.span.SpanUtil
      Adds span to spannable between start and end, removing any existing spans of the same type and with the same indices and flags.
      +
      addOverride(TrackSelectionOverrides.TrackSelectionOverride) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      +
      Adds an override for the provided TrackGroup.
      +
      addPendingHandlerMessage(FakeClock.HandlerMessage) - Method in class com.google.android.exoplayer2.testutil.FakeClock
      Adds a message to the list of pending messages.
      addPlaylistItem(int, MediaItem) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
      -
      addSample(int, float) - Method in class com.google.android.exoplayer2.util.SlidingPercentile
      +
      addSample(int, float) - Method in class com.google.android.exoplayer2.upstream.SlidingPercentile
      Adds a new weighted value.
      @@ -941,16 +933,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Convenience method to add selections of tracks for all specified text languages.
      -
      addTextOutput(TextOutput) - Method in interface com.google.android.exoplayer2.ExoPlayer.TextComponent
      -
      -
      Deprecated. - -
      -
      -
      addTextOutput(TextOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      addTime(String, long) - Method in class com.google.android.exoplayer2.testutil.Dumper
       
      addTrackSelection(int, DefaultTrackSelector.Parameters) - Method in class com.google.android.exoplayer2.offline.DownloadHelper
      @@ -988,16 +970,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -
      addVideoListener(VideoListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      -
      Deprecated. - -
      -
      -
      addVideoListener(VideoListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener) - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
      @@ -1092,7 +1064,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The position offset in the first unplayed ad at which to begin playback, in microseconds.
      -
      adsConfiguration - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      adsConfiguration - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      Optional ads configuration.
      @@ -1216,6 +1188,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      AesFlushingCipher(int, byte[], long, long) - Constructor for class com.google.android.exoplayer2.upstream.crypto.AesFlushingCipher
       
      +
      AesFlushingCipher(int, byte[], String, long) - Constructor for class com.google.android.exoplayer2.upstream.crypto.AesFlushingCipher
      +
       
      after() - Method in class com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig
       
      after() - Method in class com.google.android.exoplayer2.testutil.HttpDataSourceTestEnv
      @@ -1513,6 +1487,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Use StandardCharsets or Charsets instead.
      +
      asList() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
      + +
      ASPECT_RATIO_IDC_VALUES - Static variable in class com.google.android.exoplayer2.util.NalUnitUtil
      Aspect ratios indexed by aspect_ratio_idc, in H.264 and H.265 SPSs.
      @@ -1607,12 +1585,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Assert that timeline is empty (i.e.
      -
      assertEqualNextWindowIndices(Timeline, Timeline, int, boolean) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      +
      assertEqualNextWindowIndices(Timeline, Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      Asserts that next window indices for each window of the actual timeline are equal to the indices of the expected timeline depending on the repeat mode and the shuffle mode.
      -
      assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      +
      assertEqualPreviousWindowIndices(Timeline, Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      Asserts that previous window indices for each window of the actual timeline are equal to the indices of the expected timeline depending on the repeat mode and the shuffle mode.
      @@ -1621,7 +1599,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      assertExtensionRendererCreated(Class<? extends Renderer>, int) - Static method in class com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts
      +
      assertExtensionRendererCreated(Class<? extends Renderer>, @com.google.android.exoplayer2.C.TrackType int) - Static method in class com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts
      Asserts that an extension renderer of type clazz is not instantiated for DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, and that it's instantiated in the correct position relative to other renderers of the same type for DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON and DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER, assuming no other extension renderers @@ -1643,30 +1621,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ASSERTIONS_ENABLED - Static variable in class com.google.android.exoplayer2.ExoPlayerLibraryInfo
      -
      Whether the library was compiled with Assertions - checks enabled.
      -
      -
      assertMediaItemsTransitionedSame(MediaItem...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      -
      Asserts that the media items reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided media - items.
      -
      -
      assertMediaItemsTransitionReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      -
      Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
      +
      Whether the library was compiled with Assertions checks enabled.
      assertMediaPeriodCreated(MediaSource.MediaPeriodId) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSource
      Assert that a media period for the given id has been created.
      -
      assertNextWindowIndices(Timeline, int, boolean, int...) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      +
      assertNextWindowIndices(Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean, int...) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      Asserts that next window indices for each window depending on the repeat mode and the shuffle mode are equal to the given sequence.
      assertNoPositionDiscontinuities() - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      assertNoTimelineChange() - Method in class com.google.android.exoplayer2.testutil.MediaSourceTestRunner
      @@ -1711,7 +1679,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      assertPlaybackStatesEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
      +
      Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
      assertPlayedPeriodIndices(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      @@ -1719,7 +1687,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      assertPositionDiscontinuityReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
      Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
      assertPrepareAndReleaseAllPeriods() - Method in class com.google.android.exoplayer2.testutil.MediaSourceTestRunner
      @@ -1727,7 +1695,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates and releases all periods (including ad periods) defined in the last timeline to be returned from MediaSourceTestRunner.prepareSource(), MediaSourceTestRunner.assertTimelineChange() or MediaSourceTestRunner.assertTimelineChangeBlocking().
      -
      assertPreviousWindowIndices(Timeline, int, boolean, int...) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      +
      assertPreviousWindowIndices(Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean, int...) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      Asserts that previous window indices for each window depending on the repeat mode and the shuffle mode are equal to the given sequence.
      @@ -1774,25 +1742,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      assertTimelineChangeReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
      Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
      assertTimelinesSame(Timeline...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) +
      Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines.
      +
      assertTimelinesSame(List<Timeline>, List<Timeline>) - Static method in class com.google.android.exoplayer2.testutil.TestUtil
      +
      +
      Asserts that the actual timelines are the same to the expected timelines.
      +
      assertTotalBufferCount(String, DecoderCounters, int, int) - Static method in class com.google.android.exoplayer2.testutil.DecoderCountersUtil
       
      assertTrackGroups(MediaPeriod, TrackGroupArray) - Static method in class com.google.android.exoplayer2.testutil.MediaPeriodAsserts
      Prepares the MediaPeriod and asserts that it provides the specified track groups.
      -
      assertTrackGroupsEqual(TrackGroupArray) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      -
      Asserts that the last track group array reported by Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided - track group array.
      -
      assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int) - Static method in class com.google.android.exoplayer2.testutil.DecoderCountersUtil
       
      assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window) - Static method in class com.google.android.exoplayer2.testutil.TimelineAsserts
      @@ -1807,6 +1774,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Asserts that window tags are set correctly.
      +
      AssetContentProvider - Class in com.google.android.exoplayer2.testutil
      +
      +
      A ContentProvider for reading asset data.
      +
      +
      AssetContentProvider() - Constructor for class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      AssetDataSource - Class in com.google.android.exoplayer2.upstream
      A DataSource for reading from a local asset.
      @@ -1820,10 +1793,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      AssetDataSourceException(IOException) - Constructor for exception com.google.android.exoplayer2.upstream.AssetDataSource.AssetDataSourceException
      -
      AssetDataSourceException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.AssetDataSource.AssetDataSourceException
      +
      AssetDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.AssetDataSource.AssetDataSourceException
      Creates a new instance.
      @@ -1844,10 +1817,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Attempts to merge this RangedUri with another and an optional common base uri.
      -
      Attribute(int, int) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Attribute
      -
      -
      Creates a new GL attribute.
      -
      +
      Attribute(String, int, int) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Attribute
      +
       
      AUDIO_AAC - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      AUDIO_AC3 - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      @@ -1870,7 +1841,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      AUDIO_DTS_HD - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      -
      AUDIO_DTS_UHD - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      +
      AUDIO_DTS_X - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      AUDIO_E_AC3 - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      @@ -1994,12 +1965,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The audio rendition group referenced by this variant, or null.
      -
      AudioListener - Interface in com.google.android.exoplayer2.audio
      -
      -
      Deprecated. - -
      -
      AudioProcessor - Interface in com.google.android.exoplayer2.audio
      Interface for audio processors, which take audio data as input and transform it, potentially @@ -2214,7 +2179,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      An abstract base class suitable for most Renderer implementations.
      -
      BaseRenderer(int) - Constructor for class com.google.android.exoplayer2.BaseRenderer
      +
      BaseRenderer(@com.google.android.exoplayer2.C.TrackType int) - Constructor for class com.google.android.exoplayer2.BaseRenderer
       
      BaseTrackSelection - Class in com.google.android.exoplayer2.trackselection
      @@ -2222,7 +2187,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      BaseTrackSelection(TrackGroup, int...) - Constructor for class com.google.android.exoplayer2.trackselection.BaseTrackSelection
       
      -
      BaseTrackSelection(TrackGroup, int[], int) - Constructor for class com.google.android.exoplayer2.trackselection.BaseTrackSelection
      +
      BaseTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int) - Constructor for class com.google.android.exoplayer2.trackselection.BaseTrackSelection
       
      baseUri - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist
      @@ -2573,7 +2538,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      build() - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Builds an ExoPlayer instance.
      build() - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader.Builder
      @@ -2586,10 +2550,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      build() - Method in class com.google.android.exoplayer2.Format.Builder
       
      +
      build() - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration.Builder
      +
       
      build() - Method in class com.google.android.exoplayer2.MediaItem.Builder
      Returns a new MediaItem instance with the current builder values.
      +
      build() - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Returns a MediaItem.ClippingConfiguration instance initialized with the values of this + builder.
      +
      +
      build() - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
       
      +
      build() - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Creates a MediaItem.LiveConfiguration with the values from this builder.
      +
      +
      build() - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Creates a MediaItem.SubtitleConfiguration from the values of this builder.
      +
      build() - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Returns a new MediaMetadata instance with the current builder values.
      @@ -2602,7 +2583,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      build() - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Builds a SimpleExoPlayer instance.
      +
      Deprecated. + +
      build() - Method in class com.google.android.exoplayer2.source.rtsp.RtpPacket.Builder
      @@ -2644,10 +2627,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Builds a DefaultTrackSelector.Parameters instance with the selected values.
      +
      build() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      +
      Returns a new TrackSelectionOverrides instance with the current builder values.
      +
      build() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      Builds a TrackSelectionParameters instance with the selected values.
      +
      build() - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Builds a TranscodingTransformer instance.
      +
      build() - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Builds a Transformer instance.
      @@ -2680,7 +2671,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Builds a simple AAC LC AudioSpecificConfig, as defined in ISO 14496-3 1.6.2.1
      -
      buildAdaptationSet(int, int, List<Representation>, List<Descriptor>, List<Descriptor>, List<Descriptor>) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
      +
      buildAdaptationSet(int, @com.google.android.exoplayer2.C.TrackType int, List<Representation>, List<Descriptor>, List<Descriptor>, List<Descriptor>) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      buildAddDownloadIntent(Context, Class<? extends DownloadService>, DownloadRequest, boolean) - Static method in class com.google.android.exoplayer2.offline.DownloadService
      @@ -2722,9 +2713,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns initialization data for formats with MIME type MimeTypes.APPLICATION_CEA708.
      +
      buildClippingProperties() - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      + +
      +
      buildCronetEngine(Context) - Static method in class com.google.android.exoplayer2.ext.cronet.CronetUtil
      +
      +
      Builds a CronetEngine suitable for use with CronetDataSource.
      +
      buildCronetEngine(Context, String, boolean) - Static method in class com.google.android.exoplayer2.ext.cronet.CronetUtil
      -
      Builds a CronetEngine suitable for use with ExoPlayer.
      +
      Builds a CronetEngine suitable for use with CronetDataSource.
      buildDataSpec(Representation, RangedUri, int) - Static method in class com.google.android.exoplayer2.source.dash.DashUtil
      @@ -2768,6 +2769,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a builder.
      +
      Builder() - Constructor for class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Constructs an instance.
      +
      +
      Builder() - Constructor for class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Constructs an instance.
      +
      Builder() - Constructor for class com.google.android.exoplayer2.MediaMetadata.Builder
       
      Builder() - Constructor for class com.google.android.exoplayer2.Player.Commands.Builder
      @@ -2792,12 +2801,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Builder() - Constructor for class com.google.android.exoplayer2.text.Cue.Builder
       
      +
      Builder() - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      + +
      Builder() - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      Deprecated.
      Context constraints will not be set using this constructor. Use Builder(Context) instead.
      +
      Builder() - Constructor for class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Creates a builder with default values.
      +
      Builder() - Constructor for class com.google.android.exoplayer2.transformer.Transformer.Builder
      Creates a builder with default values.
      @@ -2810,13 +2827,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a builder.
      +
      Builder(Context) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Creates a builder.
      +
      Builder(Context) - Constructor for class com.google.android.exoplayer2.ext.ima.ImaAdsLoader.Builder
      Creates a new builder for ImaAdsLoader.
      Builder(Context) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Creates a builder.
      +
      Deprecated. +
      Use Builder(Context) instead.
      +
      Builder(Context) - Constructor for class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      @@ -2840,38 +2863,73 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Builder(Context, ExtractorsFactory) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Creates a builder with a custom ExtractorsFactory.
      +
      -
      Builder(Context, Renderer...) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      -
      Deprecated.
      -
      Creates a builder with a list of Renderers.
      -
      -
      Builder(Context, RenderersFactory) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      Builder(Context, RenderersFactory) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      Creates a builder with a custom RenderersFactory.
      +
      Builder(Context, RenderersFactory) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      +
      Deprecated. + +
      +
      Builder(Context, RenderersFactory, ExtractorsFactory) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Creates a builder with a custom RenderersFactory and ExtractorsFactory.
      + +
      +
      Builder(Context, RenderersFactory, MediaSourceFactory) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Creates a builder with a custom RenderersFactory and MediaSourceFactory.
      +
      +
      Builder(Context, RenderersFactory, MediaSourceFactory, TrackSelector, LoadControl, BandwidthMeter, AnalyticsCollector) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Creates a builder with the specified custom components.
      Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Creates a builder with the specified custom components.
      +
      -
      Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      Builder(Context, MediaSourceFactory) - Constructor for class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      -
      Creates a builder with the specified custom components.
      +
      Creates a builder with a custom MediaSourceFactory.
      +
      +
      Builder(Uri) - Constructor for class com.google.android.exoplayer2.MediaItem.AdsConfiguration.Builder
      +
      +
      Constructs a new instance.
      +
      +
      Builder(Uri) - Constructor for class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Constructs an instance.
      +
      +
      Builder(Bundle) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      +
      Creates a builder with the initial values specified in bundle.
      Builder(TrackSelectionParameters) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      -
       
      +
      +
      Creates a builder with the initial values specified in initialValues.
      +
      Builder(String) - Constructor for class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
       
      Builder(String, Uri) - Constructor for class com.google.android.exoplayer2.offline.DownloadRequest.Builder
      Creates a new instance with the specified id and uri.
      +
      Builder(UUID) - Constructor for class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Constructs an instance.
      +
      buildEvent(String, String, long, long, byte[]) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      buildEventStream(String, String, long, long[], EventMessage[]) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
      @@ -2880,10 +2938,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      buildFormat(String, String, int, int, float, int, int, int, String, List<Descriptor>, List<Descriptor>, String, List<Descriptor>, List<Descriptor>) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      -
      buildHevcCodecStringFromSps(ParsableNalUnitBitArray) - Static method in class com.google.android.exoplayer2.util.CodecSpecificDataUtil
      +
      buildHevcCodecString(int, boolean, int, int, int[], int) - Static method in class com.google.android.exoplayer2.util.CodecSpecificDataUtil
      -
      Returns an RFC 6381 HEVC codec string based on the SPS NAL unit read from the provided bit - array.
      +
      Builds an RFC 6381 HEVC codec string using the provided parameters.
      buildInitializationData(byte[]) - Static method in class com.google.android.exoplayer2.audio.OpusUtil
      @@ -2911,6 +2968,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      buildProgressNotification(Context, int, PendingIntent, String, List<Download>) - Method in class com.google.android.exoplayer2.ui.DownloadNotificationHelper
      + +
      +
      buildProgressNotification(Context, int, PendingIntent, String, List<Download>, int) - Method in class com.google.android.exoplayer2.ui.DownloadNotificationHelper
      +
      Returns a progress notification for the given downloads.
      buildPsshAtom(UUID, byte[]) - Static method in class com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil
      @@ -2996,10 +3060,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a Format.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration
      +
      +
      Returns a MediaItem.AdsConfiguration.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem
      Returns a MediaItem.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      +
      +
      Returns a MediaItem.ClippingConfiguration.Builder initialized with the values of this instance.
      +
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      +
      +
      Returns a MediaItem.DrmConfiguration.Builder initialized with the values of this instance.
      +
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration
      +
      +
      Returns a MediaItem.LiveConfiguration.Builder initialized with the values of this instance.
      +
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      +
      +
      Returns a MediaItem.SubtitleConfiguration.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.MediaMetadata
      Returns a new MediaMetadata.Builder instance with the current MediaMetadata fields.
      @@ -3020,10 +3104,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a new DefaultTrackSelector.ParametersBuilder, copying the initial values from this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
      +
      Returns a TrackSelectionOverrides.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      Creates a new TrackSelectionParameters.Builder, copying the initial values from this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Returns a TranscodingTransformer.Builder initialized with the values of this instance.
      +
      buildUpon() - Method in class com.google.android.exoplayer2.transformer.Transformer
      Returns a Transformer.Builder initialized with the values of this instance.
      @@ -3036,6 +3128,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a new DefaultTrackSelector.ParametersBuilder initialized with the current selection parameters.
      +
      buildUri(String, boolean) - Static method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      buildUri(String, long, int, long) - Method in class com.google.android.exoplayer2.source.dash.manifest.UrlTemplate
      Constructs a Uri from the template, substituting in the provided arguments.
      @@ -3056,7 +3150,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Interface for the static CREATOR field of Bundleable classes.
      -
      BundleableUtils - Class in com.google.android.exoplayer2.util
      +
      BundleableUtil - Class in com.google.android.exoplayer2.util
      Utilities for Bundleable.
      @@ -3064,7 +3158,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ChunkExtractor implementation that uses ExoPlayer app-bundled Extractors.
      -
      BundledChunkExtractor(Extractor, int, Format) - Constructor for class com.google.android.exoplayer2.source.chunk.BundledChunkExtractor
      +
      BundledChunkExtractor(Extractor, @com.google.android.exoplayer2.C.TrackType int, Format) - Constructor for class com.google.android.exoplayer2.source.chunk.BundledChunkExtractor
      Creates an instance.
      @@ -3201,6 +3295,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Audio focus types.
      +
      C.AudioManagerOffloadMode - Annotation Type in com.google.android.exoplayer2
      +
      +
      Playback offload mode.
      +
      C.AudioUsage - Annotation Type in com.google.android.exoplayer2
      Usage types for audio attributes.
      @@ -3229,6 +3327,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Crypto modes for a codec.
      +
      C.CryptoType - Annotation Type in com.google.android.exoplayer2
      +
      +
      Types of crypto implementation.
      +
      C.DataType - Annotation Type in com.google.android.exoplayer2
      Represents a type of data.
      @@ -3261,6 +3363,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Track selection flags.
      +
      C.SelectionReason - Annotation Type in com.google.android.exoplayer2
      +
      +
      Represents a reason for selection.
      +
      C.StereoMode - Annotation Type in com.google.android.exoplayer2
      The stereo mode for 360/3D/VR videos.
      @@ -3269,6 +3375,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Stream types for an AudioTrack.
      +
      C.TrackType - Annotation Type in com.google.android.exoplayer2
      +
      +
      Represents a type of media track.
      +
      +
      C.VideoChangeFrameRateStrategy - Annotation Type in com.google.android.exoplayer2
      +
      + +
      C.VideoOutputMode - Annotation Type in com.google.android.exoplayer2
      Video decoder output modes.
      @@ -3313,7 +3427,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Defines a set of data requests.
      -
      CACHED_TO_END - Static variable in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      +
      CACHED_TO_END - Static variable in class com.google.android.exoplayer2.upstream.CachedRegionTracker
       
      CacheDataSink - Class in com.google.android.exoplayer2.upstream.cache
      @@ -3335,20 +3449,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      CacheDataSinkException(IOException) - Constructor for exception com.google.android.exoplayer2.upstream.cache.CacheDataSink.CacheDataSinkException
       
      -
      CacheDataSinkFactory - Class in com.google.android.exoplayer2.upstream.cache
      -
      -
      Deprecated. - -
      -
      -
      CacheDataSinkFactory(Cache, long) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory
      -
      -
      Deprecated.
      -
      CacheDataSinkFactory(Cache, long, int) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory
      -
      -
      Deprecated.
      CacheDataSource - Class in com.google.android.exoplayer2.upstream.cache
      A DataSource that reads and writes a Cache.
      @@ -3389,35 +3489,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Flags controlling the CacheDataSource's behavior.
      -
      CacheDataSourceFactory - Class in com.google.android.exoplayer2.upstream.cache
      -
      -
      Deprecated. - -
      -
      -
      CacheDataSourceFactory(Cache, DataSource.Factory) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
      -
      -
      Deprecated.
      -
      Constructs a factory which creates CacheDataSource instances with default DataSource and DataSink instances for reading and writing the cache.
      -
      -
      CacheDataSourceFactory(Cache, DataSource.Factory, int) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
      -
      -
      Deprecated.
      -
      CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
      -
      -
      Deprecated.
      -
      CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory) - Constructor for class com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
      -
      -
      Deprecated.
      -
      CachedRegionTracker - Class in com.google.android.exoplayer2.upstream.cache
      +
      CachedRegionTracker - Class in com.google.android.exoplayer2.upstream
      Utility class for efficiently tracking regions of data that are stored in a Cache for a given cache key.
      -
      CachedRegionTracker(Cache, String, ChunkIndex) - Constructor for class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      +
      CachedRegionTracker(Cache, String, ChunkIndex) - Constructor for class com.google.android.exoplayer2.upstream.CachedRegionTracker
       
      CacheEvictor - Interface in com.google.android.exoplayer2.upstream.cache
      @@ -3475,6 +3552,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      CameraMotionRenderer() - Constructor for class com.google.android.exoplayer2.video.spherical.CameraMotionRenderer
       
      +
      canAdvertiseSession() - Method in class com.google.android.exoplayer2.BasePlayer
      +
      +
      Returns whether the player can be used to advertise a media session.
      +
      +
      canAdvertiseSession() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      canAdvertiseSession() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether the player can be used to advertise a media session.
      +
      canBlockReload - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl
      Whether the server supports blocking playlist reload.
      @@ -3499,6 +3586,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Cancels anything that was previously scheduled, or else does nothing.
      +
      cancel() - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Cancels the transformation that is currently in progress, if any.
      +
      cancel() - Method in class com.google.android.exoplayer2.transformer.Transformer
      Cancels the transformation that is currently in progress, if any.
      @@ -3586,10 +3677,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The capabilities of the decoder, like the profiles/levels it supports, or null if not known.
      -
      capacity() - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      -
      -
      Returns the length of the backing array.
      -
      capacity() - Method in class com.google.android.exoplayer2.util.ParsableByteArray
      Returns the capacity of the array, which may be larger than the limit.
      @@ -3784,7 +3871,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      checkGlError() - Static method in class com.google.android.exoplayer2.util.GlUtil
      -
      If there is an OpenGl error, logs the error and if ExoPlayerLibraryInfo.GL_ASSERTIONS_ENABLED is true throws a RuntimeException.
      +
      If there is an OpenGl error, logs the error and if GlUtil.glAssertionsEnabled is true throws + a GlUtil.GlException.
      checkInBounds() - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator
      @@ -3886,7 +3974,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A SampleStream that loads media in Chunks, obtained from a ChunkSource.
      -
      ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback<ChunkSampleStream<T>>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher) - Constructor for class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
      +
      ChunkSampleStream(@com.google.android.exoplayer2.C.TrackType int, int[], Format[], T, SequenceableLoader.Callback<ChunkSampleStream<T>>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher) - Constructor for class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
      Constructs an instance.
      @@ -3908,7 +3996,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      clear() - Method in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
       
      -
      clear() - Method in class com.google.android.exoplayer2.decoder.SimpleOutputBuffer
      +
      clear() - Method in class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer
       
      clear() - Method in class com.google.android.exoplayer2.FormatHolder
      @@ -3930,10 +4018,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears all request properties.
      -
      clear() - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      -
      -
      Clears the queue.
      -
      clear() - Method in class com.google.android.exoplayer2.util.TimedValueQueue
      Removes all of the values.
      @@ -3962,9 +4046,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      clearAuxEffectInfo() - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      clearAuxEffectInfo() - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Detaches any previously attached auxiliary audio effect from the underlying audio track.
      clearAuxEffectInfo() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      clearAuxEffectInfo() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      clearBlocks - Variable in class com.google.android.exoplayer2.decoder.CryptoInfo
       
      @@ -3972,11 +4066,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The number of clear blocks in the encryption pattern, 0 if pattern encryption does not apply.
      -
      clearCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      clearCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Clears the listener which receives camera motion events if it matches the one passed.
      +
      clearCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      clearCameraMotionListener(CameraMotionListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      clearCameraMotionListener(CameraMotionListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      clearDecoderInfoCache() - Static method in class com.google.android.exoplayer2.mediacodec.MediaCodecUtil
      @@ -4012,6 +4116,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ClearMediaItems(String) - Constructor for class com.google.android.exoplayer2.testutil.Action.ClearMediaItems
       
      +
      clearOverride(TrackGroup) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      +
      Removes the override associated with the provided TrackGroup if present.
      +
      +
      clearOverridesOfType(@com.google.android.exoplayer2.C.TrackType int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      +
      Remove any override associated with TrackGroups of type trackType.
      +
      clearPrefixFlags(boolean[]) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      @@ -4028,15 +4140,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      clearSelectionOverride(int, TrackGroupArray) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      -
      Clears a track selection override for the specified renderer and TrackGroupArray.
      +
      clearSelectionOverrides() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      -
      Clears all track selection overrides for all renderers.
      +
      clearSelectionOverrides(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      -
      Clears all track selection overrides for the specified renderer.
      +
      CleartextNotPermittedException(IOException, DataSpec) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.CleartextNotPermittedException
       
      @@ -4046,11 +4164,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the selection of tracks for a period.
      -
      clearVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      clearVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Clears the listener which receives video frame metadata events if it matches the one passed.
      +
      clearVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      clearVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      clearVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      clearVideoSizeConstraints() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      @@ -4060,8 +4189,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      clearVideoSurface() - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Clears any Surface, SurfaceHolder, SurfaceView or TextureView - currently set on the player.
      +
      Deprecated. + +
      clearVideoSurface() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -4075,16 +4205,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); currently set on the player.
      clearVideoSurface() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      clearVideoSurface() - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a clear video surface action.
      -
      clearVideoSurface() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      clearVideoSurface() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      clearVideoSurface(Surface) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Clears the Surface onto which video is being rendered if it matches the one passed.
      +
      Deprecated. + +
      clearVideoSurface(Surface) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -4097,15 +4231,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the Surface onto which video is being rendered if it matches the one passed.
      clearVideoSurface(Surface) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      clearVideoSurface(Surface) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      clearVideoSurface(Surface) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      ClearVideoSurface(String) - Constructor for class com.google.android.exoplayer2.testutil.Action.ClearVideoSurface
       
      clearVideoSurfaceHolder(SurfaceHolder) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed.
      +
      clearVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -4119,13 +4256,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); rendered if it matches the one passed.
      clearVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      clearVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      clearVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      clearVideoSurfaceView(SurfaceView) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Clears the SurfaceView onto which video is being rendered if it matches the one - passed.
      +
      Deprecated. + +
      clearVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -4138,13 +4278,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the SurfaceView onto which video is being rendered if it matches the one passed.
      clearVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      clearVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      clearVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      clearVideoTextureView(TextureView) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Clears the TextureView onto which video is being rendered if it matches the one - passed.
      +
      Deprecated. + +
      clearVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -4157,8 +4300,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the TextureView onto which video is being rendered if it matches the one passed.
      clearVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      clearVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      clearVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      clearViewportSizeConstraints() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      @@ -4181,6 +4326,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The time from which output will begin, or C.TIME_UNSET if output will begin from the start of the chunk.
      +
      clippingConfiguration - Variable in class com.google.android.exoplayer2.MediaItem
      +
      +
      The clipping properties.
      +
      ClippingMediaPeriod - Class in com.google.android.exoplayer2.source
      Wraps a MediaPeriod and clips its SampleStreams to provide a subsequence of their @@ -4219,7 +4368,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      clippingProperties - Variable in class com.google.android.exoplayer2.MediaItem
      -
      The clipping properties.
      +
      Deprecated. + +
      Clock - Interface in com.google.android.exoplayer2.util
      @@ -4327,13 +4478,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Closes the condition.
      -
      close() - Method in class com.google.android.exoplayer2.util.ReusableBufferedOutputStream
      -
       
      closedCaptions - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist
      The closed caption renditions declared by the playlist.
      -
      closeQuietly(DataSource) - Static method in class com.google.android.exoplayer2.util.Util
      +
      closeQuietly(DataSource) - Static method in class com.google.android.exoplayer2.upstream.DataSourceUtil
      Closes a DataSource, suppressing any IOException that may occur.
      @@ -4355,6 +4504,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parameters for seeking to the closest sync point.
      +
      CODEC_E_AC3_JOC - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      +
      +
      A non-standard codec string for E-AC3-JOC.
      +
      CODEC_OPERATING_RATE_UNSET - Static variable in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      Indicates no codec operating rate should be set.
      @@ -4391,7 +4544,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Codecs of the format as described in RFC 6381, or null if unknown or not applicable.
      codecs - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      +
      +
      An RFC 6381 codecs string representing the video format, or null if not known.
      +
      codecs - Variable in class com.google.android.exoplayer2.video.DolbyVisionConfig
      The RFC 6381 codecs string.
      @@ -4444,19 +4599,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      For indexed-color pictures (e.g.
      -
      colorspace - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      colorspace - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      colorSpace - Variable in class com.google.android.exoplayer2.video.ColorInfo
      The color space of the video.
      -
      COLORSPACE_BT2020 - Static variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      COLORSPACE_BT2020 - Static variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      -
      COLORSPACE_BT601 - Static variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      COLORSPACE_BT601 - Static variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      -
      COLORSPACE_BT709 - Static variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      COLORSPACE_BT709 - Static variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      -
      COLORSPACE_UNKNOWN - Static variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      COLORSPACE_UNKNOWN - Static variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      colorTransfer - Variable in class com.google.android.exoplayer2.video.ColorInfo
      @@ -4472,8 +4627,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      com.google.android.exoplayer2.decoder - package com.google.android.exoplayer2.decoder
       
      -
      com.google.android.exoplayer2.device - package com.google.android.exoplayer2.device
      -
       
      com.google.android.exoplayer2.drm - package com.google.android.exoplayer2.drm
       
      com.google.android.exoplayer2.ext.av1 - package com.google.android.exoplayer2.ext.av1
      @@ -4486,8 +4639,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      com.google.android.exoplayer2.ext.flac - package com.google.android.exoplayer2.ext.flac
       
      -
      com.google.android.exoplayer2.ext.gvr - package com.google.android.exoplayer2.ext.gvr
      -
       
      com.google.android.exoplayer2.ext.ima - package com.google.android.exoplayer2.ext.ima
       
      com.google.android.exoplayer2.ext.leanback - package com.google.android.exoplayer2.ext.leanback
      @@ -4640,7 +4791,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      COMMAND_GET_CURRENT_MEDIA_ITEM - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to get the MediaItem of the current window.
      +
      Command to get the currently playing MediaItem.
      COMMAND_GET_DEVICE_VOLUME - Static variable in interface com.google.android.exoplayer2.Player
      @@ -4658,6 +4809,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Command to get the information about the current timeline.
      +
      COMMAND_GET_TRACK_INFOS - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to get track infos.
      +
      COMMAND_GET_VOLUME - Static variable in interface com.google.android.exoplayer2.Player
      Command to get the player volume.
      @@ -4672,45 +4827,69 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Command to start, pause or resume playback.
      -
      COMMAND_PREPARE_STOP - Static variable in interface com.google.android.exoplayer2.Player
      +
      COMMAND_PREPARE - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to prepare the player, stop playback or release the player.
      +
      Command to prepare the player.
      COMMAND_SEEK_BACK - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek back by a fixed increment into the current window.
      +
      Command to seek back by a fixed increment into the current MediaItem.
      COMMAND_SEEK_FORWARD - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek forward by a fixed increment into the current window.
      +
      Command to seek forward by a fixed increment into the current MediaItem.
      +
      +
      COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to seek anywhere into the current MediaItem.
      COMMAND_SEEK_IN_CURRENT_WINDOW - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek anywhere into the current window.
      +
      Deprecated. + +
      COMMAND_SEEK_TO_DEFAULT_POSITION - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek to the default position of the current window.
      +
      Command to seek to the default position of the current MediaItem.
      +
      +
      COMMAND_SEEK_TO_MEDIA_ITEM - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to seek anywhere in any MediaItem.
      COMMAND_SEEK_TO_NEXT - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek to a later position in the current or next window.
      +
      Command to seek to a later position in the current or next MediaItem.
      +
      +
      COMMAND_SEEK_TO_NEXT_MEDIA_ITEM - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to seek to the default position of the next MediaItem.
      COMMAND_SEEK_TO_NEXT_WINDOW - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek to the default position of the next window.
      +
      Deprecated. + +
      COMMAND_SEEK_TO_PREVIOUS - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek to an earlier position in the current or previous window.
      +
      Command to seek to an earlier position in the current or previous MediaItem.
      +
      +
      COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to seek to the default position of the previous MediaItem.
      COMMAND_SEEK_TO_PREVIOUS_WINDOW - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek to the default position of the previous window.
      +
      Deprecated. + +
      COMMAND_SEEK_TO_WINDOW - Static variable in interface com.google.android.exoplayer2.Player
      -
      Command to seek anywhere in any window.
      +
      Deprecated. + +
      COMMAND_SET_DEVICE_VOLUME - Static variable in interface com.google.android.exoplayer2.Player
      @@ -4732,6 +4911,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Command to set the playback speed and pitch.
      +
      COMMAND_SET_TRACK_SELECTION_PARAMETERS - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to set the player's track selection parameters.
      +
      COMMAND_SET_VIDEO_SURFACE - Static variable in interface com.google.android.exoplayer2.Player
      Command to set and clear the surface on which to render the video.
      @@ -4740,6 +4923,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Command to set the player volume.
      +
      COMMAND_STOP - Static variable in interface com.google.android.exoplayer2.Player
      +
      +
      Command to stop playback or release the player.
      +
      commandBytes - Variable in class com.google.android.exoplayer2.metadata.scte35.PrivateCommand
      The private bytes as defined in SCTE35, Section 9.3.6.
      @@ -4801,14 +4988,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Compile an instance from the provided template string.
      -
      compileProgram(String[], String[]) - Static method in class com.google.android.exoplayer2.util.GlUtil
      -
      -
      Builds a GL shader program from vertex and fragment shader code.
      -
      -
      compileProgram(String, String) - Static method in class com.google.android.exoplayer2.util.GlUtil
      -
      -
      Builds a GL shader program from vertex and fragment shader code.
      -
      componentSpliceList - Variable in class com.google.android.exoplayer2.metadata.scte35.SpliceInsertCommand
      If SpliceInsertCommand.programSpliceFlag is false, a non-empty list containing the SpliceInsertCommand.ComponentSplices.
      @@ -4885,8 +5064,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a list of arrays containing ExtractorAsserts.SimulationConfig objects to exercise different extractor paths in which the input is not sniffed.
      -
      Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int) - Constructor for class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      -
       
      ConfigurationException(String, Format) - Constructor for exception com.google.android.exoplayer2.audio.AudioSink.ConfigurationException
      Creates a new configuration exception with the specified message and no cause.
      @@ -4903,10 +5080,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      configure(AudioProcessor.AudioFormat) - Method in class com.google.android.exoplayer2.audio.SonicAudioProcessor
       
      -
      configure(AudioProcessor.AudioFormat) - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      configure(Format, int, int[]) - Method in interface com.google.android.exoplayer2.audio.AudioSink
      Configures (or reconfigures) the sink.
      @@ -4924,8 +5097,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ConstantBitrateSeekMap(long, long, int, int) - Constructor for class com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap
      -
      Constructs a new instance from a stream.
      +
      Creates an instance with allowSeeksIfLengthUnknown set to false.
      +
      ConstantBitrateSeekMap(long, long, int, int, boolean) - Constructor for class com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap
      +
      +
      Creates an instance.
      +
      +
      constraintBytes - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      constraintsFlagsAndReservedZero2Bits - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      constrainValue(float, float, float) - Static method in class com.google.android.exoplayer2.util.Util
      @@ -5017,18 +5196,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The mime type of the container, or null if unknown or not applicable.
      -
      contains(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsListener.Events
      -
      -
      Returns whether the given event occurred.
      -
      -
      contains(int) - Method in class com.google.android.exoplayer2.Player.Commands
      +
      contains(@com.google.android.exoplayer2.Player.Command int) - Method in class com.google.android.exoplayer2.Player.Commands
      Returns whether the set of commands contains the specified Player.Command.
      -
      contains(int) - Method in class com.google.android.exoplayer2.Player.Events
      +
      contains(@com.google.android.exoplayer2.Player.Event int) - Method in class com.google.android.exoplayer2.Player.Events
      Returns whether the given Player.Event occurred.
      +
      contains(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsListener.Events
      +
      +
      Returns whether the given event occurred.
      +
      contains(int) - Method in class com.google.android.exoplayer2.util.FlagSet
      Returns whether the set contains the given flag.
      @@ -5044,14 +5223,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      contains(String) - Method in class com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata
       
      +
      containsAny(@com.google.android.exoplayer2.Player.Event int...) - Method in class com.google.android.exoplayer2.Player.Events
      +
      +
      Returns whether any of the given events occurred.
      +
      containsAny(int...) - Method in class com.google.android.exoplayer2.analytics.AnalyticsListener.Events
      Returns whether any of the given events occurred.
      -
      containsAny(int...) - Method in class com.google.android.exoplayer2.Player.Events
      -
      -
      Returns whether any of the given events occurred.
      -
      containsAny(int...) - Method in class com.google.android.exoplayer2.util.FlagSet
      Returns whether the set contains at least one of the given flags.
      @@ -5088,10 +5267,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ContentDataSourceException(IOException) - Constructor for exception com.google.android.exoplayer2.upstream.ContentDataSource.ContentDataSourceException
      -
      ContentDataSourceException(IOException, int) - Constructor for exception com.google.android.exoplayer2.upstream.ContentDataSource.ContentDataSourceException
      +
      ContentDataSourceException(IOException, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.ContentDataSource.ContentDataSourceException
      Creates a new instance.
      @@ -5172,12 +5351,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      controlCode - Variable in class com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable
       
      -
      ControlDispatcher - Interface in com.google.android.exoplayer2
      -
      -
      Deprecated. -
      Use a ForwardingPlayer or configure the player to customize operations.
      -
      -
      convert(MediaDescriptionCompat) - Method in interface com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter
      Returns a MediaItem for the given MediaDescriptionCompat or null if the @@ -5249,6 +5422,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      copyWithCryptoType(@com.google.android.exoplayer2.C.CryptoType int) - Method in class com.google.android.exoplayer2.Format
      +
      +
      Returns a copy of this format with the specified Format.cryptoType.
      +
      copyWithData(byte[]) - Method in class com.google.android.exoplayer2.drm.DrmInitData.SchemeData
      Returns a copy of this instance with the specified data.
      @@ -5263,10 +5440,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a playlist identical to this one except that an end tag is added.
      -
      copyWithExoMediaCryptoType(Class<? extends ExoMediaCrypto>) - Method in class com.google.android.exoplayer2.Format
      -
      -
      Returns a copy of this format with the specified Format.exoMediaCryptoType.
      -
      copyWithFormat(Format) - Method in class com.google.android.exoplayer2.extractor.mp4.Track
       
      copyWithFormat(Format) - Method in class com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Variant
      @@ -5404,6 +5577,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the list of FakeSampleStream.FakeSampleStreamItems that will be written the sample queue during playback.
      +
      createAdapter(MediaCodecAdapter.Configuration) - Method in class com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory
      +
       
      createAdapter(MediaCodecAdapter.Configuration) - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory
      Creates a MediaCodecAdapter instance.
      @@ -5423,13 +5598,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns an ad playback state with the specified number of ads in each of the specified ad groups, each ten seconds long.
      -
      createAudioSampleFormat(String, String, String, int, int, int, int, int, List<byte[]>, DrmInitData, int, String) - Static method in class com.google.android.exoplayer2.Format
      +
      createAudioSampleFormat(String, String, String, int, int, int, int, int, List<byte[]>, DrmInitData, @com.google.android.exoplayer2.C.SelectionFlags int, String) - Static method in class com.google.android.exoplayer2.Format
      Deprecated.
      -
      createAudioSampleFormat(String, String, String, int, int, int, int, List<byte[]>, DrmInitData, int, String) - Static method in class com.google.android.exoplayer2.Format
      +
      createAudioSampleFormat(String, String, String, int, int, int, int, List<byte[]>, DrmInitData, @com.google.android.exoplayer2.C.SelectionFlags int, String) - Static method in class com.google.android.exoplayer2.Format
      Deprecated. @@ -5469,12 +5644,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      createCompositeSequenceableLoader(SequenceableLoader...) - Method in class com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory
       
      -
      createContainerFormat(String, String, String, String, String, int, int, int, String) - Static method in class com.google.android.exoplayer2.Format
      +
      createContainerFormat(String, String, String, String, String, int, @com.google.android.exoplayer2.C.SelectionFlags int, @com.google.android.exoplayer2.C.RoleFlags int, String) - Static method in class com.google.android.exoplayer2.Format
      Deprecated.
      +
      createCryptoConfig(byte[]) - Method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      +
       
      +
      createCryptoConfig(byte[]) - Method in interface com.google.android.exoplayer2.drm.ExoMediaDrm
      +
      +
      Creates a CryptoConfig that can be passed to a compatible decoder to allow decryption + of protected content using the specified session.
      +
      +
      createCryptoConfig(byte[]) - Method in class com.google.android.exoplayer2.drm.FrameworkMediaDrm
      +
       
      +
      createCryptoConfig(byte[]) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      +
       
      createCurrentContentIntent(Player) - Method in class com.google.android.exoplayer2.ui.DefaultMediaDescriptionAdapter
       
      createCurrentContentIntent(Player) - Method in interface com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter
      @@ -5485,9 +5671,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the actions handled by this receiver.
      -
      createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener) - Method in interface com.google.android.exoplayer2.source.dash.DashChunkSource.Factory
      +
      createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, long, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener) - Method in interface com.google.android.exoplayer2.source.dash.DashChunkSource.Factory
       
      -
      createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener) - Method in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.Factory
      +
      createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, long, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener) - Method in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.Factory
       
      createDataSet(TrackGroup, long) - Method in class com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory
      @@ -5497,10 +5683,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      createDataSink() - Method in class com.google.android.exoplayer2.upstream.cache.CacheDataSink.Factory
       
      -
      createDataSink() - Method in class com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory
      -
      -
      Deprecated.
      createDataSink() - Method in interface com.google.android.exoplayer2.upstream.DataSink.Factory
      Creates a DataSink instance.
      @@ -5523,30 +5705,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory
       
      -
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory
      -
      -
      Deprecated.
      createDataSource() - Method in interface com.google.android.exoplayer2.upstream.DataSource.Factory
      Creates a DataSource instance.
      -
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.DefaultDataSource.Factory
       
      +
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      +
      Deprecated.
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory
       
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.FileDataSource.Factory
       
      -
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.FileDataSourceFactory
      -
      -
      Deprecated.
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory
       
      createDataSource() - Method in interface com.google.android.exoplayer2.upstream.HttpDataSource.Factory
       
      -
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.PriorityDataSourceFactory
      +
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.PriorityDataSource.Factory
       
      +
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.PriorityDataSourceFactory
      +
      +
      Deprecated.
      createDataSource() - Method in class com.google.android.exoplayer2.upstream.ResolvingDataSource.Factory
       
      createDataSource(int) - Method in class com.google.android.exoplayer2.source.hls.DefaultHlsDataSourceFactory
      @@ -5571,10 +5753,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Deprecated.
       
      -
      createDataSourceInternal(HttpDataSource.RequestProperties) - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      createDataSourceInternal(HttpDataSource.RequestProperties) - Method in class com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory
      @@ -5587,21 +5765,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a SubtitleDecoder for the given Format.
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
      Creates a decoder for the given format.
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer
       
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioRenderer
       
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer
       
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer
       
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer
       
      -
      createDecoder(Format, ExoMediaCrypto) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      createDecoder(Format, CryptoConfig) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      Creates a decoder for the given format.
      @@ -5631,6 +5809,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a DrmSessionEventListener.EventDispatcher which dispatches all events to the registered listeners with the specified MediaSource.MediaPeriodId
      +
      createEglContext(EGLDisplay) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Returns a new EGLContext for the specified EGLDisplay.
      +
      +
      createEglDisplay() - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Returns an initialized default EGLDisplay.
      +
      createEventDispatcher(int, MediaSource.MediaPeriodId, long) - Method in class com.google.android.exoplayer2.source.BaseMediaSource
      Returns a MediaSourceEventListener.EventDispatcher which dispatches all events to the @@ -5686,6 +5872,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a new ad load exception of AdsMediaSource.AdLoadException.TYPE_ALL_ADS.
      +
      createForAudioDecoding(MediaCodecInfo, MediaFormat, Format, MediaCrypto) - Static method in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      +
      +
      Creates a configuration for audio decoding.
      +
      +
      createForAudioEncoding(MediaCodecInfo, MediaFormat, Format) - Static method in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      +
      +
      Creates a configuration for audio encoding.
      +
      createForIOException(IOException, DataSpec, int) - Static method in exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      Returns a HttpDataSourceException whose error code is assigned according to the cause @@ -5715,7 +5909,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an instance of type ExoPlaybackException.TYPE_REMOTE.
      -
      createForRenderer(Throwable, String, int, Format, int, boolean, int) - Static method in exception com.google.android.exoplayer2.ExoPlaybackException
      +
      createForRenderer(Throwable, String, int, Format, int, boolean, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Static method in exception com.google.android.exoplayer2.ExoPlaybackException
      Creates an instance of type ExoPlaybackException.TYPE_RENDERER.
      @@ -5726,14 +5920,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      createForUnexpected(RuntimeException) - Static method in exception com.google.android.exoplayer2.ExoPlaybackException
      createForUnexpected(RuntimeException) - Static method in exception com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException
      Returns a new ad load exception of AdsMediaSource.AdLoadException.TYPE_UNEXPECTED.
      -
      createForUnexpected(RuntimeException, int) - Static method in exception com.google.android.exoplayer2.ExoPlaybackException
      +
      createForUnexpected(RuntimeException, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Static method in exception com.google.android.exoplayer2.ExoPlaybackException
      Creates an instance of type ExoPlaybackException.TYPE_UNEXPECTED.
      @@ -5742,6 +5936,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a new instance for which ParserException.contentIsMalformed is false and ParserException.dataType is C.DATA_TYPE_MEDIA.
      +
      createForVideoDecoding(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto) - Static method in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      +
      +
      Creates a configuration for video decoding.
      +
      +
      createForVideoEncoding(MediaCodecInfo, MediaFormat, Format) - Static method in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      +
      +
      Creates a configuration for video encoding.
      +
      createFromCaptionStyle(CaptioningManager.CaptionStyle) - Static method in class com.google.android.exoplayer2.ui.CaptionStyleCompat
      Creates a CaptionStyleCompat equivalent to a provided CaptioningManager.CaptionStyle.
      @@ -5797,16 +5999,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      createInputBuffer() - Method in class com.google.android.exoplayer2.text.SimpleSubtitleDecoder
       
      -
      createMediaCrypto(byte[]) - Method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      -
       
      -
      createMediaCrypto(byte[]) - Method in interface com.google.android.exoplayer2.drm.ExoMediaDrm
      +
      createInputSurface - Variable in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      -
      Creates an ExoMediaCrypto for a given session.
      +
      Whether to request a Surface and use it as to the input to an encoder.
      -
      createMediaCrypto(byte[]) - Method in class com.google.android.exoplayer2.drm.FrameworkMediaDrm
      -
       
      -
      createMediaCrypto(byte[]) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      -
       
      createMediaFormatFromFormat(Format) - Static method in class com.google.android.exoplayer2.util.MediaFormatUtil
      Returns a MediaFormat representing the given ExoPlayer Format.
      @@ -5859,12 +6055,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      createMediaSource(Uri, Format, long) - Method in class com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory
      -
      - -
      createMediaSource(MediaItem) - Method in class com.google.android.exoplayer2.source.dash.DashMediaSource.Factory
      Returns a new DashMediaSource using the current parameters.
      @@ -5891,7 +6081,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a new SsMediaSource using the current parameters.
      -
      createMediaSource(MediaItem.Subtitle, long) - Method in class com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory
      +
      createMediaSource(MediaItem) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
       
      +
      createMediaSource(MediaItem.SubtitleConfiguration, long) - Method in class com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory
      Returns a new SingleSampleMediaSource using the current parameters.
      @@ -5929,7 +6121,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a message that can be sent to a PlayerMessage.Target.
      createMessage(PlayerMessage.Target) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      createMessage(PlayerMessage.Target) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      createMetadataInputBuffer(byte[]) - Static method in class com.google.android.exoplayer2.testutil.TestUtil
      @@ -6046,16 +6240,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a new ProgressiveMediaExtractor instance.
      -
      createProgressiveMediaExtractor(int, Format, boolean, List<Format>, TrackOutput) - Method in interface com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory
      +
      createProgressiveMediaExtractor(@com.google.android.exoplayer2.C.TrackType int, Format, boolean, List<Format>, TrackOutput) - Method in interface com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory
      Returns a new ChunkExtractor instance.
      -
      createRendererException(Throwable, Format, boolean, int) - Method in class com.google.android.exoplayer2.BaseRenderer
      +
      createRendererException(Throwable, Format, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Method in class com.google.android.exoplayer2.BaseRenderer
      Creates an ExoPlaybackException of type ExoPlaybackException.TYPE_RENDERER for this renderer.
      -
      createRendererException(Throwable, Format, int) - Method in class com.google.android.exoplayer2.BaseRenderer
      +
      createRendererException(Throwable, Format, boolean, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Method in class com.google.android.exoplayer2.BaseRenderer
      Creates an ExoPlaybackException of type ExoPlaybackException.TYPE_RENDERER for this renderer.
      @@ -6064,7 +6258,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput) - Method in interface com.google.android.exoplayer2.RenderersFactory
      -
      Builds the Renderer instances for a SimpleExoPlayer.
      +
      Builds the Renderer instances for an ExoPlayer.
      createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput) - Method in class com.google.android.exoplayer2.testutil.CapturingRenderersFactory
       
      @@ -6208,13 +6402,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a sample queue without DRM resource management.
      +
      createWithWindowId(Object) - Static method in class com.google.android.exoplayer2.testutil.FakeMediaSource
      +
      +
      Convenience method to create a FakeMediaSource with the given window id.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.audio.AudioAttributes
      Object that can restore AudioAttributes from a Bundle.
      -
      CREATOR - Static variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.DeviceInfo
      -
      Object that can restore DeviceInfo from a Bundle.
      +
      Object that can restore DeviceInfo from a Bundle.
      CREATOR - Static variable in class com.google.android.exoplayer2.drm.DrmInitData
       
      @@ -6225,14 +6423,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Object that can restore ExoPlaybackException from a Bundle.
      CREATOR - Static variable in class com.google.android.exoplayer2.Format
      -
       
      +
      +
      Object that can restore Format from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.HeartRating
      Object that can restore a HeartRating from a Bundle.
      -
      CREATOR - Static variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      -
      Object that can restore MediaItem.ClippingProperties from a Bundle.
      +
      Object that can restore MediaItem.ClippingConfiguration from a Bundle.
      CREATOR - Static variable in class com.google.android.exoplayer2.MediaItem
      @@ -6345,13 +6545,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      CREATOR - Static variable in class com.google.android.exoplayer2.source.hls.HlsTrackMetadataEntry.VariantInfo
       
      CREATOR - Static variable in class com.google.android.exoplayer2.source.TrackGroup
      -
       
      +
      +
      Object that can restore TrackGroup from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.source.TrackGroupArray
      -
       
      +
      +
      Object that can restores a TrackGroupArray from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.StarRating
      Object that can restore a StarRating from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
      +
       
      CREATOR - Static variable in class com.google.android.exoplayer2.text.Cue
       
      CREATOR - Static variable in class com.google.android.exoplayer2.ThumbRating
      @@ -6371,11 +6577,33 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Object that can restore Timeline.Period from a Bundle.
      CREATOR - Static variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      -
       
      +
      +
      Object that can restore Parameters from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      -
       
      +
      +
      Object that can restore SelectionOverride from a Bundle.
      +
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
      +
      Object that can restore TrackSelectionOverrides from a Bundle.
      +
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
      +
      Object that can restore TrackSelectionOverride from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      -
       
      +
      +
      Object that can restore TrackSelectionParameters from a Bundle.
      +
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.TracksInfo
      +
      +
      Object that can restore a TracksInfo from a Bundle.
      +
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Object that can restores a TracksInfo from a Bundle.
      +
      CREATOR - Static variable in class com.google.android.exoplayer2.video.ColorInfo
       
      CREATOR - Static variable in class com.google.android.exoplayer2.video.VideoSize
      @@ -6496,8 +6724,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Deprecated.
      Use CronetEngine directly. See the Android developer guide to learn how to instantiate a CronetEngine for use by your application. You - can also use CronetUtil.buildCronetEngine(android.content.Context, java.lang.String, boolean) to build a CronetEngine suitable - for use by ExoPlayer.
      + can also use CronetUtil.buildCronetEngine(android.content.Context) to build a CronetEngine suitable + for use with CronetDataSource.
      CronetEngineWrapper(Context) - Constructor for class com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper
      @@ -6529,6 +6757,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      CRYPTO_MODE_UNENCRYPTED - Static variable in class com.google.android.exoplayer2.C
       
      +
      CRYPTO_TYPE_CUSTOM_BASE - Static variable in class com.google.android.exoplayer2.C
      +
      +
      Applications or extensions may define custom CRYPTO_TYPE_* constants greater than or + equal to this value.
      +
      +
      CRYPTO_TYPE_FRAMEWORK - Static variable in class com.google.android.exoplayer2.C
      +
      +
      Framework crypto in which a MediaCodec is configured with a MediaCrypto.
      +
      +
      CRYPTO_TYPE_NONE - Static variable in class com.google.android.exoplayer2.C
      +
      +
      No crypto.
      +
      +
      CRYPTO_TYPE_UNSUPPORTED - Static variable in class com.google.android.exoplayer2.C
      +
      +
      An unsupported crypto type.
      +
      +
      CryptoConfig - Interface in com.google.android.exoplayer2.decoder
      +
      +
      Configuration for a decoder to allow it to decode encrypted media data.
      +
      cryptoData - Variable in class com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox
      A TrackOutput.CryptoData instance containing the encryption information from this @@ -6536,13 +6785,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      CryptoData(int, byte[], int, int) - Constructor for class com.google.android.exoplayer2.extractor.TrackOutput.CryptoData
       
      +
      CryptoException - Exception in com.google.android.exoplayer2.decoder
      +
      +
      Thrown when a non-platform component fails to decrypt data.
      +
      +
      CryptoException(int, String) - Constructor for exception com.google.android.exoplayer2.decoder.CryptoException
      +
       
      cryptoInfo - Variable in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
      CryptoInfo for encrypted data.
      CryptoInfo - Class in com.google.android.exoplayer2.decoder
      -
      Compatibility wrapper for MediaCodec.CryptoInfo.
      +
      Metadata describing the structure of an encrypted input sample.
      CryptoInfo() - Constructor for class com.google.android.exoplayer2.decoder.CryptoInfo
       
      @@ -6550,6 +6805,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The encryption mode used for the sample.
      +
      cryptoType - Variable in class com.google.android.exoplayer2.Format
      +
      +
      The type of crypto that must be used to decode samples associated with this format, or C.CRYPTO_TYPE_NONE if the content is not encrypted.
      +
      csrc - Variable in class com.google.android.exoplayer2.source.rtsp.RtpPacket
      The RTP CSRC fields (Optional, up to 15 items).
      @@ -6572,19 +6831,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float) - Constructor for class com.google.android.exoplayer2.text.Cue
      +
      Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float) - Constructor for class com.google.android.exoplayer2.text.Cue
      Deprecated.
      -
      Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int) - Constructor for class com.google.android.exoplayer2.text.Cue
      +
      Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.TextSizeType int, float) - Constructor for class com.google.android.exoplayer2.text.Cue
      Deprecated.
      -
      Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float) - Constructor for class com.google.android.exoplayer2.text.Cue
      +
      Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, boolean, int) - Constructor for class com.google.android.exoplayer2.text.Cue
      Deprecated. @@ -6612,6 +6871,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of vertical layout for this cue, which may be unset (i.e.
      +
      CueDecoder - Class in com.google.android.exoplayer2.text
      +
      +
      Decodes data encoded by CueEncoder.
      +
      +
      CueDecoder() - Constructor for class com.google.android.exoplayer2.text.CueDecoder
      +
       
      +
      CueEncoder - Class in com.google.android.exoplayer2.text
      +
      +
      Encodes data that can be decoded by CueDecoder.
      +
      +
      CueEncoder() - Constructor for class com.google.android.exoplayer2.text.CueEncoder
      +
       
      CURRENT_POSITION_NOT_SET - Static variable in interface com.google.android.exoplayer2.audio.AudioSink
      Returned by AudioSink.getCurrentPositionUs(boolean) when the position is not set.
      @@ -6645,7 +6916,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      currentWindowIndex - Variable in class com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime
      The current window index in AnalyticsListener.EventTime.currentTimeline at the time of the event, or the - prospective window index if the timeline is not yet known and empty (equivalent to Player.getCurrentWindowIndex()).
      + prospective window index if the timeline is not yet known and empty (equivalent to Player.getCurrentMediaItemIndex()).
      CUSTOM_ERROR_CODE_BASE - Static variable in exception com.google.android.exoplayer2.PlaybackException
      @@ -6654,7 +6925,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      customActionReceiver - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
       
      -
      customCacheKey - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      customCacheKey - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      Optional custom cache key (only used for progressive streams).
      @@ -6750,8 +7021,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The buffer's data, or null if no data has been set.
      -
      data - Variable in class com.google.android.exoplayer2.decoder.SimpleOutputBuffer
      +
      data - Variable in class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer
       
      +
      data - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      +
      +
      RGB buffer for RGB mode.
      +
      data - Variable in class com.google.android.exoplayer2.drm.DrmInitData.SchemeData
      The initialization data.
      @@ -6772,16 +7047,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      data - Variable in class com.google.android.exoplayer2.testutil.FakeDataSet.FakeData.Segment
       
      +
      data - Variable in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
      +
       
      data - Variable in class com.google.android.exoplayer2.upstream.Allocation
      The array containing the allocated space.
      data - Variable in class com.google.android.exoplayer2.util.ParsableBitArray
       
      -
      data - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      -
      -
      RGB buffer for RGB mode.
      -
      DATA_FOURCC - Static variable in class com.google.android.exoplayer2.audio.WavUtil
      Four character code for "data".
      @@ -6823,9 +7096,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A data type constant for data of unknown or unspecified type.
      -
      DATABASE_NAME - Static variable in class com.google.android.exoplayer2.database.ExoDatabaseProvider
      +
      DATABASE_NAME - Static variable in class com.google.android.exoplayer2.database.StandaloneDatabaseProvider
      -
      The file name used for the standalone ExoPlayer database.
      +
      The file name used for the standalone database.
      DatabaseIOException - Exception in com.google.android.exoplayer2.database
      @@ -6837,7 +7110,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      DatabaseProvider - Interface in com.google.android.exoplayer2.database
      -
      Provides SQLiteDatabase instances to ExoPlayer components, which may read and write +
      Provides SQLiteDatabase instances to media library components, which may read and write tables prefixed with DatabaseProvider.TABLE_PREFIX.
      DataChunk - Class in com.google.android.exoplayer2.source.chunk
      @@ -6899,19 +7172,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Used to specify reason of a DataSource error.
      -
      DataSourceException(int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      +
      DataSourceException(@com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      Constructs a DataSourceException.
      -
      DataSourceException(String, int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      +
      DataSourceException(String, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      Constructs a DataSourceException.
      -
      DataSourceException(String, Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      +
      DataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      Constructs a DataSourceException.
      -
      DataSourceException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      +
      DataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.DataSourceException
      Constructs a DataSourceException.
      @@ -6924,6 +7197,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      DataSourceInputStream(DataSource, DataSpec) - Constructor for class com.google.android.exoplayer2.upstream.DataSourceInputStream
       
      +
      DataSourceUtil - Class in com.google.android.exoplayer2.upstream
      +
      +
      Utility methods for DataSource.
      +
      dataSpec - Variable in exception com.google.android.exoplayer2.drm.MediaDrmCallbackException
      The DataSpec associated with the request.
      @@ -7046,10 +7323,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      DebugTextViewHelper - Class in com.google.android.exoplayer2.util
      A helper class for periodically updating a TextView with debug information obtained from - a SimpleExoPlayer.
      + an ExoPlayer.
      -
      DebugTextViewHelper(SimpleExoPlayer, TextView) - Constructor for class com.google.android.exoplayer2.util.DebugTextViewHelper
      +
      DebugTextViewHelper(ExoPlayer, TextView) - Constructor for class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      +
      decode(byte[]) - Method in class com.google.android.exoplayer2.text.CueDecoder
      +
      +
      Decodes byte array into list of Cue objects.
      +
      decode(byte[], int) - Method in class com.google.android.exoplayer2.metadata.id3.Id3Decoder
      Decodes ID3 tags.
      @@ -7074,9 +7355,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      decode(byte[], int, boolean) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttDecoder
       
      -
      decode(DecoderInputBuffer, SimpleOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.flac.FlacDecoder
      +
      decode(DecoderInputBuffer, SimpleDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.flac.FlacDecoder
       
      -
      decode(DecoderInputBuffer, SimpleOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.opus.OpusDecoder
      +
      decode(DecoderInputBuffer, SimpleDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.opus.OpusDecoder
      +
       
      +
      decode(DecoderInputBuffer, VideoDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
      +
       
      +
      decode(DecoderInputBuffer, VideoDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
       
      decode(MetadataInputBuffer) - Method in interface com.google.android.exoplayer2.metadata.MetadataDecoder
      @@ -7107,10 +7392,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      decode(ParsableByteArray) - Method in class com.google.android.exoplayer2.metadata.emsg.EventMessageDecoder
       
      -
      decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
      -
       
      -
      decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      -
       
      decode(I, O, boolean) - Method in class com.google.android.exoplayer2.decoder.SimpleDecoder
      Decodes the inputBuffer and stores any decoded output in outputBuffer.
      @@ -7119,7 +7400,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A media decoder.
      -
      DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleOutputBuffer,​? extends DecoderException>> - Class in com.google.android.exoplayer2.audio
      +
      DecoderAudioRenderer<T extends Decoder<DecoderInputBuffer,​? extends SimpleDecoderOutputBuffer,​? extends DecoderException>> - Class in com.google.android.exoplayer2.audio
      Decodes and renders audio using a Decoder.
      @@ -7204,7 +7485,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The name of the decoder.
      -
      decoderPrivate - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      DecoderOutputBuffer - Class in com.google.android.exoplayer2.decoder
      +
      +
      Output buffer decoded by a Decoder.
      +
      +
      DecoderOutputBuffer() - Constructor for class com.google.android.exoplayer2.decoder.DecoderOutputBuffer
      +
       
      +
      DecoderOutputBuffer.Owner<S extends DecoderOutputBuffer> - Interface in com.google.android.exoplayer2.decoder
      +
      +
      Buffer owner.
      +
      +
      decoderPrivate - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Decoder private data.
      @@ -7242,7 +7533,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      decreaseDeviceVolume() - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Decreases the volume of the device.
      +
      Deprecated. + +
      decreaseDeviceVolume() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -7255,14 +7548,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Decreases the volume of the device.
      decreaseDeviceVolume() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      decreaseDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      -
      DecryptionException - Exception in com.google.android.exoplayer2.drm
      -
      Thrown when a non-platform component fails to decrypt data.
      -
      -
      DecryptionException(int, String) - Constructor for exception com.google.android.exoplayer2.drm.DecryptionException
      +
      Deprecated.
      +  +
      decreaseDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      deduplicateConsecutiveFormats - Variable in class com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig
      @@ -7411,7 +7700,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The default connection timeout, in milliseconds.
      -
      DEFAULT_DETACH_SURFACE_TIMEOUT_MS - Static variable in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      DEFAULT_DETACH_SURFACE_TIMEOUT_MS - Static variable in interface com.google.android.exoplayer2.ExoPlayer
      The default timeout for detaching a surface from the player, in milliseconds.
      @@ -7440,9 +7729,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Default fragmentSize recommended for caching use cases.
      -
      DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS - Static variable in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
      +
      DEFAULT_IMAGE_BUFFER_SIZE - Static variable in class com.google.android.exoplayer2.DefaultLoadControl
      -
      Country groups used to determine the default initial bitrate estimate.
      +
      A default size in bytes for an image buffer.
      DEFAULT_INITIAL_BITRATE_ESTIMATE - Static variable in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
      @@ -7497,6 +7786,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS - Static variable in class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
       
      +
      DEFAULT_MAX_HEIGHT_TO_DISCARD - Static variable in class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
      +
       
      DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED - Static variable in class com.google.android.exoplayer2.DefaultLivePlaybackSpeedControl
      The default maximum difference between the current live offset and the target live offset, in @@ -7517,6 +7808,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A default maximum position for which a seek to previous will seek to the previous window, in milliseconds.
      +
      DEFAULT_MAX_WIDTH_TO_DISCARD - Static variable in class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
      +
       
      DEFAULT_MEDIA_ID - Static variable in class com.google.android.exoplayer2.MediaItem
      The default media ID that is used if the media ID is not explicitly set by MediaItem.Builder.setMediaId(String).
      @@ -7788,12 +8081,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Default color for the unplayed portion of the time bar.
      -
      DEFAULT_USER_AGENT - Static variable in class com.google.android.exoplayer2.ExoPlayerLibraryInfo
      -
      -
      Deprecated. -
      ExoPlayer now uses the user agent of the underlying network stack by default.
      -
      -
      DEFAULT_VIDEO_BUFFER_SIZE - Static variable in class com.google.android.exoplayer2.DefaultLoadControl
      A default size in bytes for a video buffer.
      @@ -7810,6 +8097,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Default offset of a window in its first period in microseconds.
      +
      DEFAULT_WINDOW_UID - Static variable in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
      +
      The window UID used by media sources that are created by the factory.
      +
      DEFAULT_WITHOUT_CONTEXT - Static variable in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      An instance with default values, except those obtained from the Context.
      @@ -7911,27 +8202,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      DefaultContentMetadata(Map<String, byte[]>) - Constructor for class com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata
       
      -
      DefaultControlDispatcher - Class in com.google.android.exoplayer2
      -
      -
      Deprecated. -
      Use a ForwardingPlayer or configure the player to customize operations.
      -
      -
      -
      DefaultControlDispatcher() - Constructor for class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      Creates an instance.
      -
      -
      DefaultControlDispatcher(long, long) - Constructor for class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      Creates an instance with the given increments.
      -
      DefaultDashChunkSource - Class in com.google.android.exoplayer2.source.dash
      A default DashChunkSource implementation.
      -
      DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler) - Constructor for class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
      +
      DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, DataSource, long, int, boolean, List<Format>, PlayerEmsgHandler.PlayerTrackEmsgHandler) - Constructor for class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
       
      DefaultDashChunkSource.Factory - Class in com.google.android.exoplayer2.source.dash
       
      @@ -7970,28 +8245,39 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Constructs a new instance, optionally configured to follow cross-protocol redirects.
      +
      DefaultDataSource.Factory - Class in com.google.android.exoplayer2.upstream
      +
      + +
      DefaultDataSourceFactory - Class in com.google.android.exoplayer2.upstream
      -
      A DataSource.Factory that produces DefaultDataSource instances that delegate to DefaultHttpDataSources for non-file/asset/content URIs.
      +
      Deprecated. + +
      DefaultDataSourceFactory(Context) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      Deprecated.
      Creates an instance.
      DefaultDataSourceFactory(Context, DataSource.Factory) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      Deprecated.
      Creates an instance.
      DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      Deprecated.
      Creates an instance.
      DefaultDataSourceFactory(Context, String) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      Deprecated.
      Creates an instance.
      DefaultDataSourceFactory(Context, String, TransferListener) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
      +
      Deprecated.
      Creates an instance.
      DefaultDownloaderFactory - Class in com.google.android.exoplayer2.offline
      @@ -8165,35 +8451,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      DefaultHttpDataSourceFactory - Class in com.google.android.exoplayer2.upstream
      -
      -
      Deprecated. - -
      -
      -
      DefaultHttpDataSourceFactory() - Constructor for class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      -
      Creates an instance.
      -
      -
      DefaultHttpDataSourceFactory(String) - Constructor for class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      -
      Creates an instance.
      -
      -
      DefaultHttpDataSourceFactory(String, int, int, boolean) - Constructor for class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      -
      DefaultHttpDataSourceFactory(String, TransferListener) - Constructor for class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      -
      Creates an instance.
      -
      -
      DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean) - Constructor for class com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
      -
      -
      Deprecated.
      defaultInitializationVector - Variable in class com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox
      If TrackEncryptionBox.perSampleIvSize is 0, holds the default initialization vector as defined in the @@ -8234,6 +8491,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an instance with the given value for DefaultLoadErrorHandlingPolicy.getMinimumLoadableRetryCount(int).
      +
      DefaultMediaCodecAdapterFactory - Class in com.google.android.exoplayer2.mediacodec
      +
      + +
      +
      DefaultMediaCodecAdapterFactory() - Constructor for class com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory
      +
       
      DefaultMediaDescriptionAdapter - Class in com.google.android.exoplayer2.ui
      @@ -8280,7 +8543,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      DefaultMediaSourceFactory.AdsLoaderProvider - Interface in com.google.android.exoplayer2.source
      -
      Provides AdsLoader instances for media items that have ad tag URIs.
      +
      Provides AdsLoader instances for media items that have ad tag URIs.
      DefaultPlaybackSessionManager - Class in com.google.android.exoplayer2.analytics
      @@ -8444,7 +8707,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Definition(TrackGroup, int...) - Constructor for class com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition
       
      -
      Definition(TrackGroup, int[], int) - Constructor for class com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition
      +
      Definition(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int) - Constructor for class com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition
       
      delay(long) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      @@ -8454,10 +8717,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Delete the atomic file.
      +
      delete() - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Deletes the program.
      +
      +
      delete(Uri, String, String[]) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      delete(File, DatabaseProvider) - Static method in class com.google.android.exoplayer2.upstream.cache.SimpleCache
      Deletes all content belonging to a cache instance.
      +
      deleteTexture(int) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Deletes a GL texture.
      +
      deltaPicOrderAlwaysZeroFlag - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      DeltaUpdateException() - Constructor for exception com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser.DeltaUpdateException
      @@ -8472,6 +8745,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      dequeueInputBuffer() - Method in class com.google.android.exoplayer2.decoder.SimpleDecoder
       
      +
      dequeueInputBuffer() - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      dequeueInputBufferIndex() - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      Returns the next available input buffer index from the underlying MediaCodec or MediaCodec.INFO_TRY_AGAIN_LATER if no such buffer exists.
      @@ -8486,6 +8761,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      dequeueOutputBuffer() - Method in class com.google.android.exoplayer2.text.cea.Cea608Decoder
       
      +
      dequeueOutputBuffer() - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      dequeueOutputBufferIndex(MediaCodec.BufferInfo) - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      Returns the next available output buffer index from the underlying MediaCodec.
      @@ -8496,8 +8773,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      describeContents() - Method in class com.google.android.exoplayer2.drm.DrmInitData.SchemeData
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.Format
      -
       
      describeContents() - Method in class com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable
       
      describeContents() - Method in class com.google.android.exoplayer2.metadata.emsg.EventMessage
      @@ -8540,17 +8815,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      describeContents() - Method in class com.google.android.exoplayer2.source.hls.HlsTrackMetadataEntry.VariantInfo
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.source.TrackGroup
      -
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.source.TrackGroupArray
      -
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      -
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      -
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      -
       
      -
      describeContents() - Method in class com.google.android.exoplayer2.video.ColorInfo
      +
      describeContents() - Method in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
       
      description - Variable in class com.google.android.exoplayer2.MediaMetadata
      @@ -8580,6 +8845,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      descriptorBytes - Variable in class com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo
       
      +
      destroyEglContext(EGLDisplay, EGLContext) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Destroys the EGLContext identified by the provided EGLDisplay and EGLContext.
      +
      DEVICE - Static variable in class com.google.android.exoplayer2.util.Util
      Like Build.DEVICE, but in a place where it can be conveniently overridden for local @@ -8601,24 +8870,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Requirement that the device's internal storage is not low.
      -
      DeviceInfo - Class in com.google.android.exoplayer2.device
      +
      DeviceInfo - Class in com.google.android.exoplayer2
      Information about the playback device.
      -
      DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int) - Constructor for class com.google.android.exoplayer2.device.DeviceInfo
      +
      DeviceInfo(@com.google.android.exoplayer2.DeviceInfo.PlaybackType int, int, int) - Constructor for class com.google.android.exoplayer2.DeviceInfo
      Creates device information.
      -
      DeviceInfo.PlaybackType - Annotation Type in com.google.android.exoplayer2.device
      +
      DeviceInfo.PlaybackType - Annotation Type in com.google.android.exoplayer2
      Types of playback.
      -
      DeviceListener - Interface in com.google.android.exoplayer2.device
      -
      -
      Deprecated. - -
      -
      diagnosticInfo - Variable in exception com.google.android.exoplayer2.mediacodec.MediaCodecDecoderException
      An optional developer-readable diagnostic information string.
      @@ -8675,6 +8938,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Bitmask of selection flags that are disabled for text track selections.
      +
      disabledTrackTypes - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      +
      +
      The track types that are disabled.
      +
      disableInternal() - Method in class com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource
       
      disableInternal() - Method in class com.google.android.exoplayer2.source.BaseMediaSource
      @@ -8862,15 +9129,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      dispatch(RecordedRequest) - Method in class com.google.android.exoplayer2.testutil.WebServerDispatcher
       
      -
      dispatchFastForward(Player) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a fast forward operation.
      -
      -
      dispatchFastForward(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      dispatchKeyEvent(KeyEvent) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
       
      dispatchKeyEvent(KeyEvent) - Method in class com.google.android.exoplayer2.ui.PlayerView
      @@ -8895,96 +9153,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called to process media key events.
      -
      dispatchNext(Player) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.seekToNextWindow() operation.
      -
      -
      dispatchNext(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchPrepare(Player) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.prepare() operation.
      -
      -
      dispatchPrepare(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchPrevious(Player) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.seekToPreviousWindow() operation.
      -
      -
      dispatchPrevious(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchRewind(Player) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a rewind operation.
      -
      -
      dispatchRewind(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchSeekTo(Player, int, long) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.seekTo(int, long) operation.
      -
      -
      dispatchSeekTo(Player, int, long) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchSetPlaybackParameters(Player, PlaybackParameters) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      - -
      -
      dispatchSetPlaybackParameters(Player, PlaybackParameters) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchSetPlayWhenReady(Player, boolean) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.setPlayWhenReady(boolean) operation.
      -
      -
      dispatchSetPlayWhenReady(Player, boolean) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchSetRepeatMode(Player, int) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.setRepeatMode(int) operation.
      -
      -
      dispatchSetRepeatMode(Player, int) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchSetShuffleModeEnabled(Player, boolean) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      - -
      -
      dispatchSetShuffleModeEnabled(Player, boolean) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      dispatchStop(Player, boolean) - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Dispatches a Player.stop() operation.
      -
      -
      dispatchStop(Player, boolean) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      dispatchTouchEvent(MotionEvent) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
       
      displayHeight - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
      @@ -8995,95 +9163,95 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      displayWidth - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
       
      -
      doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action
      +
      doActionAndScheduleNext(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action
      Executes the action and schedules the next.
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action
      -
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.PlayUntilPosition
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.PlayUntilPosition
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForIsLoading
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForIsLoading
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForMessage
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForMessage
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPendingPlayerCommands
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPendingPlayerCommands
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlayWhenReady
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlayWhenReady
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPositionDiscontinuity
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPositionDiscontinuity
       
      -
      doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
      +
      doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.AddMediaItems
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.AddMediaItems
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ClearMediaItems
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ClearMediaItems
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ClearVideoSurface
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ClearVideoSurface
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action
      -
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ExecuteRunnable
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ExecuteRunnable
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.MoveMediaItem
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.MoveMediaItem
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.PlayUntilPosition
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.PlayUntilPosition
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Prepare
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Prepare
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.RemoveMediaItem
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.RemoveMediaItem
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.RemoveMediaItems
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.RemoveMediaItems
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Seek
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Seek
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SendMessages
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SendMessages
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetAudioAttributes
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetAudioAttributes
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetMediaItems
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetMediaItems
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetMediaItemsResetPosition
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetMediaItemsResetPosition
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetPlaybackParameters
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetPlaybackParameters
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetPlayWhenReady
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetPlayWhenReady
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetRendererDisabled
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetRendererDisabled
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetRepeatMode
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetRepeatMode
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetShuffleModeEnabled
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetShuffleModeEnabled
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetShuffleOrder
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetShuffleOrder
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetVideoSurface
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.SetVideoSurface
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Stop
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.Stop
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ThrowPlaybackException
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.ThrowPlaybackException
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForIsLoading
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForIsLoading
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForMessage
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForMessage
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPendingPlayerCommands
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPendingPlayerCommands
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlayWhenReady
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPlayWhenReady
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPositionDiscontinuity
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForPositionDiscontinuity
       
      -
      doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
      +
      doActionImpl(ExoPlayer, DefaultTrackSelector, Surface) - Method in class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
       
      DolbyVisionConfig - Class in com.google.android.exoplayer2.video
      @@ -9251,7 +9419,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a DownloadService.
      -
      downstreamFormatChanged(int, Format, int, Object, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      +
      downstreamFormatChanged(@com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -9271,7 +9439,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      An instance that supports no DRM schemes.
      -
      drmConfiguration - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      drmConfiguration - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      Optional MediaItem.DrmConfiguration for the media.
      @@ -9344,7 +9512,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Dispatches events to DrmSessionEventListeners.
      -
      DrmSessionException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.drm.DrmSession.DrmSessionException
      +
      DrmSessionException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.drm.DrmSession.DrmSessionException
       
      DrmSessionManager - Interface in com.google.android.exoplayer2.drm
      @@ -9376,14 +9544,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Identifies the operation which caused a DRM-related error.
      +
      dropOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      +
      Drops the specified output buffer and releases it.
      +
      dropOutputBuffer(MediaCodecAdapter, int, long) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      Drops the output buffer with the specified index.
      -
      dropOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      -
      -
      Drops the specified output buffer and releases it.
      -
      droppedBufferCount - Variable in class com.google.android.exoplayer2.decoder.DecoderCounters
      The number of dropped buffers.
      @@ -9578,10 +9746,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      e(String, String, Throwable) - Static method in class com.google.android.exoplayer2.util.Log
       
      -
      E_AC3_JOC_CODEC_STRING - Static variable in class com.google.android.exoplayer2.audio.Ac3Util
      -
      -
      A non-standard codec string for E-AC3-JOC.
      -
      E_AC3_MAX_RATE_BYTES_PER_SECOND - Static variable in class com.google.android.exoplayer2.audio.Ac3Util
      Maximum rate for an E-AC-3 audio stream, in bytes per second.
      @@ -9750,6 +9914,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      An empty timeline.
      +
      EMPTY - Static variable in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
      +
      Empty TrackSelectionOverrides, where no track selection is overridden.
      +
      +
      EMPTY - Static variable in class com.google.android.exoplayer2.TracksInfo
      +
      +
      An empty TrackInfo containing no TracksInfo.TrackGroupInfo.
      +
      EMPTY - Static variable in class com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata
      An empty DefaultContentMetadata.
      @@ -9806,6 +9978,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      enabledCount - Variable in class com.google.android.exoplayer2.testutil.FakeRenderer
      +
       
      enableInternal() - Method in class com.google.android.exoplayer2.source.ads.ServerSideInsertedAdsMediaSource
       
      enableInternal() - Method in class com.google.android.exoplayer2.source.BaseMediaSource
      @@ -9832,6 +10006,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Encodes an EventMessage to a byte array that can be decoded by EventMessageDecoder.
      +
      encode(List<Cue>) - Method in class com.google.android.exoplayer2.text.CueEncoder
      +
      +
      Encodes an List of Cue to a byte array that can be decoded by CueDecoder.
      +
      encoderDelay - Variable in class com.google.android.exoplayer2.extractor.GaplessInfoHolder
      The number of samples to trim from the start of the decoded audio stream, or Format.NO_VALUE if not set.
      @@ -9949,7 +10127,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Indicates that the end of the stream has been reached.
      -
      endPositionMs - Variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      endPositionMs - Variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      The end position in milliseconds.
      @@ -9975,7 +10153,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      endTracks() - Method in interface com.google.android.exoplayer2.extractor.ExtractorOutput
      Called when all tracks have been identified, meaning no new trackId values will be - passed to ExtractorOutput.track(int, int).
      + passed to ExtractorOutput.track(int, int).
      endTracks() - Method in class com.google.android.exoplayer2.extractor.jpeg.StartOffsetExtractorOutput
       
      @@ -9991,6 +10169,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Ensures the backing array is at least requiredCapacity long.
      +
      ensureClassLoader(Bundle) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      +
      +
      Sets the application class loader to the given Bundle if no class loader is present.
      +
      ensureSpaceForWrite(int) - Method in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
      Ensures that DecoderInputBuffer.data is large enough to accommodate a write of a given length at its @@ -10022,7 +10204,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      equals(Object) - Method in class com.google.android.exoplayer2.decoder.DecoderReuseEvaluation
       
      -
      equals(Object) - Method in class com.google.android.exoplayer2.device.DeviceInfo
      +
      equals(Object) - Method in class com.google.android.exoplayer2.DeviceInfo
       
      equals(Object) - Method in class com.google.android.exoplayer2.drm.DrmInitData
       
      @@ -10040,7 +10222,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration
       
      -
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
       
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
       
      @@ -10048,9 +10230,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration
       
      -
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
       
      -
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      equals(Object) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
       
      equals(Object) - Method in class com.google.android.exoplayer2.MediaMetadata
       
      @@ -10150,6 +10332,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      equals(Object) - Method in class com.google.android.exoplayer2.testutil.DumpableFormat
       
      +
      equals(Object) - Method in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
      +
       
      equals(Object) - Method in class com.google.android.exoplayer2.text.Cue
       
      equals(Object) - Method in class com.google.android.exoplayer2.ThumbRating
      @@ -10170,8 +10354,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      equals(Object) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionArray
       
      +
      equals(Object) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
       
      +
      equals(Object) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
       
      equals(Object) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
       
      +
      equals(Object) - Method in class com.google.android.exoplayer2.TracksInfo
      +
       
      +
      equals(Object) - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
       
      equals(Object) - Method in class com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata
       
      equals(Object) - Method in class com.google.android.exoplayer2.util.FlagSet
      @@ -10335,7 +10527,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The error value returned from the sink implementation.
      -
      errorCode - Variable in exception com.google.android.exoplayer2.drm.DecryptionException
      +
      errorCode - Variable in exception com.google.android.exoplayer2.decoder.CryptoException
      A component specific error code.
      @@ -10443,7 +10635,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      EVENT_AVAILABLE_COMMANDS_CHANGED - Static variable in interface com.google.android.exoplayer2.Player
      - +
      EVENT_BANDWIDTH_ESTIMATE - Static variable in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -10654,18 +10846,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Skipping silences was enabled or disabled in the audio stream.
      -
      EVENT_STATIC_METADATA_CHANGED - Static variable in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      -
      - -
      -
      EVENT_STATIC_METADATA_CHANGED - Static variable in interface com.google.android.exoplayer2.Player
      -
      -
      Deprecated. -
      Use Player.EVENT_MEDIA_METADATA_CHANGED for structured metadata changes.
      -
      -
      EVENT_SURFACE_SIZE_CHANGED - Static variable in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      The surface size changed.
      @@ -10678,13 +10858,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      EVENT_TRACK_SELECTION_PARAMETERS_CHANGED - Static variable in interface com.google.android.exoplayer2.Player
      +
      + +
      EVENT_TRACKS_CHANGED - Static variable in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      - +
      EVENT_TRACKS_CHANGED - Static variable in interface com.google.android.exoplayer2.Player
      - +
      EVENT_UPSTREAM_DISCARDED - Static variable in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -10909,12 +11093,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ExoDatabaseProvider - Class in com.google.android.exoplayer2.database
      -
      An SQLiteOpenHelper that provides instances of a standalone ExoPlayer database.
      +
      Deprecated. + +
      ExoDatabaseProvider(Context) - Constructor for class com.google.android.exoplayer2.database.ExoDatabaseProvider
      -
      Provides instances of the database located by passing ExoDatabaseProvider.DATABASE_NAME to Context.getDatabasePath(String).
      -
      +
      Deprecated.
      ExoHostedTest - Class in com.google.android.exoplayer2.testutil
      A HostActivity.HostedTest for ExoPlayer playback tests.
      @@ -10923,15 +11109,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      ExoHostedTest(String, long, boolean) - Constructor for class com.google.android.exoplayer2.testutil.ExoHostedTest
       
      -
      ExoMediaCrypto - Interface in com.google.android.exoplayer2.drm
      -
      -
      Enables decoding of encrypted data using keys in a DRM session.
      -
      -
      exoMediaCryptoType - Variable in class com.google.android.exoplayer2.Format
      -
      -
      The type of ExoMediaCrypto that will be associated with the content this format - describes, or null if the content is not encrypted.
      -
      ExoMediaDrm - Interface in com.google.android.exoplayer2.drm
      Used to obtain keys for decrypting protected media streams.
      @@ -10986,7 +11163,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ExoPlayer.AudioComponent - Interface in com.google.android.exoplayer2
      -
      The audio component of an ExoPlayer.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
      +
      ExoPlayer.AudioOffloadListener - Interface in com.google.android.exoplayer2
      @@ -10994,29 +11174,38 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ExoPlayer.Builder - Class in com.google.android.exoplayer2
      -
      Deprecated. - -
      +
      A builder for ExoPlayer instances.
      ExoPlayer.DeviceComponent - Interface in com.google.android.exoplayer2
      -
      The device component of an ExoPlayer.
      -
      -
      ExoPlayer.MetadataComponent - Interface in com.google.android.exoplayer2
      -
      -
      The metadata component of an ExoPlayer.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
      +
      ExoPlayer.TextComponent - Interface in com.google.android.exoplayer2
      -
      The text component of an ExoPlayer.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      +
      ExoPlayer.VideoComponent - Interface in com.google.android.exoplayer2
      -
      The video component of an ExoPlayer.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
      +
      +
      ExoplayerCuesDecoder - Class in com.google.android.exoplayer2.text
      +
      +
      A SubtitleDecoder that decodes subtitle samples of type MimeTypes.TEXT_EXOPLAYER_CUES
      +
      +
      ExoplayerCuesDecoder() - Constructor for class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      ExoPlayerLibraryInfo - Class in com.google.android.exoplayer2
      -
      Information about the ExoPlayer library.
      +
      Information about the media libraries.
      ExoPlayerTestRunner - Class in com.google.android.exoplayer2.testutil
      @@ -11024,7 +11213,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ExoPlayerTestRunner.Builder - Class in com.google.android.exoplayer2.testutil
      -
      Builder to set-up a ExoPlayerTestRunner.
      +
      Builder to set-up an ExoPlayerTestRunner.
      ExoTimeoutException - Exception in com.google.android.exoplayer2
      @@ -11072,17 +11261,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the player has paused its main loop to save power in offload scheduling mode.
      experimentalIsSleepingForOffload() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      experimentalIsSleepingForOffload() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      -
      experimentalSetAsynchronousBufferQueueingEnabled(boolean) - Method in class com.google.android.exoplayer2.DefaultRenderersFactory
      -
      -
      Enable asynchronous buffer queueing for both MediaCodecAudioRenderer and MediaCodecVideoRenderer instances.
      -
      -
      experimentalSetAsynchronousBufferQueueingEnabled(boolean) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      -
      -
      Enables asynchronous input buffer queueing.
      -
      experimentalSetEnableKeepAudioTrackOnSeek(boolean) - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
      Sets whether to enable the experimental feature that keeps and flushes the AudioTrack when a seek occurs, as opposed to releasing and reinitialising.
      @@ -11091,38 +11274,39 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether to enable the experimental feature that keeps and flushes the AudioTrack when a seek occurs, as opposed to releasing and reinitialising.
      -
      experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean) - Method in class com.google.android.exoplayer2.DefaultRenderersFactory
      -
      -
      Enable the asynchronous queueing synchronization workaround.
      -
      -
      experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      -
      -
      Enables the asynchronous queueing synchronization workaround.
      -
      experimentalSetForegroundModeTimeoutMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      -
      Set a limit on the time a call to ExoPlayer.setForegroundMode(boolean) can spend.
      +
      Sets a limit on the time a call to ExoPlayer.setForegroundMode(boolean) can spend.
      experimentalSetForegroundModeTimeoutMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Set a limit on the time a call to SimpleExoPlayer.setForegroundMode(boolean) can spend.
      +
      experimentalSetOffloadSchedulingEnabled(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Sets whether audio offload scheduling is enabled.
      experimentalSetOffloadSchedulingEnabled(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      experimentalSetOffloadSchedulingEnabled(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean) - Method in class com.google.android.exoplayer2.DefaultRenderersFactory
      Enable synchronizing codec interactions with asynchronous buffer queueing.
      -
      experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      +
      experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean) - Method in class com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory
      -
      Enables synchronizing codec interactions with asynchronous buffer queueing.
      +
      Enable synchronizing codec interactions with asynchronous buffer queueing.
      +
      +
      experimentalUseProgressiveMediaSourceForSubtitles(boolean) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      +
      +
      EXTENDED_SAR - Static variable in class com.google.android.exoplayer2.util.NalUnitUtil
      @@ -11258,11 +11442,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an adaptive track selection factory.
      +
      Factory(int, int, int, int, int, float) - Constructor for class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection.Factory
      +
      +
      Creates an adaptive track selection factory.
      +
      +
      Factory(int, int, int, int, int, float, float, Clock) - Constructor for class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection.Factory
      +
      +
      Creates an adaptive track selection factory.
      +
      Factory(long, double, Random) - Constructor for class com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory
      Set up factory for FakeAdaptiveDataSets with a chunk duration and the standard deviation of the chunk size.
      +
      Factory(Context) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSource.Factory
      +
      +
      Creates an instance.
      +
      +
      Factory(Context, DataSource.Factory) - Constructor for class com.google.android.exoplayer2.upstream.DefaultDataSource.Factory
      +
      +
      Creates an instance.
      +
      Factory(CronetEngineWrapper, Executor) - Constructor for class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
      Deprecated. @@ -11335,6 +11535,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Factory(DataSource.Factory, ResolvingDataSource.Resolver) - Constructor for class com.google.android.exoplayer2.upstream.ResolvingDataSource.Factory
       
      +
      Factory(DataSource.Factory, PriorityTaskManager, int) - Constructor for class com.google.android.exoplayer2.upstream.PriorityDataSource.Factory
      +
      +
      Creates an instance.
      +
      Factory(Call.Factory) - Constructor for class com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource.Factory
      Creates an instance.
      @@ -11536,6 +11740,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Message data saved to send messages or execute runnables at a later time on a Handler.
      +
      FakeCryptoConfig - Class in com.google.android.exoplayer2.testutil
      +
      + +
      +
      FakeCryptoConfig() - Constructor for class com.google.android.exoplayer2.testutil.FakeCryptoConfig
      +
       
      fakeDataSet - Variable in class com.google.android.exoplayer2.testutil.FakeDataSource.Factory
       
      FakeDataSet - Class in com.google.android.exoplayer2.testutil
      @@ -11684,11 +11894,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A forwarding timeline to provide an initial timeline for fake multi window sources.
      +
      FakeMediaSourceFactory - Class in com.google.android.exoplayer2.testutil
      +
      +
      Fake MediaSourceFactory that creates a FakeMediaSource.
      +
      +
      FakeMediaSourceFactory() - Constructor for class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
       
      +
      FakeMetadataEntry - Class in com.google.android.exoplayer2.testutil
      +
      + +
      +
      FakeMetadataEntry(String) - Constructor for class com.google.android.exoplayer2.testutil.FakeMetadataEntry
      +
       
      FakeRenderer - Class in com.google.android.exoplayer2.testutil
      Fake Renderer that supports any format with the matching track type.
      -
      FakeRenderer(int) - Constructor for class com.google.android.exoplayer2.testutil.FakeRenderer
      +
      FakeRenderer(@com.google.android.exoplayer2.C.TrackType int) - Constructor for class com.google.android.exoplayer2.testutil.FakeRenderer
       
      FakeSampleStream - Class in com.google.android.exoplayer2.testutil
      @@ -11870,37 +12092,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      FileDataSourceException(Exception) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      FileDataSourceException(String, IOException) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      -
      FileDataSourceException(String, Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      +
      FileDataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      Creates a FileDataSourceException.
      -
      FileDataSourceException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      +
      FileDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.FileDataSource.FileDataSourceException
      Creates a FileDataSourceException.
      -
      FileDataSourceFactory - Class in com.google.android.exoplayer2.upstream
      -
      -
      Deprecated. - -
      -
      -
      FileDataSourceFactory() - Constructor for class com.google.android.exoplayer2.upstream.FileDataSourceFactory
      -
      -
      Deprecated.
      -
      FileDataSourceFactory(TransferListener) - Constructor for class com.google.android.exoplayer2.upstream.FileDataSourceFactory
      -
      -
      Deprecated.
      filename - Variable in class com.google.android.exoplayer2.metadata.id3.GeobFrame
       
      FileTypes - Class in com.google.android.exoplayer2.util
      @@ -11976,9 +12184,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      FixedTrackSelection(TrackGroup, int) - Constructor for class com.google.android.exoplayer2.trackselection.FixedTrackSelection
       
      -
      FixedTrackSelection(TrackGroup, int, int) - Constructor for class com.google.android.exoplayer2.trackselection.FixedTrackSelection
      +
      FixedTrackSelection(TrackGroup, int, @com.google.android.exoplayer2.trackselection.TrackSelection.Type int) - Constructor for class com.google.android.exoplayer2.trackselection.FixedTrackSelection
       
      -
      FixedTrackSelection(TrackGroup, int, int, int, Object) - Constructor for class com.google.android.exoplayer2.trackselection.FixedTrackSelection
      +
      FixedTrackSelection(TrackGroup, int, @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, int, Object) - Constructor for class com.google.android.exoplayer2.trackselection.FixedTrackSelection
       
      fixSmoothStreamingIsmManifestUri(Uri) - Static method in class com.google.android.exoplayer2.util.Util
      @@ -11989,7 +12197,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      File type for the FLAC format.
      -
      FlacConstants - Class in com.google.android.exoplayer2.util
      +
      FlacConstants - Class in com.google.android.exoplayer2.extractor.flac
      Defines constants used by the FLAC extractor.
      @@ -12149,6 +12357,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Flag to force enable seeking using a constant bitrate assumption in cases where seeking would otherwise not be possible.
      +
      FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS - Static variable in class com.google.android.exoplayer2.extractor.amr.AmrExtractor
      +
      +
      Like AmrExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, except that seeking is also enabled in + cases where the content length (and hence the duration of the media) is unknown.
      +
      +
      FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS - Static variable in class com.google.android.exoplayer2.extractor.mp3.Mp3Extractor
      +
      +
      Like Mp3Extractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, except that seeking is also enabled in + cases where the content length (and hence the duration of the media) is unknown.
      +
      +
      FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS - Static variable in class com.google.android.exoplayer2.extractor.ts.AdtsExtractor
      +
      +
      Like AdtsExtractor.FLAG_ENABLE_CONSTANT_BITRATE_SEEKING, except that seeking is also enabled in + cases where the content length (and hence the duration of the media) is unknown.
      +
      FLAG_ENABLE_EMSG_TRACK - Static variable in class com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor
      Flag to indicate that the extractor should output an event message metadata track.
      @@ -12292,10 +12515,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      flush() - Method in class com.google.android.exoplayer2.decoder.SimpleDecoder
       
      -
      flush() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      flush() - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      Flushes the adapter and the underlying MediaCodec.
      @@ -12308,6 +12527,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      flush() - Method in class com.google.android.exoplayer2.text.cea.Cea708Decoder
       
      +
      flush() - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      flush(int, int, int) - Method in interface com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink
      Called when the audio processor is flushed with a format of subsequent input.
      @@ -12352,6 +12573,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Moves UI focus to the skip button (or other interactive elements), if currently shown.
      +
      focusSurface(EGLDisplay, EGLContext, EGLSurface, int, int) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Makes the specified surface the render target, using a viewport of width by + height pixels.
      +
      FOLDER_TYPE_ALBUMS - Static variable in class com.google.android.exoplayer2.MediaMetadata
      Type for a folder containing media categorized by album.
      @@ -12396,7 +12622,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      forAllSupportedMimeTypes() - Static method in class com.google.android.exoplayer2.robolectric.ShadowMediaCodecConfig
       
      -
      forceAllowInsecureDecoderComponents - Variable in class com.google.android.exoplayer2.drm.FrameworkMediaCrypto
      +
      forceAllowInsecureDecoderComponents - Variable in class com.google.android.exoplayer2.drm.FrameworkCryptoConfig
      Whether to allow use of insecure decoder components even if the underlying platform says otherwise.
      @@ -12406,6 +12632,29 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether to force use of MediaItem.DrmConfiguration.licenseUri even if the media specifies its own DRM license server URI.
      +
      forceDisableAsynchronous() - Method in class com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory
      +
      +
      Forces the factory to always create SynchronousMediaCodecAdapter instances.
      +
      +
      forceDisableMediaCodecAsynchronousQueueing() - Method in class com.google.android.exoplayer2.DefaultRenderersFactory
      +
      +
      Disables MediaCodecRenderer instances from + operating their MediaCodec in asynchronous mode and perform asynchronous queueing.
      +
      +
      forcedSessionTrackTypes - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      +
      +
      The types of tracks for which to always use a DRM session even if the content is unencrypted.
      +
      +
      forceEnableAsynchronous() - Method in class com.google.android.exoplayer2.mediacodec.DefaultMediaCodecAdapterFactory
      +
      +
      Forces this factory to always create AsynchronousMediaCodecAdapter instances, provided + the device API level is >= 23.
      +
      +
      forceEnableMediaCodecAsynchronousQueueing() - Method in class com.google.android.exoplayer2.DefaultRenderersFactory
      +
      +
      Enables MediaCodecRenderer instances to + operate their MediaCodec in asynchronous mode and perform asynchronous queueing.
      +
      forceHighestSupportedBitrate - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      Whether to force selection of the highest bitrate audio and video tracks that comply with all @@ -12416,6 +12665,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether to force selection of the single lowest bitrate audio and video tracks that comply with all other constraints.
      +
      forceSessionsForAudioAndVideoTracks(boolean) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets whether a DRM session should be used for clear tracks of type C.TRACK_TYPE_VIDEO and C.TRACK_TYPE_AUDIO.
      +
      forceStop() - Method in class com.google.android.exoplayer2.testutil.ExoHostedTest
       
      forceStop() - Method in interface com.google.android.exoplayer2.testutil.HostActivity.HostedTest
      @@ -12478,6 +12731,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The input Format of the sink when the error occurs.
      +
      format - Variable in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
      +
      +
      The Format.
      +
      +
      format - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      +
      +
      The format of the input from which this output buffer was decoded.
      +
      format - Variable in class com.google.android.exoplayer2.extractor.mp4.Track
      The format.
      @@ -12508,12 +12769,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The Format of this RTP payload.
      -
      format - Variable in class com.google.android.exoplayer2.video.VideoDecoderInputBuffer
      -
       
      -
      format - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      -
      -
      The format of the input from which this output buffer was decoded.
      -
      format(Format) - Method in class com.google.android.exoplayer2.extractor.DummyTrackOutput
       
      format(Format) - Method in interface com.google.android.exoplayer2.extractor.TrackOutput
      @@ -12728,12 +12983,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Size of the frame associated with this header, in bytes.
      -
      FrameworkMediaCrypto - Class in com.google.android.exoplayer2.drm
      +
      FrameworkCryptoConfig - Class in com.google.android.exoplayer2.drm
      -
      An ExoMediaCrypto implementation that contains the necessary information to build or - update a framework MediaCrypto.
      +
      -
      FrameworkMediaCrypto(UUID, byte[], boolean) - Constructor for class com.google.android.exoplayer2.drm.FrameworkMediaCrypto
      +
      FrameworkCryptoConfig(UUID, byte[], boolean) - Constructor for class com.google.android.exoplayer2.drm.FrameworkCryptoConfig
       
      FrameworkMediaDrm - Class in com.google.android.exoplayer2.drm
      @@ -12747,15 +13001,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Restores a Bundleable instance from a Bundle produced by Bundleable.toBundle().
      -
      fromBundleList(Bundleable.Creator<T>, List<Bundle>) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      fromBundleList(Bundleable.Creator<T>, List<Bundle>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      Converts a list of Bundle to a list of Bundleable.
      -
      fromNullableBundle(Bundleable.Creator<T>, Bundle) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      fromBundleNullableList(Bundleable.Creator<T>, List<Bundle>, List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      +
      +
      Converts a list of Bundle to a list of Bundleable.
      +
      +
      fromBundleNullableSparseArray(Bundleable.Creator<T>, SparseArray<Bundle>, SparseArray<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      +
      +
      Converts a SparseArray of Bundle to a SparseArray of Bundleable.
      +
      +
      fromNullableBundle(Bundleable.Creator<T>, Bundle) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      Converts a Bundle to a Bundleable.
      -
      fromNullableBundle(Bundleable.Creator<T>, Bundle, T) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      fromNullableBundle(Bundleable.Creator<T>, Bundle, T) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      Converts a Bundle to a Bundleable.
      @@ -12810,8 +13072,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Configures and queries the underlying native library.
      +
      generalLevelIdc - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      +
      generalProfileCompatibilityFlags - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      +
      generalProfileIdc - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      +
      generalProfileSpace - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      +
      generalTierFlag - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      generateAudioSessionIdV21(Context) - Static method in class com.google.android.exoplayer2.C
      + +
      +
      generateAudioSessionIdV21(Context) - Static method in class com.google.android.exoplayer2.util.Util
      +
      Returns a newly generated audio session identifier, or AudioManager.ERROR if an error occurred in which case audio playback may fail.
      @@ -13083,7 +13361,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getAdsLoader(MediaItem.AdsConfiguration) - Method in interface com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider
      -
      Returns an AdsLoader for the given ads configuration, or null if no ads +
      Returns an AdsLoader for the given ads configuration, or null if no ads loader is available for the given ads configuration.
      getAdViewGroup() - Method in interface com.google.android.exoplayer2.ui.AdViewProvider
      @@ -13127,10 +13405,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns list of all FakeTrackSelections that this track selector has made so far.
      -
      getAnalyticsCollector() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      getAnalyticsCollector() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns the AnalyticsCollector used for collecting analytics events.
      +
      getAnalyticsCollector() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getAnalyticsCollector() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      getAndClearOpenedDataSpecs() - Method in class com.google.android.exoplayer2.testutil.FakeDataSource
      Returns the DataSpec instances passed to FakeDataSource.open(DataSpec) since the last call to @@ -13144,7 +13428,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getApplicationLooper() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      getApplicationLooper() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      getApplicationLooper() - Method in class com.google.android.exoplayer2.offline.DownloadManager
      Returns the Looper associated with the application thread that's used to access the @@ -13156,9 +13442,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); player and on which player events are received.
      getApplicationLooper() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getApplicationLooper() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      -
      getApplicationLooper() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      +
      getApplicationLooper() - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Returns the Looper associated with the application thread that's used to access the + transcoding transformer and on which transcoding transformer events are received.
      +
      getApplicationLooper() - Method in class com.google.android.exoplayer2.transformer.Transformer
      Returns the Looper associated with the application thread that's used to access the @@ -13168,9 +13461,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the approximate number of bytes per frame for the current FLAC stream.
      -
      getAttributes(int) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      getAttribLocation(String) - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      -
      Returns the GlUtil.Attributes in the specified program.
      +
      Returns the location of an GlUtil.Attribute.
      +
      +
      getAttributes() - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Returns the program's GlUtil.Attributes.
      getAttributeValue(XmlPullParser, String) - Static method in class com.google.android.exoplayer2.util.XmlPullParserUtil
      @@ -13182,7 +13479,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getAudioAttributes() - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      Returns the attributes for audio playback.
      +
      Deprecated. + +
      getAudioAttributes() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -13197,8 +13496,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the attributes for audio playback.
      getAudioAttributes() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getAudioAttributes() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getAudioAttributes() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getAudioAttributesV21() - Method in class com.google.android.exoplayer2.audio.AudioAttributes
      @@ -13206,24 +13507,43 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getAudioComponent() - Method in interface com.google.android.exoplayer2.ExoPlayer
      -
      Returns the component of this player for audio output, or null if audio is not supported.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.AudioComponent methods are defined by that + interface.
      +
      getAudioComponent() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getAudioComponent() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      getAudioContentTypeForStreamType(int) - Static method in class com.google.android.exoplayer2.util.Util
      Returns the C.AudioContentType corresponding to the specified C.StreamType.
      -
      getAudioDecoderCounters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      getAudioDecoderCounters() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns DecoderCounters for audio, or null if no audio is being played.
      -
      getAudioFormat() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      getAudioDecoderCounters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getAudioDecoderCounters() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      +
      getAudioFormat() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns the audio format currently being played, or null if no audio is being played.
      +
      getAudioFormat() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getAudioFormat() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      getAudioMediaMimeType(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      Returns the first audio MIME type derived from an RFC 6381 codecs string.
      @@ -13236,9 +13556,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getAudioSessionId() - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      getAudioSessionId() - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Returns the audio session identifier, or C.AUDIO_SESSION_ID_UNSET if not set.
      getAudioSessionId() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getAudioSessionId() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getAudioString() - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      @@ -13266,8 +13596,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the player's currently available Player.Commands.
      getAvailableCommands() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getAvailableCommands() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getAvailableCommands() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getAvailableCommands(Player.Commands) - Method in class com.google.android.exoplayer2.BasePlayer
      @@ -13334,7 +13666,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getBufferedPercentage() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns an estimate of the percentage in the current content window or ad up to which data is +
      Returns an estimate of the percentage in the current content or ad up to which data is buffered, or 0 if no estimate is available.
      getBufferedPosition() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -13347,12 +13679,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getBufferedPosition() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns an estimate of the position in the current content window or ad up to which data is - buffered, in milliseconds.
      +
      Returns an estimate of the position in the current content or ad up to which data is buffered, + in milliseconds.
      getBufferedPosition() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getBufferedPosition() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getBufferedPosition() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getBufferedPositionUs() - Method in class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
      @@ -13562,7 +13896,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the Clock used for playback.
      getClock() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getClock() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getClock() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -13571,7 +13907,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getCodec() - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
       
      -
      getCodecCountOfType(String, int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      getCodecCountOfType(String, @com.google.android.exoplayer2.C.TrackType int) - Static method in class com.google.android.exoplayer2.util.Util
      Returns the number of codec strings in codecs whose type matches trackType.
      @@ -13619,7 +13955,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a subsequence of codecs containing the codec strings that correspond to the given mimeType.
      -
      getCodecsOfType(String, int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      getCodecsOfType(String, @com.google.android.exoplayer2.C.TrackType int) - Static method in class com.google.android.exoplayer2.util.Util
      Returns a copy of codecs without the codecs whose track type doesn't match trackType.
      @@ -13657,11 +13993,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getContentBufferedPosition() - Method in interface com.google.android.exoplayer2.Player
      If Player.isPlayingAd() returns true, returns an estimate of the content position in - the current content window up to which data is buffered, in milliseconds.
      + the current content up to which data is buffered, in milliseconds.
      getContentBufferedPosition() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getContentBufferedPosition() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getContentBufferedPosition() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getContentDuration() - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -13669,8 +14007,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getContentDuration() - Method in interface com.google.android.exoplayer2.Player
      -
      If Player.isPlayingAd() returns true, returns the duration of the current content - window in milliseconds, or C.TIME_UNSET if the duration is not known.
      +
      If Player.isPlayingAd() returns true, returns the duration of the current content in + milliseconds, or C.TIME_UNSET if the duration is not known.
      getContentLength(ContentMetadata) - Static method in interface com.google.android.exoplayer2.upstream.cache.ContentMetadata
      @@ -13697,8 +14035,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); played once all ads in the ad group have finished playing, in milliseconds.
      getContentPosition() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getContentPosition() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getContentPosition() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getContentResumeOffsetUs(int) - Method in class com.google.android.exoplayer2.Timeline.Period
      @@ -13746,6 +14086,29 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a list of MediaSource.MediaPeriodIds, with one element for each created media period.
      +
      getCryptoConfig() - Method in interface com.google.android.exoplayer2.drm.DrmSession
      +
      +
      Returns a CryptoConfig for the open session, or null if called before the session has + been opened or after it's been released.
      +
      +
      getCryptoConfig() - Method in class com.google.android.exoplayer2.drm.ErrorStateDrmSession
      +
       
      +
      getCryptoType() - Method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      +
       
      +
      getCryptoType() - Method in interface com.google.android.exoplayer2.drm.ExoMediaDrm
      +
      +
      Returns the type of CryptoConfig instances returned by ExoMediaDrm.createCryptoConfig(byte[]).
      +
      +
      getCryptoType() - Method in class com.google.android.exoplayer2.drm.FrameworkMediaDrm
      +
       
      +
      getCryptoType() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      +
       
      +
      getCryptoType(Format) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager
      +
       
      +
      getCryptoType(Format) - Method in interface com.google.android.exoplayer2.drm.DrmSessionManager
      +
      +
      Returns the C.CryptoType that the DRM session manager will use for a given Format.
      +
      getCues(long) - Method in interface com.google.android.exoplayer2.text.Subtitle
      Retrieve the cues that should be displayed at a given time.
      @@ -13762,8 +14125,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); currently being played.
      getCurrentAdGroupIndex() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentAdGroupIndex() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentAdGroupIndex() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentAdIndexInAdGroup() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      @@ -13774,8 +14139,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      If Player.isPlayingAd() returns true, returns the index of the ad in its ad group.
      getCurrentAdIndexInAdGroup() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentAdIndexInAdGroup() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentAdIndexInAdGroup() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentContentText(Player) - Method in class com.google.android.exoplayer2.ui.DefaultMediaDescriptionAdapter
       
      @@ -13791,7 +14158,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getCurrentCues() - Method in interface com.google.android.exoplayer2.ExoPlayer.TextComponent
      -
      Returns the current Cues.
      +
      Deprecated. + +
      getCurrentCues() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -13804,8 +14173,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the current Cues.
      getCurrentCues() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentCues() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentCues() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentDisplayModeSize(Context) - Static method in class com.google.android.exoplayer2.util.Util
      @@ -13845,8 +14216,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getCurrentLiveOffset() - Method in interface com.google.android.exoplayer2.Player
      Returns the offset of the current playback position from the live edge in milliseconds, or - C.TIME_UNSET if the current window isn't live or the - offset is unknown.
      + C.TIME_UNSET if the current MediaItem Player.isCurrentMediaItemLive() isn't + live} or the offset is unknown.
      getCurrentManifest() - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -13869,10 +14240,25 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getCurrentMediaItem() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the media item of the current window in the timeline.
      +
      Returns the currently playing MediaItem.
      +
      getCurrentMediaItemIndex() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      getCurrentMediaItemIndex() - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      +
      getCurrentMediaItemIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      getCurrentMediaItemIndex() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns the index of the current MediaItem in the timeline, or the prospective index if the current timeline is + empty.
      +
      +
      getCurrentMediaItemIndex() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentMediaItemIndex() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      getCurrentOrMainLooper() - Static method in class com.google.android.exoplayer2.util.Util
      Returns the Looper associated with the current thread, or the Looper of the @@ -13887,8 +14273,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the index of the period currently being played.
      getCurrentPeriodIndex() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentPeriodIndex() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentPeriodIndex() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentPosition() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      @@ -13900,13 +14288,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getCurrentPosition() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the playback position in the current content window or ad, in milliseconds, or the - prospective position in milliseconds if the current timeline is - empty.
      +
      Returns the playback position in the current content or ad, in milliseconds, or the prospective + position in milliseconds if the current timeline is empty.
      getCurrentPosition() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentPosition() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentPosition() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentPositionUs(boolean) - Method in interface com.google.android.exoplayer2.audio.AudioSink
      @@ -13916,30 +14305,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getCurrentPositionUs(boolean) - Method in class com.google.android.exoplayer2.audio.ForwardingAudioSink
       
      -
      getCurrentStaticMetadata() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
      -
      Deprecated.
      -
      -
      getCurrentStaticMetadata() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
      -
      Deprecated.
      -
      -
      getCurrentStaticMetadata() - Method in interface com.google.android.exoplayer2.Player
      -
      -
      Deprecated. -
      Use Player.getMediaMetadata() and Player.Listener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or - access the raw static metadata directly from the track - selections' formats.
      -
      -
      -
      getCurrentStaticMetadata() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      -
      getCurrentStaticMetadata() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
      -
      Deprecated.
      -
      getCurrentSubText(Player) - Method in interface com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter
      Gets the content sub text for the current media item.
      @@ -13953,8 +14318,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the current Timeline.
      getCurrentTimeline() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentTimeline() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentTimeline() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentTrackGroups() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      @@ -13962,11 +14329,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getCurrentTrackGroups() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the available track groups.
      +
      Deprecated. + +
      getCurrentTrackGroups() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentTrackGroups() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentTrackGroups() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentTrackSelections() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      @@ -13974,11 +14345,29 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getCurrentTrackSelections() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the current track selections.
      +
      Deprecated. + +
      getCurrentTrackSelections() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentTrackSelections() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      -
      getCurrentTrackSelections() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      getCurrentTracksInfo() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      +
      getCurrentTracksInfo() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      getCurrentTracksInfo() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns the available tracks, as well as the tracks' support, type, and selection status.
      +
      +
      getCurrentTracksInfo() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getCurrentTracksInfo() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getCurrentUnixTimeMs() - Method in class com.google.android.exoplayer2.Timeline.Window
      @@ -13992,18 +14381,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns current UrlResponseInfo.
      -
      getCurrentWindowIndex() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
       
      +
      getCurrentWindowIndex() - Method in class com.google.android.exoplayer2.BasePlayer
      +
      +
      Deprecated.
      +
      getCurrentWindowIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      getCurrentWindowIndex() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the index of the current window in the timeline, or the prospective window index if the current timeline is empty.
      +
      Deprecated. + +
      -
      getCurrentWindowIndex() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getCurrentWindowIndex() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      getCustomAction(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider
      Returns a PlaybackStateCompat.CustomAction which will be published to the media @@ -14121,6 +14512,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the default artwork to display.
      +
      getDefaultDisplayLocale() - Static method in class com.google.android.exoplayer2.util.Util
      +
      +
      Returns the default DISPLAY Locale.
      +
      getDefaultPositionMs() - Method in class com.google.android.exoplayer2.Timeline.Window
      Returns the default position relative to the start of the window at which to begin playback, @@ -14131,36 +14526,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the default position relative to the start of the window at which to begin playback, in microseconds.
      -
      getDefaultRequestProperties() - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
      -
      - -
      -
      getDefaultRequestProperties() - Method in class com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource.Factory
      -
      - -
      -
      getDefaultRequestProperties() - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory
      -
      - -
      -
      getDefaultRequestProperties() - Method in class com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory
      -
      - -
      -
      getDefaultRequestProperties() - Method in interface com.google.android.exoplayer2.upstream.HttpDataSource.Factory
      -
      - -
      getDefaults(Context) - Static method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      Returns an instance configured with default values.
      @@ -14184,19 +14549,28 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getDeviceComponent() - Method in interface com.google.android.exoplayer2.ExoPlayer
      -
      Returns the component of this player for playback device, or null if it's not supported.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.DeviceComponent methods are defined by that + interface.
      +
      getDeviceComponent() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getDeviceComponent() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      getDeviceInfo() - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Gets the device information.
      +
      Deprecated. + +
      getDeviceInfo() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
      This method is not supported and always returns DeviceInfo.UNKNOWN.
      +
      This method is not supported and always returns DeviceInfo.UNKNOWN.
      getDeviceInfo() - Method in class com.google.android.exoplayer2.ForwardingPlayer
       
      @@ -14205,12 +14579,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the device information.
      getDeviceInfo() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getDeviceInfo() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getDeviceInfo() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getDeviceVolume() - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Gets the current volume of the device.
      +
      Deprecated. + +
      getDeviceVolume() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -14223,8 +14601,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the current volume of the device.
      getDeviceVolume() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getDocumentSize(String) - Static method in class com.google.android.exoplayer2.upstream.HttpUtil
      @@ -14300,11 +14680,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getDuration() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the duration of the current content window or ad in milliseconds, or C.TIME_UNSET if the duration is not known.
      +
      Returns the duration of the current content or ad in milliseconds, or C.TIME_UNSET if + the duration is not known.
      getDuration() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getDuration() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getDuration() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getDurationMs() - Method in class com.google.android.exoplayer2.Timeline.Period
      @@ -14361,6 +14744,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a map of metadata name, value pairs to be set.
      +
      getEglSurface(EGLDisplay, Object) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Returns a new EGLSurface wrapping the specified surface.
      +
      getElapsedRealtimeOffsetMs() - Static method in class com.google.android.exoplayer2.util.SntpClient
      Returns the offset between SystemClock.elapsedRealtime() and the NTP server time in @@ -14380,10 +14767,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); 6381 codec string, or C.ENCODING_INVALID if the corresponding C.Encoding cannot be determined.
      -
      getEncodingForAudioObjectType(int) - Static method in class com.google.android.exoplayer2.audio.AacUtil
      -
      -
      Returns the encoding for a given AAC audio object type.
      -
      getEndedRatio() - Method in class com.google.android.exoplayer2.analytics.PlaybackStats
      Returns the ratio of foreground playbacks which reached the ended state at least once, or @@ -14400,7 +14783,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getError() - Method in class com.google.android.exoplayer2.drm.ErrorStateDrmSession
       
      getErrorCodeForMediaDrmErrorCode(int) - Static method in class com.google.android.exoplayer2.C
      -
       
      +
      + +
      +
      getErrorCodeForMediaDrmErrorCode(int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      +
      Returns a PlaybackException.ErrorCode value that corresponds to the provided MediaDrm.ErrorCodes value.
      +
      getErrorCodeForMediaDrmException(Exception, int) - Static method in class com.google.android.exoplayer2.drm.DrmUtil
      Returns the PlaybackException.ErrorCode that corresponds to the given DRM-related @@ -14412,9 +14803,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getErrorCodeName() - Method in exception com.google.android.exoplayer2.PlaybackException
      - +
      -
      getErrorCodeName(int) - Static method in exception com.google.android.exoplayer2.PlaybackException
      +
      getErrorCodeName(@com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Static method in exception com.google.android.exoplayer2.PlaybackException
      Returns the name of a given errorCode.
      @@ -14440,22 +14831,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getEventTimeCount() - Method in class com.google.android.exoplayer2.text.SubtitleOutputBuffer
       
      -
      getExoMediaCryptoType() - Method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      -
       
      -
      getExoMediaCryptoType() - Method in interface com.google.android.exoplayer2.drm.ExoMediaDrm
      -
      - -
      -
      getExoMediaCryptoType() - Method in class com.google.android.exoplayer2.drm.FrameworkMediaDrm
      -
       
      -
      getExoMediaCryptoType() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      -
       
      -
      getExoMediaCryptoType(Format) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager
      -
       
      -
      getExoMediaCryptoType(Format) - Method in interface com.google.android.exoplayer2.drm.DrmSessionManager
      -
      -
      Returns the ExoMediaCrypto type associated to sessions acquired for the given Format.
      -
      getExpectedBytes() - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest.TestResource
      Returns the expected contents of this resource.
      @@ -14474,11 +14849,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether a loader should fall back to using another resource on encountering an error, and if so the duration for which the failing resource should be excluded.
      -
      getFastForwardIncrementMs(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      Returns the fast forward increment in milliseconds.
      -
      getFatalErrorRate() - Method in class com.google.android.exoplayer2.analytics.PlaybackStats
      Returns the rate of fatal errors, in errors per play time second, or 0.0 if no time was @@ -14592,7 +14962,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getFontSizeUnit() - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      -
      getForegroundNotification(List<Download>) - Method in class com.google.android.exoplayer2.offline.DownloadService
      +
      getForegroundNotification(List<Download>, int) - Method in class com.google.android.exoplayer2.offline.DownloadService
      Returns a notification to be displayed when this service running in the foreground.
      @@ -14642,6 +15012,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getFormatSupportString(int) - Static method in class com.google.android.exoplayer2.C
      + +
      +
      getFormatSupportString(int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      Returns string representation of a C.FormatSupport flag.
      getFrameSize(int) - Static method in class com.google.android.exoplayer2.audio.MpegAudioUtil
      @@ -14786,6 +15162,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns an InputStream for reading from an asset file.
      +
      getInputSurface() - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      +
      +
      Returns the input Surface, or null if the input is not a surface.
      +
      +
      getInputSurface() - Method in class com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter
      +
       
      getInstance() - Static method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      Returns a new instance.
      @@ -14933,7 +15315,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getLineAnchor() - Method in class com.google.android.exoplayer2.text.Cue.Builder
      -
      Gets the cue box anchor positioned by line.
      +
      Gets the cue box anchor positioned by line.
      getLineType() - Method in class com.google.android.exoplayer2.text.Cue.Builder
      @@ -15013,12 +15395,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getMaxSeekToPreviousPosition() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the maximum position for which Player.seekToPrevious() seeks to the previous window, - in milliseconds.
      +
      Returns the maximum position for which Player.seekToPrevious() seeks to the previous MediaItem, in milliseconds.
      getMaxSeekToPreviousPosition() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getMaxSeekToPreviousPosition() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getMaxSeekToPreviousPosition() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getMaxStars() - Method in class com.google.android.exoplayer2.StarRating
      @@ -15172,13 +15555,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
       
      -
      getMediaCrypto() - Method in interface com.google.android.exoplayer2.drm.DrmSession
      -
      -
      Returns an ExoMediaCrypto for the open session, or null if called before the session - has been opened or after it's been released.
      -
      -
      getMediaCrypto() - Method in class com.google.android.exoplayer2.drm.ErrorStateDrmSession
      -
       
      getMediaDescription(Player, int) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      Gets the MediaDescriptionCompat for a given timeline window index.
      @@ -15260,6 +15636,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the number of media items in the playlist.
      +
      getMediaItemIndex() - Method in class com.google.android.exoplayer2.PlayerMessage
      +
      +
      Returns media item index at which the message will be delivered.
      +
      getMediaMetadata() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      getMediaMetadata() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      @@ -15270,8 +15650,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); supported.
      getMediaMetadata() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getMediaMetadata() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getMediaMetadata() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getMediaMimeType(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      @@ -15313,6 +15695,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the MediaSource at a specified index.
      +
      getMediaSourceFactory() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      +
      +
      Returns the MediaSourceFactory that will be used by the player, or null if no MediaSourceFactory has been set yet and no default is available.
      +
      getMediaTimeForChildMediaTime(T, long) - Method in class com.google.android.exoplayer2.source.CompositeMediaSource
      Returns the media time in the MediaPeriod of the composite source corresponding to the @@ -15337,14 +15723,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the MediaMetadataCompat to be published to the session.
      -
      getMetadataComponent() - Method in interface com.google.android.exoplayer2.ExoPlayer
      -
      -
      Returns the component of this player for metadata output, or null if metadata is not supported.
      -
      -
      getMetadataComponent() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getMetadataComponent() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      getMetadataCopyWithAppendedEntriesFrom(Metadata) - Method in class com.google.android.exoplayer2.extractor.FlacStreamMetadata
      Returns a copy of the content metadata with entries from other appended.
      @@ -15435,6 +15813,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getName() - Method in class com.google.android.exoplayer2.text.cea.Cea708Decoder
       
      +
      getName() - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      getName() - Method in class com.google.android.exoplayer2.text.SimpleSubtitleDecoder
       
      getName() - Method in class com.google.android.exoplayer2.text.TextRenderer
      @@ -15516,14 +15896,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getNextLoadPositionUs() - Method in class com.google.android.exoplayer2.testutil.FakeMediaPeriod
       
      +
      getNextMediaItemIndex() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      getNextMediaItemIndex() - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      -
      getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      +
      getNextMediaItemIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      getNextMediaItemIndex() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns the index of the MediaItem that will be played if Player.seekToNextMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
      +
      +
      getNextPeriodIndex(int, Timeline.Period, Timeline.Window, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      Returns the index of the period after the period at index periodIndex depending on the repeatMode and whether shuffling is enabled.
      -
      getNextRepeatMode(int, int) - Static method in class com.google.android.exoplayer2.util.RepeatModeUtil
      +
      getNextRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int, int) - Static method in class com.google.android.exoplayer2.util.RepeatModeUtil
      Gets the next repeat mode out of enabledModes starting from currentMode.
      @@ -15540,26 +15929,31 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getNextWindowIndex() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      getNextWindowIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      getNextWindowIndex() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the index of the window that will be played if Player.seekToNextWindow() is called, - which may depend on the current repeat mode and whether shuffle mode is enabled.
      +
      Deprecated. + +
      -
      getNextWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.AbstractConcatenatedTimeline
      +
      getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.AbstractConcatenatedTimeline
       
      -
      getNextWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.source.ForwardingTimeline
      +
      getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.source.ForwardingTimeline
       
      -
      getNextWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeTimeline
      +
      getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeTimeline
       
      -
      getNextWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      +
      getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      Returns the index of the window after the window at index windowIndex depending on the repeatMode and whether shuffling is enabled.
      -
      getNextWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.Timeline.RemotableTimeline
      +
      getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline.RemotableTimeline
       
      getNonexistentUrl() - Method in class com.google.android.exoplayer2.testutil.HttpDataSourceTestEnv
       
      @@ -15607,10 +16001,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getOutput() - Method in class com.google.android.exoplayer2.audio.SonicAudioProcessor
       
      -
      getOutput() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      getOutput() - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunk
      Returns the output most recently passed to BaseMediaChunk.init(BaseMediaChunkOutput).
      @@ -15652,13 +16042,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the overlay FrameLayout, which can be populated with UI elements to show on top of the player.
      +
      getOverride(TrackGroup) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
      +
      Returns the TrackSelectionOverrides.TrackSelectionOverride of the provided TrackGroup or null + if there is none.
      +
      getOverrides() - Method in class com.google.android.exoplayer2.ui.TrackSelectionView
      Returns the list of selected track selection overrides.
      getParameters() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      +
       
      +
      getParameters() - Method in class com.google.android.exoplayer2.trackselection.TrackSelector
      -
      Gets the current selection parameters.
      +
      Returns the current parameters for track selection.
      getPath() - Method in class com.google.android.exoplayer2.testutil.WebServerDispatcher.Resource
      @@ -15669,7 +16066,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the player pauses playback at the end of each media item.
      getPauseAtEndOfMediaItems() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getPauseAtEndOfMediaItems() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getPayload() - Method in class com.google.android.exoplayer2.PlayerMessage
      @@ -15711,7 +16110,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the estimated download percentage, or C.PERCENTAGE_UNSET if no estimate is available.
      -
      getPercentile(float) - Method in class com.google.android.exoplayer2.util.SlidingPercentile
      +
      getPercentile(float) - Method in class com.google.android.exoplayer2.upstream.SlidingPercentile
      Computes a percentile by integration.
      @@ -15773,10 +16172,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getPeriodPosition(Timeline.Window, Timeline.Period, int, long) - Method in class com.google.android.exoplayer2.Timeline
      + +
      +
      getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long) - Method in class com.google.android.exoplayer2.Timeline
      +
      + +
      +
      getPeriodPositionUs(Timeline.Window, Timeline.Period, int, long) - Method in class com.google.android.exoplayer2.Timeline
      +
      Calls Timeline.getPeriodPosition(Window, Period, int, long, long) with a zero default position projection.
      -
      getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long) - Method in class com.google.android.exoplayer2.Timeline
      +
      getPeriodPositionUs(Timeline.Window, Timeline.Period, int, long, long) - Method in class com.google.android.exoplayer2.Timeline
      Converts (windowIndex, windowPositionUs) to the corresponding (periodUid, periodPositionUs).
      @@ -15791,7 +16202,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the Looper associated with the playback thread.
      getPlaybackLooper() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getPlaybackLooper() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getPlaybackParameters() - Method in interface com.google.android.exoplayer2.audio.AudioSink
      @@ -15815,8 +16228,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the currently active playback parameters.
      getPlaybackParameters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getPlaybackParameters() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getPlaybackParameters() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getPlaybackParameters() - Method in interface com.google.android.exoplayer2.util.MediaClock
      @@ -15839,8 +16254,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the current playback state of the player.
      getPlaybackState() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getPlaybackState() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getPlaybackState() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getPlaybackStateAtTime(long) - Method in class com.google.android.exoplayer2.analytics.PlaybackStats
      @@ -15865,8 +16282,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
      getPlaybackSuppressionReason() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getPlaybackSuppressionReason() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getPlaybackSuppressionReason() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getPlayer() - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      @@ -15900,9 +16319,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the error that caused playback to fail.
      getPlayerError() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getPlayerError() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      +
      getPlayerError() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      getPlayerState() - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      getPlayerStateString() - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      @@ -15922,8 +16345,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the playlist MediaMetadata, as set by Player.setPlaylistMetadata(MediaMetadata), or MediaMetadata.EMPTY if not supported.
      getPlaylistMetadata() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getPlaylistMetadata() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getPlaylistMetadata() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getPlaylistSnapshot(Uri, boolean) - Method in class com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker
       
      @@ -15944,8 +16369,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether playback will proceed when Player.getPlaybackState() == Player.STATE_READY.
      getPlayWhenReady() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getPlayWhenReady() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getPlayWhenReady() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getPosition() - Method in class com.google.android.exoplayer2.extractor.DefaultExtractorInput
       
      @@ -15969,8 +16396,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getPosition() - Method in class com.google.android.exoplayer2.text.Cue.Builder
      -
      Gets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
      +
      Gets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
      getPosition() - Method in class com.google.android.exoplayer2.util.ParsableBitArray
      @@ -16006,8 +16433,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getPositionMs() - Method in class com.google.android.exoplayer2.PlayerMessage
      -
      Returns position in window at PlayerMessage.getWindowIndex() at which the message will be delivered, - in milliseconds.
      +
      Returns position in the media item at PlayerMessage.getMediaItemIndex() at which the message will be + delivered, in milliseconds.
      getPositionUs() - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
       
      @@ -16048,10 +16475,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the presentation time offset, in microseconds.
      -
      getPreSkipSamples(List<byte[]>) - Static method in class com.google.android.exoplayer2.audio.OpusUtil
      -
      -
      Returns the number of pre-skip samples specified by the given Opus codec initialization data.
      -
      getPreviousIndex(int) - Method in class com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder
       
      getPreviousIndex(int) - Method in interface com.google.android.exoplayer2.source.ShuffleOrder
      @@ -16062,29 +16485,43 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getPreviousIndex(int) - Method in class com.google.android.exoplayer2.testutil.FakeShuffleOrder
       
      +
      getPreviousMediaItemIndex() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      getPreviousMediaItemIndex() - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      +
      getPreviousMediaItemIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      getPreviousMediaItemIndex() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns the index of the MediaItem that will be played if Player.seekToPreviousMediaItem() is called, which may depend on the current repeat mode and whether + shuffle mode is enabled.
      +
      getPreviousWindowIndex() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      getPreviousWindowIndex() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      getPreviousWindowIndex() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns the index of the window that will be played if Player.seekToPreviousWindow() is - called, which may depend on the current repeat mode and whether shuffle mode is enabled.
      +
      Deprecated. + +
      -
      getPreviousWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.AbstractConcatenatedTimeline
      +
      getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.AbstractConcatenatedTimeline
       
      -
      getPreviousWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.source.ForwardingTimeline
      +
      getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.source.ForwardingTimeline
       
      -
      getPreviousWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeTimeline
      +
      getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeTimeline
       
      -
      getPreviousWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      +
      getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      Returns the index of the window before the window at index windowIndex depending on the repeatMode and whether shuffling is enabled.
      -
      getPreviousWindowIndex(int, int, boolean) - Method in class com.google.android.exoplayer2.Timeline.RemotableTimeline
      +
      getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline.RemotableTimeline
       
      getPriorityCount(List<BaseUrl>) - Static method in class com.google.android.exoplayer2.source.dash.BaseUrlExclusionList
      @@ -16098,6 +16535,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The profile levels supported by the decoder.
      +
      getProgress(ProgressHolder) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Returns the current TranscodingTransformer.ProgressState and updates progressHolder with the current + progress if it is available.
      +
      getProgress(ProgressHolder) - Method in class com.google.android.exoplayer2.transformer.Transformer
      Returns the current Transformer.ProgressState and updates progressHolder with the current @@ -16161,6 +16603,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the ratio of rebuffer time to the total time spent playing and waiting, or 0.0 if no time was spend playing or waiting.
      +
      getReceivedProvisionRequests() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.LicenseServer
      +
       
      getReceivedSchemeDatas() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.LicenseServer
       
      getRedirectedUri(ContentMetadata) - Static method in interface com.google.android.exoplayer2.upstream.cache.ContentMetadata
      @@ -16170,7 +16614,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getReferenceCount() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
       
      -
      getRegionEndTimeMs(long) - Method in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      +
      getRegionEndTimeMs(long) - Method in class com.google.android.exoplayer2.upstream.CachedRegionTracker
      When provided with a byte offset, this method locates the cached region within which the offset falls, and returns the approximate end position in milliseconds of that region.
      @@ -16192,7 +16636,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the number of renderers.
      getRendererCount() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getRendererCount() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getRendererCount() - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      @@ -16230,7 +16676,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the track type that the renderer at a given index handles.
      getRendererType(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getRendererType(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getRendererType(int) - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      @@ -16248,8 +16696,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the current Player.RepeatMode used for playback.
      getRepeatMode() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getRepeatMode() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getRepeatMode() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getRepeatToggleModes() - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      @@ -16347,18 +16797,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo) - Method in class com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy
      - +
      getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo) - Method in interface com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy
      Returns whether a loader can retry on encountering an error, and if so the duration to wait before retrying.
      -
      getRewindIncrementMs(Player) - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      -
      Returns the rewind increment in milliseconds.
      -
      getRubyPosition() - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      getRuntimeExceptionForUnexpected() - Method in exception com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException
      @@ -16406,8 +16851,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getScheduler() - Method in class com.google.android.exoplayer2.offline.DownloadService
      -
      Returns a Scheduler to restart the service when requirements allowing downloads to take - place are met.
      +
      Returns a Scheduler to restart the service when requirements for downloads to continue + are met.
      getSchemeUuid() - Method in interface com.google.android.exoplayer2.drm.DrmSession
      @@ -16424,8 +16869,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the Player.seekBack() increment.
      getSeekBackIncrement() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getSeekBackIncrement() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getSeekBackIncrement() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getSeekBackIncrementMs() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -16440,8 +16887,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the Player.seekForward() increment.
      getSeekForwardIncrement() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getSeekForwardIncrement() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getSeekForwardIncrement() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getSeekForwardIncrementMs() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -16456,7 +16905,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the currently active SeekParameters of the player.
      getSeekParameters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getSeekParameters() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getSeekPoints(long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker.BinarySearchSeekMap
      @@ -16481,11 +16932,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the MediaParser.SeekPoint instances corresponding to the given timestamp.
      -
      getSeekPreRollSamples(List<byte[]>) - Static method in class com.google.android.exoplayer2.audio.OpusUtil
      -
      -
      Returns the number of seek per-roll samples specified by the given Opus codec initialization - data.
      -
      getSeekTimeRatio() - Method in class com.google.android.exoplayer2.analytics.PlaybackStats
      Returns the ratio of seek time to the total time spent playing and waiting, or 0.0 if @@ -16669,11 +17115,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getShuffleModeEnabled() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether shuffling of windows is enabled.
      +
      Returns whether shuffling of media items is enabled.
      getShuffleModeEnabled() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getShuffleModeEnabled() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getShuffleModeEnabled() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getSingletonInstance(Context) - Static method in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
      @@ -16719,9 +17167,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getSkipSilenceEnabled() - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      getSkipSilenceEnabled() - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Returns whether skipping silences in the audio stream is enabled.
      getSkipSilenceEnabled() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getSkipSilenceEnabled() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getSnapshot() - Method in class com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties
      @@ -16810,7 +17268,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the position in the underlying server-side inserted ads stream for a position in a content MediaPeriod.
      -
      getStreamTypeForAudioUsage(int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      getStreamTypeForAudioUsage(@com.google.android.exoplayer2.C.AudioUsage int) - Static method in class com.google.android.exoplayer2.util.Util
      Returns the C.StreamType corresponding to the specified C.AudioUsage.
      @@ -16890,6 +17348,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      getSupportedTypes() - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
       
      +
      getSupportedTypes() - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
       
      getSurface() - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
       
      getSurfaceTexture() - Method in class com.google.android.exoplayer2.util.EGLSurfaceTexture
      @@ -16932,12 +17392,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getTextComponent() - Method in interface com.google.android.exoplayer2.ExoPlayer
      -
      Returns the component of this player for text output, or null if text is not supported.
      +
      Deprecated. +
      Use Player, as the ExoPlayer.TextComponent methods are defined by that + interface.
      +
      getTextComponent() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getTextComponent() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      getTextMediaMimeType(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      Returns the first text MIME type derived from an RFC 6381 codecs string.
      @@ -17008,8 +17475,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns an estimate of the total buffered duration from the current position, in milliseconds.
      getTotalBufferedDuration() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getTotalBufferedDuration() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getTotalBufferedDuration() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getTotalBytesAllocated() - Method in interface com.google.android.exoplayer2.upstream.Allocator
      @@ -17058,6 +17527,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the TrackGroup to which the selected tracks belong.
      +
      getTrackGroup() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns the TrackGroup described by this TrackGroupInfo.
      +
      +
      getTrackGroupInfos() - Method in class com.google.android.exoplayer2.TracksInfo
      +
      +
      Returns the TrackGroupInfos, describing each TrackGroup.
      +
      getTrackGroups() - Method in class com.google.android.exoplayer2.source.ClippingMediaPeriod
       
      getTrackGroups() - Method in class com.google.android.exoplayer2.source.hls.HlsMediaPeriod
      @@ -17094,6 +17571,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the ChunkExtractor.TrackOutputProvider to be used by the wrapped extractor.
      +
      getTrackSelectionParameters() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      +
      getTrackSelectionParameters() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      getTrackSelectionParameters() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns the parameters constraining the track selection.
      +
      +
      getTrackSelectionParameters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getTrackSelectionParameters() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      getTrackSelections(int, int) - Method in class com.google.android.exoplayer2.offline.DownloadHelper
      Returns all track selections for a period and renderer.
      @@ -17103,13 +17594,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the track selector that this player uses, or null if track selection is not supported.
      getTrackSelector() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getTrackSelector() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getTrackSelector() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      Returns the track selector used by the player.
      +
      getTrackSupport(int) - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns the level of support for a track in a TrackGroup.
      +
      getTrackSupport(int, int, int) - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      Returns the extent to which an individual track is supported by the renderer.
      @@ -17126,18 +17623,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the track type that the Renderer handles.
      +
      getTrackType() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns the C.TrackType of the tracks in the TrackGroup.
      +
      getTrackType(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      -
      Returns the C.TRACK_TYPE_* constant corresponding to a specified MIME type, or - C.TRACK_TYPE_UNKNOWN if it could not be determined.
      +
      Returns the track type constant corresponding to a specified MIME type, + which may be C.TRACK_TYPE_UNKNOWN if it could not be determined.
      getTrackTypeOfCodec(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      Equivalent to getTrackType(getMediaMimeType(codec)).
      -
      getTrackTypeString(int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      getTrackTypeString(@com.google.android.exoplayer2.C.TrackType int) - Static method in class com.google.android.exoplayer2.util.Util
      -
      Returns a string representation of a TRACK_TYPE_* constant defined in C.
      +
      Returns a string representation of a C.TrackType.
      getTransferListener() - Method in interface com.google.android.exoplayer2.upstream.BandwidthMeter
      @@ -17168,11 +17669,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns an integer specifying the type of the selection, or TrackSelection.TYPE_UNSET if not specified.
      +
      getType(Uri) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      getTypeForPcmEncoding(int) - Static method in class com.google.android.exoplayer2.audio.WavUtil
      Returns the WAVE format type value for the given C.PcmEncoding.
      -
      getTypeSupport(int) - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      +
      getTypeSupport(@com.google.android.exoplayer2.C.TrackType int) - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      Returns the extent to which tracks of a specified type are supported.
      @@ -17203,9 +17706,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Retrieves the underlying error when ExoPlaybackException.type is ExoPlaybackException.TYPE_UNEXPECTED.
      -
      getUniforms(int) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      getUniformLocation(String) - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      -
      Returns the GlUtil.Uniforms in the specified program.
      +
      Returns the location of a GlUtil.Uniform.
      +
      +
      getUniforms() - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Returns the program's GlUtil.Uniforms.
      getUnmappedTrackGroups() - Method in class com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
      @@ -17331,28 +17838,63 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the vertical formatting for this Cue.
      +
      getVideoChangeFrameRateStrategy() - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      + +
      +
      getVideoChangeFrameRateStrategy() - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      +
      getVideoChangeFrameRateStrategy() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getVideoChangeFrameRateStrategy() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      getVideoComponent() - Method in interface com.google.android.exoplayer2.ExoPlayer
      -
      Returns the component of this player for video output, or null if video is not supported.
      +
      Deprecated. +
      Use ExoPlayer, as the ExoPlayer.VideoComponent methods are defined by that + interface.
      +
      getVideoComponent() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      getVideoComponent() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      -
      getVideoDecoderCounters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      +
      getVideoDecoderCounters() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns DecoderCounters for video, or null if no video is being played.
      +
      getVideoDecoderCounters() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getVideoDecoderCounters() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      getVideoDecoderOutputBufferRenderer() - Method in class com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView
      Deprecated.
      This class implements VideoDecoderOutputBufferRenderer directly.
      -
      getVideoFormat() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      getVideoFormat() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns the video format currently being played, or null if no video is being played.
      +
      getVideoFormat() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getVideoFormat() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      getVideoFrameMetadataListener() - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
      Returns the VideoFrameMetadataListener that should be registered during playback.
      @@ -17361,15 +17903,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the first video MIME type derived from an RFC 6381 codecs string.
      -
      getVideoScalingMode() - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      getVideoScalingMode() - Method in interface com.google.android.exoplayer2.ExoPlayer
      Returns the C.VideoScalingMode.
      +
      getVideoScalingMode() - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      +
      Deprecated. + +
      +
      getVideoScalingMode() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      getVideoScalingMode() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      getVideoSize() - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Gets the size of the video.
      +
      Deprecated. + +
      getVideoSize() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -17382,8 +17936,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets the size of the video.
      getVideoSize() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getVideoSize() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getVideoSize() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getVideoString() - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      @@ -17404,7 +17960,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getVolume() - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      +
      Deprecated. +
      Use Player.getVolume() instead.
      +
      getVolume() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -17417,8 +17975,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      getVolume() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      getVolume() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      getVolume() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      getWaitTimeRatio() - Method in class com.google.android.exoplayer2.analytics.PlaybackStats
      @@ -17467,10 +18027,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      getWindowCount() - Method in class com.google.android.exoplayer2.Timeline.RemotableTimeline
       
      -
      getWindowIndex() - Method in class com.google.android.exoplayer2.PlayerMessage
      -
      -
      Returns window index at which the message will be delivered.
      -
      getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int) - Method in class com.google.android.exoplayer2.source.ConcatenatingMediaSource
       
      getWindowIndexForChildWindowIndex(T, int) - Method in class com.google.android.exoplayer2.source.CompositeMediaSource
      @@ -17509,9 +18065,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the current absolute write indices of the individual sample queues.
      -
      GL_ASSERTIONS_ENABLED - Static variable in class com.google.android.exoplayer2.ExoPlayerLibraryInfo
      +
      glAssertionsEnabled - Static variable in class com.google.android.exoplayer2.util.GlUtil
      -
      Whether an exception should be thrown in case of an OpenGl error.
      +
      Whether to throw a GlUtil.GlException in case of an OpenGL error.
      +
      +
      GlException(String) - Constructor for exception com.google.android.exoplayer2.util.GlUtil.GlException
      +
      +
      Creates an instance with the specified error message.
      GlUtil - Class in com.google.android.exoplayer2.util
      @@ -17521,10 +18081,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      GL attribute, which can be attached to a buffer with GlUtil.Attribute.setBuffer(float[], int).
      +
      GlUtil.GlException - Exception in com.google.android.exoplayer2.util
      +
      +
      Thrown when an OpenGL error occurs and GlUtil.glAssertionsEnabled is true.
      +
      +
      GlUtil.Program - Class in com.google.android.exoplayer2.util
      +
      +
      GL program.
      +
      GlUtil.Uniform - Class in com.google.android.exoplayer2.util
      GL uniform, which can be attached to a sampler using GlUtil.Uniform.setSamplerTexId(int, int).
      +
      GlUtil.UnsupportedEglVersionException - Exception in com.google.android.exoplayer2.util
      +
      +
      Thrown when the required EGL version is not supported by the device.
      +
      group - Variable in class com.google.android.exoplayer2.trackselection.BaseTrackSelection
      The selected TrackGroup.
      @@ -17555,17 +18127,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      groupKey - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
       
      -
      GvrAudioProcessor - Class in com.google.android.exoplayer2.ext.gvr
      -
      -
      Deprecated. -
      If you still need this component, please contact us by filing an issue on our issue tracker.
      -
      -
      -
      GvrAudioProcessor() - Constructor for class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      -
      Creates a new GVR audio processor.
      -
      gzip(byte[]) - Static method in class com.google.android.exoplayer2.util.Util
      Compresses input using gzip and returns the result in a newly allocated byte array.
      @@ -17615,6 +18176,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      H265Reader(SeiReader) - Constructor for class com.google.android.exoplayer2.extractor.ts.H265Reader
       
      +
      H265SpsData(int, boolean, int, int, int[], int, int, int, int, float) - Constructor for class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int) - Method in class com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor
       
      handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int) - Method in class com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor
      @@ -17680,7 +18243,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      handleMessage(Message) - Method in class com.google.android.exoplayer2.text.TextRenderer
       
      -
      handleMessage(SimpleExoPlayer, int, Object) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget
      +
      handleMessage(ExoPlayer, int, Object) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget
      Handles the message send to the component and additionally provides access to the player.
      @@ -17786,7 +18349,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      hashCode() - Method in class com.google.android.exoplayer2.decoder.DecoderReuseEvaluation
       
      -
      hashCode() - Method in class com.google.android.exoplayer2.device.DeviceInfo
      +
      hashCode() - Method in class com.google.android.exoplayer2.DeviceInfo
       
      hashCode() - Method in class com.google.android.exoplayer2.drm.DrmInitData
       
      @@ -17804,7 +18367,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration
       
      -
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
       
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
       
      @@ -17812,9 +18375,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration
       
      -
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
       
      -
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      hashCode() - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
       
      hashCode() - Method in class com.google.android.exoplayer2.MediaMetadata
       
      @@ -17914,6 +18477,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      hashCode() - Method in class com.google.android.exoplayer2.testutil.DumpableFormat
       
      +
      hashCode() - Method in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
      +
       
      hashCode() - Method in class com.google.android.exoplayer2.text.Cue
       
      hashCode() - Method in class com.google.android.exoplayer2.ThumbRating
      @@ -17934,8 +18499,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      hashCode() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionArray
       
      +
      hashCode() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
       
      +
      hashCode() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
       
      hashCode() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
       
      +
      hashCode() - Method in class com.google.android.exoplayer2.TracksInfo
      +
       
      +
      hashCode() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
       
      hashCode() - Method in class com.google.android.exoplayer2.upstream.cache.DefaultContentMetadata
       
      hashCode() - Method in class com.google.android.exoplayer2.util.FlagSet
      @@ -17973,17 +18546,31 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      hasNext() - Method in interface com.google.android.exoplayer2.Player
      Deprecated. - +
      +
      hasNextMediaItem() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      hasNextMediaItem() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      hasNextMediaItem() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether a next MediaItem exists, which may depend on the current repeat mode + and whether shuffle mode is enabled.
      +
      hasNextWindow() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      hasNextWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      hasNextWindow() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether a next window exists, which may depend on the current repeat mode and whether - shuffle mode is enabled.
      +
      Deprecated. + +
      hasNoAbsoluteSizeSpanBetween(int, int) - Method in class com.google.android.exoplayer2.testutil.truth.SpannedSubject
      @@ -18080,17 +18667,31 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      hasPrevious() - Method in interface com.google.android.exoplayer2.Player
      Deprecated. - +
      +
      hasPreviousMediaItem() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      hasPreviousMediaItem() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      hasPreviousMediaItem() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether a previous media item exists, which may depend on the current repeat mode and + whether shuffle mode is enabled.
      +
      hasPreviousWindow() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      hasPreviousWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      hasPreviousWindow() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether a previous window exists, which may depend on the current repeat mode and - whether shuffle mode is enabled.
      +
      Deprecated. + +
      hasProgramDateTime - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist
      @@ -18128,10 +18729,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Checks that the subject has an TextEmphasisSpan from start to end.
      -
      hasTrackOfType(TrackSelectionArray, int) - Static method in class com.google.android.exoplayer2.trackselection.TrackSelectionUtil
      -
      -
      Returns if a TrackSelectionArray has at least one track of the given type.
      -
      hasTypefaceSpanBetween(int, int) - Method in class com.google.android.exoplayer2.testutil.truth.SpannedSubject
      Checks that the subject has a TypefaceSpan from start to end.
      @@ -18170,6 +18767,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a rated instance.
      +
      height - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      +
       
      height - Variable in class com.google.android.exoplayer2.Format
      The height of the video in pixels, or Format.NO_VALUE if unknown or not applicable.
      @@ -18178,14 +18777,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The height of the picture in pixels.
      +
      height - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      height - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      height - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      +
      +
      The height of each decoded frame, or Format.NO_VALUE if unknown.
      +
      +
      height - Variable in class com.google.android.exoplayer2.video.HevcConfig
      +
      +
      The height of each decoded frame, or Format.NO_VALUE if unknown.
      +
      height - Variable in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues
       
      -
      height - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      -
       
      height - Variable in class com.google.android.exoplayer2.video.VideoSize
      The video height in pixels, 0 when unknown.
      @@ -18272,7 +18877,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A MediaPeriod that loads an HLS stream.
      -
      HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean) - Constructor for class com.google.android.exoplayer2.source.hls.HlsMediaPeriod
      +
      HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, @com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType int, boolean) - Constructor for class com.google.android.exoplayer2.source.hls.HlsMediaPeriod
      Creates an HLS media period.
      @@ -18456,49 +19061,49 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); a thread safe way to avoid the potential of creating snapshots of an inconsistent or unintended state. +
      HttpDataSourceException(DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      +
      +
      Constructs an HttpDataSourceException.
      +
      HttpDataSourceException(DataSpec, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      -
      HttpDataSourceException(DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      +
      HttpDataSourceException(IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      Constructs an HttpDataSourceException.
      HttpDataSourceException(IOException, DataSpec, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      -
      HttpDataSourceException(IOException, DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      +
      HttpDataSourceException(String, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      Constructs an HttpDataSourceException.
      HttpDataSourceException(String, DataSpec, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      -
      HttpDataSourceException(String, DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      +
      HttpDataSourceException(String, IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      Constructs an HttpDataSourceException.
      HttpDataSourceException(String, IOException, DataSpec, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      -
      HttpDataSourceException(String, IOException, DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException
      -
      -
      Constructs an HttpDataSourceException.
      -
      HttpDataSourceTestEnv - Class in com.google.android.exoplayer2.testutil
      A JUnit Rule that creates test resources for HttpDataSource contract tests.
      @@ -18718,7 +19323,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      increaseDeviceVolume() - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Increases the volume of the device.
      +
      Deprecated. + +
      increaseDeviceVolume() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -18731,8 +19338,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Increases the volume of the device.
      increaseDeviceVolume() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      increaseDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      increaseDeviceVolume() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      index - Variable in class com.google.android.exoplayer2.testutil.DumpableFormat
       
      @@ -18816,11 +19425,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Initializes required EGL parameters and creates the SurfaceTexture.
      -
      init(long, int) - Method in class com.google.android.exoplayer2.decoder.SimpleOutputBuffer
      +
      init(long, int) - Method in class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer
      Initializes the buffer.
      -
      init(long, int, ByteBuffer) - Method in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      init(long, int, ByteBuffer) - Method in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Initializes the buffer.
      @@ -18872,6 +19481,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      init(ExtractorOutput) - Method in class com.google.android.exoplayer2.source.hls.WebvttExtractor
       
      +
      init(ExtractorOutput) - Method in class com.google.android.exoplayer2.text.SubtitleExtractor
      +
       
      init(BaseMediaChunkOutput) - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunk
      Initializes the chunk for loading, setting the BaseMediaChunkOutput that will receive @@ -18921,11 +19532,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Initializes the payload reader.
      -
      initForPrivateFrame(int, int) - Method in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      initForPrivateFrame(int, int) - Method in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      -
      Configures the buffer for the given frame dimensions when passing actual frame data via VideoDecoderOutputBuffer.decoderPrivate.
      +
      Configures the buffer for the given frame dimensions when passing actual frame data via VideoDecoderOutputBuffer.decoderPrivate.
      -
      initForYuvFrame(int, int, int, int, int) - Method in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      initForYuvFrame(int, int, int, int, int) - Method in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Resizes the buffer based on the given stride.
      @@ -18950,11 +19561,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Initialization data that must be provided to the decoder.
      initializationData - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      +
      +
      List of buffers containing the codec-specific data to be provided to the decoder.
      +
      initializationData - Variable in class com.google.android.exoplayer2.video.HevcConfig
      -
      List of buffers containing the codec-specific data to be provided to the decoder, or - null if not known.
      +
      List of buffers containing the codec-specific data to be provided to the decoder.
      initializationDataEquals(Format) - Method in class com.google.android.exoplayer2.Format
      @@ -19012,18 +19624,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      inputSize - Variable in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues
       
      +
      insert(Uri, ContentValues) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      INSTANCE - Static variable in class com.google.android.exoplayer2.upstream.DummyDataSource
       
      InsufficientCapacityException(int, int) - Constructor for exception com.google.android.exoplayer2.decoder.DecoderInputBuffer.InsufficientCapacityException
      Creates an instance.
      -
      IntArrayQueue - Class in com.google.android.exoplayer2.util
      -
      -
      Array-based unbounded queue for int primitives with amortized O(1) add and remove.
      -
      -
      IntArrayQueue() - Constructor for class com.google.android.exoplayer2.util.IntArrayQueue
      -
       
      integerElement(int, long) - Method in interface com.google.android.exoplayer2.extractor.mkv.EbmlProcessor
      Called when an integer element is encountered.
      @@ -19049,7 +19657,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      invalidateForegroundNotification() - Method in class com.google.android.exoplayer2.offline.DownloadService
      -
      Invalidates the current foreground notification and causes DownloadService.getForegroundNotification(List) to be invoked again if the service isn't stopped.
      +
      Invalidates the current foreground notification and causes DownloadService.getForegroundNotification(List, int) to be invoked again if the service isn't stopped.
      invalidateMediaSessionMetadata() - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
      @@ -19109,10 +19717,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      isActive() - Method in class com.google.android.exoplayer2.audio.SonicAudioProcessor
       
      -
      isActive() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      isAd() - Method in class com.google.android.exoplayer2.source.MediaPeriodId
      Returns whether this period identifier identifies an ad in an ad group in a period.
      @@ -19145,6 +19749,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether the decoder supports audio with a given sample rate.
      +
      isAutomotive(Context) - Static method in class com.google.android.exoplayer2.util.Util
      +
      +
      Returns whether the app is running on an automotive device.
      +
      isAvailable() - Static method in class com.google.android.exoplayer2.ext.av1.Gav1Library
      Returns whether the underlying library is available, loading it if necessary.
      @@ -19223,11 +19831,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether the decoder supports the codec of the given format.
      -
      isCommandAvailable(int) - Method in class com.google.android.exoplayer2.BasePlayer
      +
      isCommandAvailable(@com.google.android.exoplayer2.Player.Command int) - Method in class com.google.android.exoplayer2.BasePlayer
       
      -
      isCommandAvailable(int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
      isCommandAvailable(@com.google.android.exoplayer2.Player.Command int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
       
      -
      isCommandAvailable(int) - Method in interface com.google.android.exoplayer2.Player
      +
      isCommandAvailable(@com.google.android.exoplayer2.Player.Command int) - Method in interface com.google.android.exoplayer2.Player
      Returns whether the provided Player.Command is available.
      @@ -19243,6 +19851,32 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the DRM scheme with the given UUID is supported on this device.
      +
      isCurrentMediaItemDynamic() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      isCurrentMediaItemDynamic() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      isCurrentMediaItemDynamic() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether the current MediaItem is dynamic (may change when the Timeline + is updated), or false if the Timeline is empty.
      +
      +
      isCurrentMediaItemLive() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      isCurrentMediaItemLive() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      isCurrentMediaItemLive() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether the current MediaItem is live, or false if the Timeline + is empty.
      +
      +
      isCurrentMediaItemSeekable() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      isCurrentMediaItemSeekable() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      isCurrentMediaItemSeekable() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Returns whether the current MediaItem is seekable, or false if the Timeline is empty.
      +
      isCurrentStreamFinal() - Method in class com.google.android.exoplayer2.BaseRenderer
       
      isCurrentStreamFinal() - Method in class com.google.android.exoplayer2.NoSampleRenderer
      @@ -19253,30 +19887,46 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); renderer is next disabled or reset.
      isCurrentWindowDynamic() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowDynamic() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowDynamic() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether the current window is dynamic, or false if the Timeline is - empty.
      +
      Deprecated. + +
      isCurrentWindowLive() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowLive() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowLive() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether the current window is live, or false if the Timeline is empty.
      +
      Deprecated. + +
      isCurrentWindowSeekable() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowSeekable() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      isCurrentWindowSeekable() - Method in interface com.google.android.exoplayer2.Player
      -
      Returns whether the current window is seekable, or false if the Timeline is - empty.
      +
      Deprecated. + +
      isDecodeOnly() - Method in class com.google.android.exoplayer2.decoder.Buffer
      @@ -19284,7 +19934,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      isDeviceMuted() - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Gets whether the device is muted or not.
      +
      Deprecated. + +
      isDeviceMuted() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -19297,8 +19949,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Gets whether the device is muted or not.
      isDeviceMuted() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      isDeviceMuted() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      isDeviceMuted() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      isDone() - Method in class com.google.android.exoplayer2.util.RunnableFutureTask
       
      @@ -19320,10 +19974,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the timeline is empty.
      -
      isEmpty() - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      -
      -
      Returns whether the queue is empty.
      -
      isEnabled - Variable in class com.google.android.exoplayer2.testutil.FakeTrackSelection
       
      isEnabled() - Method in class com.google.android.exoplayer2.source.BaseMediaSource
      @@ -19369,10 +20019,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      isEnded() - Method in class com.google.android.exoplayer2.audio.SonicAudioProcessor
       
      -
      isEnded() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      isEnded() - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
       
      isEnded() - Method in class com.google.android.exoplayer2.metadata.MetadataRenderer
      @@ -19437,15 +20083,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether a fallback is available for the given fallback type.
      -
      isFastForwardEnabled() - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Returns true if fast forward is enabled, false otherwise.
      -
      -
      isFastForwardEnabled() - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      isFirst() - Method in interface com.google.android.exoplayer2.offline.DownloadCursor
      Returns whether the cursor is pointing to the first download.
      @@ -19490,6 +20127,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the device is required to be idle.
      +
      isImage(String) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      +
      +
      Returns whether the given string is an image MIME type.
      +
      isIndependent - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Part
      Whether the part is independent.
      @@ -19510,7 +20151,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the cursor is pointing to the last download.
      -
      isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      +
      isLastPeriod(int, Timeline.Period, Timeline.Window, @com.google.android.exoplayer2.Player.RepeatMode int, boolean) - Method in class com.google.android.exoplayer2.Timeline
      Returns whether the given period is the last period of the timeline depending on the repeatMode and whether shuffling is enabled.
      @@ -19574,7 +20215,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Whether the player is currently loading the source.
      isLoading() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      isLoading() - Method in class com.google.android.exoplayer2.source.chunk.ChunkSampleStream
       
      isLoading() - Method in class com.google.android.exoplayer2.source.ClippingMediaPeriod
      @@ -19597,7 +20240,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      isLoading() - Method in class com.google.android.exoplayer2.testutil.FakeMediaPeriod
       
      -
      isLoading() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      isLoading() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      isLoading() - Method in class com.google.android.exoplayer2.upstream.Loader
      @@ -19707,8 +20350,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the player is currently playing an ad.
      isPlayingAd() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      isPlayingAd() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      isPlayingAd() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      isPreload - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Part
      @@ -19797,7 +20442,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the renderer at the specified index is enabled.
      -
      isRepeatModeEnabled(int, int) - Static method in class com.google.android.exoplayer2.util.RepeatModeUtil
      +
      isRepeatModeEnabled(@com.google.android.exoplayer2.Player.RepeatMode int, int) - Static method in class com.google.android.exoplayer2.util.RepeatModeUtil
      Verifies whether a given repeatMode is enabled in the bitmask enabledModes.
      @@ -19813,15 +20458,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      isReusable() - Method in class com.google.android.exoplayer2.source.hls.MediaParserHlsMediaChunkExtractor
       
      -
      isRewindEnabled() - Method in interface com.google.android.exoplayer2.ControlDispatcher
      -
      -
      Deprecated.
      -
      Returns true if rewind is enabled, false otherwise.
      -
      -
      isRewindEnabled() - Method in class com.google.android.exoplayer2.DefaultControlDispatcher
      -
      -
      Deprecated.
      isRoot - Variable in class com.google.android.exoplayer2.metadata.id3.ChapterTocFrame
       
      isSeamlessAdaptationSupported(Format) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecInfo
      @@ -19869,6 +20505,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      isSegmentAvailableAtFullNetworkSpeed(long, long) - Method in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder
       
      +
      isSelected() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns if at least one track in a TrackGroup is selected for playback.
      +
      isServerSideInserted - Variable in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
      Whether this ad group is server-side inserted and part of the content stream.
      @@ -19878,6 +20518,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the ad group at index adGroupIndex is server-side inserted and part of the content stream.
      +
      isSetParametersSupported() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      +
       
      +
      isSetParametersSupported() - Method in class com.google.android.exoplayer2.trackselection.TrackSelector
      +
      +
      Returns if this TrackSelector supports TrackSelector.setParameters(TrackSelectionParameters).
      +
      isSimulatingUnknownLength() - Method in class com.google.android.exoplayer2.testutil.FakeDataSet.FakeData
      Returns whether unknown length is simulated
      @@ -19926,6 +20572,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the device is required to not be low on internal storage.
      +
      isSupported() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns if at least one track in a TrackGroup is supported.
      +
      isSupported(int, boolean) - Static method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      Returns true if the C.FormatSupport in the given RendererCapabilities.Capabilities is C.FORMAT_HANDLED or if allowExceedsCapabilities is set and the format support is @@ -19956,10 +20606,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether the rating is "thumbs up".
      +
      isTrackSelected(int) - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns if a track in a TrackGroup is selected for playback.
      +
      +
      isTrackSupported(int) - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Returns if a track in a TrackGroup is supported for playback.
      +
      isTv(Context) - Static method in class com.google.android.exoplayer2.util.Util
      Returns whether the app is running on a TV device.
      +
      isTypeSelected(@com.google.android.exoplayer2.C.TrackType int) - Method in class com.google.android.exoplayer2.TracksInfo
      +
      +
      Returns if at least one track of the type trackType is selected for playback.
      +
      +
      isTypeSupportedOrEmpty(@com.google.android.exoplayer2.C.TrackType int) - Method in class com.google.android.exoplayer2.TracksInfo
      +
      +
      Returns if there is at least one track of type trackType but none are supported.
      +
      isUnderline() - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      isUnmeteredNetworkRequired() - Method in class com.google.android.exoplayer2.scheduler.Requirements
      @@ -20084,20 +20750,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      KEY_EXO_PCM_ENCODING - Static variable in class com.google.android.exoplayer2.util.MediaFormatUtil
      -
      -
      Custom MediaFormat key associated with an integer representing the PCM encoding.
      -
      -
      KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT - Static variable in class com.google.android.exoplayer2.util.MediaFormatUtil
      -
      -
      Custom MediaFormat key associated with a float representing the ratio between a pixel's - width and height.
      -
      KEY_FOREGROUND - Static variable in class com.google.android.exoplayer2.offline.DownloadService
      Key for a boolean extra that can be set on any intent to indicate whether the service was started in the foreground.
      +
      KEY_PCM_ENCODING_EXTENDED - Static variable in class com.google.android.exoplayer2.util.MediaFormatUtil
      +
      +
      Custom MediaFormat key associated with an integer representing the PCM encoding.
      +
      +
      KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT - Static variable in class com.google.android.exoplayer2.util.MediaFormatUtil
      +
      +
      Custom MediaFormat key associated with a float representing the ratio between a pixel's + width and height.
      +
      KEY_REDIRECTED_URI - Static variable in interface com.google.android.exoplayer2.upstream.cache.ContentMetadata
      Key for redirected uri (type: String).
      @@ -20171,7 +20837,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The human readable label, or null if unknown or not applicable.
      -
      label - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      label - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      The label.
      @@ -20187,7 +20853,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The language as an IETF BCP 47 conformant tag, or null if unknown or not applicable.
      -
      language - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      language - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      The language.
      @@ -20367,6 +21033,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a new instance.
      +
      licenseRequestHeaders - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      +
      +
      The headers to attach to requests sent to the DRM license server.
      +
      licenseServerUrl - Variable in class com.google.android.exoplayer2.drm.DrmInitData.SchemeData
      The URL of the server to which license requests should be made.
      @@ -20408,7 +21078,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of the Cue.line value.
      -
      ListenerSet<T> - Class in com.google.android.exoplayer2.util
      +
      ListenerSet<T extends @NonNull Object> - Class in com.google.android.exoplayer2.util
      A set of listeners.
      @@ -20436,7 +21106,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      LiveConfiguration(long, long, long, float, float) - Constructor for class com.google.android.exoplayer2.MediaItem.LiveConfiguration
      -
      Creates a live playback configuration.
      +
      Deprecated. + +
      LiveContentUnsupportedException() - Constructor for exception com.google.android.exoplayer2.offline.DownloadHelper.LiveContentUnsupportedException
       
      @@ -20469,11 +21141,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Loads a single parsable object.
      +
      loadAsset(Context, String) - Static method in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Loads a file from the assets folder.
      +
      loadCanceled(LoadEventInfo, int) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      -
      loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      +
      loadCanceled(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -20493,7 +21169,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      +
      loadCompleted(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -20544,7 +21220,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A LoaderErrorThrower that never throws.
      -
      loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      +
      loadError(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long, IOException, boolean) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -20627,7 +21303,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      +
      loadStarted(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long) - Method in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -20647,6 +21323,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Identifies the load task for this loadable.
      +
      localConfiguration - Variable in class com.google.android.exoplayer2.MediaItem
      +
      +
      Optional configuration for local playback.
      +
      localeIndicator - Variable in class com.google.android.exoplayer2.metadata.mp4.MdtaMetadataEntry
      The four byte locale indicator.
      @@ -20711,7 +21391,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      LoopingMediaSource - Class in com.google.android.exoplayer2.source
      Deprecated. -
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) +
      To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class. To add a MediaSource a specific number of times to the playlist, use ExoPlayer.addMediaSource(com.google.android.exoplayer2.source.MediaSource) in a loop with the same MediaSource. To combine repeated MediaSource instances into one MediaSource, for example @@ -20829,16 +21509,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns whether this initialization data applies to the specified scheme.
      -
      matchesExpectedExoMediaCryptoType(Class<? extends ExoMediaCrypto>) - Static method in class com.google.android.exoplayer2.ext.opus.OpusLibrary
      -
      -
      Returns whether the given ExoMediaCrypto type matches the one required for decoding - protected content.
      -
      -
      matchesExpectedExoMediaCryptoType(Class<? extends ExoMediaCrypto>) - Static method in class com.google.android.exoplayer2.ext.vp9.VpxLibrary
      -
      -
      Returns whether the given ExoMediaCrypto type matches the one required for decoding - protected content.
      -
      MATROSKA - Static variable in class com.google.android.exoplayer2.util.FileTypes
      File type for the Matroska and WebM formats.
      @@ -20859,7 +21529,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The maximum number of frames that can be dropped between invocations of VideoRendererEventListener.onDroppedFrames(int, long).
      -
      MAX_FRAME_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      MAX_FRAME_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Maximum size of a FLAC frame header in bytes.
      @@ -20976,12 +21646,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Maximum allowed video width in pixels.
      -
      maxVolume - Variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      maxVolume - Variable in class com.google.android.exoplayer2.DeviceInfo
      The maximum volume that the device supports.
      maxWidth - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
       
      +
      maybeApplyOverride(MappingTrackSelector.MappedTrackInfo, DefaultTrackSelector.Parameters, int, ExoTrackSelection.Definition) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      +
      +
      Returns the ExoTrackSelection.Definition of a renderer after applying selection + overriding and renderer disabling.
      +
      maybeDropBuffersToKeyframe(long) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      Drops frames from the current output buffer to the next keyframe at or before the playback @@ -21009,7 +21684,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); permission for the specified media items, requesting the permission if necessary.
      -
      maybeSetArtworkData(byte[], int) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      +
      maybeSetArtworkData(byte[], @com.google.android.exoplayer2.MediaMetadata.PictureType int) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Sets the artwork data as a compressed byte array in the event that the associated MediaMetadata.PictureType is MediaMetadata.PICTURE_TYPE_FRONT_COVER, the existing MediaMetadata.PictureType is not MediaMetadata.PICTURE_TYPE_FRONT_COVER, or the current artworkData is not set.
      @@ -21242,7 +21917,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      An abstract renderer that uses MediaCodec to decode samples for rendering.
      -
      MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float) - Constructor for class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      +
      MediaCodecRenderer(@com.google.android.exoplayer2.C.TrackType int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float) - Constructor for class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
       
      MediaCodecRenderer.DecoderInitializationException - Exception in com.google.android.exoplayer2.mediacodec
      @@ -21271,6 +21946,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Decodes and renders video using MediaCodec.
      MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int) - Constructor for class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      +
       
      +
      MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int, float) - Constructor for class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      Creates a new instance.
      @@ -21320,6 +21997,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      MediaIdMediaItemProvider() - Constructor for class com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaIdMediaItemProvider
       
      +
      mediaItem - Variable in class com.google.android.exoplayer2.Player.PositionInfo
      +
      +
      The media item, or null if the timeline is empty.
      +
      mediaItem - Variable in class com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition
       
      mediaItem - Variable in class com.google.android.exoplayer2.Timeline.Window
      @@ -21334,30 +22015,68 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Configuration for playing back linear ads with a media item.
      +
      MediaItem.AdsConfiguration.Builder - Class in com.google.android.exoplayer2
      +
      +
      Builder for MediaItem.AdsConfiguration instances.
      +
      MediaItem.Builder - Class in com.google.android.exoplayer2
      A builder for MediaItem instances.
      -
      MediaItem.ClippingProperties - Class in com.google.android.exoplayer2
      +
      MediaItem.ClippingConfiguration - Class in com.google.android.exoplayer2
      Optionally clips the media item to a custom start and end position.
      +
      MediaItem.ClippingConfiguration.Builder - Class in com.google.android.exoplayer2
      +
      +
      Builder for MediaItem.ClippingConfiguration instances.
      +
      +
      MediaItem.ClippingProperties - Class in com.google.android.exoplayer2
      +
      +
      Deprecated. + +
      +
      MediaItem.DrmConfiguration - Class in com.google.android.exoplayer2
      DRM configuration for a media item.
      +
      MediaItem.DrmConfiguration.Builder - Class in com.google.android.exoplayer2
      +
      + +
      MediaItem.LiveConfiguration - Class in com.google.android.exoplayer2
      Live playback configuration.
      -
      MediaItem.PlaybackProperties - Class in com.google.android.exoplayer2
      +
      MediaItem.LiveConfiguration.Builder - Class in com.google.android.exoplayer2
      +
      +
      Builder for MediaItem.LiveConfiguration instances.
      +
      +
      MediaItem.LocalConfiguration - Class in com.google.android.exoplayer2
      Properties for local playback.
      +
      MediaItem.PlaybackProperties - Class in com.google.android.exoplayer2
      +
      +
      Deprecated. + +
      +
      MediaItem.Subtitle - Class in com.google.android.exoplayer2
      +
      Deprecated. + +
      +
      +
      MediaItem.SubtitleConfiguration - Class in com.google.android.exoplayer2
      +
      Properties for a text track.
      +
      MediaItem.SubtitleConfiguration.Builder - Class in com.google.android.exoplayer2
      +
      +
      Builder for MediaItem.SubtitleConfiguration instances.
      +
      MediaItemConverter - Interface in com.google.android.exoplayer2.ext.cast
      Converts between MediaItem and the Cast SDK's MediaQueueItem.
      @@ -21366,6 +22085,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Converts between Media2 MediaItem and ExoPlayer MediaItem.
      +
      mediaItemIndex - Variable in class com.google.android.exoplayer2.Player.PositionInfo
      +
      +
      The media item index.
      +
      mediaLoadData - Variable in class com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo
      MediaLoadData associated with the load that encountered an error.
      @@ -21378,7 +22101,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an instance with the given MediaLoadData.dataType.
      -
      MediaLoadData(int, int, Format, int, Object, long, long) - Constructor for class com.google.android.exoplayer2.source.MediaLoadData
      +
      MediaLoadData(int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long) - Constructor for class com.google.android.exoplayer2.source.MediaLoadData
      Creates media load data.
      @@ -21406,7 +22129,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      ChunkExtractor implemented on top of the platform's MediaParser.
      -
      MediaParserChunkExtractor(int, Format, List<Format>) - Constructor for class com.google.android.exoplayer2.source.chunk.MediaParserChunkExtractor
      +
      MediaParserChunkExtractor(@com.google.android.exoplayer2.C.TrackType int, Format, List<Format>) - Constructor for class com.google.android.exoplayer2.source.chunk.MediaParserChunkExtractor
      Creates a new instance.
      @@ -21685,7 +22408,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      Metadata(List<? extends Metadata.Entry>) - Constructor for class com.google.android.exoplayer2.metadata.Metadata
       
      -
      METADATA_BLOCK_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      METADATA_BLOCK_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Size of the header of a FLAC metadata block in bytes.
      @@ -21697,19 +22420,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Type for ID3 metadata in HLS streams.
      -
      METADATA_TYPE_PICTURE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      METADATA_TYPE_PICTURE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Picture metadata block type.
      -
      METADATA_TYPE_SEEK_TABLE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      METADATA_TYPE_SEEK_TABLE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Seek table metadata block type.
      -
      METADATA_TYPE_STREAM_INFO - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      METADATA_TYPE_STREAM_INFO - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Stream info metadata block type.
      -
      METADATA_TYPE_VORBIS_COMMENT - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      METADATA_TYPE_VORBIS_COMMENT - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Vorbis comment metadata block type.
      @@ -21784,13 +22507,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The mime type for which a decoder was being initialized.
      -
      mimeType - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      mimeType - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      The optional MIME type of the item, or null if unspecified.
      -
      mimeType - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      mimeType - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      -
      The MIME type.
      +
      The optional MIME type of the subtitle file, or null if unspecified.
      mimeType - Variable in class com.google.android.exoplayer2.metadata.flac.PictureFrame
      @@ -21813,7 +22536,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The minimum value for the validDataChannelTimeoutMs constructor parameter permitted by ANSI/CTA-608-E R-2014 Annex C.9.
      -
      MIN_FRAME_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      MIN_FRAME_HEADER_SIZE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Minimum size of a FLAC frame header in bytes.
      @@ -21890,7 +22613,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Minimum allowed video width in pixels.
      -
      minVolume - Variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      minVolume - Variable in class com.google.android.exoplayer2.DeviceInfo
      The minimum volume that the device supports.
      @@ -21906,7 +22629,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of encryption that has been applied.
      -
      mode - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      mode - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Output mode.
      @@ -22001,8 +22724,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Moves the media item range to the new index.
      moveMediaItems(int, int, int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      moveMediaItems(int, int, int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      moveMediaItems(int, int, int) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      moveMediaSource(int, int) - Method in class com.google.android.exoplayer2.source.ConcatenatingMediaSource
      @@ -22102,23 +22827,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      mpegFramesBetweenReference - Variable in class com.google.android.exoplayer2.metadata.id3.MlltFrame
       
      -
      MSG_CUSTOM_BASE - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_CUSTOM_BASE.
      -
      -
      MSG_CUSTOM_BASE - Static variable in interface com.google.android.exoplayer2.Renderer
      Applications or extensions may define custom MSG_* constants that can be passed to renderers.
      -
      MSG_SET_AUDIO_ATTRIBUTES - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_AUDIO_ATTRIBUTES.
      -
      -
      MSG_SET_AUDIO_ATTRIBUTES - Static variable in interface com.google.android.exoplayer2.Renderer
      A type of a message that can be passed to an audio renderer via ExoPlayer.createMessage(Target).
      @@ -22127,31 +22840,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of a message that can be passed to audio and video renderers via ExoPlayer.createMessage(Target).
      -
      MSG_SET_AUX_EFFECT_INFO - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_AUX_EFFECT_INFO.
      -
      -
      MSG_SET_AUX_EFFECT_INFO - Static variable in interface com.google.android.exoplayer2.Renderer
      A type of a message that can be passed to an audio renderer via ExoPlayer.createMessage(Target).
      -
      MSG_SET_CAMERA_MOTION_LISTENER - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_CAMERA_MOTION_LISTENER.
      -
      -
      MSG_SET_CAMERA_MOTION_LISTENER - Static variable in interface com.google.android.exoplayer2.Renderer
      The type of a message that can be passed to a camera motion renderer via ExoPlayer.createMessage(Target).
      -
      MSG_SET_SCALING_MODE - Static variable in class com.google.android.exoplayer2.C
      +
      MSG_SET_CHANGE_FRAME_RATE_STRATEGY - Static variable in interface com.google.android.exoplayer2.Renderer
      -
      Deprecated. -
      Use Renderer.MSG_SET_SCALING_MODE.
      -
      +
      The type of a message that can be passed to a video renderer via ExoPlayer.createMessage(Target).
      MSG_SET_SCALING_MODE - Static variable in interface com.google.android.exoplayer2.Renderer
      @@ -22162,18 +22861,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of a message that can be passed to an audio renderer via ExoPlayer.createMessage(Target).
      -
      MSG_SET_SURFACE - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_VIDEO_OUTPUT.
      -
      -
      -
      MSG_SET_VIDEO_FRAME_METADATA_LISTENER - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_VIDEO_FRAME_METADATA_LISTENER.
      -
      -
      MSG_SET_VIDEO_FRAME_METADATA_LISTENER - Static variable in interface com.google.android.exoplayer2.Renderer
      The type of a message that can be passed to a video renderer via ExoPlayer.createMessage(Target).
      @@ -22182,12 +22869,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of a message that can be passed to a video renderer via ExoPlayer.createMessage(Target).
      -
      MSG_SET_VOLUME - Static variable in class com.google.android.exoplayer2.C
      -
      -
      Deprecated. -
      Use Renderer.MSG_SET_VOLUME.
      -
      -
      MSG_SET_VOLUME - Static variable in interface com.google.android.exoplayer2.Renderer
      A type of a message that can be passed to an audio renderer via ExoPlayer.createMessage(Target).
      @@ -22199,6 +22880,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      msToUs(long) - Static method in class com.google.android.exoplayer2.C
      +
      Deprecated. + +
      +
      +
      msToUs(long) - Static method in class com.google.android.exoplayer2.util.Util
      +
      Converts a time in milliseconds to the corresponding time in microseconds, preserving C.TIME_UNSET values and C.TIME_END_OF_SOURCE values.
      multiRowAlignment - Variable in class com.google.android.exoplayer2.text.Cue
      @@ -22239,7 +22926,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      For H264 video tracks, the length in bytes of the NALUnitLength field in each sample.
      nalUnitLengthFieldLength - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      +
      +
      The length of the NAL unit length field in the bitstream's container, in bytes.
      +
      nalUnitLengthFieldLength - Variable in class com.google.android.exoplayer2.video.HevcConfig
      The length of the NAL unit length field in the bitstream's container, in bytes.
      @@ -22248,13 +22937,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Utility methods for handling H.264/AVC and H.265/HEVC NAL units.
      +
      NalUnitUtil.H265SpsData - Class in com.google.android.exoplayer2.util
      +
      +
      Holds data parsed from a H.265 sequence parameter set NAL unit.
      +
      NalUnitUtil.PpsData - Class in com.google.android.exoplayer2.util
      Holds data parsed from a picture parameter set NAL unit.
      NalUnitUtil.SpsData - Class in com.google.android.exoplayer2.util
      -
      Holds data parsed from a sequence parameter set NAL unit.
      +
      Holds data parsed from a H.264 sequence parameter set NAL unit.
      name - Variable in class com.google.android.exoplayer2.mediacodec.MediaCodecInfo
      @@ -22400,7 +23093,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a newly created dummy surface.
      -
      newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long) - Method in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
      +
      newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, int, long, long) - Method in class com.google.android.exoplayer2.source.dash.DefaultDashChunkSource
       
      newNoDataInstance() - Static method in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
      @@ -22437,7 +23130,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      next() - Method in interface com.google.android.exoplayer2.Player
      Deprecated. - +
      next() - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator
      @@ -22513,7 +23206,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      NoSampleRenderer() - Constructor for class com.google.android.exoplayer2.NoSampleRenderer
       
      -
      NOT_CACHED - Static variable in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      +
      NOT_CACHED - Static variable in class com.google.android.exoplayer2.upstream.CachedRegionTracker
       
      NOT_IN_LOOKUP_TABLE - Static variable in class com.google.android.exoplayer2.extractor.FlacStreamMetadata
      @@ -22801,13 +23494,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the audio attributes change.
      -
      onAudioAttributesChanged(AudioAttributes) - Method in interface com.google.android.exoplayer2.audio.AudioListener
      +
      onAudioAttributesChanged(AudioAttributes) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
      Deprecated.
      Called when the audio attributes change.
      -
      onAudioAttributesChanged(AudioAttributes) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      onAudioCapabilitiesChanged(AudioCapabilities) - Method in interface com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener
      Called when the audio capabilities change.
      @@ -22918,13 +23608,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the audio session ID changes.
      -
      onAudioSessionIdChanged(int) - Method in interface com.google.android.exoplayer2.audio.AudioListener
      +
      onAudioSessionIdChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
      Deprecated.
      Called when the audio session ID changes.
      -
      onAudioSessionIdChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      onAudioSessionIdChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the audio session ID changes.
      @@ -22966,7 +23653,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onAvailableCommandsChanged(Player.Commands) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      -
      Called when the value returned from Player.isCommandAvailable(int) changes for at least one +
      Called when the value returned from Player.isCommandAvailable(int) changes for at least one Player.Command.
      onAvailableCommandsChanged(Player.Commands) - Method in interface com.google.android.exoplayer2.Player.Listener
      @@ -23110,13 +23797,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onCodecReleased(String) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
       
      -
      onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver
      +
      onCommand(Player, String, Bundle, ResultReceiver) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver
      See MediaSessionCompat.Callback.onCommand(String, Bundle, ResultReceiver).
      -
      onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor
      +
      onCommand(Player, String, Bundle, ResultReceiver) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor
       
      -
      onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      +
      onCommand(Player, String, Bundle, ResultReceiver) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand) - Method in interface com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider
      @@ -23158,7 +23845,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onCreate() - Method in class com.google.android.exoplayer2.offline.DownloadService
       
      -
      onCreate(SQLiteDatabase) - Method in class com.google.android.exoplayer2.database.ExoDatabaseProvider
      +
      onCreate() - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      +
      onCreate(SQLiteDatabase) - Method in class com.google.android.exoplayer2.database.StandaloneDatabaseProvider
       
      onCreate(Bundle) - Method in class com.google.android.exoplayer2.testutil.HostActivity
       
      @@ -23170,29 +23859,31 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); ControllerInfo, String)
      is called.
      onCues(List<Cue>) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      +
      +
      Called when there is a change in the Cues.
      +
      onCues(List<Cue>) - Method in interface com.google.android.exoplayer2.text.TextOutput
      Called when there is a change in the Cues.
      onCues(List<Cue>) - Method in class com.google.android.exoplayer2.ui.SubtitleView
       
      -
      onCurrentWindowIndexChanged(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      +
      onCurrentMediaItemIndexChanged(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      -
      Called when the current window index changed.
      +
      Called when the current media item index changed.
      -
      onCurrentWindowIndexChanged(Player) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      -
       
      -
      onCustomAction(Player, ControlDispatcher, String, Bundle) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider
      -
      -
      Called when a custom action provided by this provider is sent to the media session.
      -
      -
      onCustomAction(Player, ControlDispatcher, String, Bundle) - Method in class com.google.android.exoplayer2.ext.mediasession.RepeatModeActionProvider
      +
      onCurrentMediaItemIndexChanged(Player) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      onCustomAction(Player, String, Intent) - Method in interface com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver
      Called when a custom action has been received.
      +
      onCustomAction(Player, String, Bundle) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider
      +
      +
      Called when a custom action provided by this provider is sent to the media session.
      +
      +
      onCustomAction(Player, String, Bundle) - Method in class com.google.android.exoplayer2.ext.mediasession.RepeatModeActionProvider
      +
       
      onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle) - Method in interface com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider
      Called when a controller has sent a custom command.
      @@ -23245,20 +23936,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onDetachedFromWindow() - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
       
      -
      onDeviceInfoChanged(DeviceInfo) - Method in interface com.google.android.exoplayer2.device.DeviceListener
      +
      onDeviceInfoChanged(DeviceInfo) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
      Deprecated.
      Called when the device information changes.
      -
      onDeviceInfoChanged(DeviceInfo) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      -
      onDeviceVolumeChanged(int, boolean) - Method in interface com.google.android.exoplayer2.device.DeviceListener
      +
      onDeviceVolumeChanged(int, boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
      Deprecated.
      Called when the device volume or mute state changes.
      -
      onDeviceVolumeChanged(int, boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      onDisabled() - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
       
      onDisabled() - Method in class com.google.android.exoplayer2.audio.MediaCodecAudioRenderer
      @@ -23301,29 +23986,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called to notify the selection of a position discontinuity.
      -
      onDowngrade(SQLiteDatabase, int, int) - Method in class com.google.android.exoplayer2.database.ExoDatabaseProvider
      +
      onDowngrade(SQLiteDatabase, int, int) - Method in class com.google.android.exoplayer2.database.StandaloneDatabaseProvider
       
      -
      onDownloadChanged(Download) - Method in class com.google.android.exoplayer2.offline.DownloadService
      -
      -
      Deprecated. -
      Some state change events may not be delivered to this method. Instead, use DownloadManager.addListener(DownloadManager.Listener) to register a listener directly to - the DownloadManager that you return through DownloadService.getDownloadManager().
      -
      -
      onDownloadChanged(DownloadManager, Download, Exception) - Method in interface com.google.android.exoplayer2.offline.DownloadManager.Listener
      Called when the state of a download changes.
      onDownloadChanged(DownloadManager, Download, Exception) - Method in class com.google.android.exoplayer2.robolectric.TestDownloadManagerListener
       
      -
      onDownloadRemoved(Download) - Method in class com.google.android.exoplayer2.offline.DownloadService
      -
      -
      Deprecated. -
      Some download removal events may not be delivered to this method. Instead, use - DownloadManager.addListener(DownloadManager.Listener) to register a listener - directly to the DownloadManager that you return through DownloadService.getDownloadManager().
      -
      -
      onDownloadRemoved(DownloadManager, Download) - Method in interface com.google.android.exoplayer2.offline.DownloadManager.Listener
      Called when a download is removed.
      @@ -23492,6 +24162,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onEnabled(boolean, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeAudioRenderer
       
      +
      onEnabled(boolean, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeRenderer
      +
       
      onEnabled(boolean, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeVideoRenderer
       
      onEnabled(boolean, boolean) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      @@ -23757,14 +24429,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called once loadTaskId will not be associated with any more load errors.
      -
      onMaxSeekToPreviousPositionChanged(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onMaxSeekToPreviousPositionChanged(long) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onMaxSeekToPreviousPositionChanged(int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onMaxSeekToPreviousPositionChanged(long) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the value of Player.getMaxSeekToPreviousPosition() changes.
      -
      onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, long) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the maximum position for which Player.seekToPrevious() seeks to the previous window changes.
      @@ -23773,27 +24445,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onMeasure(int, int) - Method in class com.google.android.exoplayer2.ui.DefaultTimeBar
       
      -
      onMediaButtonEvent(Player, ControlDispatcher, Intent) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler
      +
      onMediaButtonEvent(Player, Intent) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler
      See MediaSessionCompat.Callback.onMediaButtonEvent(Intent).
      -
      onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when playback transitions to a different media item.
      onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      -
      onMediaItemTransition(MediaItem, int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onMediaItemTransition(MediaItem, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when playback transitions to a media item or starts repeating a media item according to the current repeat mode.
      -
      onMediaItemTransition(MediaItem, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onMediaItemTransition(MediaItem, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      +
      onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -23825,7 +24497,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when there is metadata associated with current playback time.
      onMetadata(Metadata) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      +
      +
      Called when there is metadata associated with the current playback time.
      +
      onNetworkTypeChanged(int) - Method in interface com.google.android.exoplayer2.util.NetworkTypeObserver.Listener
      Called when the network type changed or when the listener is first registered.
      @@ -23901,43 +24575,43 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the renderer's playback speed changes.
      -
      onPlaybackStateChanged(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onPlaybackStateChanged(int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the value returned from Player.getPlaybackState() changes.
      -
      onPlaybackStateChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onPlaybackStateChanged(int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      +
      onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      -
      onPlaybackStateChanged(int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      +
      onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      -
      onPlaybackStateChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPlaybackStateChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.State int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the playback state changed.
      -
      onPlaybackStateChanged(AnalyticsListener.EventTime, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onPlaybackStateChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats) - Method in interface com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback
      Called when a playback session ends and its PlaybackStats are ready.
      -
      onPlaybackSuppressionReasonChanged(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onPlaybackSuppressionReasonChanged(int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the value returned from Player.getPlaybackSuppressionReason() changes.
      -
      onPlaybackSuppressionReasonChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when playback suppression reason changed.
      -
      onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      onPlayerError(AnalyticsListener.EventTime, PlaybackException) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -23969,18 +24643,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the Player is released.
      -
      onPlayerStateChanged(boolean, int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onPlayerStateChanged(boolean, @com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onPlayerStateChanged(boolean, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPlayerStateChanged(boolean, @com.google.android.exoplayer2.Player.State int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      -
      onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPlayerStateChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.State int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      onPlaylistChanged() - Method in class com.google.android.exoplayer2.source.hls.HlsMediaPeriod
      @@ -24014,22 +24688,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called to notify when the playback is paused or resumed.
      -
      onPlayWhenReadyChanged(boolean, int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onPlayWhenReadyChanged(boolean, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the value returned from Player.getPlayWhenReady() changes.
      -
      onPlayWhenReadyChanged(boolean, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onPlayWhenReadyChanged(boolean, int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      +
      onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      -
      onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the value changed that indicates whether playback will proceed when ready.
      -
      onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      onPositionAdvancing(long) - Method in interface com.google.android.exoplayer2.audio.AudioSink.Listener
      @@ -24049,41 +24723,41 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      onPositionDiscontinuity(int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPositionDiscontinuity(@com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      -
      onPositionDiscontinuity(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPositionDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      -
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when a position discontinuity occurred.
      -
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.analytics.PlaybackStatsListener
      +
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.analytics.PlaybackStatsListener
       
      -
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
       
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when a position discontinuity occurs.
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      -
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      onPositionReset() - Method in class com.google.android.exoplayer2.video.VideoFrameReleaseHelper
      @@ -24229,14 +24903,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called immediately before an input buffer is queued into the codec.
      +
      onQueueInputBuffer(DecoderInputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      +
      Called immediately before an input buffer is queued into the decoder.
      +
      onQueueInputBuffer(DecoderInputBuffer) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      Called immediately before an input buffer is queued into the codec.
      -
      onQueueInputBuffer(VideoDecoderInputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      -
      -
      Called immediately before an input buffer is queued into the decoder.
      -
      onRebuffer() - Method in interface com.google.android.exoplayer2.trackselection.ExoTrackSelection
      Called to notify when a rebuffer occurred.
      @@ -24261,10 +24935,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onRemoveQueueItem(Player, MediaDescriptionCompat) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor
       
      onRenderedFirstFrame() - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      -
      onRenderedFirstFrame() - Method in interface com.google.android.exoplayer2.video.VideoListener
      -
      Deprecated.
      Called when a frame is rendered for the first time since setting the surface, or since the renderer was reset, or since the stream being rendered was changed.
      @@ -24286,22 +24957,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the renderer's offset has been changed.
      -
      onRepeatModeChanged(int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onRepeatModeChanged(int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
      +
      onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
       
      -
      onRepeatModeChanged(int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the value of Player.getRepeatMode() changes.
      -
      onRepeatModeChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onRepeatModeChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onRepeatModeChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.RepeatMode int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the repeat mode changed.
      -
      onRepeatModeChanged(AnalyticsListener.EventTime, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onRepeatModeChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      onRequirementsStateChanged(DownloadManager, Requirements, int) - Method in interface com.google.android.exoplayer2.offline.DownloadManager.Listener
      @@ -24331,6 +25002,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the renderer is reset.
      +
      onReset() - Method in class com.google.android.exoplayer2.testutil.FakeRenderer
      +
       
      onReset() - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
       
      onResume() - Method in class com.google.android.exoplayer2.ui.PlayerView
      @@ -24406,20 +25079,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onSeekProcessed() - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated. - +
      onSeekProcessed(AnalyticsListener.EventTime) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      onSeekStarted(AnalyticsListener.EventTime) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -24490,11 +25163,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onSkipSilenceEnabledChanged(boolean) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onSkipSilenceEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.audio.AudioListener
      -
      -
      Deprecated.
      -
      Called when skipping silences is enabled or disabled in the audio stream.
      -
      onSkipSilenceEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.audio.AudioRendererEventListener
      Called when skipping silences is enabled or disabled in the audio stream.
      @@ -24504,30 +25172,32 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when skipping silences is enabled or disabled.
      onSkipSilenceEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      +
      +
      Called when skipping silences is enabled or disabled in the audio stream.
      +
      onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when skipping silences is enabled or disabled in the audio stream.
      onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      -
      onSkipToNext(Player, ControlDispatcher) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      +
      onSkipToNext(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      See MediaSessionCompat.Callback.onSkipToNext().
      -
      onSkipToNext(Player, ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      +
      onSkipToNext(Player) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      -
      onSkipToPrevious(Player, ControlDispatcher) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      +
      onSkipToPrevious(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      See MediaSessionCompat.Callback.onSkipToPrevious().
      -
      onSkipToPrevious(Player, ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      +
      onSkipToPrevious(Player) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      -
      onSkipToQueueItem(Player, ControlDispatcher, long) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      +
      onSkipToQueueItem(Player, long) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      See MediaSessionCompat.Callback.onSkipToQueueItem(long).
      -
      onSkipToQueueItem(Player, ControlDispatcher, long) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
      +
      onSkipToQueueItem(Player, long) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      onSleep(long) - Method in interface com.google.android.exoplayer2.Renderer.WakeupListener
      @@ -24545,32 +25215,32 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when a CacheSpan is added to the cache.
      -
      onSpanAdded(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      -
       
      onSpanAdded(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
       
      onSpanAdded(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor
       
      +
      onSpanAdded(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.CachedRegionTracker
      +
       
      onSpanRemoved(Cache, CacheSpan) - Method in interface com.google.android.exoplayer2.upstream.cache.Cache.Listener
      Called when a CacheSpan is removed from the cache.
      -
      onSpanRemoved(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      -
       
      onSpanRemoved(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
       
      onSpanRemoved(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor
       
      +
      onSpanRemoved(Cache, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.CachedRegionTracker
      +
       
      onSpanTouched(Cache, CacheSpan, CacheSpan) - Method in interface com.google.android.exoplayer2.upstream.cache.Cache.Listener
      Called when an existing CacheSpan is touched, causing it to be replaced.
      -
      onSpanTouched(Cache, CacheSpan, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      -
       
      onSpanTouched(Cache, CacheSpan, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor
       
      onSpanTouched(Cache, CacheSpan, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor
       
      +
      onSpanTouched(Cache, CacheSpan, CacheSpan) - Method in class com.google.android.exoplayer2.upstream.CachedRegionTracker
      +
       
      onStart() - Method in class com.google.android.exoplayer2.testutil.HostActivity
       
      onStart(HostActivity, Surface, FrameLayout) - Method in class com.google.android.exoplayer2.testutil.ExoHostedTest
      @@ -24613,26 +25283,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onStartJob(JobParameters) - Method in class com.google.android.exoplayer2.scheduler.PlatformScheduler.PlatformSchedulerService
       
      -
      onStaticMetadataChanged(AnalyticsListener.EventTime, List<Metadata>) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      -
      -
      Deprecated. -
      Use Player.getMediaMetadata() and AnalyticsListener.onMediaMetadataChanged(EventTime, - MediaMetadata) for access to structured metadata, or access the raw static metadata - directly from the track selections' formats.
      -
      -
      -
      onStaticMetadataChanged(List<Metadata>) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      -
      -
      Deprecated.
      -
      -
      onStaticMetadataChanged(List<Metadata>) - Method in interface com.google.android.exoplayer2.Player.EventListener
      -
      -
      Deprecated. -
      Use Player.getMediaMetadata() and Player.EventListener.onMediaMetadataChanged(MediaMetadata) for access to structured metadata, or access the - raw static metadata directly from the track - selections' formats.
      -
      -
      onStop() - Method in class com.google.android.exoplayer2.testutil.HostActivity
       
      onStopJob(JobParameters) - Method in class com.google.android.exoplayer2.scheduler.PlatformScheduler.PlatformSchedulerService
      @@ -24693,10 +25343,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); rendered.
      onSurfaceSizeChanged(int, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      -
      onSurfaceSizeChanged(int, int) - Method in interface com.google.android.exoplayer2.video.VideoListener
      -
      Deprecated.
      Called each time there's a change in the size of the surface onto which the video is being rendered.
      @@ -24717,11 +25364,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onThreadBlocked() - Method in class com.google.android.exoplayer2.util.SystemClock
       
      -
      onTimelineChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      onTimelineChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the timeline changed.
      -
      onTimelineChanged(AnalyticsListener.EventTime, int) - Method in class com.google.android.exoplayer2.util.EventLogger
      +
      onTimelineChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      onTimelineChanged(Player) - Method in interface com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator
      @@ -24729,18 +25376,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onTimelineChanged(Player) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator
       
      -
      onTimelineChanged(Timeline, int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
      onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      -
      onTimelineChanged(Timeline, int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
      +
      onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
       
      -
      onTimelineChanged(Timeline, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      Deprecated.
      Called when the timeline has been refreshed.
      -
      onTimelineChanged(Timeline, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
      onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in interface com.google.android.exoplayer2.Player.Listener
       
      -
      onTimelineChanged(Timeline, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      +
      onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onTouchEvent(MotionEvent) - Method in class com.google.android.exoplayer2.ui.DefaultTimeBar
       
      @@ -24758,7 +25405,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      -
      Called when the available or selected tracks for the renderers changed.
      +
      onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray) - Method in class com.google.android.exoplayer2.util.EventLogger
       
      @@ -24766,22 +25415,37 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      onTracksChanged(TrackGroupArray, TrackSelectionArray) - Method in interface com.google.android.exoplayer2.Player.EventListener
      -
      Deprecated.
      -
      Called when the available or selected tracks change.
      +
      -
      onTracksChanged(TrackGroupArray, TrackSelectionArray) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      -
      onTracksChanged(TrackGroupArray, TrackSelectionArray) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
       
      onTrackSelectionChanged(boolean, List<DefaultTrackSelector.SelectionOverride>) - Method in interface com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener
      Called when the selected tracks changed.
      +
      onTrackSelectionParametersChanged(TrackSelectionParameters) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      +
      Deprecated.
      +
      Called when the value returned from Player.getTrackSelectionParameters() changes.
      +
      onTrackSelectionsInvalidated() - Method in interface com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener
      Called by a TrackSelector to indicate that selections it has previously made are no longer valid.
      +
      onTracksInfoChanged(AnalyticsListener.EventTime, TracksInfo) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      +
      +
      Called when the available or selected tracks change.
      +
      +
      onTracksInfoChanged(TracksInfo) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      +
       
      +
      onTracksInfoChanged(TracksInfo) - Method in interface com.google.android.exoplayer2.Player.EventListener
      +
      +
      Deprecated.
      +
      Called when the available or selected tracks change.
      +
      +
      onTracksInfoChanged(TracksInfo) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onTracksSelected(boolean, List<DefaultTrackSelector.SelectionOverride>) - Method in interface com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback
      Called when tracks are selected.
      @@ -24826,10 +25490,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when a transfer starts.
      +
      onTransformationCompleted(MediaItem) - Method in interface com.google.android.exoplayer2.transformer.TranscodingTransformer.Listener
      +
      +
      Called when the transformation is completed.
      +
      onTransformationCompleted(MediaItem) - Method in interface com.google.android.exoplayer2.transformer.Transformer.Listener
      Called when the transformation is completed.
      +
      onTransformationError(MediaItem, Exception) - Method in interface com.google.android.exoplayer2.transformer.TranscodingTransformer.Listener
      +
      +
      Called if an error occurs during the transformation.
      +
      onTransformationError(MediaItem, Exception) - Method in interface com.google.android.exoplayer2.transformer.Transformer.Listener
      Called if an error occurs during the transformation.
      @@ -24846,7 +25518,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the audio sink runs out of data.
      -
      onUpgrade(SQLiteDatabase, int, int) - Method in class com.google.android.exoplayer2.database.ExoDatabaseProvider
      +
      onUpgrade(SQLiteDatabase, int, int) - Method in class com.google.android.exoplayer2.database.StandaloneDatabaseProvider
       
      onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      @@ -24973,12 +25645,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the format of the media being consumed by the renderer changes.
      -
      onVideoSizeChanged(int, int, int, float) - Method in interface com.google.android.exoplayer2.video.VideoListener
      -
      - -
      onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Deprecated. @@ -24997,10 +25663,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      onVideoSizeChanged(VideoSize) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      onVideoSizeChanged(VideoSize) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      -
      onVideoSizeChanged(VideoSize) - Method in interface com.google.android.exoplayer2.video.VideoListener
      -
      Deprecated.
      Called each time there's a change in the size of the video being rendered.
      onVideoSizeChanged(VideoSize) - Method in interface com.google.android.exoplayer2.video.VideoRendererEventListener
      @@ -25028,13 +25691,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Called when the volume changes.
      -
      onVolumeChanged(float) - Method in interface com.google.android.exoplayer2.audio.AudioListener
      +
      onVolumeChanged(float) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
      Deprecated.
      Called when the volume changes.
      -
      onVolumeChanged(float) - Method in interface com.google.android.exoplayer2.Player.Listener
      -
       
      onVolumeChanged(AnalyticsListener.EventTime, float) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the volume changes.
      @@ -25120,24 +25780,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      open(DataSpec) - Method in class com.google.android.exoplayer2.upstream.UdpDataSource
       
      -
      OpenException(DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      +
      openAssetFile(Uri, String) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      +
      OpenException(DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      +
       
      +
      OpenException(IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
       
      OpenException(IOException, DataSpec, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      -
      OpenException(IOException, DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      +
      OpenException(String, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
       
      OpenException(String, DataSpec, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      -
      OpenException(String, DataSpec, int, int) - Constructor for exception com.google.android.exoplayer2.ext.cronet.CronetDataSource.OpenException
      -
       
      openRead() - Method in class com.google.android.exoplayer2.util.AtomicFile
      Open the atomic file for reading.
      @@ -25156,7 +25818,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Opus decoder.
      -
      OpusDecoder(int, int, int, List<byte[]>, ExoMediaCrypto, boolean) - Constructor for class com.google.android.exoplayer2.ext.opus.OpusDecoder
      +
      OpusDecoder(int, int, int, List<byte[]>, CryptoConfig, boolean) - Constructor for class com.google.android.exoplayer2.ext.opus.OpusDecoder
      Creates an Opus decoder.
      @@ -25190,31 +25852,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The current output audio format.
      -
      OutputBuffer - Class in com.google.android.exoplayer2.decoder
      -
      -
      Output buffer decoded by a Decoder.
      -
      -
      OutputBuffer() - Constructor for class com.google.android.exoplayer2.decoder.OutputBuffer
      -
       
      -
      OutputBuffer.Owner<S extends OutputBuffer> - Interface in com.google.android.exoplayer2.decoder
      -
      -
      Buffer owner.
      -
      OutputConsumerAdapterV30 - Class in com.google.android.exoplayer2.source.mediaparser
      MediaParser.OutputConsumer implementation that redirects output to an ExtractorOutput.
      OutputConsumerAdapterV30() - Constructor for class com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
      -
      -
      OutputConsumerAdapterV30(Format, int, boolean) - Constructor for class com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
      +
      OutputConsumerAdapterV30(Format, @com.google.android.exoplayer2.C.TrackType int, boolean) - Constructor for class com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
      Creates a new instance.
      outputFloat - Variable in class com.google.android.exoplayer2.ext.opus.OpusDecoder
       
      +
      outputPendingSampleMetadata(TrackOutput, TrackOutput.CryptoData) - Method in class com.google.android.exoplayer2.extractor.TrueHdSampleRechunker
      +
       
      overallRating - Variable in class com.google.android.exoplayer2.MediaMetadata
      Optional overall Rating.
      @@ -25539,6 +26193,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      parseFrameRate(XmlPullParser, float) - Static method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      +
      parseH265SpsNalUnit(byte[], int, int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      +
      +
      Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) + subsection 7.3.2.2.1.
      +
      +
      parseH265SpsNalUnitPayload(byte[], int, int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      +
      +
      Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in + ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.
      +
      parseInitialization(XmlPullParser) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      parseInt(XmlPullParser, String, int) - Static method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
      @@ -25573,6 +26237,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.2.
      +
      parsePpsNalUnitPayload(byte[], int, int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      +
      +
      Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.2.
      +
      parseProgramInformation(XmlPullParser) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      parseRangedUrl(XmlPullParser, String, String) - Method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
      @@ -25615,9 +26284,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      parseSpsNalUnit(byte[], int, int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      -
      Parses an SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection +
      Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.
      +
      parseSpsNalUnitPayload(byte[], int, int) - Static method in class com.google.android.exoplayer2.util.NalUnitUtil
      +
      +
      Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T + Recommendation H.264 (2013) subsection 7.3.2.1.1.
      +
      parseString(XmlPullParser, String, String) - Static method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
       
      parseText(XmlPullParser, String) - Static method in class com.google.android.exoplayer2.source.dash.manifest.DashManifestParser
      @@ -25860,7 +26534,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      periodUid - Variable in class com.google.android.exoplayer2.Player.PositionInfo
      -
      The UID of the period, or null, if the timeline is empty.
      +
      The UID of the period, or null if the timeline is empty.
      periodUid - Variable in class com.google.android.exoplayer2.source.MediaPeriodId
      @@ -25964,14 +26638,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The factor by which pitch will be shifted.
      -
      pixelWidthAspectRatio - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
      -
       
      -
      pixelWidthAspectRatio - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.Format
      The width to height ratio of pixels in the video, or 1.0 if unknown or not applicable.
      +
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      +
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
      +
       
      +
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.video.AvcConfig
      +
      +
      The pixel width to height ratio.
      +
      +
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.video.HevcConfig
      +
      +
      The pixel width to height ratio.
      +
      pixelWidthHeightRatio - Variable in class com.google.android.exoplayer2.video.VideoSize
      The width to height ratio of each pixel, 1 if unknown.
      @@ -26042,6 +26724,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      playActionIconResourceId - Variable in class com.google.android.exoplayer2.ui.PlayerNotificationManager.Builder
       
      +
      PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED - Static variable in class com.google.android.exoplayer2.C
      +
      +
      See AudioManager#PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED
      +
      +
      PLAYBACK_OFFLOAD_NOT_SUPPORTED - Static variable in class com.google.android.exoplayer2.C
      +
      +
      See AudioManager#PLAYBACK_OFFLOAD_NOT_SUPPORTED
      +
      +
      PLAYBACK_OFFLOAD_SUPPORTED - Static variable in class com.google.android.exoplayer2.C
      +
      +
      See AudioManager#PLAYBACK_OFFLOAD_SUPPORTED
      +
      PLAYBACK_STATE_ABANDONED - Static variable in class com.google.android.exoplayer2.analytics.PlaybackStats
      Playback is abandoned before reaching the end of the media.
      @@ -26110,11 +26804,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Playback is suppressed due to transient audio focus loss.
      -
      PLAYBACK_TYPE_LOCAL - Static variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      PLAYBACK_TYPE_LOCAL - Static variable in class com.google.android.exoplayer2.DeviceInfo
      Playback happens on the local device (e.g.
      -
      PLAYBACK_TYPE_REMOTE - Static variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      PLAYBACK_TYPE_REMOTE - Static variable in class com.google.android.exoplayer2.DeviceInfo
      Playback happens outside of the device (e.g.
      @@ -26130,11 +26824,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates a new instance using the fields obtained from the given Bundle.
      -
      PlaybackException(String, Throwable, int) - Constructor for exception com.google.android.exoplayer2.PlaybackException
      +
      PlaybackException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.PlaybackException
      Creates an instance.
      -
      PlaybackException(String, Throwable, int, long) - Constructor for exception com.google.android.exoplayer2.PlaybackException
      +
      PlaybackException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, long) - Constructor for exception com.google.android.exoplayer2.PlaybackException
      Creates a new instance using the given values.
      @@ -26168,7 +26862,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      playbackProperties - Variable in class com.google.android.exoplayer2.MediaItem
      -
      Optional playback properties.
      +
      Deprecated. + +
      PlaybackSessionManager - Interface in com.google.android.exoplayer2.analytics
      @@ -26216,7 +26912,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A listener for PlaybackStats updates.
      -
      playbackType - Variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      playbackType - Variable in class com.google.android.exoplayer2.DeviceInfo
      The type of playback.
      @@ -26450,15 +27146,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      PlayUntilPosition(String, int, long) - Constructor for class com.google.android.exoplayer2.testutil.Action.PlayUntilPosition
       
      -
      playUntilStartOfWindow(int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      +
      playUntilStartOfMediaItem(int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      -
      Schedules a play action, waits until the player reaches the start of the specified window, - and pauses the player again.
      +
      Schedules a play action, waits until the player reaches the start of the specified media + item, and pauses the player again.
      -
      playUntilStartOfWindow(ExoPlayer, int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      +
      playUntilStartOfMediaItem(ExoPlayer, int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      Calls Player.play(), runs tasks of the main Looper until the player - reaches the specified window or a playback error occurs, and then pauses the player.
      + reaches the specified media item or a playback error occurs, and then pauses the + player.
      pointOffsets - Variable in class com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable
      @@ -26481,6 +27178,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the value with the greatest timestamp which is less than or equal to the given timestamp.
      +
      populate(MediaMetadata) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      +
      +
      Populates all the fields from mediaMetadata, provided they are non-null.
      +
      populateFromMetadata(Metadata) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Sets all fields supported by the entries within the Metadata.
      @@ -26573,10 +27274,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The position of the start of this window relative to the start of the first period belonging to it, in microseconds.
      -
      PositionInfo(Object, int, Object, int, long, long, int, int) - Constructor for class com.google.android.exoplayer2.Player.PositionInfo
      +
      PositionInfo(Object, int, MediaItem, Object, int, long, long, int, int) - Constructor for class com.google.android.exoplayer2.Player.PositionInfo
      Creates an instance.
      +
      PositionInfo(Object, int, Object, int, long, long, int, int) - Constructor for class com.google.android.exoplayer2.Player.PositionInfo
      +
      + +
      positionInWindowUs - Variable in class com.google.android.exoplayer2.Timeline.Period
      The position of the start of this period relative to the start of the window to which it @@ -26664,17 +27372,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Prepares the player.
      prepare() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      prepare() - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a prepare action to be executed.
      -
      prepare() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
      - -
      +
      prepare() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      prepare(DownloadHelper.Callback) - Method in class com.google.android.exoplayer2.offline.DownloadHelper
      Initializes the helper for starting a download.
      @@ -26707,9 +27413,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      prepare(MediaSource) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      - +
      Deprecated.
      prepare(MediaSource, boolean, boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -26726,10 +27430,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      prepare(MediaSource, boolean, boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      - +
      Deprecated.
      Prepare(String) - Constructor for class com.google.android.exoplayer2.testutil.Action.Prepare
       
      @@ -26819,7 +27520,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      previous() - Method in interface com.google.android.exoplayer2.Player
      Deprecated. - +
      PREVIOUS_SYNC - Static variable in class com.google.android.exoplayer2.SeekParameters
      @@ -26848,12 +27549,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      PriorityDataSource(DataSource, PriorityTaskManager, int) - Constructor for class com.google.android.exoplayer2.upstream.PriorityDataSource
       
      +
      PriorityDataSource.Factory - Class in com.google.android.exoplayer2.upstream
      +
      + +
      PriorityDataSourceFactory - Class in com.google.android.exoplayer2.upstream
      -
      A DataSource.Factory that produces PriorityDataSource instances.
      +
      Deprecated. + +
      PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int) - Constructor for class com.google.android.exoplayer2.upstream.PriorityDataSourceFactory
      -
       
      +
      +
      Deprecated.
      PriorityTaskManager - Class in com.google.android.exoplayer2.util
      Allows tasks with associated priorities to control how they proceed relative to one another.
      @@ -26908,6 +27617,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      profileIdc - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      +
      Program(Context, String, String) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code.
      +
      +
      Program(String[], String[]) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code.
      +
      +
      Program(String, String) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Compiles a GL shader program from vertex and fragment shader GLSL GLES20 code.
      +
      programInformation - Variable in class com.google.android.exoplayer2.source.dash.manifest.DashManifest
      The ProgramInformation, or null if not present.
      @@ -26939,18 +27660,35 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The held progress, expressed as an integer percentage.
      +
      PROGRESS_STATE_AVAILABLE - Static variable in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Indicates that the progress is available.
      +
      PROGRESS_STATE_AVAILABLE - Static variable in class com.google.android.exoplayer2.transformer.Transformer
      Indicates that the progress is available.
      +
      PROGRESS_STATE_NO_TRANSFORMATION - Static variable in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Indicates that there is no current transformation.
      +
      PROGRESS_STATE_NO_TRANSFORMATION - Static variable in class com.google.android.exoplayer2.transformer.Transformer
      Indicates that there is no current transformation.
      +
      PROGRESS_STATE_UNAVAILABLE - Static variable in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Indicates that the progress is permanently unavailable for the current transformation.
      +
      PROGRESS_STATE_UNAVAILABLE - Static variable in class com.google.android.exoplayer2.transformer.Transformer
      Indicates that the progress is permanently unavailable for the current transformation.
      +
      PROGRESS_STATE_WAITING_FOR_AVAILABILITY - Static variable in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Indicates that the progress is unavailable for the current transformation, but might become + available.
      +
      PROGRESS_STATE_WAITING_FOR_AVAILABILITY - Static variable in class com.google.android.exoplayer2.transformer.Transformer
      Indicates that the progress is unavailable for the current transformation, but might become @@ -27126,6 +27864,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

      Q

      +
      query(Uri, String[], String, String[], String) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      queryKeyStatus() - Method in interface com.google.android.exoplayer2.drm.DrmSession
      Returns a map describing the key status for the session, or null if called before the session @@ -27151,10 +27891,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      queueEndOfStream() - Method in class com.google.android.exoplayer2.audio.SonicAudioProcessor
       
      -
      queueEndOfStream() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      queueEvent(int, ListenerSet.Event<T>) - Method in class com.google.android.exoplayer2.util.ListenerSet
      Adds an event that is sent to the listeners when ListenerSet.flushEvents() is called.
      @@ -27169,16 +27905,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      queueInput(ByteBuffer) - Method in class com.google.android.exoplayer2.audio.TeeAudioProcessor
       
      -
      queueInput(ByteBuffer) - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      queueInputBuffer(int, int, int, long, int) - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      Submit an input buffer for decoding.
      queueInputBuffer(int, int, int, long, int) - Method in class com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter
       
      +
      queueInputBuffer(SubtitleInputBuffer) - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      queueInputBuffer(I) - Method in interface com.google.android.exoplayer2.decoder.Decoder
      Queues an input buffer to the decoder.
      @@ -27260,17 +27994,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      RawResourceDataSourceException(String) - Constructor for exception com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException
      -
      RawResourceDataSourceException(String, Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException
      +
      RawResourceDataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException
      Creates a new instance.
      RawResourceDataSourceException(Throwable) - Constructor for exception com.google.android.exoplayer2.upstream.RawResourceDataSource.RawResourceDataSourceException
      read() - Method in class com.google.android.exoplayer2.upstream.DataSourceInputStream
      @@ -27393,6 +28127,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      read(ExtractorInput, PositionHolder) - Method in class com.google.android.exoplayer2.source.hls.WebvttExtractor
       
      +
      read(ExtractorInput, PositionHolder) - Method in class com.google.android.exoplayer2.text.SubtitleExtractor
      +
       
      read(PositionHolder) - Method in class com.google.android.exoplayer2.source.BundledExtractorsAdapter
       
      read(PositionHolder) - Method in class com.google.android.exoplayer2.source.MediaParserExtractorAdapter
      @@ -27506,7 +28242,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Reads the next eight bytes as a 64-bit floating point value.
      -
      readExactly(DataSource, int) - Static method in class com.google.android.exoplayer2.util.Util
      +
      readExactly(DataSource, int) - Static method in class com.google.android.exoplayer2.upstream.DataSourceUtil
      Reads length bytes from the specified opened DataSource, and returns a byte array containing the read data.
      @@ -27647,7 +28383,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Reads a Synchsafe integer.
      -
      readToEnd(DataSource) - Static method in class com.google.android.exoplayer2.util.Util
      +
      readToEnd(DataSource) - Static method in class com.google.android.exoplayer2.upstream.DataSourceUtil
      Reads data from the specified opened DataSource until it ends, and returns a byte array containing the read data.
      @@ -27816,7 +28552,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Registers the receiver, meaning it will notify the listener when audio capability changes occur.
      -
      register(SimpleExoPlayer, CapturingRenderersFactory) - Static method in class com.google.android.exoplayer2.robolectric.PlaybackOutput
      +
      register(ExoPlayer, CapturingRenderersFactory) - Static method in class com.google.android.exoplayer2.robolectric.PlaybackOutput
      Create an instance that captures the metadata and text output from player and the audio and video output via capturingRenderersFactory.
      @@ -27829,7 +28565,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Registers a custom command receiver for responding to commands delivered via MediaSessionCompat.Callback.onCommand(String, Bundle, ResultReceiver).
      -
      registerCustomMimeType(String, String, int) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      +
      registerCustomMimeType(String, String, @com.google.android.exoplayer2.C.TrackType int) - Static method in class com.google.android.exoplayer2.util.MimeTypes
      Registers a custom MIME type.
      @@ -27853,12 +28589,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The start time of the segment in microseconds, relative to the start of the playlist.
      -
      relativeToDefaultPosition - Variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      relativeToDefaultPosition - Variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      -
      -
      relativeToLiveWindow - Variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      relativeToLiveWindow - Variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      Whether the clipping of active media periods moves with a live window.
      @@ -27870,13 +28606,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Releases the decoder.
      -
      release() - Method in class com.google.android.exoplayer2.decoder.OutputBuffer
      +
      release() - Method in class com.google.android.exoplayer2.decoder.DecoderOutputBuffer
      Releases the output buffer for reuse.
      release() - Method in class com.google.android.exoplayer2.decoder.SimpleDecoder
       
      -
      release() - Method in class com.google.android.exoplayer2.decoder.SimpleOutputBuffer
      +
      release() - Method in class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer
      +
       
      +
      release() - Method in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      release() - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager
       
      @@ -27971,7 +28709,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Releases the player.
      release() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      release() - Method in interface com.google.android.exoplayer2.source.ads.AdsLoader
      Releases the loader.
      @@ -28044,18 +28784,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Releases the runner.
      -
      release() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      release() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      release() - Method in class com.google.android.exoplayer2.text.cea.Cea608Decoder
       
      +
      release() - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      +
      release() - Method in class com.google.android.exoplayer2.text.SubtitleExtractor
      +
      +
      Releases the extractor's resources, including the SubtitleDecoder.
      +
      release() - Method in interface com.google.android.exoplayer2.upstream.cache.Cache
      Releases the cache.
      -
      release() - Method in class com.google.android.exoplayer2.upstream.cache.CachedRegionTracker
      -
       
      release() - Method in class com.google.android.exoplayer2.upstream.cache.SimpleCache
       
      +
      release() - Method in class com.google.android.exoplayer2.upstream.CachedRegionTracker
      +
       
      release() - Method in class com.google.android.exoplayer2.upstream.Loader
      Releases the loader.
      @@ -28070,8 +28816,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      release() - Method in class com.google.android.exoplayer2.video.DummySurface
       
      -
      release() - Method in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      -
       
      release(DrmSessionEventListener.EventDispatcher) - Method in interface com.google.android.exoplayer2.drm.DrmSession
      Decrements the reference count.
      @@ -28150,15 +28894,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      releaseOutputBuffer(int, long) - Method in class com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter
       
      -
      releaseOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
      +
      releaseOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
       
      -
      releaseOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      +
      releaseOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
       
      releaseOutputBuffer(O) - Method in class com.google.android.exoplayer2.decoder.SimpleDecoder
      Releases an output buffer back to the decoder.
      -
      releaseOutputBuffer(S) - Method in interface com.google.android.exoplayer2.decoder.OutputBuffer.Owner
      +
      releaseOutputBuffer(S) - Method in interface com.google.android.exoplayer2.decoder.DecoderOutputBuffer.Owner
      Releases the buffer.
      @@ -28264,18 +29008,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      remove() - Method in class com.google.android.exoplayer2.offline.SegmentDownloader
       
      -
      remove() - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      +
      remove(@com.google.android.exoplayer2.Player.Command int) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      -
      Remove an item from the queue.
      +
      Removes a Player.Command.
      remove(int) - Method in interface com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter
      Removes the item at the given position.
      -
      remove(int) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      -
      -
      Removes a Player.Command.
      -
      remove(int) - Method in class com.google.android.exoplayer2.util.FlagSet.Builder
      Removes a flag.
      @@ -28300,7 +29040,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Removes a listener from the set.
      -
      removeAll(int...) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      +
      removeAll(@com.google.android.exoplayer2.Player.Command int...) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      Removes commands.
      @@ -28312,26 +29052,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Cancels all pending downloads and removes all downloaded data.
      -
      removeAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      removeAnalyticsListener(AnalyticsListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Removes an AnalyticsListener.
      -
      removeAudioListener(AudioListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      - -
      -
      removeAudioListener(AudioListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      removeAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated.
      -
      +  +
      removeAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      removeAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Removes a listener of audio offload events.
      removeAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      removeAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      removeCallbacksAndMessages(Object) - Method in interface com.google.android.exoplayer2.util.HandlerWrapper
      @@ -28342,16 +29080,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The number of ad groups the have been removed.
      -
      removeDeviceListener(DeviceListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      - -
      -
      removeDeviceListener(DeviceListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      removeDownload(String) - Method in class com.google.android.exoplayer2.offline.DefaultDownloadIndex
       
      removeDownload(String) - Method in class com.google.android.exoplayer2.offline.DownloadManager
      @@ -28390,7 +29118,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      removeEventListener(BandwidthMeter.EventListener) - Method in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter
       
      -
      removeIf(int, boolean) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      +
      removeIf(@com.google.android.exoplayer2.Player.Command int, boolean) - Method in class com.google.android.exoplayer2.Player.Commands.Builder
      Removes a Player.Command if the provided condition is true.
      @@ -28406,18 +29134,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
       
      -
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
      -
      Deprecated.
      -
      -
      removeListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.Player
      +
      removeListener(Player.EventListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
      + +
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated.
      @@ -28433,8 +29161,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Unregister a listener registered through Player.addListener(Listener).
      removeListener(Player.Listener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      removeListener(Player.Listener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      removeListener(Player.Listener) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      removeListener(HlsPlaylistTracker.PlaylistEventListener) - Method in class com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker
       
      @@ -28481,12 +29211,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Removes a range of media items from the playlist.
      removeMediaItems(int, int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      removeMediaItems(int, int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a remove media items action to be executed.
      -
      removeMediaItems(int, int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      removeMediaItems(int, int) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      RemoveMediaItems(String, int, int) - Constructor for class com.google.android.exoplayer2.testutil.Action.RemoveMediaItems
       
      @@ -28512,16 +29244,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      removeMetadataOutput(MetadataOutput) - Method in interface com.google.android.exoplayer2.ExoPlayer.MetadataComponent
      -
      - -
      -
      removeMetadataOutput(MetadataOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      removePlaylistItem(int) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      removeQueryParameter(Uri, String) - Static method in class com.google.android.exoplayer2.util.UriUtil
      @@ -28544,30 +29266,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      removeSpan(CacheSpan) - Method in class com.google.android.exoplayer2.upstream.cache.SimpleCache
       
      -
      removeTextOutput(TextOutput) - Method in interface com.google.android.exoplayer2.ExoPlayer.TextComponent
      -
      - -
      -
      removeTextOutput(TextOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      removeVersion(SQLiteDatabase, int, String) - Static method in class com.google.android.exoplayer2.database.VersionTable
      Removes the version of a specified instance of a feature.
      -
      removeVideoListener(VideoListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      - -
      -
      removeVideoListener(VideoListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      -
      Deprecated.
      -
      removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener) - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
      @@ -28627,16 +29329,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The renderer has tracks mapped to it, but all are unsupported.
      +
      Renderer.MessageType - Annotation Type in com.google.android.exoplayer2
      +
      +
      Represents a type of message that can be passed to a renderer.
      +
      Renderer.State - Annotation Type in com.google.android.exoplayer2
      The renderer states.
      -
      Renderer.VideoScalingMode - Annotation Type in com.google.android.exoplayer2
      -
      -
      Deprecated. - -
      -
      Renderer.WakeupListener - Interface in com.google.android.exoplayer2
      Some renderers can signal when Renderer.render(long, long) should be called.
      @@ -28692,24 +29392,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      If ExoPlaybackException.type is ExoPlaybackException.TYPE_RENDERER, this is the name of the renderer.
      renderers - Variable in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      RenderersFactory - Interface in com.google.android.exoplayer2
      -
      Builds Renderer instances for use by a SimpleExoPlayer.
      +
      Builds Renderer instances for use by an ExoPlayer.
      +
      +
      renderOutputBuffer(VideoDecoderOutputBuffer, long, Format) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      +
      Renders the specified output buffer.
      renderOutputBuffer(MediaCodecAdapter, int, long) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      Renders the output buffer with the specified index.
      -
      renderOutputBuffer(VideoDecoderOutputBuffer, long, Format) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      -
      -
      Renders the specified output buffer.
      -
      -
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer
      +
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer
       
      -
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer
      +
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer
       
      -
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      Renders the specified output buffer to the passed surface.
      @@ -28723,11 +29425,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Incrementally renders any remaining output.
      -
      renderToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
      +
      renderToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.av1.Gav1Decoder
      Renders output buffer to the given surface.
      -
      renderToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      +
      renderToSurface(VideoDecoderOutputBuffer, Surface) - Method in class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      Renders the outputBuffer to the surface.
      @@ -28759,7 +29461,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      REPEAT_MODE_ONE - Static variable in interface com.google.android.exoplayer2.Player
      -
      Repeats the currently playing window infinitely during ongoing playback.
      +
      Repeats the currently playing MediaItem infinitely during ongoing playback.
      REPEAT_TOGGLE_MODE_ALL - Static variable in class com.google.android.exoplayer2.util.RepeatModeUtil
      @@ -28889,7 +29591,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      requestHeaders - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      -
      The headers to attach to the request to the DRM license server.
      +
      RequestProperties() - Constructor for class com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties
       
      @@ -28928,6 +29632,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      requiresCacheSpanTouches() - Method in class com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor
       
      +
      requiresSecureDecoder(byte[], String) - Method in class com.google.android.exoplayer2.drm.DummyExoMediaDrm
      +
       
      +
      requiresSecureDecoder(byte[], String) - Method in interface com.google.android.exoplayer2.drm.ExoMediaDrm
      +
      +
      Returns whether the given session requires use of a secure decoder for the given MIME type.
      +
      +
      requiresSecureDecoder(byte[], String) - Method in class com.google.android.exoplayer2.drm.FrameworkMediaDrm
      +
       
      +
      requiresSecureDecoder(byte[], String) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      +
       
      +
      requiresSecureDecoder(String) - Method in interface com.google.android.exoplayer2.drm.DrmSession
      +
      +
      Returns whether this session requires use of a secure decoder for the given MIME type.
      +
      +
      requiresSecureDecoder(String) - Method in class com.google.android.exoplayer2.drm.ErrorStateDrmSession
      +
       
      +
      requiringProvisioningThenAllowingSchemeDatas(List<DrmInitData.SchemeData>...) - Static method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.LicenseServer
      +
       
      reset() - Method in interface com.google.android.exoplayer2.audio.AudioProcessor
      Resets the processor to its unconfigured state, releasing any resources.
      @@ -28946,10 +29668,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      reset() - Method in class com.google.android.exoplayer2.BaseRenderer
       
      -
      reset() - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      +
      reset() - Method in class com.google.android.exoplayer2.extractor.TrueHdSampleRechunker
      +
       
      reset() - Method in class com.google.android.exoplayer2.extractor.VorbisBitArray
      Resets the reading position to zero.
      @@ -28990,14 +29710,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      reset() - Method in class com.google.android.exoplayer2.upstream.DefaultAllocator
       
      +
      reset() - Method in class com.google.android.exoplayer2.upstream.SlidingPercentile
      +
      +
      Resets the sliding percentile.
      +
      reset() - Method in interface com.google.android.exoplayer2.upstream.TimeToFirstByteEstimator
      Resets the estimator.
      -
      reset() - Method in class com.google.android.exoplayer2.util.SlidingPercentile
      -
      -
      Resets the sliding percentile.
      -
      reset(boolean) - Method in class com.google.android.exoplayer2.source.SampleQueue
      Clears all samples from the queue.
      @@ -29035,10 +29755,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets this instance's data, position and limit to match the provided parsableByteArray.
      -
      reset(OutputStream) - Method in class com.google.android.exoplayer2.util.ReusableBufferedOutputStream
      -
      -
      Resets this stream and uses the given output stream for writing.
      -
      resetBytesRead() - Method in class com.google.android.exoplayer2.upstream.StatsDataSource
      Resets the number of bytes read as returned from StatsDataSource.getBytesRead() to zero.
      @@ -29053,6 +29769,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Resets the renderer internal state after a codec release.
      +
      resetCount - Variable in class com.google.android.exoplayer2.testutil.FakeRenderer
      +
       
      resetForTests() - Static method in class com.google.android.exoplayer2.util.NetworkTypeObserver
      Resets the network type observer for tests.
      @@ -29272,9 +29990,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      retry() - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
      Deprecated. - -
      +
      Deprecated.
      RETRY - Static variable in class com.google.android.exoplayer2.upstream.Loader
      @@ -29284,15 +30000,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Retries the load using the default delay and resets the error count.
      -
      ReusableBufferedOutputStream - Class in com.google.android.exoplayer2.util
      -
      -
      This is a subclass of BufferedOutputStream with a ReusableBufferedOutputStream.reset(OutputStream) method - that allows an instance to be re-used with another underlying output stream.
      -
      -
      ReusableBufferedOutputStream(OutputStream) - Constructor for class com.google.android.exoplayer2.util.ReusableBufferedOutputStream
      -
       
      -
      ReusableBufferedOutputStream(OutputStream, int) - Constructor for class com.google.android.exoplayer2.util.ReusableBufferedOutputStream
      -
       
      REUSE_RESULT_NO - Static variable in class com.google.android.exoplayer2.decoder.DecoderReuseEvaluation
      The decoder cannot be reused.
      @@ -29394,7 +30101,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Track role flags.
      -
      roleFlags - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      roleFlags - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      The role flags.
      @@ -29507,7 +30214,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      run() - Method in class com.google.android.exoplayer2.util.RunnableFutureTask
       
      -
      run(SimpleExoPlayer) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable
      +
      run(ExoPlayer) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable
      Executes Runnable with reference to player.
      @@ -29577,7 +30284,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Runs tasks of the main Looper until the player completely handled all previously issued commands on the internal playback thread.
      -
      runUntilPlaybackState(Player, int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      +
      runUntilPlaybackState(Player, @com.google.android.exoplayer2.Player.State int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      Runs tasks of the main Looper until Player.getPlaybackState() matches the expected state or a playback error occurs.
      @@ -29587,9 +30294,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Runs tasks of the main Looper until Player.getPlayWhenReady() matches the expected value or a playback error occurs.
      -
      runUntilPositionDiscontinuity(Player, int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      +
      runUntilPositionDiscontinuity(Player, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      -
      runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      @@ -29597,9 +30304,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Runs tasks of the main Looper until ExoPlayer.AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged(boolean) is called or a playback error occurs.
      -
      runUntilRenderedFirstFrame(SimpleExoPlayer) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      +
      runUntilRenderedFirstFrame(ExoPlayer) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      -
      Runs tasks of the main Looper until the VideoListener.onRenderedFirstFrame() +
      Runs tasks of the main Looper until the Player.Listener.onRenderedFirstFrame() callback is called or a playback error occurs.
      runUntilSleepingForOffload(ExoPlayer, boolean) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      @@ -29710,6 +30417,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      sampleMetadata(long, int, int, int, TrackOutput.CryptoData) - Method in class com.google.android.exoplayer2.testutil.FakeTrackOutput
       
      +
      sampleMetadata(TrackOutput, long, int, int, int, TrackOutput.CryptoData) - Method in class com.google.android.exoplayer2.extractor.TrueHdSampleRechunker
      +
       
      sampleMimeType - Variable in class com.google.android.exoplayer2.Format
      The sample mime type, or null if unknown or not applicable.
      @@ -29823,6 +30532,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      SchedulerWorker(Context, WorkerParameters) - Constructor for class com.google.android.exoplayer2.ext.workmanager.WorkManagerScheduler.SchedulerWorker
       
      +
      scheme - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      +
      +
      The UUID of the protection scheme.
      +
      SCHEME_DATA - Static variable in class com.google.android.exoplayer2.upstream.DataSchemeDataSource
       
      SchemeData(UUID, String, byte[]) - Constructor for class com.google.android.exoplayer2.drm.DrmInitData.SchemeData
      @@ -30009,6 +30722,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Seeks the reader.
      +
      seek(long, long) - Method in class com.google.android.exoplayer2.text.SubtitleExtractor
      +
       
      Seek(String, int, long, boolean) - Constructor for class com.google.android.exoplayer2.testutil.Action.Seek
      @@ -30027,7 +30742,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekBack() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks back in the current window by Player.getSeekBackIncrement() milliseconds.
      +
      Seeks back in the current MediaItem by Player.getSeekBackIncrement() milliseconds.
      seekForward() - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -30035,7 +30750,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekForward() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks forward in the current window by Player.getSeekForwardIncrement() milliseconds.
      +
      Seeks forward in the current MediaItem by Player.getSeekForwardIncrement() + milliseconds.
      seekMap - Variable in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
       
      @@ -30101,11 +30817,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekTo(int, long) - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to a position specified in milliseconds in the specified window.
      +
      Seeks to a position specified in milliseconds in the specified MediaItem.
      seekTo(int, long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      seekTo(int, long) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      seekTo(int, long) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      seekTo(long) - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -30117,7 +30835,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekTo(long) - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to a position specified in milliseconds in the current window.
      +
      Seeks to a position specified in milliseconds in the current MediaItem.
      seekTo(long, boolean) - Method in class com.google.android.exoplayer2.source.SampleQueue
      @@ -30129,7 +30847,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekToDefaultPosition() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to the default position associated with the current window.
      +
      Seeks to the default position associated with the current MediaItem.
      seekToDefaultPosition(int) - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -30137,7 +30855,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekToDefaultPosition(int) - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to the default position associated with the specified window.
      +
      Seeks to the default position associated with the specified MediaItem.
      seekToNext() - Method in class com.google.android.exoplayer2.BasePlayer
       
      @@ -30145,16 +30863,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekToNext() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to a later position in the current or next window (if available).
      +
      Seeks to a later position in the current or next MediaItem (if available).
      +
      +
      seekToNextMediaItem() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      seekToNextMediaItem() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      seekToNextMediaItem() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Seeks to the default position of the next MediaItem, which may depend on the current + repeat mode and whether shuffle mode is enabled.
      seekToNextWindow() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      seekToNextWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      seekToNextWindow() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to the default position of the next window, which may depend on the current repeat mode - and whether shuffle mode is enabled.
      +
      Deprecated. + +
      seekToPosition(long) - Method in class com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30
       
      @@ -30166,16 +30898,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      seekToPrevious() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to an earlier position in the current or previous window (if available).
      +
      Seeks to an earlier position in the current or previous MediaItem (if available).
      +
      +
      seekToPreviousMediaItem() - Method in class com.google.android.exoplayer2.BasePlayer
      +
       
      +
      seekToPreviousMediaItem() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      seekToPreviousMediaItem() - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Seeks to the default position of the previous MediaItem, which may depend on the + current repeat mode and whether shuffle mode is enabled.
      seekToPreviousWindow() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      +
      +
      Deprecated.
      +
      seekToPreviousWindow() - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      +
      +
      Deprecated.
      +
      seekToPreviousWindow() - Method in interface com.google.android.exoplayer2.Player
      -
      Seeks to the default position of the previous window, which may depend on the current repeat - mode and whether shuffle mode is enabled.
      +
      Deprecated. + +
      seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri) - Static method in class com.google.android.exoplayer2.testutil.TestUtil
      @@ -30346,14 +31092,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Track selection flags.
      -
      selectionFlags - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      selectionFlags - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      The selection flags.
      SelectionOverride(int, int...) - Constructor for class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      -
       
      -
      SelectionOverride(int, int[], int) - Constructor for class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      -
       
      +
      +
      Constructs a SelectionOverride to override tracks of a group.
      +
      +
      SelectionOverride(int, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int) - Constructor for class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      +
      +
      Constructs a SelectionOverride of the given type to override tracks of a group.
      +
      selections - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectorResult
      A ExoTrackSelection array containing the track selection for each renderer.
      @@ -30496,6 +31246,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      separateColorPlaneFlag - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      +
      seqParameterSetId - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      seqParameterSetId - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.PpsData
       
      seqParameterSetId - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
      @@ -30608,9 +31360,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      sessionForClearTypes - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      -
      The types of clear tracks for which to use a DRM session.
      +
      -
      sessionId - Variable in class com.google.android.exoplayer2.drm.FrameworkMediaCrypto
      +
      sessionId - Variable in class com.google.android.exoplayer2.drm.FrameworkCryptoConfig
      The DRM session id.
      @@ -30633,6 +31387,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      set(int, int[], int[], byte[], byte[], int, int, int) - Method in class com.google.android.exoplayer2.decoder.CryptoInfo
       
      +
      set(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
       
      +
      set(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      +
      Overrides the value of the builder with the value of TrackSelectionParameters.
      +
      set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long) - Method in class com.google.android.exoplayer2.Timeline.Window
      Sets the data held by this window.
      @@ -30705,22 +31465,43 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the duration in milliseconds for which the player must buffer while preloading an ad group before that ad group is skipped and marked as having failed to load.
      +
      setAdsConfiguration(MediaItem.AdsConfiguration) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      +
      Sets the optional MediaItem.AdsConfiguration.
      +
      +
      setAdsId(Object) - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration.Builder
      +
      +
      Sets the ads identifier.
      +
      setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      Sets the DefaultMediaSourceFactory.AdsLoaderProvider that provides AdsLoader instances for media items - that have ads configurations.
      + that have ads configurations. +
      +
      setAdTagUri(Uri) - Method in class com.google.android.exoplayer2.MediaItem.AdsConfiguration.Builder
      +
      +
      Sets the ad tag URI to load.
      setAdTagUri(Uri) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional ad tag Uri.
      +
      Deprecated. + +
      setAdTagUri(Uri, Object) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional ad tag Uri and ads identifier.
      +
      setAdTagUri(String) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional ad tag Uri.
      +
      Deprecated. +
      Use MediaItem.Builder.setAdsConfiguration(AdsConfiguration), parse the adTagUri + with Uri.parse(String) and pass the result to Builder(Uri) instead.
      +
      setAdtsExtractorFlags(int) - Method in class com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
      @@ -30775,7 +31556,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether to allow cross protocol redirects.
      -
      setAllowedCapturePolicy(int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
      +
      setAllowedCapturePolicy(@com.google.android.exoplayer2.C.AudioAllowedCapturePolicy int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
      @@ -30819,12 +31600,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setAnalyticsCollector(AnalyticsCollector) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the AnalyticsCollector that will collect and forward all player events.
      setAnalyticsCollector(AnalyticsCollector) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the AnalyticsCollector that will collect and forward all player events.
      +
      setAnalyticsListener(AnalyticsListener) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
      @@ -30849,7 +31631,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setArtworkData(byte[]) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      setArtworkData(byte[], Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      @@ -30870,11 +31652,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener) - Method in class com.google.android.exoplayer2.ui.PlayerView
      - +
      setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
      - +
      setAudioAttributes(AudioAttributesCompat) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      @@ -30888,21 +31670,42 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setAudioAttributes(AudioAttributes, boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      Sets the attributes for audio playback, used by the underlying audio track.
      +
      -
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      Sets AudioAttributes that will be used by the player and whether to handle audio focus.
      +
      setAudioAttributes(AudioAttributes, boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      +
      Sets the attributes for audio playback, used by the underlying audio track.
      +
      +
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      + +
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules application of audio attributes.
      +
      setAudioAttributes(AudioAttributes, boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      SetAudioAttributes(String, AudioAttributes, boolean) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetAudioAttributes
       
      +
      setAudioMimeType(String) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the audio MIME type of the output.
      +
      setAudioSessionId(int) - Method in interface com.google.android.exoplayer2.audio.AudioSink
      Sets the audio session id.
      @@ -30913,9 +31716,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setAudioSessionId(int) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      setAudioSessionId(int) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Sets the ID of the audio session to attach to the underlying AudioTrack.
      setAudioSessionId(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setAudioSessionId(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setAuxEffectInfo(AuxEffectInfo) - Method in interface com.google.android.exoplayer2.audio.AudioSink
      @@ -30927,9 +31740,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setAuxEffectInfo(AuxEffectInfo) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      setAuxEffectInfo(AuxEffectInfo) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Sets information on an auxiliary audio effect to attach to the underlying audio track.
      setAuxEffectInfo(AuxEffectInfo) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setAuxEffectInfo(AuxEffectInfo) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setAverageBitrate(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -30948,12 +31771,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setBandwidthMeter(BandwidthMeter) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the BandwidthMeter that will be used by the player.
      setBandwidthMeter(BandwidthMeter) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the BandwidthMeter that will be used by the player.
      +
      setBandwidthMeter(BandwidthMeter) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      @@ -31033,16 +31857,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setCallback(ActionSchedule.PlayerTarget.Callback) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget
       
      -
      setCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      setCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Sets a listener of camera motion events.
      +
      setCameraMotionListener(CameraMotionListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      setCameraMotionListener(CameraMotionListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setCameraMotionListener(CameraMotionListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setCaptionCallback(MediaSessionConnector.CaptionCallback) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
      Sets the MediaSessionConnector.CaptionCallback to handle requests to enable or disable captions.
      +
      setChangeFrameRateStrategy(int) - Method in class com.google.android.exoplayer2.video.VideoFrameReleaseHelper
      +
      + +
      setChannelCount(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -31061,36 +31899,52 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setClipEndPositionMs(long) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional end position in milliseconds which must be a value larger than or equal to - zero, or C.TIME_END_OF_SOURCE to end when playback reaches the end of media (Default: - C.TIME_END_OF_SOURCE).
      + +
      +
      setClippingConfiguration(MediaItem.ClippingConfiguration) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      + +
      +
      setClippingError(ClippingMediaSource.IllegalClippingException) - Method in class com.google.android.exoplayer2.source.ClippingMediaPeriod
      +
      +
      Sets a clipping error detected by the media source so that it can be thrown as a period error + at the next opportunity.
      setClipRelativeToDefaultPosition(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether the start position and the end position are relative to the default position in - the window (Default: false).
      +
      setClipRelativeToLiveWindow(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether the start/end positions should move with the live window for live streams.
      +
      setClipStartPositionMs(long) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional start position in milliseconds which must be a value larger than or equal - to zero (Default: 0).
      +
      setClipStartsAtKeyFrame(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether the start point is guaranteed to be a key frame.
      +
      setClock(Clock) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the Clock that will be used by the player.
      setClock(Clock) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the Clock that will be used by the player.
      +
      Deprecated. + +
      setClock(Clock) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      @@ -31159,6 +32013,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the connect timeout, in milliseconds.
      +
      setConstantBitrateSeekingAlwaysEnabled(boolean) - Method in class com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
      +
      +
      Convenience method to set whether approximate seeking using constant bitrate assumptions should + be enabled for all extractors that support it, and if it should be enabled even if the content + length (and hence the duration of the media) is unknown.
      +
      setConstantBitrateSeekingEnabled(boolean) - Method in class com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
      Convenience method to set whether approximate seeking using constant bitrate assumptions should @@ -31180,7 +32040,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a mutation to set the ContentMetadata.KEY_CONTENT_LENGTH value, or to remove any existing value if C.LENGTH_UNSET is passed.
      -
      setContentType(int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
      +
      setContentType(@com.google.android.exoplayer2.C.AudioContentType int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
       
      setContentTypePredicate(Predicate<String>) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
      @@ -31211,6 +32071,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); instead.
      +
      setContext(Context) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the Context.
      +
      setContext(Context) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets the Context.
      @@ -31219,72 +32083,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the number of bytes that should be loaded between each invocation of SequenceableLoader.Callback.onContinueLoadingRequested(SequenceableLoader).
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to the constructor instead. You can also - customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to MediaSessionConnector.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder#setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to PlayerControlView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to PlayerNotificationManager.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)), or configure whether the - rewind and fast forward actions should be used with {PlayerNotificationManager.setUseRewindAction(boolean)} - and PlayerNotificationManager.setUseFastForwardAction(boolean).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.PlayerView
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to PlayerView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.StyledPlayerControlView
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to StyledPlayerControlView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      -
      -
      -
      setControlDispatcher(ControlDispatcher) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
      -
      -
      Deprecated. -
      Use a ForwardingPlayer and pass it to StyledPlayerView.setPlayer(Player) instead. - You can also customize some operations when configuring the player (for example by using - SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)).
      -
      -
      setControllerAutoShow(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerView
      Sets whether the playback controls are automatically shown when playback starts, pauses, ends, @@ -31325,11 +32123,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setControllerVisibilityListener(PlayerControlView.VisibilityListener) - Method in class com.google.android.exoplayer2.ui.PlayerView
      - +
      setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
      - + +
      +
      setCryptoType(@com.google.android.exoplayer2.C.CryptoType int) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      +
      setCsdBuffers(MediaFormat, List<byte[]>) - Static method in class com.google.android.exoplayer2.util.MediaFormatUtil
      @@ -31430,6 +32232,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the wrapped DataReader.
      +
      setDebugLoggingEnabled(boolean) - Method in class com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory
      +
      +
      Sets whether to log RTSP messages, the default value is false.
      +
      setDebugModeEnabled(boolean) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader.Builder
      Sets whether to enable outputting verbose logs for the IMA extension and IMA SDK.
      @@ -31482,13 +32288,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the description.
      -
      setDetachSurfaceTimeoutMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      setDetachSurfaceTimeoutMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      Sets a timeout for detaching a surface from the player.
      +
      setDetachSurfaceTimeoutMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      + +
      setDeviceMuted(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Sets the mute state of the device.
      +
      Deprecated. + +
      setDeviceMuted(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -31501,12 +32315,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the mute state of the device.
      setDeviceMuted(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setDeviceMuted(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setDeviceMuted(boolean) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setDeviceVolume(int) - Method in interface com.google.android.exoplayer2.ExoPlayer.DeviceComponent
      -
      Sets the volume of the device.
      +
      Deprecated. + +
      setDeviceVolume(int) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -31519,13 +32337,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the volume of the device.
      setDeviceVolume(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setDeviceVolume(int) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      -
      setDeviceVolume(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      -
      setDisabledTextTrackSelectionFlags(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
      setDisabledTextTrackSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      Sets a bitmask of selection flags that are disabled for text track selections.
      +
      setDisabledTrackTypes(Set<Integer>) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
       
      +
      setDisabledTrackTypes(Set<Integer>) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      +
      Sets the disabled track types, preventing all tracks of those types from being selected for + playback.
      +
      setDiscNumber(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Sets the disc number.
      @@ -31553,10 +32380,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      setDrmConfiguration(MediaItem.DrmConfiguration) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      +
      Sets the optional DRM configuration.
      +
      setDrmForceDefaultLicenseUri(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether to force use the default DRM license server URI even if the media specifies its - own DRM license server URI.
      +
      setDrmHttpDataSourceFactory(HttpDataSource.Factory) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManagerProvider
      @@ -31586,44 +32418,63 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setDrmHttpDataSourceFactory(HttpDataSource.Factory) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
       
      +
      setDrmHttpDataSourceFactory(HttpDataSource.Factory) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
      +
      Deprecated.
      +
      setDrmInitData(DrmInitData) - Method in class com.google.android.exoplayer2.Format.Builder
      setDrmKeySetId(byte[]) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the key set ID of the offline license.
      +
      setDrmLicenseRequestHeaders(Map<String, String>) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional request headers attached to the DRM license request.
      +
      setDrmLicenseUri(Uri) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional default DRM license server URI.
      +
      setDrmLicenseUri(String) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional default DRM license server URI.
      +
      setDrmMultiSession(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether the DRM configuration is multi session enabled.
      +
      setDrmPlayClearContentWithoutKey(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether clear samples within protected content should be played when keys for the - encrypted part of the content have yet to be loaded.
      +
      setDrmSessionForClearPeriods(boolean) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets whether a DRM session should be used for clear tracks of type C.TRACK_TYPE_VIDEO - and C.TRACK_TYPE_AUDIO.
      +
      setDrmSessionForClearTypes(List<Integer>) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets a list of C.TRACK_TYPE_* constants for which to use a DRM session even - when the tracks are in the clear.
      +
      setDrmSessionManager(DrmSessionManager) - Method in class com.google.android.exoplayer2.source.dash.DashMediaSource.Factory
       
      @@ -31648,6 +32499,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setDrmSessionManager(DrmSessionManager) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
       
      +
      setDrmSessionManager(DrmSessionManager) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
      +
      Deprecated.
      +
      setDrmSessionManagerProvider(DrmSessionManagerProvider) - Method in class com.google.android.exoplayer2.source.dash.DashMediaSource.Factory
       
      setDrmSessionManagerProvider(DrmSessionManagerProvider) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -31667,6 +32522,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setDrmSessionManagerProvider(DrmSessionManagerProvider) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
       
      +
      setDrmSessionManagerProvider(DrmSessionManagerProvider) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
       
      setDrmUserAgent(String) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManagerProvider
      Sets the optional user agent to be used for DRM requests.
      @@ -31695,9 +32552,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setDrmUserAgent(String) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
       
      +
      setDrmUserAgent(String) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
      +
      Deprecated.
      +
      setDrmUuid(UUID) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the UUID of the protection scheme.
      +
      Deprecated. + +
      setDumpFilesPrefix(String) - Method in class com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig.Builder
       
      @@ -31752,6 +32616,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      setEndPositionMs(long) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Sets the optional end position in milliseconds which must be a value larger than or equal + to zero, or C.TIME_END_OF_SOURCE to end when playback reaches the end of media + (Default: C.TIME_END_OF_SOURCE).
      +
      +
      setEnforceValidKeyResponses(boolean) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Sets whether key responses passed to FakeExoMediaDrm.provideKeyResponse(byte[], byte[]) should be + checked for validity (i.e.
      +
      setErrorMessageProvider(ErrorMessageProvider<? super PlaybackException>) - Method in class com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter
      Sets the optional ErrorMessageProvider.
      @@ -31785,10 +32660,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      setExoMediaCryptoType(Class<? extends ExoMediaCrypto>) - Method in class com.google.android.exoplayer2.Format.Builder
      -
      - -
      setExpectedBytes(byte[]) - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest.TestResource.Builder
      Sets the expected contents of this resource.
      @@ -31883,13 +32754,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setFixedTextSize(int, float) - Method in class com.google.android.exoplayer2.ui.SubtitleView
      -
      Set the text size to a given unit and value.
      +
      Sets the text size to a given unit and value.
      setFlacExtractorFlags(int) - Method in class com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
      Sets flags for FlacExtractor instances created by the factory.
      -
      setFlags(int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
      +
      setFlags(@com.google.android.exoplayer2.C.AudioFlags int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
       
      setFlags(int) - Method in class com.google.android.exoplayer2.decoder.Buffer
      @@ -31903,6 +32774,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the DataSpec.flags.
      +
      setFlattenForSlowMotion(boolean) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets whether the input should be flattened for media containing slow motion markers.
      +
      setFlattenForSlowMotion(boolean) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets whether the input should be flattened for media containing slow motion markers.
      @@ -31931,6 +32806,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setFontSizeUnit(int) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      +
      setForceDefaultLicenseUri(boolean) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets whether to always use the default DRM license server URI even if the media specifies + its own DRM license server URI.
      +
      +
      setForcedSessionTrackTypes(List<Integer>) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets a list of track type constants for which to use a DRM session even + when the tracks are in the clear.
      +
      setForceHighestSupportedBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      setForceHighestSupportedBitrate(boolean) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      @@ -31955,7 +32840,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); even when in the idle state.
      setForegroundMode(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setForegroundMode(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setForHeaderData(int) - Method in class com.google.android.exoplayer2.audio.MpegAudioUtil.Header
      @@ -32004,16 +32891,28 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the level of gzip support for this resource.
      -
      setHandleAudioBecomingNoisy(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      setHandleAudioBecomingNoisy(boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      Sets whether the player should pause automatically when audio is rerouted from a headset to device speakers.
      +
      setHandleAudioBecomingNoisy(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      +
      Sets whether the player should pause automatically when audio is rerouted from a headset to + device speakers.
      +
      +
      setHandleAudioBecomingNoisy(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      + +
      setHandleAudioBecomingNoisy(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      Sets whether the player should pause automatically when audio is rerouted from a headset to - device speakers.
      -
      +
      Deprecated.
      +  +
      setHandleAudioBecomingNoisy(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      setHandler(Handler) - Method in class com.google.android.exoplayer2.PlayerMessage
      Deprecated. @@ -32025,12 +32924,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether "Set-Cookie" requests on redirect should be forwarded to the redirect url in the "Cookie" header.
      -
      setHandleWakeLock(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      setHandleWakeLock(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Deprecated. - +
      +
      setHandleWakeLock(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      +
      setHandleWakeLock(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setHeight(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -32069,7 +32976,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setInfo(String) - Method in class com.google.android.exoplayer2.testutil.AdditionalFailureInfo
      -
      Set the additional info to be added to any test failures.
      +
      Sets the additional info to be added to any test failures.
      setInitialBitrateEstimate(int, long) - Method in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.Builder
      @@ -32144,6 +33051,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets a header for key requests made by the callback.
      +
      setKeySetId(byte[]) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets the key set ID of the offline license.
      +
      setKeySetId(byte[]) - Method in class com.google.android.exoplayer2.offline.DownloadRequest.Builder
      @@ -32160,19 +33071,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      setLabel(String) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the optional label for this subtitle track.
      +
      setLanguage(String) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      setLanguage(String) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the optional language of the subtitle file.
      +
      setLength(long) - Method in class com.google.android.exoplayer2.upstream.DataSpec.Builder
      Sets the DataSpec.length.
      -
      setLibraries(Class<? extends ExoMediaCrypto>, String...) - Static method in class com.google.android.exoplayer2.ext.opus.OpusLibrary
      +
      setLibraries(@com.google.android.exoplayer2.C.CryptoType int, String...) - Static method in class com.google.android.exoplayer2.ext.opus.OpusLibrary
      Override the names of the Opus native libraries.
      -
      setLibraries(Class<? extends ExoMediaCrypto>, String...) - Static method in class com.google.android.exoplayer2.ext.vp9.VpxLibrary
      +
      setLibraries(@com.google.android.exoplayer2.C.CryptoType int, String...) - Static method in class com.google.android.exoplayer2.ext.vp9.VpxLibrary
      Override the names of the Vpx native libraries.
      @@ -32188,18 +33107,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Overrides the names of the libraries to load.
      +
      setLicenseRequestHeaders(Map<String, String>) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets the optional request headers attached to DRM license requests.
      +
      +
      setLicenseUri(Uri) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets the optional default DRM license server URI.
      +
      +
      setLicenseUri(String) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets the optional default DRM license server URI.
      +
      setLimit(int) - Method in class com.google.android.exoplayer2.util.ParsableByteArray
      Sets the limit.
      -
      setLine(float, int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      +
      setLine(float, @com.google.android.exoplayer2.text.Cue.LineType int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      Sets the position of the cue box within the viewport in the direction orthogonal to the writing direction.
      -
      setLineAnchor(int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      +
      setLineAnchor(@com.google.android.exoplayer2.text.Cue.AnchorType int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      -
      Sets the cue box anchor positioned by line.
      +
      Sets the cue box anchor positioned by line.
      setLinethrough(boolean) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      @@ -32217,6 +33148,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setListener(AudioSink.Listener) - Method in class com.google.android.exoplayer2.audio.ForwardingAudioSink
       
      +
      setListener(TranscodingTransformer.Listener) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the TranscodingTransformer.Listener to listen to the transformation events.
      +
      +
      setListener(TranscodingTransformer.Listener) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Sets the TranscodingTransformer.Listener to listen to the transformation events.
      +
      setListener(Transformer.Listener) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets the Transformer.Listener to listen to the transformation events.
      @@ -32235,9 +33174,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the live configuration defined by the media.
      +
      setLiveConfiguration(MediaItem.LiveConfiguration) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      + +
      setLiveMaxOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional maximum offset from the live edge for live streams, in milliseconds.
      +
      setLiveMaxOffsetMs(long) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -32245,7 +33190,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLiveMaxPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional maximum playback speed for live stream speed adjustment.
      +
      setLiveMaxSpeed(float) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -32253,7 +33200,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLiveMinOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional minimum offset from the live edge for live streams, in milliseconds.
      +
      setLiveMinOffsetMs(long) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -32261,7 +33210,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLiveMinPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional minimum playback speed for live stream speed adjustment.
      +
      setLiveMinSpeed(float) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -32269,14 +33220,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLivePlaybackSpeedControl(LivePlaybackSpeedControl) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the LivePlaybackSpeedControl that will control the playback speed when playing live streams, in order to maintain a steady target offset from the live stream edge.
      setLivePlaybackSpeedControl(LivePlaybackSpeedControl) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the LivePlaybackSpeedControl that will control the playback speed when playing - live streams, in order to maintain a steady target offset from the live stream edge.
      +
      setLivePresentationDelayMs(long) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
      @@ -32286,13 +33237,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLivePresentationDelayMs(long, boolean) - Method in class com.google.android.exoplayer2.source.dash.DashMediaSource.Factory
      setLiveTargetOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      -
      Sets the optional target offset from the live edge for live streams, in milliseconds.
      +
      setLiveTargetOffsetMs(long) - Method in class com.google.android.exoplayer2.source.DefaultMediaSourceFactory
      @@ -32300,12 +33254,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLoadControl(LoadControl) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the LoadControl that will be used by the player.
      setLoadControl(LoadControl) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the LoadControl that will be used by the player.
      +
      setLoadControl(LoadControl) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      @@ -32347,6 +33302,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSourceFactory
      +
       
      setLogLevel(int) - Static method in class com.google.android.exoplayer2.util.Log
      Sets the Log.LogLevel for ExoPlayer logcat logging.
      @@ -32357,7 +33314,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLooper(Looper) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the Looper that must be used for all calls to the player and that is used to call listeners on.
      @@ -32367,13 +33323,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setLooper(Looper) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the Looper that must be used for all calls to the player and that is used to - call listeners on.
      +
      Deprecated. + +
      setLooper(Looper) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      Sets the Looper to be used by the player.
      +
      setLooper(Looper) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the Looper that must be used for all calls to the transcoding transformer and + that is used to call listeners on.
      +
      setLooper(Looper) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets the Looper that must be used for all calls to the transformer and that is used @@ -32428,10 +33390,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the media maximum recommended bitrate for ads, in bps.
      +
      setMaxOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Sets the maximum allowed live offset, in milliseconds.
      +
      setMaxParallelDownloads(int) - Method in class com.google.android.exoplayer2.offline.DownloadManager
      Sets the maximum number of parallel downloads.
      +
      setMaxPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Sets the maximum playback speed.
      +
      setMaxVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      setMaxVideoBitrate(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      @@ -32520,8 +33490,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaItems.
      setMediaItems(List<MediaItem>, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setMediaItems(List<MediaItem>, boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setMediaItems(List<MediaItem>, boolean) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      @@ -32532,8 +33504,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaItems.
      setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setMediaItems(List<MediaItem>, int, long) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      SetMediaItems(String, int, long, MediaSource...) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetMediaItems
       
      @@ -32561,7 +33535,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); default position.
      setMediaSource(MediaSource) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSource(MediaSource) - Method in class com.google.android.exoplayer2.source.MaskingMediaPeriod
      Sets the MediaSource that will create the underlying media period.
      @@ -32573,7 +33549,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaSource.
      setMediaSource(MediaSource, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSource(MediaSource, boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setMediaSource(MediaSource, long) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -32581,17 +33559,28 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaSource.
      setMediaSource(MediaSource, long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSource(MediaSource, long) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setMediaSourceFactory(MediaSourceFactory) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the MediaSourceFactory that will be used by the player.
      setMediaSourceFactory(MediaSourceFactory) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the MediaSourceFactory that will be used by the player.
      + +
      +
      setMediaSourceFactory(MediaSourceFactory) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      +
      +
      Sets the MediaSourceFactory to be used by the player.
      +
      +
      setMediaSourceFactory(MediaSourceFactory) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the MediaSourceFactory to be used to retrieve the inputs to transform.
      setMediaSourceFactory(MediaSourceFactory) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      @@ -32619,7 +33608,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); position to the default position.
      setMediaSources(List<MediaSource>) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSources(List<MediaSource>) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setMediaSources(List<MediaSource>, boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -32627,7 +33618,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaSources.
      setMediaSources(List<MediaSource>, boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSources(List<MediaSource>, boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setMediaSources(List<MediaSource>, int, long) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -32635,7 +33628,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Clears the playlist and adds the specified MediaSources.
      setMediaSources(List<MediaSource>, int, long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setMediaSources(List<MediaSource>, int, long) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setMediaUri(Uri) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      @@ -32651,7 +33646,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether MediaSessionConnector.MediaMetadataProvider.sameAs(MediaMetadataCompat, MediaMetadataCompat) should be consulted before calling MediaSessionCompat.setMetadata(MediaMetadataCompat).
      -
      setMetadataType(int) - Method in class com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory
      +
      setMetadataType(@com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType int) - Method in class com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory
      Sets the type of metadata to extract from the HLS source (defaults to HlsMediaSource.METADATA_TYPE_ID3).
      @@ -32659,12 +33654,24 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the optional MIME type.
      +
      setMimeType(String) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the MIME type.
      +
      setMimeType(String) - Method in class com.google.android.exoplayer2.offline.DownloadRequest.Builder
      setMimeType(String) - Method in class com.google.android.exoplayer2.testutil.DownloadBuilder
       
      +
      setMinOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Sets the minimum allowed live offset, in milliseconds.
      +
      +
      setMinPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Sets the minimum playback speed.
      +
      setMinPossibleLiveOffsetSmoothingFactor(float) - Method in class com.google.android.exoplayer2.DefaultLivePlaybackSpeedControl.Builder
      Sets the smoothing factor when smoothing the minimum possible live offset that can be @@ -32716,6 +33723,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether this session manager is allowed to acquire multiple simultaneous sessions.
      +
      setMultiSession(boolean) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets whether multi session is enabled.
      +
      setMuxedCaptionFormats(List<Format>) - Method in class com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
      Sets Format information associated to the caption tracks multiplexed in the media.
      @@ -32800,12 +33811,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the video output.
      -
      setOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView
      +
      setOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView
       
      -
      setOutputBuffer(VideoDecoderOutputBuffer) - Method in interface com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer
      +
      setOutputBuffer(VideoDecoderOutputBuffer) - Method in interface com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer
      Sets the output buffer to be rendered.
      +
      setOutputMimeType(String) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the MIME type of the output.
      +
      setOutputMimeType(String) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets the MIME type of the output.
      @@ -32838,6 +33853,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the initial selection override to show.
      +
      setOverrideForType(TrackSelectionOverrides.TrackSelectionOverride) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.Builder
      +
      +
      Set the override for the type of the provided TrackGroup.
      +
      setOverrides(List<DefaultTrackSelector.SelectionOverride>) - Method in class com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder
      Sets the list of initial selection overrides to show.
      @@ -32852,14 +33871,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setParameters(Bundle) - Method in class com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter
       
      -
      setParameters(DefaultTrackSelector.Parameters) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      -
      -
      Atomically sets the provided parameters for track selection.
      -
      setParameters(DefaultTrackSelector.ParametersBuilder) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      Atomically sets the provided parameters for track selection.
      +
      setParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector
      +
       
      +
      setParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.trackselection.TrackSelector
      +
      +
      Called by the player to provide parameters for track selection.
      +
      setPath(String) - Method in class com.google.android.exoplayer2.testutil.WebServerDispatcher.Resource.Builder
      Sets the path this data should be served at.
      @@ -32870,7 +33891,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPauseAtEndOfMediaItems(boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets whether to pause playback at the end of each media item.
      setPauseAtEndOfMediaItems(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -32879,10 +33899,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPauseAtEndOfMediaItems(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets whether to pause playback at the end of each media item.
      +
      setPauseAtEndOfMediaItems(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setPauseAtEndOfMediaItems(boolean) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
      Sets whether to enable pausing at the end of media items.
      @@ -32957,12 +33981,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Attempts to set the playback parameters.
      setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a playback parameters setting action.
      -
      setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      setPlaybackParameters(PlaybackParameters) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setPlaybackParameters(PlaybackParameters) - Method in interface com.google.android.exoplayer2.util.MediaClock
      @@ -32996,6 +34022,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPlaybackSpeed(float, float) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
       
      +
      setPlayClearContentWithoutKey(boolean) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets whether clear samples within protected content should be played when keys for the + encrypted part of the content have yet to be loaded.
      +
      setPlayClearSamplesWithoutKeys(boolean) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Builder
      Sets whether clear samples within protected content should be played when keys for the @@ -33029,7 +34060,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPlayer(Player) - Method in class com.google.android.exoplayer2.ui.PlayerView
      -
      Set the Player to use.
      +
      Sets the Player to use.
      setPlayer(Player) - Method in class com.google.android.exoplayer2.ui.StyledPlayerControlView
      @@ -33037,7 +34068,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPlayer(Player) - Method in class com.google.android.exoplayer2.ui.StyledPlayerView
      -
      Set the Player to use.
      +
      Sets the Player to use.
      setPlayer(Player, Looper) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
      @@ -33059,8 +34090,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the playlist MediaMetadata.
      setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setPlaylistMetadata(MediaMetadata) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setPlaylistParserFactory(HlsPlaylistParserFactory) - Method in class com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory
      @@ -33079,15 +34112,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether playback should proceed when Player.getPlaybackState() == Player.STATE_READY.
      setPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      SetPlayWhenReady(String, boolean) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetPlayWhenReady
       
      setPosition(float) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      -
      Sets the fractional position of the positionAnchor of the cue - box within the viewport in the direction orthogonal to line.
      +
      Sets the fractional position of the positionAnchor of the cue + box within the viewport in the direction orthogonal to line.
      setPosition(int) - Method in class com.google.android.exoplayer2.extractor.VorbisBitArray
      @@ -33107,11 +34142,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setPosition(int, long) - Method in class com.google.android.exoplayer2.PlayerMessage
      -
      Sets a position in a window at which the message will be delivered.
      +
      Sets a position in a media item at which the message will be delivered.
      setPosition(long) - Method in class com.google.android.exoplayer2.PlayerMessage
      -
      Sets a position in the current window at which the message will be delivered.
      +
      Sets a position in the current media item at which the message will be delivered.
      setPosition(long) - Method in class com.google.android.exoplayer2.ui.DefaultTimeBar
       
      @@ -33123,10 +34158,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      setPositionAnchor(int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      +
      setPositionAnchor(@com.google.android.exoplayer2.text.Cue.AnchorType int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      Sets the cue box anchor positioned by position.
      +
      setPositionUs(long) - Method in class com.google.android.exoplayer2.text.ExoplayerCuesDecoder
      +
       
      setPositionUs(long) - Method in class com.google.android.exoplayer2.text.SimpleSubtitleDecoder
       
      setPositionUs(long) - Method in interface com.google.android.exoplayer2.text.SubtitleDecoder
      @@ -33161,9 +34198,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the preferred sample MIME types for audio tracks.
      -
      setPreferredAudioRoleFlags(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
      setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      -
      setPreferredAudioRoleFlags(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      Sets the preferred C.RoleFlags for audio tracks.
      @@ -33186,9 +34223,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the preferred languages for text tracks.
      -
      setPreferredTextRoleFlags(int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
      setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      -
      setPreferredTextRoleFlags(int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      Sets the preferred C.RoleFlags for text tracks.
      @@ -33225,14 +34262,27 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the priority of the notification required for API 25 and lower.
      -
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      Sets an PriorityTaskManager that will be used by the player.
      -
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      setPriorityTaskManager(PriorityTaskManager) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Sets a PriorityTaskManager, or null to clear a previously set priority task manager.
      +
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      + +
      +
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setPriorityTaskManager(PriorityTaskManager) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      setProgressUpdateListener(PlayerControlView.ProgressUpdateListener) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      @@ -33326,6 +34376,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Adds a mutation to set the ContentMetadata.KEY_REDIRECTED_URI value, or to remove any existing entry if null is passed.
      +
      setRelativeToDefaultPosition(boolean) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Sets whether the start position and the end position are relative to the default position + in the window (Default: false).
      +
      +
      setRelativeToLiveWindow(boolean) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Sets whether the start/end positions should move with the live window for live streams.
      +
      setReleaseDay(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Sets the day of the release date.
      @@ -33336,21 +34395,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setReleaseTimeoutMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      setReleaseTimeoutMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      - +
      setReleaseYear(Integer) - Method in class com.google.android.exoplayer2.MediaMetadata.Builder
      Sets the year of the release date.
      +
      setRemoveAudio(boolean) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets whether to remove the audio from the output.
      +
      setRemoveAudio(boolean) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets whether to remove the audio from the output.
      +
      setRemoveVideo(boolean) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets whether to remove the video from the output.
      +
      setRemoveVideo(boolean) - Method in class com.google.android.exoplayer2.transformer.Transformer.Builder
      Sets whether to remove the video from the output.
      @@ -33367,6 +34435,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the Renderers.
      +
      setRenderersFactory(RenderersFactory) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets the RenderersFactory that will be used by the player.
      +
      setRenderersFactory(RenderersFactory) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      setRenderersFactory(RenderersFactory) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -33375,28 +34447,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setRenderTimeLimitMs(long) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      -
      Set a limit on the time a single MediaCodecRenderer.render(long, long) call can spend draining and +
      Sets a limit on the time a single MediaCodecRenderer.render(long, long) call can spend draining and filling the decoder.
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
       
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
       
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      -
       
      -
      setRepeatMode(int) - Method in interface com.google.android.exoplayer2.Player
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in interface com.google.android.exoplayer2.Player
      Sets the Player.RepeatMode to be used for playback.
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a repeat mode setting action.
      -
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      -
      SetRepeatMode(String, int) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetRepeatMode
      +
      setRepeatMode(int) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
      +
       
      +
      SetRepeatMode(String, @com.google.android.exoplayer2.Player.RepeatMode int) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetRepeatMode
       
      setRepeatToggleModes(int) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      @@ -33471,10 +34545,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the rewind increment in milliseconds.
      -
      setRoleFlags(int) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      setRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      setRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the role flags.
      +
      setRotationDegrees(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -33511,21 +34589,37 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets a schedule to be applied during the test.
      +
      setScheme(UUID) - Method in class com.google.android.exoplayer2.MediaItem.DrmConfiguration.Builder
      +
      +
      Sets the UUID of the protection scheme.
      +
      setScrubberColor(int) - Method in class com.google.android.exoplayer2.ui.DefaultTimeBar
      Sets the color for the scrubber handle.
      +
      setSeekBackIncrementMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets the Player.seekBack() increment.
      +
      setSeekBackIncrementMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the BasePlayer.seekBack() increment.
      +
      setSeekBackIncrementMs(long) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      Sets the seek back increment to be used by the player.
      +
      setSeekForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets the Player.seekForward() increment.
      +
      setSeekForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the BasePlayer.seekForward() increment.
      +
      setSeekForwardIncrementMs(long) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -33533,7 +34627,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setSeekParameters(SeekParameters) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the parameters that control how seek operations are performed.
      setSeekParameters(SeekParameters) - Method in interface com.google.android.exoplayer2.ExoPlayer
      @@ -33542,10 +34635,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setSeekParameters(SeekParameters) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the parameters that control how seek operations are performed.
      +
      setSeekParameters(SeekParameters) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setSeekParameters(SeekParameters) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setSeekTargetUs(long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
      @@ -33565,13 +34662,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Defines the container mime type to propagate through TrackOutput.format(com.google.android.exoplayer2.Format).
      -
      setSelectionFlags(int) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int) - Method in class com.google.android.exoplayer2.Format.Builder
      +
      setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the flags used for track selection.
      +
      setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      -
      Overrides the track selection for the renderer at the specified index.
      +
      setSelectUndeterminedTextLanguage(boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      @@ -33745,15 +34848,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setShuffleModeEnabled(boolean) - Method in interface com.google.android.exoplayer2.Player
      -
      Sets whether shuffling of windows is enabled.
      +
      Sets whether shuffling of media items is enabled.
      setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a shuffle setting action to be executed.
      -
      setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      setShuffleModeEnabled(boolean) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      SetShuffleModeEnabled(String, boolean) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetShuffleModeEnabled
       
      @@ -33762,7 +34867,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the shuffle order.
      setShuffleOrder(ShuffleOrder) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setShuffleOrder(ShuffleOrder) - Method in class com.google.android.exoplayer2.source.ConcatenatingMediaSource
      Sets a new shuffle order to use when shuffling the child media sources.
      @@ -33817,13 +34924,29 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setSkipSilenceEnabled(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      +
      Deprecated. + +
      +
      +
      setSkipSilenceEnabled(boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets whether silences silences in the audio stream is enabled.
      +
      +
      setSkipSilenceEnabled(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      Sets whether skipping silences in the audio stream is enabled.
      setSkipSilenceEnabled(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets whether silences silences in the audio stream is enabled.
      +
      setSkipSilenceEnabled(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setSkipSilenceEnabled(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      setSlidingWindowMaxWeight(int) - Method in class com.google.android.exoplayer2.upstream.DefaultBandwidthMeter.Builder
      @@ -33845,6 +34968,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      +
      setStartPositionMs(long) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Sets the optional start position in milliseconds which must be a value larger than or equal + to zero (Default: 0).
      +
      +
      setStartsAtKeyFrame(boolean) - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration.Builder
      +
      +
      Sets whether the start point is guaranteed to be a key frame.
      +
      setStartTimeMs(long) - Method in class com.google.android.exoplayer2.testutil.DownloadBuilder
       
      setStartTimeUs(long) - Method in class com.google.android.exoplayer2.source.SampleQueue
      @@ -33918,7 +35050,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setStreamKeys(List<StreamKey>) - Method in interface com.google.android.exoplayer2.source.MediaSourceFactory
      setStreamKeys(List<StreamKey>) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
      @@ -33939,10 +35071,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the subtitle.
      -
      setSubtitles(List<MediaItem.Subtitle>) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      setSubtitleConfigurations(List<MediaItem.SubtitleConfiguration>) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      Sets the optional subtitles.
      +
      setSubtitles(List<MediaItem.Subtitle>) - Method in class com.google.android.exoplayer2.MediaItem.Builder
      +
      +
      Deprecated. +
      Use MediaItem.Builder.setSubtitleConfigurations(List) instead. Note that MediaItem.Builder.setSubtitleConfigurations(List) doesn't accept null, use an empty list to clear the + contents.
      +
      +
      setSupportedContentTypes(int...) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
       
      setSupportedContentTypes(int...) - Method in interface com.google.android.exoplayer2.source.ads.AdsLoader
      @@ -33978,12 +35117,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setTag(Object) - Method in class com.google.android.exoplayer2.source.SilenceMediaSource.Factory
      -
      Sets a tag for the media source which will be published in the Timeline of the source as Window#mediaItem.playbackProperties.tag.
      +
      Sets a tag for the media source which will be published in the Timeline of the source + as Window#mediaItem.localConfiguration.tag.
      setTag(Object) - Method in class com.google.android.exoplayer2.source.SingleSampleMediaSource.Factory
      Sets a tag for the media source which will be published in the Timeline of the source - as Window#mediaItem.playbackProperties.tag.
      + as Window#mediaItem.localConfiguration.tag.
      setTag(Object) - Method in class com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory
      @@ -34012,6 +35152,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the target live offset in microseconds that overrides the live offset configured by the media.
      +
      setTargetOffsetMs(long) - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration.Builder
      +
      +
      Sets the target live offset, in milliseconds.
      +
      setTargetTagName(String) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      setTargetVoice(String) - Method in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
      @@ -34024,7 +35168,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the alignment of the cue text within the cue box.
      -
      setTextSize(float, int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      +
      setTextSize(float, @com.google.android.exoplayer2.text.Cue.TextSizeType int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      Sets the default text size and type for this cue's text.
      @@ -34032,13 +35176,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the resource ID of the theme used to inflate this dialog.
      -
      setThrowsWhenUsingWrongThread(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      setThrowsWhenUsingWrongThread(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Deprecated.
      Disabling the enforcement can result in hard-to-detect bugs. Do not use this method except to ease the transition while wrong thread access problems are fixed.
      +
      setThrowsWhenUsingWrongThread(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      +
      setThrowsWhenUsingWrongThread(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setTimeBarMinUpdateInterval(int) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      Sets the minimum interval between time bar position updates.
      @@ -34098,6 +35250,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the track number.
      +
      setTrackSelectionOverrides(TrackSelectionOverrides) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
      +
       
      +
      setTrackSelectionOverrides(TrackSelectionOverrides) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder
      +
      +
      Sets the selection overrides.
      +
      +
      setTrackSelectionParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      +
      setTrackSelectionParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      +
       
      +
      setTrackSelectionParameters(TrackSelectionParameters) - Method in interface com.google.android.exoplayer2.Player
      +
      +
      Sets the parameters constraining the track selection.
      +
      +
      setTrackSelectionParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setTrackSelectionParameters(TrackSelectionParameters) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      setTrackSelector(DefaultTrackSelector) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      setTrackSelector(DefaultTrackSelector) - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -34106,12 +35278,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setTrackSelector(TrackSelector) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets the TrackSelector that will be used by the player.
      setTrackSelector(TrackSelector) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the TrackSelector that will be used by the player.
      +
      setTransferListener(TransferListener) - Method in class com.google.android.exoplayer2.ext.cronet.CronetDataSource.Factory
      @@ -34125,6 +35298,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the TransferListener that will be used.
      +
      setTransferListener(TransferListener) - Method in class com.google.android.exoplayer2.upstream.DefaultDataSource.Factory
      +
      +
      Sets the TransferListener that will be used.
      +
      setTransferListener(TransferListener) - Method in class com.google.android.exoplayer2.upstream.DefaultHttpDataSource.Factory
      Sets the TransferListener that will be used.
      @@ -34189,6 +35366,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the optional URI.
      +
      setUri(Uri) - Method in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration.Builder
      +
      +
      Sets the Uri to the subtitle file.
      +
      setUri(Uri) - Method in class com.google.android.exoplayer2.testutil.DataSourceContractTest.TestResource.Builder
      Sets the URI where this resource is located.
      @@ -34217,7 +35398,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      -
      setUsage(int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
      +
      setUsage(@com.google.android.exoplayer2.C.AudioUsage int) - Method in class com.google.android.exoplayer2.audio.AudioAttributes.Builder
       
      setUseArtwork(boolean) - Method in class com.google.android.exoplayer2.ui.PlayerView
      @@ -34239,7 +35420,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets whether the playback controls can be shown.
      -
      setUseDrmSessionsForClearContent(int...) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Builder
      +
      setUseDrmSessionsForClearContent(@com.google.android.exoplayer2.C.TrackType int...) - Method in class com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Builder
      Sets whether this session manager should attach DrmSessions to the clear sections of the media content.
      @@ -34254,12 +35435,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setUseLazyPreparation(boolean) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      -
      Deprecated.
      Sets whether media sources should be initialized lazily.
      setUseLazyPreparation(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets whether media sources should be initialized lazily.
      +
      setUseLazyPreparation(boolean) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
       
      @@ -34350,7 +35532,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the version of a specified instance of a specified feature.
      -
      setVerticalType(int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      +
      setVerticalType(@com.google.android.exoplayer2.text.Cue.VerticalType int) - Method in class com.google.android.exoplayer2.text.Cue.Builder
      Sets the vertical formatting for this Cue.
      @@ -34358,16 +35540,69 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets a callback to receive video ad player events.
      -
      setVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      setVideoChangeFrameRateStrategy(int) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets a C.VideoChangeFrameRateStrategy that will be used by the player when provided + with a video output Surface.
      +
      +
      setVideoChangeFrameRateStrategy(int) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      +
      Sets a C.VideoChangeFrameRateStrategy that will be used by the player when provided + with a video output Surface.
      +
      +
      setVideoChangeFrameRateStrategy(int) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      +
      setVideoChangeFrameRateStrategy(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      + +
      +
      setVideoChangeFrameRateStrategy(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setVideoChangeFrameRateStrategy(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      +
      setVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Sets a listener to receive video frame metadata events.
      +
      setVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      + +
      setVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setVideoFrameMetadataListener(VideoFrameMetadataListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      -
      setVideoScalingMode(int) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      setVideoMimeType(String) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer.Builder
      +
      +
      Sets the video MIME type of the output.
      +
      +
      setVideoScalingMode(int) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      +
      +
      Sets the C.VideoScalingMode that will be used by the player.
      +
      +
      setVideoScalingMode(int) - Method in interface com.google.android.exoplayer2.ExoPlayer
      +
      setVideoScalingMode(int) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      +
      +
      Deprecated. + +
      +
      setVideoScalingMode(int) - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      Specifies the scaling mode to use, if a surface was specified when the codec was created.
      @@ -34376,19 +35611,25 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setVideoScalingMode(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      -
      Sets the C.VideoScalingMode that will be used by the player.
      +
      Deprecated. + +
      setVideoScalingMode(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
      Sets the video scaling mode.
      -
      +
      Deprecated.
      +  +
      setVideoScalingMode(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      setVideoSurface() - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a set video surface action.
      setVideoSurface(Surface) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Sets the Surface onto which video will be rendered.
      +
      Deprecated. + +
      setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -34401,19 +35642,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the Surface onto which video will be rendered.
      setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
      Sets the video Surface.
      -
      setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      setVideoSurface(Surface) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      SetVideoSurface(String) - Constructor for class com.google.android.exoplayer2.testutil.Action.SetVideoSurface
       
      setVideoSurfaceHolder(SurfaceHolder) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Sets the SurfaceHolder that holds the Surface onto which video will be - rendered.
      +
      setVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -34427,12 +35671,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); rendered.
      setVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setVideoSurfaceHolder(SurfaceHolder) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setVideoSurfaceView(SurfaceView) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Sets the SurfaceView onto which video will be rendered.
      +
      Deprecated. + +
      setVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -34445,12 +35693,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the SurfaceView onto which video will be rendered.
      setVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setVideoSurfaceView(SurfaceView) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setVideoTextureView(TextureView) - Method in interface com.google.android.exoplayer2.ExoPlayer.VideoComponent
      -
      Sets the TextureView onto which video will be rendered.
      +
      Deprecated. + +
      setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -34463,8 +35715,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets the TextureView onto which video will be rendered.
      setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setVideoTextureView(TextureView) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setViewportSize(int, int, boolean) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
       
      @@ -34482,7 +35736,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      setViewType(int) - Method in class com.google.android.exoplayer2.ui.SubtitleView
      -
      Set the type of View used to display subtitles.
      +
      Sets the type of View used to display subtitles.
      setVisibility(int) - Method in class com.google.android.exoplayer2.ui.PlayerNotificationManager
      @@ -34503,7 +35757,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setVolume(float) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioComponent
      -
      Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      +
      Deprecated. + +
      setVolume(float) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -34513,11 +35769,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      setVolume(float) - Method in interface com.google.android.exoplayer2.Player
      -
      Sets the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).
      +
      Sets the audio volume, valid values are between 0 (silence) and 1 (unity gain, signal + unchanged), inclusive.
      setVolume(float) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      -
      setVolume(float) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
      +
      Deprecated.
      +
      setVolume(float) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
       
      setVrButtonListener(View.OnClickListener) - Method in class com.google.android.exoplayer2.ui.PlayerControlView
      @@ -34527,14 +35786,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Sets listener for the VR button.
      -
      setWakeMode(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      setWakeMode(@com.google.android.exoplayer2.C.WakeMode int) - Method in class com.google.android.exoplayer2.ExoPlayer.Builder
      Sets the C.WakeMode that will be used by the player.
      -
      setWakeMode(int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      setWakeMode(@com.google.android.exoplayer2.C.WakeMode int) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Sets how the player should keep the device awake for playback when the screen is off.
      +
      setWakeMode(@com.google.android.exoplayer2.C.WakeMode int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer.Builder
      +
      +
      Deprecated. + +
      +
      +
      setWakeMode(@com.google.android.exoplayer2.C.WakeMode int) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      +
      setWakeMode(int) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      +
       
      setWidth(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -34709,6 +35980,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A ShuffleOrder implementation which does not shuffle.
      +
      signalEndOfInputStream() - Method in interface com.google.android.exoplayer2.mediacodec.MediaCodecAdapter
      +
      +
      Signals the encoder of end-of-stream on input.
      +
      +
      signalEndOfInputStream() - Method in class com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter
      +
       
      SilenceMediaSource - Class in com.google.android.exoplayer2.source
      Media source with a single period consisting of silent raw audio of a given duration.
      @@ -34763,28 +36040,40 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Constructs the cache.
      -
      SimpleDecoder<I extends DecoderInputBuffer,​O extends OutputBuffer,​E extends DecoderException> - Class in com.google.android.exoplayer2.decoder
      +
      SimpleDecoder<I extends DecoderInputBuffer,​O extends DecoderOutputBuffer,​E extends DecoderException> - Class in com.google.android.exoplayer2.decoder
      Base class for Decoders that use their own decode thread and decode each input buffer immediately into a corresponding output buffer.
      SimpleDecoder(I[], O[]) - Constructor for class com.google.android.exoplayer2.decoder.SimpleDecoder
       
      +
      SimpleDecoderOutputBuffer - Class in com.google.android.exoplayer2.decoder
      +
      +
      Buffer for SimpleDecoder output.
      +
      +
      SimpleDecoderOutputBuffer(DecoderOutputBuffer.Owner<SimpleDecoderOutputBuffer>) - Constructor for class com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer
      +
       
      SimpleExoPlayer - Class in com.google.android.exoplayer2
      -
      An ExoPlayer implementation that uses default Renderer components.
      +
      Deprecated. +
      Use ExoPlayer instead.
      +
      SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer
      Deprecated. - +
      SimpleExoPlayer(SimpleExoPlayer.Builder) - Constructor for class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      SimpleExoPlayer.Builder - Class in com.google.android.exoplayer2
      -
      A builder for SimpleExoPlayer instances.
      +
      Deprecated. +
      Use ExoPlayer.Builder instead.
      +
      SimpleMetadataDecoder - Class in com.google.android.exoplayer2.metadata
      @@ -34793,12 +36082,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      SimpleMetadataDecoder() - Constructor for class com.google.android.exoplayer2.metadata.SimpleMetadataDecoder
       
      -
      SimpleOutputBuffer - Class in com.google.android.exoplayer2.decoder
      -
      -
      Buffer for SimpleDecoder output.
      -
      -
      SimpleOutputBuffer(OutputBuffer.Owner<SimpleOutputBuffer>) - Constructor for class com.google.android.exoplayer2.decoder.SimpleOutputBuffer
      -
       
      SimpleSubtitleDecoder - Class in com.google.android.exoplayer2.text
      Base class for subtitle parsers that use their own decode thread.
      @@ -34881,7 +36164,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A BaseMediaChunk for chunks consisting of a single raw sample.
      -
      SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format) - Constructor for class com.google.android.exoplayer2.source.chunk.SingleSampleMediaChunk
      +
      SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, @com.google.android.exoplayer2.C.TrackType int, Format) - Constructor for class com.google.android.exoplayer2.source.chunk.SingleSampleMediaChunk
       
      SingleSampleMediaSource - Class in com.google.android.exoplayer2.source
      @@ -34939,10 +36222,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns the number of flags in this set.
      -
      size() - Method in class com.google.android.exoplayer2.util.IntArrayQueue
      -
      -
      Returns the number of items in the queue.
      -
      size() - Method in class com.google.android.exoplayer2.util.ListenerSet
      Returns the number of added listeners.
      @@ -35046,14 +36325,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      skipInputUntilPosition(ExtractorInput, long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
       
      +
      skipOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      +
      +
      Skips the specified output buffer and releases it.
      +
      skipOutputBuffer(MediaCodecAdapter, int, long) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      Skips the output buffer with the specified index.
      -
      skipOutputBuffer(VideoDecoderOutputBuffer) - Method in class com.google.android.exoplayer2.video.DecoderVideoRenderer
      -
      -
      Skips the specified output buffer and releases it.
      -
      skippedInputBufferCount - Variable in class com.google.android.exoplayer2.decoder.DecoderCounters
      The number of skipped input buffers.
      @@ -35062,14 +36341,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The number of skipped output buffers.
      -
      skippedOutputBufferCount - Variable in class com.google.android.exoplayer2.decoder.OutputBuffer
      +
      skippedOutputBufferCount - Variable in class com.google.android.exoplayer2.decoder.DecoderOutputBuffer
      The number of buffers immediately prior to this one that were skipped in the Decoder.
      skipSettingMediaSources() - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder
      -
      Skips calling ExoPlayer.setMediaSources(List) before - preparing.
      +
      Skips calling ExoPlayer.setMediaSources(List) before preparing.
      skipSilenceEnabledChanged(boolean) - Method in class com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher
      @@ -35091,11 +36369,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The skip boundary for delta updates in microseconds, or C.TIME_UNSET if delta updates are not supported.
      -
      SlidingPercentile - Class in com.google.android.exoplayer2.util
      +
      SlidingPercentile - Class in com.google.android.exoplayer2.upstream
      Calculate any percentile over a sliding window of weighted values.
      -
      SlidingPercentile(int) - Constructor for class com.google.android.exoplayer2.util.SlidingPercentile
      +
      SlidingPercentile(int) - Constructor for class com.google.android.exoplayer2.upstream.SlidingPercentile
       
      SlowMotionData - Class in com.google.android.exoplayer2.metadata.mp4
      @@ -35165,6 +36443,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      sniff(ExtractorInput) - Method in class com.google.android.exoplayer2.source.hls.WebvttExtractor
       
      +
      sniff(ExtractorInput) - Method in class com.google.android.exoplayer2.text.SubtitleExtractor
      +
       
      sniffFirst - Variable in class com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig
      Whether to sniff the data by calling Extractor.sniff(ExtractorInput) prior to @@ -35415,6 +36695,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The RTP SSRC field (Word 2).
      +
      StandaloneDatabaseProvider - Class in com.google.android.exoplayer2.database
      +
      +
      An SQLiteOpenHelper that provides instances of a standalone database.
      +
      +
      StandaloneDatabaseProvider(Context) - Constructor for class com.google.android.exoplayer2.database.StandaloneDatabaseProvider
      +
      +
      Provides instances of the database located by passing StandaloneDatabaseProvider.DATABASE_NAME to Context.getDatabasePath(String).
      +
      StandaloneMediaClock - Class in com.google.android.exoplayer2.util
      A MediaClock whose position advances with real time based on the playback parameters when @@ -35540,7 +36828,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The start offset in microseconds from the beginning of the playlist, as defined by #EXT-X-START, or C.TIME_UNSET if undefined.
      -
      startPositionMs - Variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      startPositionMs - Variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      The start position in milliseconds.
      @@ -35557,7 +36845,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      startReadWriteNonBlocking(String, long, long) - Method in class com.google.android.exoplayer2.upstream.cache.SimpleCache
       
      -
      startsAtKeyFrame - Variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      startSample(ExtractorInput) - Method in class com.google.android.exoplayer2.extractor.TrueHdSampleRechunker
      +
       
      +
      startsAtKeyFrame - Variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      Sets whether the start point is guaranteed to be a key frame.
      @@ -35586,10 +36876,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      startTimeUs - Variable in class com.google.android.exoplayer2.text.webvtt.WebvttCueInfo
       
      +
      startTransformation(MediaItem, ParcelFileDescriptor) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Starts an asynchronous operation to transform the given MediaItem.
      +
      startTransformation(MediaItem, ParcelFileDescriptor) - Method in class com.google.android.exoplayer2.transformer.Transformer
      Starts an asynchronous operation to transform the given MediaItem.
      +
      startTransformation(MediaItem, String) - Method in class com.google.android.exoplayer2.transformer.TranscodingTransformer
      +
      +
      Starts an asynchronous operation to transform the given MediaItem.
      +
      startTransformation(MediaItem, String) - Method in class com.google.android.exoplayer2.transformer.Transformer
      Starts an asynchronous operation to transform the given MediaItem.
      @@ -35713,10 +37011,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The stereo layout for 360/3D/VR video, or Format.NO_VALUE if not applicable.
      -
      stop() - Method in class com.google.android.exoplayer2.BasePlayer
      -
       
      stop() - Method in class com.google.android.exoplayer2.BaseRenderer
       
      +
      stop() - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      +
       
      stop() - Method in class com.google.android.exoplayer2.ForwardingPlayer
       
      stop() - Method in class com.google.android.exoplayer2.NoSampleRenderer
      @@ -35733,6 +37031,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Stops watching for changes.
      +
      stop() - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      +
      +
      Deprecated.
      stop() - Method in class com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker
       
      stop() - Method in interface com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker
      @@ -35743,6 +37045,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Schedules a stop action.
      +
      stop() - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      stop() - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      Stops periodic updates of the TextView.
      @@ -35752,7 +37056,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Stops the clock.
      stop(boolean) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      -
       
      +
      +
      Deprecated.
      +
      stop(boolean) - Method in class com.google.android.exoplayer2.ForwardingPlayer
      Deprecated.
      @@ -35773,8 +37079,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Schedules a stop action.
      -
      stop(boolean) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
      -
       
      +
      stop(boolean) - Method in class com.google.android.exoplayer2.testutil.StubPlayer
      +
      +
      Deprecated.
      +
      stop(AdsMediaSource, AdsLoader.EventListener) - Method in class com.google.android.exoplayer2.ext.ima.ImaAdsLoader
       
      stop(AdsMediaSource, AdsLoader.EventListener) - Method in interface com.google.android.exoplayer2.source.ads.AdsLoader
      @@ -35799,11 +37107,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The reason the download is stopped, or Download.STOP_REASON_NONE.
      -
      STREAM_INFO_BLOCK_SIZE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      STREAM_INFO_BLOCK_SIZE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Size of the FLAC stream info block (header included) in bytes.
      -
      STREAM_MARKER_SIZE - Static variable in class com.google.android.exoplayer2.util.FlacConstants
      +
      STREAM_MARKER_SIZE - Static variable in class com.google.android.exoplayer2.extractor.flac.FlacConstants
      Size of the FLAC stream marker in bytes.
      @@ -35841,7 +37149,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      STREAM_TYPE_VOICE_CALL - Static variable in class com.google.android.exoplayer2.C
       
      -
      StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List<Long>, long) - Constructor for class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
      +
      StreamElement(String, String, @com.google.android.exoplayer2.C.TrackType int, String, long, String, int, int, int, int, String, Format[], List<Long>, long) - Constructor for class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
       
      streamElements - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest
      @@ -35863,7 +37171,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates an instance.
      -
      streamKeys - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      streamKeys - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      Optional stream keys by which the manifest is filtered.
      @@ -35892,6 +37200,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      StubExoPlayer() - Constructor for class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      +
      StubPlayer - Class in com.google.android.exoplayer2.testutil
      +
      +
      An abstract Player implementation that throws UnsupportedOperationException from + every method.
      +
      +
      StubPlayer() - Constructor for class com.google.android.exoplayer2.testutil.StubPlayer
      +
       
      STYLE_BOLD - Static variable in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      STYLE_BOLD_ITALIC - Static variable in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
      @@ -35981,15 +37296,25 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Subtitle(Uri, String, String) - Constructor for class com.google.android.exoplayer2.MediaItem.Subtitle
      -
      Creates an instance.
      +
      Deprecated. + +
      -
      Subtitle(Uri, String, String, int) - Constructor for class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      Subtitle(Uri, String, String, @com.google.android.exoplayer2.C.SelectionFlags int) - Constructor for class com.google.android.exoplayer2.MediaItem.Subtitle
      -
      Creates an instance.
      +
      Deprecated. + +
      -
      Subtitle(Uri, String, String, int, int, String) - Constructor for class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      Subtitle(Uri, String, String, @com.google.android.exoplayer2.C.SelectionFlags int, @com.google.android.exoplayer2.C.RoleFlags int, String) - Constructor for class com.google.android.exoplayer2.MediaItem.Subtitle
      -
      Creates an instance.
      +
      Deprecated. + +
      +
      +
      subtitleConfigurations - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      +
      +
      Optional subtitles to be sideloaded.
      SubtitleDecoder - Interface in com.google.android.exoplayer2.text
      @@ -36009,6 +37334,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A factory for SubtitleDecoder instances.
      +
      SubtitleExtractor - Class in com.google.android.exoplayer2.text
      +
      +
      Generic extractor for extracting subtitles from various subtitle formats.
      +
      +
      SubtitleExtractor(SubtitleDecoder, Format) - Constructor for class com.google.android.exoplayer2.text.SubtitleExtractor
      +
       
      subtitleGroupId - Variable in class com.google.android.exoplayer2.source.hls.HlsTrackMetadataEntry.VariantInfo
      The SUBTITLES value as defined in the EXT-X-STREAM-INF tag, or null if the SUBTITLES @@ -36030,9 +37361,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      SubtitleOutputBuffer() - Constructor for class com.google.android.exoplayer2.text.SubtitleOutputBuffer
       
      -
      subtitles - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      subtitles - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      -
      Optional subtitles to be sideloaded.
      +
      subtitles - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist
      @@ -36065,7 +37398,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Supplemental data related to the buffer, if Buffer.hasSupplementalData() returns true.
      -
      supplementalData - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      supplementalData - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Supplemental data related to the output frame, if Buffer.hasSupplementalData() returns true.
      @@ -36073,6 +37406,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Supplemental properties in the adaptation set.
      +
      supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int) - Static method in class com.google.android.exoplayer2.ext.opus.OpusLibrary
      +
      +
      Returns whether the library supports the given C.CryptoType.
      +
      +
      supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int) - Static method in class com.google.android.exoplayer2.ext.vp9.VpxLibrary
      +
      +
      Returns whether the library supports the given C.CryptoType.
      +
      supportsEncoding(int) - Method in class com.google.android.exoplayer2.audio.AudioCapabilities
      Returns whether this device supports playback of the specified audio encoding.
      @@ -36166,7 +37507,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      surface - Variable in class com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration
      -
      For video playbacks, the output where the object will render the decoded frames.
      +
      For video decoding, the output where the object will render the decoded frames.
      surfaceChanged(SurfaceHolder, int, int, int) - Method in class com.google.android.exoplayer2.testutil.HostActivity
       
      @@ -36212,13 +37553,13 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      TABLE_PREFIX - Static variable in interface com.google.android.exoplayer2.database.DatabaseProvider
      -
      Prefix for tables that can be read and written by ExoPlayer components.
      +
      Prefix for tables that can be read and written by media library components.
      tableExists(SQLiteDatabase, String) - Static method in class com.google.android.exoplayer2.util.Util
      Returns whether the table exists in the database.
      -
      tag - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      tag - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      Optional tag for custom attributes.
      @@ -36295,8 +37636,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      TestPlayerRunHelper - Class in com.google.android.exoplayer2.robolectric
      -
      Helper methods to block the calling thread until the provided SimpleExoPlayer instance - reaches a particular state.
      +
      Helper methods to block the calling thread until the provided ExoPlayer instance reaches + a particular state.
      TestUtil - Class in com.google.android.exoplayer2.testutil
      @@ -36310,6 +37651,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The cue text, or null if this is an image cue.
      +
      TEXT_EXOPLAYER_CUES - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      +
       
      TEXT_SIZE_TYPE_ABSOLUTE - Static variable in class com.google.android.exoplayer2.text.Cue
      Text size is measured in number of pixels.
      @@ -36324,6 +37667,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      TEXT_SSA - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      +
      TEXT_UNKNOWN - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      +
       
      TEXT_VTT - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      textAlignment - Variable in class com.google.android.exoplayer2.text.Cue
      @@ -36382,10 +37727,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String) - Constructor for class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore
       
      +
      TEXTURE_ID_UNSET - Static variable in class com.google.android.exoplayer2.util.GlUtil
      +
      +
      Represents an unset texture ID.
      +
      THREAD_COUNT_AUTODETECT - Static variable in class com.google.android.exoplayer2.ext.av1.Libgav1VideoRenderer
      Attempts to use as many threads as performance processors available on the device.
      +
      throwNotProvisionedExceptionFromGetKeyRequest() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Configures the FakeExoMediaDrm to throw any NotProvisionedException from + FakeExoMediaDrm.getKeyRequest(byte[], List, int, HashMap) instead of the default behaviour of + throwing from FakeExoMediaDrm.openSession().
      +
      throwPlaybackException(ExoPlaybackException) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules to throw a playback exception on the playback thread.
      @@ -36611,7 +37966,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The time at which the sample should be presented.
      -
      timeUs - Variable in class com.google.android.exoplayer2.decoder.OutputBuffer
      +
      timeUs - Variable in class com.google.android.exoplayer2.decoder.DecoderOutputBuffer
      The presentation timestamp for the buffer, in microseconds.
      @@ -36621,8 +37976,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      timeUs - Variable in class com.google.android.exoplayer2.source.ads.AdPlaybackState.AdGroup
      -
      The time of the ad group in the Timeline.Period, in - microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
      +
      The time of the ad group in the Timeline.Period, in microseconds, or C.TIME_END_OF_SOURCE to indicate a postroll ad.
      timeUsToTargetTime(long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker.BinarySearchSeekMap
       
      @@ -36658,15 +38012,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a Bundle representing the information stored in this object.
      -
      toBundle() - Method in class com.google.android.exoplayer2.device.DeviceInfo
      +
      toBundle() - Method in class com.google.android.exoplayer2.DeviceInfo
       
      toBundle() - Method in exception com.google.android.exoplayer2.ExoPlaybackException
      Returns a Bundle representing the information stored in this object.
      +
      toBundle() - Method in class com.google.android.exoplayer2.Format
      +
       
      toBundle() - Method in class com.google.android.exoplayer2.HeartRating
       
      -
      toBundle() - Method in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      toBundle() - Method in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
       
      toBundle() - Method in class com.google.android.exoplayer2.MediaItem.LiveConfiguration
       
      @@ -36694,6 +38050,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a Bundle representing the information stored in this object.
      +
      toBundle() - Method in class com.google.android.exoplayer2.source.TrackGroup
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.source.TrackGroupArray
      +
       
      toBundle() - Method in class com.google.android.exoplayer2.StarRating
       
      toBundle() - Method in class com.google.android.exoplayer2.text.Cue
      @@ -36712,19 +38072,39 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a Bundle representing the information stored in this object.
      +
      toBundle() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.TracksInfo
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
       
      +
      toBundle() - Method in class com.google.android.exoplayer2.video.ColorInfo
      +
       
      toBundle() - Method in class com.google.android.exoplayer2.video.VideoSize
       
      toBundle(boolean) - Method in class com.google.android.exoplayer2.Timeline
      -
      toBundleArrayList(List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      toBundleArrayList(Collection<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      -
      Converts a list of Bundleable to an ArrayList of Bundle so that the - returned list can be put to Bundle using Bundle.putParcelableArrayList(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>) +
      Converts a collection of Bundleable to an ArrayList of Bundle so that + the returned list can be put to Bundle using Bundle.putParcelableArrayList(java.lang.String, java.util.ArrayList<? extends android.os.Parcelable>) conveniently.
      -
      toBundleList(List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      toBundleList(List<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      Converts a list of Bundleable to a list Bundle.
      +
      toBundleSparseArray(SparseArray<T>) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      +
      + +
      toByteArray(InputStream) - Static method in class com.google.android.exoplayer2.util.Util
      Converts the entirety of an InputStream to a byte array.
      @@ -36753,7 +38133,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      toLong(int, int) - Static method in class com.google.android.exoplayer2.util.Util
      -
      Return the long that is composed of the bits of the 2 specified integers.
      +
      Returns the long that is composed of the bits of the 2 specified integers.
      toMediaItem() - Method in class com.google.android.exoplayer2.offline.DownloadRequest
      @@ -36771,7 +38151,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Converts a MediaItem to a MediaQueueItem.
      -
      toNullableBundle(Bundleable) - Static method in class com.google.android.exoplayer2.util.BundleableUtils
      +
      toNullableBundle(Bundleable) - Static method in class com.google.android.exoplayer2.util.BundleableUtil
      Converts a Bundleable to a Bundle.
      @@ -36965,36 +38345,35 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      TRACE_ENABLED - Static variable in class com.google.android.exoplayer2.ExoPlayerLibraryInfo
      -
      Whether the library was compiled with TraceUtil - trace enabled.
      +
      Whether the library was compiled with TraceUtil trace enabled.
      TraceUtil - Class in com.google.android.exoplayer2.util
      Calls through to Trace methods on supported API levels.
      -
      track(int, int) - Method in class com.google.android.exoplayer2.extractor.DummyExtractorOutput
      -
       
      -
      track(int, int) - Method in interface com.google.android.exoplayer2.extractor.ExtractorOutput
      +
      track(int, @com.google.android.exoplayer2.C.TrackType int) - Method in interface com.google.android.exoplayer2.extractor.ExtractorOutput
      Called by the Extractor to get the TrackOutput for a specific track.
      -
      track(int, int) - Method in class com.google.android.exoplayer2.extractor.jpeg.StartOffsetExtractorOutput
      +
      track(int, @com.google.android.exoplayer2.C.TrackType int) - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput
       
      -
      track(int, int) - Method in class com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput
      -
       
      -
      track(int, int) - Method in class com.google.android.exoplayer2.source.chunk.BundledChunkExtractor
      -
       
      -
      track(int, int) - Method in interface com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider
      +
      track(int, @com.google.android.exoplayer2.C.TrackType int) - Method in interface com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider
      Called to get the TrackOutput for a specific track.
      +
      track(int, int) - Method in class com.google.android.exoplayer2.extractor.DummyExtractorOutput
      +
       
      +
      track(int, int) - Method in class com.google.android.exoplayer2.extractor.jpeg.StartOffsetExtractorOutput
      +
       
      +
      track(int, int) - Method in class com.google.android.exoplayer2.source.chunk.BundledChunkExtractor
      +
       
      track(int, int) - Method in class com.google.android.exoplayer2.testutil.FakeExtractorOutput
       
      Track - Class in com.google.android.exoplayer2.extractor.mp4
      Encapsulates information describing an MP4 track.
      -
      Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[]) - Constructor for class com.google.android.exoplayer2.extractor.mp4.Track
      +
      Track(int, @com.google.android.exoplayer2.C.TrackType int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[]) - Constructor for class com.google.android.exoplayer2.extractor.mp4.Track
       
      TRACK_TYPE_AUDIO - Static variable in class com.google.android.exoplayer2.C
      @@ -37058,18 +38437,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The format of the track to which the data belongs.
      +
      trackGroup - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
      + +
      TrackGroup - Class in com.google.android.exoplayer2.source
      Defines an immutable group of tracks identified by their format identity.
      TrackGroup(Format...) - Constructor for class com.google.android.exoplayer2.source.TrackGroup
      -
       
      +
      +
      Constructs an instance TrackGroup containing the provided formats.
      +
      TrackGroupArray - Class in com.google.android.exoplayer2.source
      An immutable array of TrackGroups.
      TrackGroupArray(TrackGroup...) - Constructor for class com.google.android.exoplayer2.source.TrackGroupArray
      -
       
      +
      +
      Construct a TrackGroupArray from an array of (possibly empty) trackGroups.
      +
      +
      TrackGroupInfo(TrackGroup, int[], @com.google.android.exoplayer2.C.TrackType int, boolean[]) - Constructor for class com.google.android.exoplayer2.TracksInfo.TrackGroupInfo
      +
      +
      Constructs a TrackGroupInfo.
      +
      TrackIdGenerator(int, int) - Constructor for class com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator
       
      TrackIdGenerator(int, int, int) - Constructor for class com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator
      @@ -37080,6 +38471,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); +
      trackIndexes - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
      +
      The index of tracks in a TrackGroup to be selected.
      +
      TrackNameProvider - Interface in com.google.android.exoplayer2.ui
      Converts Formats to user readable track names.
      @@ -37116,6 +38511,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A track selection consisting of a static subset of selected tracks belonging to a TrackGroup.
      +
      TrackSelection.Type - Annotation Type in com.google.android.exoplayer2.trackselection
      +
      +
      Represents a type track selection.
      +
      TrackSelectionArray - Class in com.google.android.exoplayer2.trackselection
      An array of TrackSelections.
      @@ -37146,6 +38545,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Callback which is invoked when a track selection has been made.
      +
      TrackSelectionOverride(TrackGroup) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
      +
      Constructs an instance to force all tracks in trackGroup to be selected.
      +
      +
      TrackSelectionOverride(TrackGroup, List<Integer>) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride
      +
      +
      Constructs an instance to force trackIndexes in trackGroup to be selected.
      +
      +
      trackSelectionOverrides - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      +
      +
      Overrides to force tracks to be selected.
      +
      +
      TrackSelectionOverrides - Class in com.google.android.exoplayer2.trackselection
      +
      +
      Forces the selection of the specified tracks in TrackGroups.
      +
      +
      TrackSelectionOverrides.Builder - Class in com.google.android.exoplayer2.trackselection
      +
      + +
      +
      TrackSelectionOverrides.TrackSelectionOverride - Class in com.google.android.exoplayer2.trackselection
      +
      + +
      TrackSelectionParameters - Class in com.google.android.exoplayer2.trackselection
      Constraint parameters for track selection.
      @@ -37158,11 +38581,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      trackSelectionReason - Variable in class com.google.android.exoplayer2.source.chunk.Chunk
      -
      One of the C SELECTION_REASON_* constants if the chunk belongs to a track.
      +
      One of the selection reasons if the chunk belongs to a track.
      trackSelectionReason - Variable in class com.google.android.exoplayer2.source.MediaLoadData
      -
      One of the C SELECTION_REASON_* constants if the data belongs to a track.
      +
      One of the selection reasons if the data belongs to a track.
      TrackSelectionUtil - Class in com.google.android.exoplayer2.trackselection
      @@ -37207,19 +38630,59 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The result of a TrackSelector operation.
      -
      TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectorResult
      +
      TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], TracksInfo, Object) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectorResult
       
      +
      TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object) - Constructor for class com.google.android.exoplayer2.trackselection.TrackSelectorResult
      +
      + +
      tracksEnded - Variable in class com.google.android.exoplayer2.testutil.FakeExtractorOutput
       
      +
      tracksInfo - Variable in class com.google.android.exoplayer2.trackselection.TrackSelectorResult
      +
      +
      Describe the tracks and which one were selected.
      +
      +
      TracksInfo - Class in com.google.android.exoplayer2
      +
      +
      Immutable information (TracksInfo.TrackGroupInfo) about tracks.
      +
      +
      TracksInfo(List<TracksInfo.TrackGroupInfo>) - Constructor for class com.google.android.exoplayer2.TracksInfo
      +
      +
      Constructs TracksInfo from the provided TracksInfo.TrackGroupInfo.
      +
      +
      TracksInfo.TrackGroupInfo - Class in com.google.android.exoplayer2
      +
      +
      Information about tracks in a TrackGroup: their C.TrackType, if their format is + supported by the player and if they are selected for playback.
      +
      trackType - Variable in class com.google.android.exoplayer2.source.MediaLoadData
      -
      One of the C TRACK_TYPE_* constants if the data corresponds to media of a - specific type.
      +
      One of the track types, which is a media track type if the data corresponds + to media of a specific type, or C.TRACK_TYPE_UNKNOWN otherwise.
      trailingParts - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist
      The list of parts at the end of the playlist for which the segment is not in the playlist yet.
      +
      TranscodingTransformer - Class in com.google.android.exoplayer2.transformer
      +
      +
      A transcoding transformer to transform media inputs.
      +
      +
      TranscodingTransformer.Builder - Class in com.google.android.exoplayer2.transformer
      +
      +
      A builder for TranscodingTransformer instances.
      +
      +
      TranscodingTransformer.Listener - Interface in com.google.android.exoplayer2.transformer
      +
      +
      A listener for the transformation events.
      +
      +
      TranscodingTransformer.ProgressState - Annotation Type in com.google.android.exoplayer2.transformer
      +
      +
      Progress state.
      +
      transferEnded() - Method in class com.google.android.exoplayer2.upstream.BaseDataSource
      Notifies listeners that a transfer ended.
      @@ -37288,6 +38751,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The number of bytes that must be parsed from a TrueHD syncframe to calculate the sample count.
      +
      TrueHdSampleRechunker - Class in com.google.android.exoplayer2.extractor
      +
      +
      Rechunks TrueHD sample data into groups of Ac3Util.TRUEHD_RECHUNK_SAMPLE_COUNT samples.
      +
      +
      TrueHdSampleRechunker() - Constructor for class com.google.android.exoplayer2.extractor.TrueHdSampleRechunker
      +
       
      truncateAscii(CharSequence, int) - Static method in class com.google.android.exoplayer2.util.Util
      Truncates a sequence of ASCII characters to a maximum length.
      @@ -37308,6 +38777,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      TS_STREAM_TYPE_AIT - Static variable in class com.google.android.exoplayer2.extractor.ts.TsExtractor
       
      +
      TS_STREAM_TYPE_DC2_H262 - Static variable in class com.google.android.exoplayer2.extractor.ts.TsExtractor
      +
       
      TS_STREAM_TYPE_DTS - Static variable in class com.google.android.exoplayer2.extractor.ts.TsExtractor
       
      TS_STREAM_TYPE_DVBSUBS - Static variable in class com.google.android.exoplayer2.extractor.ts.TsExtractor
      @@ -37438,7 +38909,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      type - Variable in class com.google.android.exoplayer2.source.dash.manifest.AdaptationSet
      -
      The type of the adaptation set.
      +
      The track type of the adaptation set.
      type - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement
       
      @@ -37458,6 +38929,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The type of the data.
      +
      TYPE - Static variable in class com.google.android.exoplayer2.testutil.FakeCryptoConfig
      +
       
      TYPE_AD - Static variable in exception com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException
      Type for when an ad failed to load.
      @@ -37609,7 +39082,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Thrown when an error is encountered when trying to read from a UdpDataSource.
      -
      UdpDataSourceException(Throwable, int) - Constructor for exception com.google.android.exoplayer2.upstream.UdpDataSource.UdpDataSourceException
      +
      UdpDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int) - Constructor for exception com.google.android.exoplayer2.upstream.UdpDataSource.UdpDataSourceException
      Creates a UdpDataSourceException.
      @@ -37669,9 +39142,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      UnhandledAudioFormatException(AudioProcessor.AudioFormat) - Constructor for exception com.google.android.exoplayer2.audio.AudioProcessor.UnhandledAudioFormatException
       
      -
      Uniform(int, int) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Uniform
      +
      Uniform(String, int, int) - Constructor for class com.google.android.exoplayer2.util.GlUtil.Uniform
      -
      Creates a new GL uniform.
      +
      Creates a new uniform.
      uniqueProgramId - Variable in class com.google.android.exoplayer2.metadata.scte35.SpliceInsertCommand
      @@ -37681,7 +39154,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The unique program id as defined in SCTE35, Section 9.3.2.
      -
      UNKNOWN - Static variable in class com.google.android.exoplayer2.device.DeviceInfo
      +
      UNKNOWN - Static variable in class com.google.android.exoplayer2.DeviceInfo
      Unknown DeviceInfo.
      @@ -37714,9 +39187,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      Unseekable(long, long) - Constructor for class com.google.android.exoplayer2.extractor.SeekMap.Unseekable
       
      +
      UNSET - Static variable in class com.google.android.exoplayer2.MediaItem.ClippingConfiguration
      +
      +
      A clipping configuration with default values.
      +
      +
      UNSET - Static variable in class com.google.android.exoplayer2.MediaItem.ClippingProperties
      +
      +
      Deprecated.
      UNSET - Static variable in class com.google.android.exoplayer2.MediaItem.LiveConfiguration
      -
      A live playback configuration with unset values.
      +
      A live playback configuration with unset values, meaning media-defined default values will be + used.
      UNSET_LOOKAHEAD - Static variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest
       
      @@ -37726,6 +39208,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      UNSPECIFIED - Static variable in class com.google.android.exoplayer2.text.webvtt.WebvttCssStyle
       
      +
      UNSUPPORTED - Static variable in interface com.google.android.exoplayer2.source.MediaSourceFactory
      +
      + +
      UnsupportedDrmException - Exception in com.google.android.exoplayer2.drm
      Thrown when the requested DRM scheme is not supported.
      @@ -37738,16 +39225,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The reason for the exception.
      -
      UnsupportedMediaCrypto - Class in com.google.android.exoplayer2.drm
      -
      -
      ExoMediaCrypto type that cannot be used to handle any type of protected content.
      -
      -
      UnsupportedMediaCrypto() - Constructor for class com.google.android.exoplayer2.drm.UnsupportedMediaCrypto
      +
      UnsupportedEglVersionException() - Constructor for exception com.google.android.exoplayer2.util.GlUtil.UnsupportedEglVersionException
       
      UnsupportedRequestException() - Constructor for exception com.google.android.exoplayer2.offline.DownloadRequest.UnsupportedRequestException
       
      update(byte[], int, int, byte[], int) - Method in class com.google.android.exoplayer2.upstream.crypto.AesFlushingCipher
       
      +
      update(Uri, ContentValues, String, String[]) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      updateAndPost() - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      updateClipping(long, long) - Method in class com.google.android.exoplayer2.source.ClippingMediaPeriod
      @@ -37791,11 +39276,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Updates the playback queue information used for event association.
      -
      updateOrientation(float, float, float, float) - Method in class com.google.android.exoplayer2.ext.gvr.GvrAudioProcessor
      -
      -
      Deprecated.
      -
      Updates the listener head orientation.
      -
      updateOutputFormatForTime(long) - Method in class com.google.android.exoplayer2.mediacodec.MediaCodecRenderer
      Updates the output formats for the specified output buffer timestamp, calling MediaCodecRenderer.onOutputFormatChanged(com.google.android.exoplayer2.Format, android.media.MediaFormat) if a change has occurred.
      @@ -37824,9 +39304,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Updates or creates sessions based on a player AnalyticsListener.EventTime.
      -
      updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int) - Method in class com.google.android.exoplayer2.analytics.DefaultPlaybackSessionManager
      +
      updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in class com.google.android.exoplayer2.analytics.DefaultPlaybackSessionManager
       
      -
      updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.PlaybackSessionManager
      +
      updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int) - Method in interface com.google.android.exoplayer2.analytics.PlaybackSessionManager
      Updates or creates sessions based on a position discontinuity at AnalyticsListener.EventTime.
      @@ -37875,11 +39355,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      uptimeMillis() - Method in class com.google.android.exoplayer2.util.SystemClock
       
      -
      uri - Variable in class com.google.android.exoplayer2.MediaItem.PlaybackProperties
      +
      uri - Variable in class com.google.android.exoplayer2.MediaItem.LocalConfiguration
      The Uri.
      -
      uri - Variable in class com.google.android.exoplayer2.MediaItem.Subtitle
      +
      uri - Variable in class com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
      The Uri to the subtitle file.
      @@ -38004,6 +39484,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      USAGE_VOICE_COMMUNICATION_SIGNALLING - Static variable in class com.google.android.exoplayer2.C
       
      +
      use() - Method in class com.google.android.exoplayer2.util.GlUtil.Program
      +
      +
      Uses the program.
      +
      USE_TRACK_COLOR_SETTINGS - Static variable in class com.google.android.exoplayer2.ui.CaptionStyleCompat
      Use color setting specified by the track and fallback to default caption style.
      @@ -38020,6 +39504,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      usToMs(long) - Static method in class com.google.android.exoplayer2.C
      +
      Deprecated. + +
      +
      +
      usToMs(long) - Static method in class com.google.android.exoplayer2.util.Util
      +
      Converts a time in microseconds to the corresponding time in milliseconds, preserving C.TIME_UNSET and C.TIME_END_OF_SOURCE values.
      usToNonWrappedPts(long) - Static method in class com.google.android.exoplayer2.util.TimestampAdjuster
      @@ -38074,13 +39564,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The UUID of the DRM scheme, or C.UUID_NIL if the data is universal (i.e.
      -
      uuid - Variable in class com.google.android.exoplayer2.drm.FrameworkMediaCrypto
      +
      uuid - Variable in class com.google.android.exoplayer2.drm.FrameworkCryptoConfig
      The DRM scheme UUID.
      uuid - Variable in class com.google.android.exoplayer2.MediaItem.DrmConfiguration
      -
      The UUID of the protection scheme.
      +
      Deprecated. + +
      uuid - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement
       
      @@ -38183,7 +39675,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      VERSION_SLASHY - Static variable in class com.google.android.exoplayer2.ExoPlayerLibraryInfo
      -
      The version of the library expressed as "ExoPlayerLib/" + VERSION.
      +
      The version of the library expressed as TAG + "/" + VERSION.
      VERSION_UNSET - Static variable in class com.google.android.exoplayer2.database.VersionTable
      @@ -38191,7 +39683,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      VersionTable - Class in com.google.android.exoplayer2.database
      -
      Utility methods for accessing versions of ExoPlayer database components.
      +
      Utility methods for accessing versions of media library database components.
      VERTICAL_TYPE_LR - Static variable in class com.google.android.exoplayer2.text.Cue
      @@ -38208,6 +39700,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      VIDEO_AV1 - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      +
      VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF - Static variable in class com.google.android.exoplayer2.C
      +
      + +
      +
      VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS - Static variable in class com.google.android.exoplayer2.C
      +
      +
      Strategy to call Surface.setFrameRate(float, int, int) with Surface.CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS when the output frame rate is known.
      +
      VIDEO_DIVX - Static variable in class com.google.android.exoplayer2.util.MimeTypes
       
      VIDEO_DOLBY_VISION - Static variable in class com.google.android.exoplayer2.util.MimeTypes
      @@ -38256,32 +39756,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      A default video scaling mode for MediaCodec-based renderers.
      -
      VIDEO_SCALING_MODE_DEFAULT - Static variable in interface com.google.android.exoplayer2.Renderer
      -
      -
      Deprecated. -
      Use C.VIDEO_SCALING_MODE_DEFAULT.
      -
      -
      VIDEO_SCALING_MODE_SCALE_TO_FIT - Static variable in class com.google.android.exoplayer2.C
      -
      VIDEO_SCALING_MODE_SCALE_TO_FIT - Static variable in interface com.google.android.exoplayer2.Renderer
      -
      - -
      VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING - Static variable in class com.google.android.exoplayer2.C
      -
      VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING - Static variable in interface com.google.android.exoplayer2.Renderer
      -
      - -
      VIDEO_STREAM - Static variable in class com.google.android.exoplayer2.extractor.ts.PsExtractor
       
      VIDEO_STREAM_MASK - Static variable in class com.google.android.exoplayer2.extractor.ts.PsExtractor
      @@ -38302,35 +39784,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      VideoDecoderGLSurfaceView - Class in com.google.android.exoplayer2.video
      -
      GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
      +
      GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
      VideoDecoderGLSurfaceView(Context) - Constructor for class com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView
       
      VideoDecoderGLSurfaceView(Context, AttributeSet) - Constructor for class com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView
       
      -
      VideoDecoderInputBuffer - Class in com.google.android.exoplayer2.video
      -
      -
      Input buffer to a video decoder.
      -
      -
      VideoDecoderInputBuffer(int) - Constructor for class com.google.android.exoplayer2.video.VideoDecoderInputBuffer
      -
      -
      Creates a new instance.
      -
      -
      VideoDecoderInputBuffer(int, int) - Constructor for class com.google.android.exoplayer2.video.VideoDecoderInputBuffer
      -
      -
      Creates a new instance.
      -
      -
      VideoDecoderOutputBuffer - Class in com.google.android.exoplayer2.video
      +
      VideoDecoderOutputBuffer - Class in com.google.android.exoplayer2.decoder
      Video decoder output buffer containing video frame data.
      -
      VideoDecoderOutputBuffer(OutputBuffer.Owner<VideoDecoderOutputBuffer>) - Constructor for class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      VideoDecoderOutputBuffer(DecoderOutputBuffer.Owner<VideoDecoderOutputBuffer>) - Constructor for class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      Creates VideoDecoderOutputBuffer.
      VideoDecoderOutputBufferRenderer - Interface in com.google.android.exoplayer2.video
      - +
      videoFormatHistory - Variable in class com.google.android.exoplayer2.analytics.PlaybackStats
      @@ -38362,12 +39832,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The video rendition group referenced by this variant, or null.
      -
      VideoListener - Interface in com.google.android.exoplayer2.video
      -
      -
      Deprecated. - -
      -
      VideoRendererEventListener - Interface in com.google.android.exoplayer2.video
      Listener of video Renderer events.
      @@ -38466,7 +39930,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Vpx decoder.
      -
      VpxDecoder(int, int, int, ExoMediaCrypto, int) - Constructor for class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      +
      VpxDecoder(int, int, int, CryptoConfig, int) - Constructor for class com.google.android.exoplayer2.ext.vp9.VpxDecoder
      Creates a VP9 decoder.
      @@ -38508,11 +39972,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      WaitForPendingPlayerCommands(String) - Constructor for class com.google.android.exoplayer2.testutil.Action.WaitForPendingPlayerCommands
       
      -
      waitForPlaybackState(int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      +
      waitForPlaybackState(@com.google.android.exoplayer2.Player.State int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a delay until the playback state changed to the specified state.
      -
      WaitForPlaybackState(String, int) - Constructor for class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
      +
      WaitForPlaybackState(String, @com.google.android.exoplayer2.Player.State int) - Constructor for class com.google.android.exoplayer2.testutil.Action.WaitForPlaybackState
       
      waitForPlayWhenReady(boolean) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      @@ -38530,7 +39994,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Schedules a delay until any timeline change.
      -
      waitForTimelineChanged(Timeline, int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      +
      waitForTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a delay until the timeline changed to a specified expected timeline.
      @@ -38538,7 +40002,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Creates action waiting for any timeline change for any reason.
      -
      WaitForTimelineChanged(String, Timeline, int) - Constructor for class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
      +
      WaitForTimelineChanged(String, Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int) - Constructor for class com.google.android.exoplayer2.testutil.Action.WaitForTimelineChanged
      Creates action waiting for a timeline change for a given reason.
      @@ -38658,6 +40122,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Utility methods for Widevine.
      +
      width - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      +
       
      width - Variable in class com.google.android.exoplayer2.Format
      The width of the video in pixels, or Format.NO_VALUE if unknown or not applicable.
      @@ -38666,14 +40132,20 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      The width of the picture in pixels.
      +
      width - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.H265SpsData
      +
       
      width - Variable in class com.google.android.exoplayer2.util.NalUnitUtil.SpsData
       
      width - Variable in class com.google.android.exoplayer2.video.AvcConfig
      -
       
      +
      +
      The width of each decoded frame, or Format.NO_VALUE if unknown.
      +
      +
      width - Variable in class com.google.android.exoplayer2.video.HevcConfig
      +
      +
      The width of each decoded frame, or Format.NO_VALUE if unknown.
      +
      width - Variable in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues
       
      -
      width - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      -
       
      width - Variable in class com.google.android.exoplayer2.video.VideoSize
      The video width in pixels, 0 when unknown.
      @@ -38711,7 +40183,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      windowIndex - Variable in class com.google.android.exoplayer2.Player.PositionInfo
      -
      The window index.
      +
      Deprecated. + +
      windowIndex - Variable in class com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
      @@ -38737,7 +40211,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      windowUid - Variable in class com.google.android.exoplayer2.Player.PositionInfo
      -
      The UID of the window, or null, if the timeline is empty.
      +
      The UID of the window, or null if the timeline is empty.
      withAbsoluteSize(int) - Method in interface com.google.android.exoplayer2.testutil.truth.SpannedSubject.AbsoluteSized
      @@ -38898,7 +40372,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Returns a copy of this data spec with the specified Uri.
      -
      WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC - Static variable in class com.google.android.exoplayer2.drm.FrameworkMediaCrypto
      +
      WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC - Static variable in class com.google.android.exoplayer2.drm.FrameworkCryptoConfig
      Whether the device needs keys to have been loaded into the DrmSession before codec configuration.
      @@ -38944,6 +40418,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      Writes all not yet written sample stream items to the sample queue starting at the given position.
      +
      writeDataToPipe(ParcelFileDescriptor, Uri, String, Bundle, Object) - Method in class com.google.android.exoplayer2.testutil.AssetContentProvider
      +
       
      WriteException(int, Format, boolean) - Constructor for exception com.google.android.exoplayer2.audio.AudioSink.WriteException
      Creates an instance.
      @@ -38962,8 +40438,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.drm.DrmInitData
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.Format
      -
       
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.metadata.dvbsi.AppInfoTable
       
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.metadata.emsg.EventMessage
      @@ -39030,17 +40504,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
       
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.source.hls.HlsTrackMetadataEntry
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.source.TrackGroup
      -
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.source.TrackGroupArray
      -
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters
      -
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride
      -
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.trackselection.TrackSelectionParameters
      -
       
      -
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.video.ColorInfo
      +
      writeToParcel(Parcel, int) - Method in class com.google.android.exoplayer2.testutil.FakeMetadataEntry
       
      @@ -39064,11 +40528,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height")); -
      yuvPlanes - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      yuvPlanes - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
      YUV planes for YUV mode.
      -
      yuvStrides - Variable in class com.google.android.exoplayer2.video.VideoDecoderOutputBuffer
      +
      yuvStrides - Variable in class com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer
       
      A B C D E F G H I J K L M N O P Q R S T U V W X Y 
      All Classes All Packages diff --git a/docs/doc/reference/index.html b/docs/doc/reference/index.html index 1af4c0e735..6ec45d617b 100644 --- a/docs/doc/reference/index.html +++ b/docs/doc/reference/index.html @@ -122,310 +122,302 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));   -com.google.android.exoplayer2.device -  - - com.google.android.exoplayer2.drm   - + com.google.android.exoplayer2.ext.av1   - + com.google.android.exoplayer2.ext.cast   - + com.google.android.exoplayer2.ext.cronet   - + com.google.android.exoplayer2.ext.ffmpeg   - + com.google.android.exoplayer2.ext.flac   - -com.google.android.exoplayer2.ext.gvr -  - - + com.google.android.exoplayer2.ext.ima   - + com.google.android.exoplayer2.ext.leanback   - + com.google.android.exoplayer2.ext.media2   - + com.google.android.exoplayer2.ext.mediasession   - + com.google.android.exoplayer2.ext.okhttp   - + com.google.android.exoplayer2.ext.opus   - + com.google.android.exoplayer2.ext.rtmp   - + com.google.android.exoplayer2.ext.vp9   - + com.google.android.exoplayer2.ext.workmanager   - + com.google.android.exoplayer2.extractor   - + com.google.android.exoplayer2.extractor.amr   - + com.google.android.exoplayer2.extractor.flac   - + com.google.android.exoplayer2.extractor.flv   - + com.google.android.exoplayer2.extractor.jpeg   - + com.google.android.exoplayer2.extractor.mkv   - + com.google.android.exoplayer2.extractor.mp3   - + com.google.android.exoplayer2.extractor.mp4   - + com.google.android.exoplayer2.extractor.ogg   - + com.google.android.exoplayer2.extractor.rawcc   - + com.google.android.exoplayer2.extractor.ts   - + com.google.android.exoplayer2.extractor.wav   - + com.google.android.exoplayer2.mediacodec   - + com.google.android.exoplayer2.metadata   - + com.google.android.exoplayer2.metadata.dvbsi   - + com.google.android.exoplayer2.metadata.emsg   - + com.google.android.exoplayer2.metadata.flac   - + com.google.android.exoplayer2.metadata.icy   - + com.google.android.exoplayer2.metadata.id3   - + com.google.android.exoplayer2.metadata.mp4   - + com.google.android.exoplayer2.metadata.scte35   - + com.google.android.exoplayer2.offline   - + com.google.android.exoplayer2.robolectric   - + com.google.android.exoplayer2.scheduler   - + com.google.android.exoplayer2.source   - + com.google.android.exoplayer2.source.ads   - + com.google.android.exoplayer2.source.chunk   - + com.google.android.exoplayer2.source.dash   - + com.google.android.exoplayer2.source.dash.manifest   - + com.google.android.exoplayer2.source.dash.offline   - + com.google.android.exoplayer2.source.hls   - + com.google.android.exoplayer2.source.hls.offline   - + com.google.android.exoplayer2.source.hls.playlist   - + com.google.android.exoplayer2.source.mediaparser   - + com.google.android.exoplayer2.source.rtsp   - + com.google.android.exoplayer2.source.rtsp.reader   - + com.google.android.exoplayer2.source.smoothstreaming   - + com.google.android.exoplayer2.source.smoothstreaming.manifest   - + com.google.android.exoplayer2.source.smoothstreaming.offline   - + com.google.android.exoplayer2.testutil   - + com.google.android.exoplayer2.testutil.truth   - + com.google.android.exoplayer2.text   - + com.google.android.exoplayer2.text.cea   - + com.google.android.exoplayer2.text.dvb   - + com.google.android.exoplayer2.text.pgs   - + com.google.android.exoplayer2.text.span   - + com.google.android.exoplayer2.text.ssa   - + com.google.android.exoplayer2.text.subrip   - + com.google.android.exoplayer2.text.ttml   - + com.google.android.exoplayer2.text.tx3g   - + com.google.android.exoplayer2.text.webvtt   - + com.google.android.exoplayer2.trackselection   - + com.google.android.exoplayer2.transformer   - + com.google.android.exoplayer2.ui   - + com.google.android.exoplayer2.upstream   - + com.google.android.exoplayer2.upstream.cache   - + com.google.android.exoplayer2.upstream.crypto   - + com.google.android.exoplayer2.util   - + com.google.android.exoplayer2.video   - + com.google.android.exoplayer2.video.spherical   diff --git a/docs/doc/reference/member-search-index.js b/docs/doc/reference/member-search-index.js index 0a5c9c8738..5fc7a85569 100644 --- a/docs/doc/reference/member-search-index.js +++ b/docs/doc/reference/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, int, List, List, List, List)","url":"%3Cinit%3E(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, long, long, long, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"addAdGroupToAdPlaybackState(AdPlaybackState, long, long, long)","url":"addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(FlagSet)","url":"addAll(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAllCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioListener(AudioListener)","url":"addAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addDeviceListener(DeviceListener)","url":"addDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMetadataOutput(MetadataOutput)","url":"addMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addTextOutput(TextOutput)","url":"addTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addVideoListener(VideoListener)","url":"addVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkDataType"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, int)","url":"assertExtensionRendererCreated(java.lang.Class,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionedSame(MediaItem...)","url":"assertMediaItemsTransitionedSame(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertMediaItemsTransitionReasonsEqual(Integer...)","url":"assertMediaItemsTransitionReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,int,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTrackGroupsEqual(TrackGroupArray)","url":"assertTrackGroupsEqual(com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_UHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String, String, int, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"BaseUrlExclusionList()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrls"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrls"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, int, List, List, List, List)","url":"buildAdaptationSet(int,int,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context, String, boolean)","url":"buildCronetEngine(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, String, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, Renderer...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Renderer[], TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(TrackSelectionParameters)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecStringFromSps(ParsableNalUnitBitArray)","url":"buildHevcCodecStringFromSps(com.google.android.exoplayer2.util.ParsableNalUnitBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"CacheDataSinkFactory(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, DataSource.Factory, DataSink.Factory, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.DataSink.Factory,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"CacheDataSourceFactory(Cache, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"capacity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter, long, long)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter,long,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelDescriptionResourceId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelImportance"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelNameResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"checkContainerInput(boolean, String)","url":"checkContainerInput(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(int,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TIMELINE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_INVALID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE_STOP"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_BACK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_FORWARD"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"compilation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String, String)","url":"compileProgram(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"compileProgram(String[], String[])","url":"compileProgram(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"composer"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"conductor"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"Configuration(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException, int)","url":"%3Cinit%3E(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"contentIsMalformed"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"contentResumeOffsetUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"context"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithExoMediaCryptoType(Class)","url":"copyWithExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, int, int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSinkFactory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, ExoMediaCrypto)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.drm.ExoMediaCrypto)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createFallbackOptions(ExoTrackSelection)","url":"createFallbackOptions(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"createForIOException(IOException, DataSpec, int)","url":"createForIOException(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedContainer(String, Throwable)","url":"createForMalformedContainer(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedDataOfUnknownType(String, Throwable)","url":"createForMalformedDataOfUnknownType(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedManifest(String, Throwable)","url":"createForMalformedManifest(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForManifestWithUnsupportedFeature(String, Throwable)","url":"createForManifestWithUnsupportedFeature(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean, int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException, int)","url":"createForSource(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException, int)","url":"createForUnexpected(java.lang.RuntimeException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForUnsupportedContainerFeature(String)","url":"createForUnsupportedContainerFeature(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createMediaCrypto(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.Subtitle, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.Subtitle,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(Uri, Format, long)","url":"createMediaSource(android.net.Uri,com.google.android.exoplayer2.Format,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(int,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, int, boolean, boolean, String, HttpDataSource.RequestProperties, Predicate, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,int,boolean,boolean,java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,com.google.common.base.Predicate,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, int, int, float, int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,int,int,float,int,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CUSTOM_ERROR_CODE_BASE"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"customActionReceiver"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"dataType"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(SimpleExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(VideoDecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.video.VideoDecoderInputBuffer,com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"DecryptionException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_COUNTRY_GROUPS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_LOCATION_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_PRIORITY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_BACK_INCREMENT_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_FORWARD_INCREMENT_MS"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"DEFAULT_USER_AGENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_WEIGHT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"DefaultControlDispatcher(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,int,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener, int, int, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String, TransferListener)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSourceFactory","l":"DefaultHttpDataSourceFactory(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"DefaultMediaDescriptionAdapter(PendingIntent)","url":"%3Cinit%3E(android.app.PendingIntent)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"describeContents()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"describeContents()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.device.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Config","l":"disable5GNsaDisambiguation()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"discNumber"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchFastForward(Player)","url":"dispatchFastForward(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchNext(Player)","url":"dispatchNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrepare(Player)","url":"dispatchPrepare(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchPrevious(Player)","url":"dispatchPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchRewind(Player)","url":"dispatchRewind(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSeekTo(Player, int, long)","url":"dispatchSeekTo(com.google.android.exoplayer2.Player,int,long)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlaybackParameters(Player, PlaybackParameters)","url":"dispatchSetPlaybackParameters(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetPlayWhenReady(Player, boolean)","url":"dispatchSetPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetRepeatMode(Player, int)","url":"dispatchSetRepeatMode(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchSetShuffleModeEnabled(Player, boolean)","url":"dispatchSetShuffleModeEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"dispatchStop(Player, boolean)","url":"dispatchStop(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(SimpleExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(SimpleExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(int, Format, int, Object, long)","url":"downstreamFormatChanged(int,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_JOC_CODEC_STRING"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_BEHIND_LIVE_WINDOW"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_QUERY_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_CONTENT_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DEVICE_REVOKED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DISALLOWED_OPERATION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_EXPIRED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_PROVISIONING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SCHEME_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SYSTEM_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_FAILED_RUNTIME_CHECK"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_BAD_HTTP_STATUS"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_FILE_NOT_FOUND"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NO_PERMISSION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_REMOTE_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_EXO_MEDIA_DRM"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_LICENSE_ACQUISITION"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_PROVISIONING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorCode"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DecryptionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_STATIC_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(FlagSet, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(FlagSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"exclude(BaseUrl, long)","url":"exclude(com.google.android.exoplayer2.source.dash.manifest.BaseUrl,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"exclusionDurationMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"exoMediaCryptoType"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetAsynchronousBufferQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetForceAsyncQueueingSynchronizationWorkaround(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_LOCATION"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_TRACK"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"FallbackOptions(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"FallbackSelection(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"fastForwardActionIconResourceId"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"FIELD_CUSTOM_ID_BASE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Exception)","url":"%3Cinit%3E(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSourceFactory","l":"FileDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"ForwardingPlayer(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"FrameworkMediaCrypto(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromBundleList(Bundleable.Creator, List)","url":"fromBundleList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle, T)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle,T)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"fromNullableBundle(Bundleable.Creator, Bundle)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getAdCountInGroup(AdPlaybackState, int)","url":"getAdCountInGroup(com.google.android.exoplayer2.source.ads.AdPlaybackState,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getAttributes(int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, int)","url":"getCodecCountOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, int)","url":"getCodecsOfType(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getContentResumeOffsetUs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentStaticMetadata()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"getDefaultRequestProperties()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"getEncodingForAudioObjectType(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2","c":"C","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"getErrorCodeForMediaDrmException(Exception, int)","url":"getErrorCodeForMediaDrmException(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeFromPlatformDiagnosticsInfo(String)","url":"getErrorCodeFromPlatformDiagnosticsInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName(int)"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getExoMediaCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getExoMediaCryptoType(Format)","url":"getExoMediaCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getFastForwardIncrementMs(Player)","url":"getFastForwardIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List)","url":"getForegroundNotification(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getMediaCrypto()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getMediaPeriodPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForAd(long, int, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForContent(long, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getMetadataComponent()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(int, int)","url":"getNextRepeatMode(int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, int, boolean)","url":"getNextWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getPreSkipSamples(List)","url":"getPreSkipSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, int, boolean)","url":"getPreviousWindowIndex(int,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCount(List)","url":"getPriorityCount(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCountAfterExclusion(List)","url":"getPriorityCountAfterExclusion(java.util.List)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getRemovedAdGroupCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"getRewindIncrementMs(Player)","url":"getRewindIncrementMs(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekBackIncrementMs()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getSeekPreRollSamples(List)","url":"getSeekPreRollSamples(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamDurationUs(Player, AdPlaybackState)","url":"getStreamDurationUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getStreamPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(Player, AdPlaybackState)","url":"getStreamPositionUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForAd(long, int, int, AdPlaybackState)","url":"getStreamPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForContent(long, int, AdPlaybackState)","url":"getStreamPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getUniforms(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getWindowIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getWrappedPlayer()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"GL_ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"groupKey"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"GvrAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(SimpleExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.SimpleExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"hasTrackOfType(TrackSelectionArray, int)","url":"hasTrackOfType(com.google.android.exoplayer2.trackselection.TrackSelectionArray,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"IntArrayQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, IOException, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.io.IOException,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, FlagSet)","url":"invoke(T,com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"isAbsolute(String)","url":"isAbsolute(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"isEligibleForFallback(IOException)","url":"isEligibleForFallback(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"isFallbackAvailable(int)"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isFastForwardEnabled()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoColorPrimariesToColorSpace(int)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoTransferCharacteristicsToColorTransfer(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(int, int)","url":"isRepeatModeEnabled(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2","c":"ControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2","c":"DefaultControlDispatcher","l":"isRewindEnabled()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"isServerSideInserted"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isServerSideInsertedAdGroup(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PCM_ENCODING"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_EXO_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"keyForField(int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation, int)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadInitializationData(ChunkExtractor, DataSource, Representation, boolean)","url":"loadInitializationData(com.google.android.exoplayer2.source.chunk.ChunkExtractor,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Representation,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation, int)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"matchesExpectedExoMediaCryptoType(Class)","url":"matchesExpectedExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MAX_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"maybeSetArtworkData(byte[], int)","url":"maybeSetArtworkData(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"mediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(int, Format, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MIN_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_NO_OFFSET"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_SHARED"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_SURFACE"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, List, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"nextActionIconResourceId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationListener"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedLocations"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfLocations"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAvailableCommandsChanged(AnalyticsListener.EventTime, Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, ControlDispatcher, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentWindowIndexChanged(Player)","url":"onCurrentWindowIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, ControlDispatcher, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.device.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceListener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadChanged(Download)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDownloadRemoved(Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, int)","url":"onMaxSeekToPreviousPositionChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMaxSeekToPreviousPositionChanged(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, ControlDispatcher, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, int)","url":"onPlayerStateChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaylistMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, int)","url":"onPlayWhenReadyChanged(boolean,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(VideoDecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.video.VideoDecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekBackIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekBackIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekForwardIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekForwardIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player, ControlDispatcher)","url":"onSkipToNext(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player, ControlDispatcher)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, ControlDispatcher, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ControlDispatcher,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onStaticMetadataChanged(AnalyticsListener.EventTime, List)","url":"onStaticMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onStaticMetadataChanged(List)","url":"onStaticMetadataChanged(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(int, int, int, float)","url":"onVideoSizeChanged(int,int,int,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioListener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(DataSpec, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, ExoMediaCrypto, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.drm.ExoMediaCrypto,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"OutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, List, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, List)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, BaseUrl)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.BaseUrl)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, List, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.util.List,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, List, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.util.List,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable, boolean, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"pauseActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_A_BRIGHT_COLORED_FISH"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BACK_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ARTIST_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ORCHESTRA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_COMPOSER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_CONDUCTOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_PERFORMANCE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_RECORDING"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FRONT_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ILLUSTRATION"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAD_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAFLET_PAGE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LYRICIST"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_PUBLISHER_STUDIO_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_RECORDING_LOCATION"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthAspectRatio"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"playActionIconResourceId"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int, long)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener, PlayerNotificationManager.CustomActionReceiver, int, int, int, int, int, int, int, int, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener,com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver,int,int,int,int,int,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfWindow(ExoPlayer, int)","url":"playUntilStartOfWindow(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfWindow(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"previousActionIconResourceId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"priority"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String, Throwable, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingDay"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingMonth"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingYear"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(SimpleExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.SimpleExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"release()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseDay"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseMonth"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseYear"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"RemotableTimeline(ImmutableList, ImmutableList, int[])","url":"%3Cinit%3E(com.google.common.collect.ImmutableList,com.google.common.collect.ImmutableList,int[])"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"remove()"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioListener(AudioListener)","url":"removeAudioListener(com.google.android.exoplayer2.audio.AudioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"removedAdGroupCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeDeviceListener(DeviceListener)","url":"removeDeviceListener(com.google.android.exoplayer2.device.DeviceListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.MetadataComponent","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMetadataOutput(MetadataOutput)","url":"removeMetadataOutput(com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeTextOutput(TextOutput)","url":"removeTextOutput(com.google.android.exoplayer2.text.TextOutput)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeVideoListener(VideoListener)","url":"removeVideoListener(com.google.android.exoplayer2.video.VideoListener)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, List, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"reset(OutputStream)","url":"reset(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"resolveCacheKey(Representation, RangedUri)","url":"resolveCacheKey(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream, int)","url":"%3Cinit%3E(java.io.OutputStream,int)"},{"p":"com.google.android.exoplayer2.util","c":"ReusableBufferedOutputStream","l":"ReusableBufferedOutputStream(OutputStream)","url":"%3Cinit%3E(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"rewindActionIconResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(SimpleExoPlayer)","url":"run(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(ExoPlayer)","url":"runUntilError(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(SimpleExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.SimpleExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"sameAs(MediaMetadataCompat, MediaMetadataCompat)","url":"sameAs(android.support.v4.media.MediaMetadataCompat,android.support.v4.media.MediaMetadataCompat)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekForward()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"selectBaseUrl(List)","url":"selectBaseUrl(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"selectedBaseUrl"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], int)","url":"%3Cinit%3E(int,int[],int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"ServerSideInsertedAdsMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"serviceLocation"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"setAdPlaybackState(AdPlaybackState)","url":"setAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[], Integer)","url":"setArtworkData(byte[],java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setCompilation(CharSequence)","url":"setCompilation(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setComposer(CharSequence)","url":"setComposer(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setConductor(CharSequence)","url":"setConductor(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControlDispatcher(ControlDispatcher)","url":"setControlDispatcher(com.google.android.exoplayer2.ControlDispatcher)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDiscNumber(Integer)","url":"setDiscNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setDispatchUnsupportedActionsEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setExoMediaCryptoType(Class)","url":"setExoMediaCryptoType(java.lang.Class)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setGenre(CharSequence)","url":"setGenre(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(Class, String...)","url":"setLibraries(java.lang.Class,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, int)","url":"setLine(float,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter)","url":"setMediaDescriptionAdapter(com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMetadataDeduplicationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.Parameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(int)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingDay(Integer)","url":"setRecordingDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingMonth(Integer)","url":"setRecordingMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingYear(Integer)","url":"setRecordingYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseDay(Integer)","url":"setReleaseDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseMonth(Integer)","url":"setReleaseMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseYear(Integer)","url":"setReleaseYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setRequestPriority(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, int)","url":"setTextSize(float,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalDiscCount(Integer)","url":"setTotalDiscCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(int...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setWriter(CharSequence)","url":"setWriter(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"shouldPlayAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleOutputBuffer","l":"SimpleOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, List, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"IntArrayQueue","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.video.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.util","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"smallIconResourceId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"stopActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"streamIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int, int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"OutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleArrayList(List)","url":"toBundleArrayList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toBundleList(List)","url":"toBundleList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtils","l":"toNullableBundle(Bundleable)","url":"toNullableBundle(com.google.android.exoplayer2.Bundleable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalDiscCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,int,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"TrackSelectionParameters(TrackSelectionParameters.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(Throwable, int)","url":"%3Cinit%3E(java.lang.Throwable,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.device","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedMediaCrypto","l":"UnsupportedMediaCrypto()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ext.gvr","c":"GvrAudioProcessor","l":"updateOrientation(float, float, float, float)","url":"updateOrientation(float,float,float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.PlaybackProperties","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderInputBuffer","l":"VideoDecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(OutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.OutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, ExoMediaCrypto, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.drm.ExoMediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"weight"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(int, long...)","url":"withAdDurationsUs(int,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdGroupTimeUs(int, long)","url":"withAdGroupTimeUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentResumeOffsetUs(int, long)","url":"withContentResumeOffsetUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withContentResumeOffsetUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withIsServerSideInserted(boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withIsServerSideInserted(int, boolean)","url":"withIsServerSideInserted(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withNewAdGroup(int, long)","url":"withNewAdGroup(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withRemovedAdGroupCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withTimeUs(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaCrypto","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"writer"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] \ No newline at end of file +memberSearchIndex = [{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_ELD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V1_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_HE_V2_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LC_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_LD_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_AUDIO_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AAC_XHE_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"abandonedBeforeReadyCount"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"absoluteStreamPosition"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"AbstractConcatenatedTimeline(boolean, ShuffleOrder)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC3"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"Ac3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"Ac3Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AC4"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC40_SYNCWORD"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"AC41_SYNCWORD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"Ac4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"Ac4Reader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Consumer","l":"accept(T)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"acceptConnection(MediaSession, MediaSession.ControllerInfo)","url":"acceptConnection(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"accessibilityChannel"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"accessibilityDescriptors"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"acquire()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"acquire(DrmSessionEventListener.EventDispatcher)","url":"acquire(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.Provider","l":"acquireExoMediaDrm(UUID)","url":"acquireExoMediaDrm(java.util.UUID)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"acquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"action"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_ADD_DOWNLOAD"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_FAST_FORWARD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_INIT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_NEXT"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PAUSE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_PAUSE_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PLAY"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_PREVIOUS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_ALL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_REMOVE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_RESUME_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_REWIND"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"ACTION_SET_STOP_REASON"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"ACTION_STOP"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"Action(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"actualPresentationTimeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_ERROR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_PLAYED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_SKIPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AD_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"AdaptationCheckpoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"AdaptationSet(int, @com.google.android.exoplayer2.C.TrackType int, List, List, List, List)","url":"%3Cinit%3E(int,@com.google.android.exoplayer2.C.TrackTypeint,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"adaptationSets"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"adaptive"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SEAMLESS"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"ADAPTIVE_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, BandwidthMeter, long, long, long, int, int, float, float, List, Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint,com.google.android.exoplayer2.upstream.BandwidthMeter,long,long,long,int,int,float,float,java.util.List,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"AdaptiveTrackSelection(TrackGroup, int[], BandwidthMeter)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"add(@com.google.android.exoplayer2.Player.Command int)","url":"add(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(Dumper.Dumpable)","url":"add(com.google.android.exoplayer2.testutil.Dumper.Dumpable)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"add(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"add(int, MediaDescriptionCompat)","url":"add(int,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"add(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"add(long, V)","url":"add(long,V)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"add(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, byte[])","url":"add(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"add(String, Object)","url":"add(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"add(T)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"addAdGroupToAdPlaybackState(AdPlaybackState, long, long, long)","url":"addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(@com.google.android.exoplayer2.Player.Command int...)","url":"addAll(@com.google.android.exoplayer2.Player.Commandint...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(FlagSet)","url":"addAll(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addAll(int...)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAll(Player.Commands)","url":"addAll(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addAllCommands()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAnalyticsListener(AnalyticsListener)","url":"addAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addAudioLanguagesToSelection(String...)","url":"addAudioLanguagesToSelection(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"addAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest, int)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addDownload(DownloadRequest)","url":"addDownload(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addDrmEventListener(Handler, DrmSessionEventListener)","url":"addDrmEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"addEventListener(Handler, BandwidthMeter.EventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"addEventListener(Handler, DrmSessionEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"addEventListener(Handler, MediaSourceEventListener)","url":"addEventListener(android.os.Handler,com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"addFlag(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"addIf(@com.google.android.exoplayer2.Player.Command int, boolean)","url":"addIf(@com.google.android.exoplayer2.Player.Commandint,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"addIf(int, boolean)","url":"addIf(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"additionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"AdditionalFailureInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"addListener(AnalyticsListener)","url":"addListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"addListener(DownloadManager.Listener)","url":"addListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"addListener(Handler, BandwidthMeter.EventListener)","url":"addListener(android.os.Handler,com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"addListener(HlsPlaylistTracker.PlaylistEventListener)","url":"addListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addListener(Player.EventListener)","url":"addListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"addListener(Player.Listener)","url":"addListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"addListener(String, Cache.Listener)","url":"addListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"addListener(TimeBar.OnScrubListener)","url":"addListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(int, MediaItem)","url":"addMediaItem(int,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItem(MediaItem)","url":"addMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"addMediaItems(int, List)","url":"addMediaItems(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"addMediaItems(List)","url":"addMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"AddMediaItems(String, MediaSource...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource, Handler, Runnable)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(int, MediaSource)","url":"addMediaSource(int,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource, Handler, Runnable)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSource(MediaSource)","url":"addMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection, Handler, Runnable)","url":"addMediaSources(java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(Collection)","url":"addMediaSources(java.util.Collection)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection, Handler, Runnable)","url":"addMediaSources(int,java.util.Collection,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"addMediaSources(int, Collection)","url":"addMediaSources(int,java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(int, List)","url":"addMediaSources(int,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"addMediaSources(List)","url":"addMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"addMediaSources(MediaSource...)","url":"addMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.text.span","c":"SpanUtil","l":"addOrReplaceSpan(Spannable, Object, int, int, int)","url":"addOrReplaceSpan(android.text.Spannable,java.lang.Object,int,int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"addOverride(TrackSelectionOverrides.TrackSelectionOverride)","url":"addOverride(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"addPendingHandlerMessage(FakeClock.HandlerMessage)","url":"addPendingHandlerMessage(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"addPlaylistItem(int, MediaItem)","url":"addPlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"SlidingPercentile","l":"addSample(int, float)","url":"addSample(int,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTextLanguagesToSelection(boolean, String...)","url":"addTextLanguagesToSelection(boolean,java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"addTime(String, long)","url":"addTime(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelection(int, DefaultTrackSelector.Parameters)","url":"addTrackSelection(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"addTrackSelectionForSingleRenderer(int, int, DefaultTrackSelector.Parameters, List)","url":"addTrackSelectionForSingleRenderer(int,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.util.List)"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"addTransferListener(TransferListener)","url":"addTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"addVideoFrameProcessingOffset(long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"addVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"addVisibilityListener(PlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"addVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"addVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"addWithOverflowDefault(long, long, long)","url":"addWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"AdGroup(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adGroupCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adGroupIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"adIndexInAdGroup"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"adjustReleaseTime(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustSampleTimestamp(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"adjustTsTimestamp(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int, String)","url":"%3Cinit%3E(android.view.View,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"AdOverlayInfo(View, int)","url":"%3Cinit%3E(android.view.View,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"adPlaybackCount"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"adPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"AdPlaybackState(Object, long...)","url":"%3Cinit%3E(java.lang.Object,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adResumePositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"adsConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"adsId"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"AdsMediaSource(MediaSource, DataSpec, Object, MediaSourceFactory, AdsLoader, AdViewProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.source.ads.AdsLoader,com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"adTagUri"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"AdtsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean, String)","url":"%3Cinit%3E(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"AdtsReader(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int, boolean)","url":"advancePeekPosition(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"advancePeekPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"advanceTime(long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink, byte[])","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink,byte[])"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"AesCipherDataSink(byte[], DataSink)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"AesCipherDataSource(byte[], DataSource)","url":"%3Cinit%3E(byte[],com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], long, long)","url":"%3Cinit%3E(int,byte[],long,long)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"AesFlushingCipher(int, byte[], String, long)","url":"%3Cinit%3E(int,byte[],java.lang.String,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"after()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"after()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumArtist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"albumTitle"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"alignVideoSizeV21(int, int)","url":"alignVideoSizeV21(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"ALL_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"allocate()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"allocatedBandwidth"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"Allocation(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_ALL"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ALLOW_CAPTURE_BY_SYSTEM"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedChannelCountAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowAudioMixedSampleRateAdaptiveness"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"allowedCapturePolicy"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"allowingSchemeDatas(List...)","url":"allowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowMultipleAdaptiveSelections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoMixedMimeTypeAdaptiveness"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"allowVideoNonSeamlessAdaptiveness"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"allSamplesAreSyncSamples(String, String)","url":"allSamplesAreSyncSamples(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"AMR"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"AmrExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"AnalyticsCollector(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_END"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_MIDDLE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"ANCHOR_TYPE_START"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AndSpanFlags","l":"andFlags(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ApicFrame(String, String, int, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"APP_ID_DEFAULT_RECEIVER_WITH_DRM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"append(List)","url":"append(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadAction(Runnable)","url":"appendReadAction(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"appendReadError(IOException)","url":"appendReadError(java.io.IOException)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"AppInfoTable(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"AppInfoTableDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_AIT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_CEA708"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_DVBSUBS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EMSG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_EXIF"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ICY"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_ID3"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"APPLICATION_INFORMATION_TABLE_ID"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_M3U8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4CEA608"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MP4VTT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_MPD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_PGS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RAWCC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_RTSP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SCTE35"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_SUBRIP"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TTML"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_TX3G"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_VOBSUB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"APPLICATION_WEBM"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"apply(Action)","url":"apply(com.google.android.exoplayer2.testutil.Action)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"apply(Statement, Description)","url":"apply(org.junit.runners.model.Statement,org.junit.runner.Description)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"applyContentMetadataMutations(String, ContentMetadataMutations)","url":"applyContentMetadataMutations(java.lang.String,com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applyPlaybackParameters(PlaybackParameters)","url":"applyPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"applySkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.AppManagedProvider","l":"AppManagedProvider(ExoMediaDrm)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.ExoMediaDrm)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"areEqual(Object, Object)","url":"areEqual(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artist"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkData"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkDataType"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"artworkUri"},{"p":"com.google.android.exoplayer2","c":"C","l":"ASCII_NAME"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"asList()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"ASPECT_RATIO_IDC_VALUES"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"AspectRatioFrameLayout(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertAdGroupCounts(Timeline, int...)","url":"assertAdGroupCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertAllBehaviors(ExtractorAsserts.ExtractorFactory, String)","url":"assertAllBehaviors(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.AssertionConfig, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertBehavior(ExtractorAsserts.ExtractorFactory, String, ExtractorAsserts.SimulationConfig)","url":"assertBehavior(com.google.android.exoplayer2.testutil.ExtractorAsserts.ExtractorFactory,java.lang.String,com.google.android.exoplayer2.testutil.ExtractorAsserts.SimulationConfig)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBitmapsAreSimilar(Bitmap, Bitmap, double)","url":"assertBitmapsAreSimilar(android.graphics.Bitmap,android.graphics.Bitmap,double)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertBufferInfosEqual(MediaCodec.BufferInfo, MediaCodec.BufferInfo)","url":"assertBufferInfosEqual(android.media.MediaCodec.BufferInfo,android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, CacheAsserts.RequestSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCachedData(Cache, FakeDataSet)","url":"assertCachedData(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertCacheEmpty(Cache)","url":"assertCacheEmpty(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedManifestLoads(Integer...)","url":"assertCompletedManifestLoads(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertCompletedMediaPeriodLoads(MediaSource.MediaPeriodId...)","url":"assertCompletedMediaPeriodLoads(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertConsecutiveDroppedBufferLimit(String, DecoderCounters, int)","url":"assertConsecutiveDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertDataCached(Cache, DataSpec, byte[])","url":"assertDataCached(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertDataSourceContent(DataSource, DataSpec, byte[], boolean)","url":"assertDataSourceContent(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertDroppedBufferLimit(String, DecoderCounters, int)","url":"assertDroppedBufferLimit(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEmpty(Timeline)","url":"assertEmpty(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualNextWindowIndices(Timeline, Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"assertEqualNextWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualPreviousWindowIndices(Timeline, Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"assertEqualPreviousWindowIndices(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertEqualsExceptIdsAndManifest(Timeline, Timeline)","url":"assertEqualsExceptIdsAndManifest(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"assertExtensionRendererCreated(Class, @com.google.android.exoplayer2.C.TrackType int)","url":"assertExtensionRendererCreated(java.lang.Class,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T, int, String)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertGetStreamKeysAndManifestFilterIntegration(MediaPeriodAsserts.FilterableManifestMediaPeriodFactory, T)","url":"assertGetStreamKeysAndManifestFilterIntegration(com.google.android.exoplayer2.testutil.MediaPeriodAsserts.FilterableManifestMediaPeriodFactory,T)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"ASSERTIONS_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertMediaPeriodCreated(MediaSource.MediaPeriodId)","url":"assertMediaPeriodCreated(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertNextWindowIndices(Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean, int...)","url":"assertNextWindowIndices(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.RepeatModeint,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertNoPositionDiscontinuities()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertNoTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, Dumper.Dumpable, String)","url":"assertOutput(android.content.Context,com.google.android.exoplayer2.testutil.Dumper.Dumpable,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"assertOutput(Context, String, String)","url":"assertOutput(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"assertPassed(DecoderCounters, DecoderCounters)","url":"assertPassed(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodCounts(Timeline, int...)","url":"assertPeriodCounts(com.google.android.exoplayer2.Timeline,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodDurations(Timeline, long...)","url":"assertPeriodDurations(com.google.android.exoplayer2.Timeline,long...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPeriodEqualsExceptIds(Timeline.Period, Timeline.Period)","url":"assertPeriodEqualsExceptIds(com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlaybackStatesEqual(Integer...)","url":"assertPlaybackStatesEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPlayedPeriodIndices(Integer...)","url":"assertPlayedPeriodIndices(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertPositionDiscontinuityReasonsEqual(Integer...)","url":"assertPositionDiscontinuityReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertPrepareAndReleaseAllPeriods()"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertPreviousWindowIndices(Timeline, @com.google.android.exoplayer2.Player.RepeatMode int, boolean, int...)","url":"assertPreviousWindowIndices(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.RepeatModeint,boolean,int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts","l":"assertReadData(DataSource, DataSpec, byte[])","url":"assertReadData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"assertReleased()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertRemoved(String)","url":"assertRemoved(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSample(int, byte[], long, int, TrackOutput.CryptoData)","url":"assertSample(int,byte[],long,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"assertSampleCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertSkippedOutputBufferCount(String, DecoderCounters, int)","url":"assertSkippedOutputBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"assertSniff(Extractor, FakeExtractorInput, boolean)","url":"assertSniff(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"assertState(String, int)","url":"assertState(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"assertThat(Spanned)","url":"assertThat(android.text.Spanned)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChange()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"assertTimelineChangeBlocking()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelineChangeReasonsEqual(Integer...)","url":"assertTimelineChangeReasonsEqual(java.lang.Integer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"assertTimelinesSame(List, List)","url":"assertTimelinesSame(java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"assertTimelinesSame(Timeline...)","url":"assertTimelinesSame(com.google.android.exoplayer2.Timeline...)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertTotalBufferCount(String, DecoderCounters, int, int)","url":"assertTotalBufferCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts","l":"assertTrackGroups(MediaPeriod, TrackGroupArray)","url":"assertTrackGroups(com.google.android.exoplayer2.source.MediaPeriod,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int)","url":"assertVideoFrameProcessingOffsetSampleCount(java.lang.String,com.google.android.exoplayer2.decoder.DecoderCounters,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowEqualsExceptUidAndManifest(Timeline.Window, Timeline.Window)","url":"assertWindowEqualsExceptUidAndManifest(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowIsDynamic(Timeline, boolean...)","url":"assertWindowIsDynamic(com.google.android.exoplayer2.Timeline,boolean...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TimelineAsserts","l":"assertWindowTags(Timeline, Object...)","url":"assertWindowTags(com.google.android.exoplayer2.Timeline,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"AssetContentProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"AssetDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource.AssetDataSourceException","l":"AssetDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"assetIdentifier"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"AtomicFile(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"attemptMerge(RangedUri, String)","url":"attemptMerge(com.google.android.exoplayer2.source.dash.manifest.RangedUri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"Attribute(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AC4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_ALAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_NB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_AMR_WB"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_EXPRESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_HD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_DTS_X"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_FLAC"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"AUDIO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MLAW"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEG_L2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHA1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MPEGH_MHM1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_MSGSM"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ELD"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_LC"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_PS"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_SBR"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"AUDIO_OBJECT_TYPE_AAC_XHE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OGG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_OPUS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_RAW"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIO_SESSION_ID_UNSET"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"AUDIO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_TRUEHD"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_VORBIS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WAV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"AUDIO_WEBM"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"AudioCapabilities(int[], int)","url":"%3Cinit%3E(int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"AudioCapabilitiesReceiver(Context, AudioCapabilitiesReceiver.Listener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioCodecError(Exception)","url":"audioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK"},{"p":"com.google.android.exoplayer2","c":"C","l":"AUDIOFOCUS_NONE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"AudioFormat(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"audioFormatHistory"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"audioGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"audios"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"audioSinkError(Exception)","url":"audioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"AudioTrackScore(Format, DefaultTrackSelector.Parameters, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"audioTrackState"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"autoReturn"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"autoReturn"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"AuxEffectInfo(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"availabilityStartTimeMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availNum"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"availsExpected"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"availsExpected"},{"p":"com.google.android.exoplayer2","c":"Format","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"averageBitrate"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"backgroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"backgroundJoiningCount"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"bandwidthSample(int, long, long)","url":"bandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_BOTTOM"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"BAR_GRAVITY_CENTER"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_APPLICATION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_TEXT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"BASE_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"BaseAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"BaseDataSource(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"BaseFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"BaseMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"BaseMediaChunkIterator(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"BaseMediaChunkOutput(int[], SampleQueue[])","url":"%3Cinit%3E(int[],com.google.android.exoplayer2.source.SampleQueue[])"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"BaseMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"BasePlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"BaseRenderer(@com.google.android.exoplayer2.C.TrackType int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"BaseTrackSelection(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"baseUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String, String, int, int)","url":"%3Cinit%3E(java.lang.String,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"BaseUrl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"BaseUrlExclusionList()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"baseUrls"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"baseUrls"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"before()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"before()"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"beginSection(String)","url":"beginSection(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BehindLiveWindowException","l":"BehindLiveWindowException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"belongsToSession(AnalyticsListener.EventTime, String)","url":"belongsToSession(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"binaryElement(int, int, ExtractorInput)","url":"binaryElement(int,int,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"BinaryFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(int[], int, boolean, boolean)","url":"binarySearchCeil(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(List>, T, boolean, boolean)","url":"binarySearchCeil(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchCeil(long[], long, boolean, boolean)","url":"binarySearchCeil(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(int[], int, boolean, boolean)","url":"binarySearchFloor(int[],int,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(List>, T, boolean, boolean)","url":"binarySearchFloor(java.util.List,T,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(long[], long, boolean, boolean)","url":"binarySearchFloor(long[],long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"binarySearchFloor(LongArray, long, boolean, boolean)","url":"binarySearchFloor(com.google.android.exoplayer2.util.LongArray,long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"BinarySearchSeeker(BinarySearchSeeker.SeekTimestampConverter, BinarySearchSeeker.TimestampSeeker, long, long, long, long, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,com.google.android.exoplayer2.extractor.BinarySearchSeeker.TimestampSeeker,long,long,long,long,long,long,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"BinarySearchSeekMap(BinarySearchSeeker.SeekTimestampConverter, long, long, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.BinarySearchSeeker.SeekTimestampConverter,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"bind()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"bind()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmap"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"bitmapHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"bitrate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"bitrate"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"bitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMaximum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateMinimum"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"bitrateNominal"},{"p":"com.google.android.exoplayer2","c":"C","l":"BITS_PER_BYTE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"bitsLeft()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSample"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"bitsPerSampleLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"bitstreamVersion"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"blacklist(int, long)","url":"blacklist(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"block(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"blockFlag"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize0"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"blockSize1"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"blockUninterruptible()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilActionScheduleFinished(long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"blockUntilDelivered(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"blockUntilEnded(long)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilFinished()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdle()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilIdleAndThrowAnyFailure()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"blockUntilInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"blockUntilStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"blockUntilStopped(long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"bottomFieldPicOrderInFramePresentFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"breakDurationUs"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_DECODE_ONLY"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_ENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_END_OF_STREAM"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_KEY_FRAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"BUFFER_FLAG_LAST_SAMPLE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DIRECT"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"BUFFER_REPLACEMENT_MODE_NORMAL"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"Buffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"build()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"build()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"build(MediaDrmCallback)","url":"build(com.google.android.exoplayer2.drm.MediaDrmCallback)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAacLcAudioSpecificConfig(int, int)","url":"buildAacLcAudioSpecificConfig(int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildAdaptationSet(int, @com.google.android.exoplayer2.C.TrackType int, List, List, List, List)","url":"buildAdaptationSet(int,@com.google.android.exoplayer2.C.TrackTypeint,java.util.List,java.util.List,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildAddDownloadIntent(Context, Class, DownloadRequest, int, boolean)","url":"buildAddDownloadIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildAssetUri(String)","url":"buildAssetUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioRenderers(Context, int, MediaCodecSelector, boolean, AudioSink, Handler, AudioRendererEventListener, ArrayList)","url":"buildAudioRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,com.google.android.exoplayer2.audio.AudioSink,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildAudioSink(Context, boolean, boolean, boolean)","url":"buildAudioSink(android.content.Context,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"buildAudioSpecificConfig(int, int, int)","url":"buildAudioSpecificConfig(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildAvcCodecString(int, int, int)","url":"buildAvcCodecString(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"buildCacheKey(DataSpec)","url":"buildCacheKey(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildCameraMotionRenderers(Context, int, ArrayList)","url":"buildCameraMotionRenderers(android.content.Context,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildCea708InitializationData(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"buildClippingProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context, String, boolean)","url":"buildCronetEngine(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetUtil","l":"buildCronetEngine(Context)","url":"buildCronetEngine(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"buildDataSpec(Representation, String, RangedUri, int)","url":"buildDataSpec(com.google.android.exoplayer2.source.dash.manifest.Representation,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.RangedUri,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadCompletedNotification(Context, int, PendingIntent, String)","url":"buildDownloadCompletedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildDownloadFailedNotification(Context, int, PendingIntent, String)","url":"buildDownloadFailedNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildDrmSessionManager()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"Builder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String, PlayerNotificationManager.MediaDescriptionAdapter)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"Builder(Context, int, String)","url":"%3Cinit%3E(android.content.Context,int,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, MediaSourceFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, RenderersFactory, MediaSourceFactory, TrackSelector, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, RenderersFactory, MediaSourceFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context, RenderersFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"Builder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"Builder(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"Builder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"Builder(TrackSelectionParameters)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration.Builder","l":"Builder(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"Builder(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"Builder(UUID)","url":"%3Cinit%3E(java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEvent(String, String, long, long, byte[])","url":"buildEvent(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildEventStream(String, String, long, long[], EventMessage[])","url":"buildEventStream(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildExoPlayer(HostActivity, Surface, MappingTrackSelector)","url":"buildExoPlayer(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildFormat(String, String, int, int, float, int, int, int, String, List, List, String, List, List)","url":"buildFormat(java.lang.String,java.lang.String,int,int,float,int,int,int,java.lang.String,java.util.List,java.util.List,java.lang.String,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildHevcCodecString(int, boolean, int, int, int[], int)","url":"buildHevcCodecString(int,boolean,int,int,int[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"buildInitializationData(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildMediaPresentationDescription(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"buildMediaPresentationDescription(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMetadataRenderers(Context, MetadataOutput, Looper, int, ArrayList)","url":"buildMetadataRenderers(android.content.Context,com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildMiscellaneousRenderers(Context, Handler, int, ArrayList)","url":"buildMiscellaneousRenderers(android.content.Context,android.os.Handler,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"buildNalUnit(byte[], int, int)","url":"buildNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildPauseDownloadsIntent(Context, Class, boolean)","url":"buildPauseDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildPeriod(String, long, List, List, Descriptor)","url":"buildPeriod(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List, int)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"buildProgressNotification(Context, int, PendingIntent, String, List)","url":"buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, byte[])","url":"buildPsshAtom(java.util.UUID,byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"buildPsshAtom(UUID, UUID[], byte[])","url":"buildPsshAtom(java.util.UUID,java.util.UUID[],byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRangedUri(String, long, long)","url":"buildRangedUri(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"buildRangeRequestHeader(long, long)","url":"buildRangeRequestHeader(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"buildRawResourceUri(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveAllDownloadsIntent(Context, Class, boolean)","url":"buildRemoveAllDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildRemoveDownloadIntent(Context, Class, String, boolean)","url":"buildRemoveDownloadIntent(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildRepresentation(DashManifestParser.RepresentationInfo, String, String, ArrayList, ArrayList)","url":"buildRepresentation(com.google.android.exoplayer2.source.dash.manifest.DashManifestParser.RepresentationInfo,java.lang.String,java.lang.String,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"buildRequestBuilder(DataSpec)","url":"buildRequestBuilder(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"buildRequestUri(int, int)","url":"buildRequestUri(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildResumeDownloadsIntent(Context, Class, boolean)","url":"buildResumeDownloadsIntent(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"buildSegmentList(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"buildSegmentTemplate(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSegmentTimelineElement(long, long)","url":"buildSegmentTimelineElement(long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetRequirementsIntent(Context, Class, Requirements, boolean)","url":"buildSetRequirementsIntent(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"buildSetStopReasonIntent(Context, Class, String, int, boolean)","url":"buildSetStopReasonIntent(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildSingleSegmentBase(RangedUri, long, long, long, long)","url":"buildSingleSegmentBase(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildSource(HostActivity, DrmSessionManager, FrameLayout)","url":"buildSource(com.google.android.exoplayer2.testutil.HostActivity,com.google.android.exoplayer2.drm.DrmSessionManager,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, int)","url":"buildTestData(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int, Random)","url":"buildTestData(int,java.util.Random)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"buildTestString(int, Random)","url":"buildTestString(int,java.util.Random)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildTextRenderers(Context, TextOutput, Looper, int, ArrayList)","url":"buildTextRenderers(android.content.Context,com.google.android.exoplayer2.text.TextOutput,android.os.Looper,int,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"buildTrackSelector(HostActivity)","url":"buildTrackSelector(com.google.android.exoplayer2.testutil.HostActivity)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"buildUpon()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"buildUpon()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"buildUponParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"buildUri(String, boolean)","url":"buildUri(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"buildUri(String, long, int, long)","url":"buildUri(java.lang.String,long,int,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"buildUtcTimingElement(String, String)","url":"buildUtcTimingElement(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"buildVideoRenderers(Context, int, MediaCodecSelector, boolean, Handler, VideoRendererEventListener, long, ArrayList)","url":"buildVideoRenderers(android.content.Context,int,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,long,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"BundledChunkExtractor(Extractor, @com.google.android.exoplayer2.C.TrackType int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"BundledExtractorsAdapter(ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"BundledHlsMediaChunkExtractor(Extractor, Format, TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"BundleListRetriever(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"BY_START_THEN_END_THEN_DIVISOR"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"byteAlign()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"ByteArrayDataSink()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"ByteArrayDataSource(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"byteOffset"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeLength"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"byteRangeOffset"},{"p":"com.google.android.exoplayer2","c":"C","l":"BYTES_PER_FLOAT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"bytesDeviations"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"bytesDownloaded"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"bytesLeft()"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"bytesLoaded"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"bytesLoaded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"bytesPerFrame"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"bytesRead"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"bytesRead()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"bytesTransferred(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_ERROR"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CACHE_IGNORED_REASON_UNSET_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cache()"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"CACHED_TO_END"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"CacheDataSink(Cache, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.CacheDataSinkException","l":"CacheDataSinkException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener, CacheKeyFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener,com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, DataSource, DataSink, int, CacheDataSource.EventListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink,int,com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"CacheDataSource(Cache, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"CachedRegionTracker(Cache, String, ChunkIndex)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,com.google.android.exoplayer2.extractor.ChunkIndex)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.CacheException","l":"CacheException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long, long, File)","url":"%3Cinit%3E(java.lang.String,long,long,long,java.io.File)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"CacheSpan(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"CacheWriter(CacheDataSource, DataSpec, byte[], CacheWriter.ProgressListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource,com.google.android.exoplayer2.upstream.DataSpec,byte[],com.google.android.exoplayer2.upstream.cache.CacheWriter.ProgressListener)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"calculateNextSearchBytePosition(long, long, long, long, long, long)","url":"calculateNextSearchBytePosition(long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])","url":"calculateTargetBufferBytes(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"CameraMotionRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"canAdvertiseSession()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"canAdvertiseSession()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"canAdvertiseSession()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canBlockReload"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"cancel()"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"cancel()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"cancel()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancel(boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"cancelLoad()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"cancelLoading()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"cancelWork()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"canReadExpGolombCodedNum()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"canReplace(DrmInitData.SchemeData)","url":"canReplace(com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"canReuseCodec(Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"canReuseCodec(MediaCodecInfo, Format, Format)","url":"canReuseCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"canReuseDecoder(String, Format, Format)","url":"canReuseDecoder(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"canSelectFormat(Format, int, long)","url":"canSelectFormat(com.google.android.exoplayer2.Format,int,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"canSkipDateRanges"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"capabilities"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"capacity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"captionGroupId"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"CaptionStyleCompat(int, int, int, int, int, Typeface)","url":"%3Cinit%3E(int,int,int,int,int,android.graphics.Typeface)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"captureFrameRate"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"CapturingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"CapturingRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNull(T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"castNonNullTypeArray(T[])"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter, long, long)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter,long,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext,com.google.android.exoplayer2.ext.cast.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"CastPlayer(CastContext)","url":"%3Cinit%3E(com.google.android.gms.cast.framework.CastContext)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"Cea608Decoder(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"Cea708Decoder(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(int, int)","url":"ceilDivide(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"ceilDivide(long, long)","url":"ceilDivide(long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbc1"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cbcs"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cenc"},{"p":"com.google.android.exoplayer2","c":"C","l":"CENC_TYPE_cens"},{"p":"com.google.android.exoplayer2","c":"Format","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"channelCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"channelCount"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"channelCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelDescriptionResourceId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelImportance"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"channelNameResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"channels"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"channels"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ChapterFrame(String, int, int, long, long, Id3Frame[])","url":"%3Cinit%3E(java.lang.String,int,int,long,long,com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"chapterId"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ChapterTocFrame(String, boolean, boolean, String[], Id3Frame[])","url":"%3Cinit%3E(java.lang.String,boolean,boolean,java.lang.String[],com.google.android.exoplayer2.metadata.id3.Id3Frame[])"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"checkAndPeekStreamMarker(ExtractorInput)","url":"checkAndPeekStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkAndReadFrameHeader(ParsableByteArray, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkAndReadFrameHeader(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean, Object)","url":"checkArgument(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkArgument(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"checkCleartextTrafficPermitted(MediaItem...)","url":"checkCleartextTrafficPermitted(com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"checkContainerInput(boolean, String)","url":"checkContainerInput(boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"checkFrameHeaderFromPeek(ExtractorInput, FlacStreamMetadata, int, FlacFrameReader.SampleNumberHolder)","url":"checkFrameHeaderFromPeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata,int,com.google.android.exoplayer2.extractor.FlacFrameReader.SampleNumberHolder)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"checkGlError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"checkInBounds()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkIndex(int, int, int)","url":"checkIndex(int,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"checkInitialization()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkMainThread()"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String, Object)","url":"checkNotEmpty(java.lang.String,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotEmpty(String)","url":"checkNotEmpty(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T, Object)","url":"checkNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkNotNull(T)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"checkRequirements(Context)","url":"checkRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean, Object)","url":"checkState(boolean,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkState(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T, Object)","url":"checkStateNotNull(T,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"Assertions","l":"checkStateNotNull(T)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"children"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"chunk"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"Chunk(DataSource, DataSpec, int, Format, int, Object, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"chunkCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"ChunkHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"chunkIndex"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"ChunkIndex(int[], long[], long[], long[])","url":"%3Cinit%3E(int[],long[],long[],long[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"ChunkSampleStream(@com.google.android.exoplayer2.C.TrackType int, int[], Format[], T, SequenceableLoader.Callback>, Allocator, long, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(@com.google.android.exoplayer2.C.TrackTypeint,int[],com.google.android.exoplayer2.Format[],T,com.google.android.exoplayer2.source.SequenceableLoader.Callback,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoderOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"clear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"clear()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"clear()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clear()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"clear()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"clear(Handler, Runnable)","url":"clear(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearAllKeyRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearAllRequestProperties()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"clearAndSet(Map)","url":"clearAndSet(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearAuxEffectInfo()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"clearBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"clearBlocks"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearCameraMotionListener(CameraMotionListener)","url":"clearCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"clearDecoderInfoCache()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"clearFatalError()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"clearFlag(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CLEARKEY_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"clearKeyRequestProperty(String)","url":"clearKeyRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"ClearMediaItems(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"clearOverride(TrackGroup)","url":"clearOverride(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"clearOverridesOfType(@com.google.android.exoplayer2.C.TrackType int)","url":"clearOverridesOfType(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"clearPrefixFlags(boolean[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"clearRequestProperty(String)","url":"clearRequestProperty(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverride(int, TrackGroupArray)","url":"clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearSelectionOverrides(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.CleartextNotPermittedException","l":"CleartextNotPermittedException(IOException, DataSpec)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"clearTrackOutputs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"clearTrackSelections(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"clearVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"clearVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearVideoSizeConstraints()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"clearVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"ClearVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"clearVideoSurface(Surface)","url":"clearVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"clearVideoSurfaceHolder(SurfaceHolder)","url":"clearVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"clearVideoSurfaceView(SurfaceView)","url":"clearVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"clearVideoTextureView(TextureView)","url":"clearVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"clearViewportSizeConstraints()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"clearWindowColor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedEndTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"clippedStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingConfiguration"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"ClippingMediaPeriod(MediaPeriod, boolean, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriod,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"ClippingMediaSource(MediaSource, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"clippingProperties"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"clockRate"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndClear()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndInsert(int, int)","url":"cloneAndInsert(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"cloneAndRemove(int, int)","url":"cloneAndRemove(int,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"close()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"close()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"close()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"close()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"closedCaptions"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"closeQuietly(Closeable)","url":"closeQuietly(java.io.Closeable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceUtil","l":"closeQuietly(DataSource)","url":"closeQuietly(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"closeSession(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"CLOSEST_SYNC"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"CODEC_E_AC3_JOC"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"CODEC_OPERATING_RATE_UNSET"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"codecInfo"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"CodecMaxValues(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"codecMimeType"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"codecNeedsSetOutputSurfaceWorkaround(String)","url":"codecNeedsSetOutputSurfaceWorkaround(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"codecs"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"codecs"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"codecs"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_FULL"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_RANGE_LIMITED"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT2020"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT601"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_SPACE_BT709"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_HLG"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_SDR"},{"p":"com.google.android.exoplayer2","c":"C","l":"COLOR_TRANSFER_ST2084"},{"p":"com.google.android.exoplayer2","c":"Format","l":"colorInfo"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"ColorInfo(int, int, int, byte[])","url":"%3Cinit%3E(int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorRange"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"colors"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"colorspace"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorSpace"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT2020"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT601"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_BT709"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"COLORSPACE_UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"colorTransfer"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_ADJUST_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_CHANGE_MEDIA_ITEMS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TIMELINE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_TRACK_INFOS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_GET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_INVALID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"COMMAND_MOVE_QUEUE_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PLAY_PAUSE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_PREPARE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_BACK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_FORWARD"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_IN_CURRENT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_DEFAULT_POSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_NEXT_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_PREVIOUS_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SEEK_TO_WINDOW"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_DEVICE_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_MEDIA_ITEMS_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_REPEAT_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SHUFFLE_MODE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_SPEED_AND_PITCH"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_TRACK_SELECTION_PARAMETERS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VIDEO_SURFACE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"COMMAND_STOP"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"commandBytes"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CommentFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"CommentHeader(String, String[], int)","url":"%3Cinit%3E(java.lang.String,java.lang.String[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"comments"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"commitFile(File, long)","url":"commitFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"COMMON_PSSH_UUID"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"compare(DrmInitData.SchemeData, DrmInitData.SchemeData)","url":"compare(com.google.android.exoplayer2.drm.DrmInitData.SchemeData,com.google.android.exoplayer2.drm.DrmInitData.SchemeData)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"compareLong(long, long)","url":"compareLong(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"compareTo(CacheSpan)","url":"compareTo(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"compareTo(DefaultTrackSelector.AudioTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.AudioTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"compareTo(DefaultTrackSelector.OtherTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.OtherTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"compareTo(DefaultTrackSelector.TextTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.TextTrackScore)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"compareTo(DefaultTrackSelector.VideoTrackScore)","url":"compareTo(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.VideoTrackScore)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"compareTo(FakeClock.HandlerMessage)","url":"compareTo(com.google.android.exoplayer2.testutil.FakeClock.HandlerMessage)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"compareTo(Long)","url":"compareTo(java.lang.Long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"compareTo(SegmentDownloader.Segment)","url":"compareTo(com.google.android.exoplayer2.offline.SegmentDownloader.Segment)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"compareTo(StreamKey)","url":"compareTo(com.google.android.exoplayer2.offline.StreamKey)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"compilation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UrlTemplate","l":"compile(String)","url":"compile(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"componentSpliceList"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentSplicePts"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"componentTag"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"composer"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"CompositeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"CompositeSequenceableLoader(SequenceableLoader[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.SequenceableLoader[])"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(boolean, ShuffleOrder, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.ShuffleOrder,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"ConcatenatingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"ConditionVariable(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"conductor"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configs()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts","l":"configsNoSniffing()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(String, Format)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"ConfigurationException(Throwable, Format)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"configure(AudioProcessor.AudioFormat)","url":"configure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"configure(Format, int, int[])","url":"configure(com.google.android.exoplayer2.Format,int,int[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int, boolean)","url":"%3Cinit%3E(long,long,int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"ConstantBitrateSeekMap(long, long, int, int)","url":"%3Cinit%3E(long,long,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"constraintBytes"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"constraintsFlagsAndReservedZero2Bits"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(float, float, float)","url":"constrainValue(float,float,float)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(int, int, int)","url":"constrainValue(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"constrainValue(long, long, long)","url":"constrainValue(long,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"consume(byte[], int)","url":"consume(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consume(long, ParsableByteArray, TrackOutput[])","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"consume(long, ParsableByteArray)","url":"consume(long,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"consume(ParsableByteArray, int)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"consume(ParsableByteArray, long, int, boolean)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray,long,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"consume(ParsableByteArray)","url":"consume(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"consumeCcData(long, ParsableByteArray, TrackOutput[])","url":"consumeCcData(long,com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.extractor.TrackOutput[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"ContainerMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, long, long, int, long, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,long,long,int,long,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"containerMimeType"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"contains(@com.google.android.exoplayer2.Player.Command int)","url":"contains(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"contains(@com.google.android.exoplayer2.Player.Event int)","url":"contains(@com.google.android.exoplayer2.Player.Eventint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"contains(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"contains(Object[], Object)","url":"contains(java.lang.Object[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"contains(String)","url":"contains(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"containsAny(@com.google.android.exoplayer2.Player.Event int...)","url":"containsAny(@com.google.android.exoplayer2.Player.Eventint...)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"containsAny(int...)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"containsCodecsCorrespondingToMimeType(String, String)","url":"containsCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"containsTrack(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MOVIE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_SPEECH"},{"p":"com.google.android.exoplayer2","c":"C","l":"CONTENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"ContentDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.io.IOException,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource.ContentDataSourceException","l":"ContentDataSourceException(IOException)","url":"%3Cinit%3E(java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"contentDurationUs"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"contentIsMalformed"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"contentLength"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"contentLength"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"ContentMetadataMutations()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"contentPositionMs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"contentResumeOffsetUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"contentType"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"contentType"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"context"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"continueLoading(long)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_AUTOSTART"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CONTROL_CODE_PRESENT"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"controlCode"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaDescriptionConverter","l":"convert(MediaDescriptionCompat)","url":"convert(android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToExoPlayerMediaItem(MediaItem)","url":"convertToExoPlayerMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"MediaItemConverter","l":"convertToMedia2MediaItem(MediaItem)","url":"convertToMedia2MediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"copy(Format[])","url":"copy(com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.offline","c":"FilterableManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"copy(List)","url":"copy(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"copy(Looper, ListenerSet.IterationFinishedEvent)","url":"copy(android.os.Looper,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"CopyOnWriteMultiset()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"copyright"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"copyWith(long, int)","url":"copyWith(long,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntries(Metadata.Entry...)","url":"copyWithAppendedEntries(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"copyWithAppendedEntriesFrom(Metadata)","url":"copyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithCryptoType(@com.google.android.exoplayer2.C.CryptoType int)","url":"copyWithCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"copyWithData(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithDrmInitData(DrmInitData)","url":"copyWithDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"copyWithEndTag()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"copyWithFormat(Format)","url":"copyWithFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithFrameRate(float)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithGaplessInfo(int, int)","url":"copyWithGaplessInfo(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithId(String)","url":"copyWithId(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithLabel(String)","url":"copyWithLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithManifestFormatInfo(Format)","url":"copyWithManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMaxInputSize(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"copyWithMergedRequest(DownloadRequest)","url":"copyWithMergedRequest(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithMetadata(Metadata)","url":"copyWithMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"copyWithMutationsApplied(ContentMetadataMutations)","url":"copyWithMutationsApplied(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithPeriodUid(Object)","url":"copyWithPeriodUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithPictureFrames(List)","url":"copyWithPictureFrames(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"copyWithSchemeType(String)","url":"copyWithSchemeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithSeekTable(FlacStreamMetadata.SeekTable)","url":"copyWithSeekTable(com.google.android.exoplayer2.extractor.FlacStreamMetadata.SeekTable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"copyWithVideoSize(int, int)","url":"copyWithVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"copyWithVorbisComments(List)","url":"copyWithVorbisComments(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"copyWithWindowSequenceNumber(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"count"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"count(E)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc32(byte[], int, int, int)","url":"crc32(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"crc8(byte[], int, int, int)","url":"crc8(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.ExtractorFactory","l":"create()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"create(Format, MediaSource.MediaPeriodId)","url":"create(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int, int, int)","url":"create(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput.Factory","l":"create(int, int)","url":"create(int,int)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"create(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"DefaultMediaCodecAdapterFactory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createAdapter(MediaCodecAdapter.Configuration)","url":"createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil.AdaptiveTrackSelectionFactory","l":"createAdaptiveTrackSelection(ExoTrackSelection.Definition)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createAdaptiveTrackSelection(TrackGroup, int[], int, BandwidthMeter, ImmutableList)","url":"createAdaptiveTrackSelection(com.google.android.exoplayer2.source.TrackGroup,int[],int,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.common.collect.ImmutableList)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"createAdPlaybackState(int, long...)","url":"createAdPlaybackState(int,long...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, int, List, DrmInitData, @com.google.android.exoplayer2.C.SelectionFlags int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,@com.google.android.exoplayer2.C.SelectionFlagsint,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createAudioSampleFormat(String, String, String, int, int, int, int, List, DrmInitData, @com.google.android.exoplayer2.C.SelectionFlags int, String)","url":"createAudioSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,java.util.List,com.google.android.exoplayer2.drm.DrmInitData,@com.google.android.exoplayer2.C.SelectionFlagsint,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(float[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createBuffer(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteArray(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createByteList(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"createChunkSource(ExoTrackSelection, long, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.trackselection.ExoTrackSelection,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource.Factory","l":"createChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, TransferListener)","url":"createChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"createCodec(MediaCodecAdapter.Configuration)","url":"createCodec(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"createCompositeSequenceableLoader(SequenceableLoader...)","url":"createCompositeSequenceableLoader(com.google.android.exoplayer2.source.SequenceableLoader...)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createContainerFormat(String, String, String, String, String, int, @com.google.android.exoplayer2.C.SelectionFlags int, @com.google.android.exoplayer2.C.RoleFlags int, String)","url":"createContainerFormat(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,int,@com.google.android.exoplayer2.C.SelectionFlagsint,@com.google.android.exoplayer2.C.RoleFlagsint,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"createCryptoConfig(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"createCryptoConfig(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"createCryptoConfig(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"createCryptoConfig(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"createCurrentContentIntent(Player)","url":"createCurrentContentIntent(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"createCustomActions(Context, int)","url":"createCustomActions(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,@com.google.android.exoplayer2.C.TrackTypeint,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"createDashChunkSource(LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, long, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler, TransferListener)","url":"createDashChunkSource(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,@com.google.android.exoplayer2.C.TrackTypeint,long,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"createDataSet(TrackGroup, long)","url":"createDataSet(com.google.android.exoplayer2.source.TrackGroup,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"createDataSink()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSource()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsDataSourceFactory","l":"createDataSource(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForDownloading()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"createDataSourceForRemovingDownload()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"createDataSourceInternal(HttpDataSource.RequestProperties)","url":"createDataSourceInternal(com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"createDecoder(Format, CryptoConfig)","url":"createDecoder(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.CryptoConfig)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"createDecoder(Format)","url":"createDecoder(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"createDecoderException(Throwable, MediaCodecInfo)","url":"createDecoderException(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"createDefaultLoadControl()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloaderFactory","l":"createDownloader(DownloadRequest)","url":"createDownloader(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(int, MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createDrmEventDispatcher(MediaSource.MediaPeriodId)","url":"createDrmEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createEglContext(EGLDisplay)","url":"createEglContext(android.opengl.EGLDisplay)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createEglDisplay()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(int, MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId, long)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"createEventDispatcher(MediaSource.MediaPeriodId)","url":"createEventDispatcher(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"createExternalTexture()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"createExtractor(Uri, Format, List, TimestampAdjuster, Map>, ExtractorInput)","url":"createExtractor(android.net.Uri,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.util.TimestampAdjuster,java.util.Map,com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"createExtractors(Uri, Map>)","url":"createExtractors(android.net.Uri,java.util.Map)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createFallbackOptions(ExoTrackSelection)","url":"createFallbackOptions(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAd(Exception)","url":"createForAd(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAdGroup(Exception, int)","url":"createForAdGroup(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForAllAds(Exception)","url":"createForAllAds(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"createForAudioDecoding(MediaCodecInfo, MediaFormat, Format, MediaCrypto)","url":"createForAudioDecoding(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.media.MediaCrypto)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"createForAudioEncoding(MediaCodecInfo, MediaFormat, Format)","url":"createForAudioEncoding(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"createForIOException(IOException, DataSpec, int)","url":"createForIOException(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedContainer(String, Throwable)","url":"createForMalformedContainer(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedDataOfUnknownType(String, Throwable)","url":"createForMalformedDataOfUnknownType(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForMalformedManifest(String, Throwable)","url":"createForMalformedManifest(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForManifestWithUnsupportedFeature(String, Throwable)","url":"createForManifestWithUnsupportedFeature(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRemote(String)","url":"createForRemote(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForRenderer(Throwable, String, int, Format, int, boolean, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"createForRenderer(java.lang.Throwable,java.lang.String,int,com.google.android.exoplayer2.Format,int,boolean,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForSource(IOException, int)","url":"createForSource(java.io.IOException,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"createForUnexpected(java.lang.RuntimeException,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"createForUnexpected(RuntimeException)","url":"createForUnexpected(java.lang.RuntimeException)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"createForUnsupportedContainerFeature(String)","url":"createForUnsupportedContainerFeature(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"createForVideoDecoding(MediaCodecInfo, MediaFormat, Format, Surface, MediaCrypto)","url":"createForVideoDecoding(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format,android.view.Surface,android.media.MediaCrypto)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"createForVideoEncoding(MediaCodecInfo, MediaFormat, Format)","url":"createForVideoEncoding(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.media.MediaFormat,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"createFromCaptionStyle(CaptioningManager.CaptionStyle)","url":"createFromCaptionStyle(android.view.accessibility.CaptioningManager.CaptionStyle)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"createFromParcel(Parcel)","url":"createFromParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandler(Looper, Handler.Callback)","url":"createHandler(android.os.Looper,android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentLooper(Handler.Callback)","url":"createHandlerForCurrentLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createHandlerForCurrentOrMainLooper(Handler.Callback)","url":"createHandlerForCurrentOrMainLooper(android.os.Handler.Callback)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createInitialPayloadReaders()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"createInputSurface"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"createMediaFormatFromFormat(Format)","url":"createMediaFormatFromFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createMediaPeriod(MediaSource.MediaPeriodId, TrackGroupArray, Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, TransferListener)","url":"createMediaPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory","l":"createMediaPeriod(T, int)","url":"createMediaPeriod(T,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"createMediaPlaylistVariantUrl(Uri)","url":"createMediaPlaylistVariantUrl(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"createMediaSource()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(DashManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory, DrmSessionManager)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"createMediaSource(DownloadRequest, DataSource.Factory)","url":"createMediaSource(com.google.android.exoplayer2.offline.DownloadRequest,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"createMediaSource(MediaItem.SubtitleConfiguration, long)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem.SubtitleConfiguration,long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"createMediaSource(MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest, MediaItem)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(SsManifest)","url":"createMediaSource(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"createMediaSource(Uri)","url":"createMediaSource(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"createMessage(PlayerMessage.Target)","url":"createMessage(com.google.android.exoplayer2.PlayerMessage.Target)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createMetadataInputBuffer(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"createNotification(Player, NotificationCompat.Builder, boolean, Bitmap)","url":"createNotification(com.google.android.exoplayer2.Player,androidx.core.app.NotificationCompat.Builder,boolean,android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"createNotificationChannel(Context, String, int, int, int)","url":"createNotificationChannel(android.content.Context,java.lang.String,int,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createOutputBuffer()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.Factory","l":"createPayloadReader(int, TsPayloadReader.EsInfo)","url":"createPayloadReader(int,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader.Factory","l":"createPayloadReader(RtpPayloadFormat)","url":"createPayloadReader(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId, long)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"createPeriod(MediaSource.MediaPeriodId)","url":"createPeriod(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"createPlaceholder(Object)","url":"createPlaceholder(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParserFactory","l":"createPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"createPlaylistParser(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor.Factory","l":"createProgressiveMediaExtractor()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.Factory","l":"createProgressiveMediaExtractor(@com.google.android.exoplayer2.C.TrackType int, Format, boolean, List, TrackOutput)","url":"createProgressiveMediaExtractor(@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,boolean,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"createRendererException(Throwable, Format, boolean, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"createRendererException(java.lang.Throwable,com.google.android.exoplayer2.Format,boolean,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2","c":"RenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"createRenderers(Handler, VideoRendererEventListener, AudioRendererEventListener, TextOutput, MetadataOutput)","url":"createRenderers(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.text.TextOutput,com.google.android.exoplayer2.metadata.MetadataOutput)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"createRetryAction(boolean, long)","url":"createRetryAction(boolean,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"createRobolectricConditionVariable()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createSampleFormat(String, String)","url":"createSampleFormat(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"createSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"createSampleStream(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"createSeekParamsForTargetTimeUs(long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"createSessionCreationData(DrmInitData, DrmInitData)","url":"createSessionCreationData(com.google.android.exoplayer2.drm.DrmInitData,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"createSingleVariantMasterPlaylist(String)","url":"createSingleVariantMasterPlaylist(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"createSubtitle()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempDirectory(Context, String)","url":"createTempDirectory(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"createTempFile(Context, String)","url":"createTempFile(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, long)","url":"createTestFile(java.io.File,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String, long)","url":"createTestFile(java.io.File,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"createTestFile(File, String)","url":"createTestFile(java.io.File,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.Factory","l":"createTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"createTracker(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"createTracks(ExtractorOutput, int)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"createTracks(ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"createTracks(com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"createTrackSelections(ExoTrackSelection.Definition[], BandwidthMeter, MediaSource.MediaPeriodId, Timeline)","url":"createTrackSelections(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"createTrackSelectionsForDefinitions(ExoTrackSelection.Definition[], TrackSelectionUtil.AdaptiveTrackSelectionFactory)","url":"createTrackSelectionsForDefinitions(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition[],com.google.android.exoplayer2.trackselection.TrackSelectionUtil.AdaptiveTrackSelectionFactory)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"createUnexpectedDecodeException(Throwable)","url":"createUnexpectedDecodeException(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"createVideoSampleFormat(String, String, String, int, int, int, int, float, List, int, float, DrmInitData)","url":"createVideoSampleFormat(java.lang.String,java.lang.String,java.lang.String,int,int,int,int,float,java.util.List,int,float,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithDrm(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"createWithDrm(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"createWithoutDrm(Allocator)","url":"createWithoutDrm(com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"createWithWindowId(Object)","url":"createWithWindowId(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"CREATOR"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"CREATOR"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"CREATOR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"CREATOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"CREATOR"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"CREATOR"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"cronetConnectionStatus"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, int, int, int, boolean, boolean, String, HttpDataSource.RequestProperties, Predicate, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,int,int,int,boolean,boolean,java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,com.google.common.base.Predicate,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties, boolean)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor, Predicate)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor,com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"CronetDataSource(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, int, int, boolean, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,int,int,boolean,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"CronetDataSourceFactory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetEngineWrapper","l":"CronetEngineWrapper(CronetEngine)","url":"%3Cinit%3E(org.chromium.net.CronetEngine)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"crypto"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CBC"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_AES_CTR"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_MODE_UNENCRYPTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_TYPE_FRAMEWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"CRYPTO_TYPE_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"cryptoData"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"CryptoData(int, byte[], int, int)","url":"%3Cinit%3E(int,byte[],int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoException","l":"CryptoException(int, String)","url":"%3Cinit%3E(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"cryptoInfo"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"CryptoInfo()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"cryptoMode"},{"p":"com.google.android.exoplayer2","c":"Format","l":"cryptoType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrc"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"CSRC_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"csrcCount"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"cue"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"CUE_HEADER_PATTERN"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.TextSizeType int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,@com.google.android.exoplayer2.text.Cue.LineTypeint,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float,@com.google.android.exoplayer2.text.Cue.TextSizeTypeint,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, boolean, int)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,@com.google.android.exoplayer2.text.Cue.LineTypeint,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float,boolean,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence, Layout.Alignment, float, @com.google.android.exoplayer2.text.Cue.LineType int, @com.google.android.exoplayer2.text.Cue.AnchorType int, float, @com.google.android.exoplayer2.text.Cue.AnchorType int, float)","url":"%3Cinit%3E(java.lang.CharSequence,android.text.Layout.Alignment,float,@com.google.android.exoplayer2.text.Cue.LineTypeint,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float,@com.google.android.exoplayer2.text.Cue.AnchorTypeint,float)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"Cue(CharSequence)","url":"%3Cinit%3E(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"CueDecoder","l":"CueDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"CueEncoder","l":"CueEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"CURRENT_POSITION_NOT_SET"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"currentCapacity"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentMediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentTimeline"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"currentTimeMillis()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"currentWindowIndex"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"CUSTOM_ERROR_CODE_BASE"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"customActionReceiver"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"customCacheKey"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"customData"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String, Throwable)","url":"d(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"d(String, String)","url":"d(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"DashDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"DashManifest(long, long, long, boolean, long, long, long, long, ProgramInformation, UtcTimingElement, ServiceDescriptionElement, Uri, List)","url":"%3Cinit%3E(long,long,long,boolean,long,long,long,long,com.google.android.exoplayer2.source.dash.manifest.ProgramInformation,com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement,com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement,android.net.Uri,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"DashManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashManifestStaleException","l":"DashManifestStaleException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"DashWrappingSegmentIndex(ChunkIndex, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ChunkIndex,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"data"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"data"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"data"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"data"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"data"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"data"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"data"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"data"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"data"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"DATA_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_AD"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MANIFEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_INITIALIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_MEDIA_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_TIME_SYNCHRONIZATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"DATA_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.database","c":"StandaloneDatabaseProvider","l":"DATABASE_NAME"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException, String)","url":"%3Cinit%3E(android.database.SQLException,java.lang.String)"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseIOException","l":"DatabaseIOException(SQLException)","url":"%3Cinit%3E(android.database.SQLException)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"DataChunk(DataSource, DataSpec, int, Format, int, Object, byte[])","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.Format,int,java.lang.Object,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"DataSchemeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSetFactory"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSource"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"DataSourceContractTest()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(@com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.String,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"DataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"dataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"DataSourceInputStream(DataSource, DataSpec)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"dataSpec"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"dataSpec"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int, byte[], long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,int,byte[],long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, int)","url":"%3Cinit%3E(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int, Map)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String, int)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long, String)","url":"%3Cinit%3E(android.net.Uri,long,long,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri, long, long)","url":"%3Cinit%3E(android.net.Uri,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"DataSpec(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithEndPositionOutOfRange_readsToEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPosition_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAndLength_readExpectedRange()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEnd_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionAtEndAndLength_readsZeroBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"dataSpecWithPositionOutOfRange_throwsPositionOutOfRangeException()"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"dataType"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"dataType"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"DebugTextViewHelper(ExoPlayer, TextView)","url":"%3Cinit%3E(com.google.android.exoplayer2.ExoPlayer,android.widget.TextView)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"decode(byte[], int, boolean)","url":"decode(byte[],int,boolean)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(byte[], int)","url":"decode(byte[],int)"},{"p":"com.google.android.exoplayer2.text","c":"CueDecoder","l":"decode(byte[])"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"decode(DecoderInputBuffer, SimpleDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"decode(DecoderInputBuffer, SimpleDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.SimpleDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"decode(DecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"decode(DecoderInputBuffer, VideoDecoderOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.decoder.DecoderInputBuffer,com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"decode(I, O, boolean)","url":"decode(I,O,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTableDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"decode(MetadataInputBuffer, ByteBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"decode(MetadataInputBuffer)","url":"decode(com.google.android.exoplayer2.metadata.MetadataInputBuffer)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"decode(ParsableByteArray)","url":"decode(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"decode(SubtitleInputBuffer, SubtitleOutputBuffer, boolean)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer,com.google.android.exoplayer2.text.SubtitleOutputBuffer,boolean)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"decode(SubtitleInputBuffer)","url":"decode(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"DecoderAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"decoderCounters"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"DecoderCounters()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderException","l":"DecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderInitCount"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"DecoderInitializationException(Format, Throwable, boolean, MediaCodecInfo)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.lang.Throwable,boolean,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderInitialized(String, long, long)","url":"decoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"DecoderInputBuffer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"decoderName"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderOutputBuffer","l":"DecoderOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"decoderPrivate"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"decoderReleaseCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"decoderReleased(String)","url":"decoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DecoderReuseEvaluation(String, Format, Format, int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"DecoderVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"decreaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"deduplicateConsecutiveFormats"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"DEFAULT"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Factory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsExtractorFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheKeyFactory","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"DEFAULT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_AD_MARKER_WIDTH_DP"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"DEFAULT_AD_PRELOAD_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_AUDIO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"DEFAULT_AUDIO_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BACK_BUFFER_DURATION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BANDWIDTH_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BAR_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_BOTTOM_PADDING_FRACTION"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_BUFFER_FOR_PLAYBACK_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_BUFFER_SEGMENT_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter","l":"DEFAULT_BUFFER_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_BUFFERED_COLOR"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_CAMERA_MOTION_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_CONNECT_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_DETACH_SURFACE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"DEFAULT_FACTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DEFAULT_FOREGROUND_NOTIFICATION_UPDATE_INTERVAL"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"DEFAULT_FRAGMENT_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_IMAGE_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATE"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_2G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_3G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_4G"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_NSA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_5G_SA"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_INITIAL_BITRATE_ESTIMATES_WIFI"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"DEFAULT_LIVE_PRESENTATION_DELAY_MS"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"DEFAULT_LOADING_CHECK_INTERVAL_BYTES"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_LOCATION_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MAX_BUFFER_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_HEIGHT_TO_DISCARD"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_MAX_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MAX_PARALLEL_DOWNLOADS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"DEFAULT_MAX_QUEUE_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MAX_WIDTH_TO_DISCARD"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"DEFAULT_MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_METADATA_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_MS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MIN_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_MIN_LOADABLE_RETRY_COUNT_PROGRESSIVE_LIVE"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_MIN_RETRY_COUNT"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_MINIMUM_SILENCE_DURATION_US"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_MUXED_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"DEFAULT_NTP_HOST"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_PADDING_SILENCE_US"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"DEFAULT_PLAYBACK_ACTIONS"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DEFAULT_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_AD_MARKER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_PLAYED_COLOR"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_PRIORITY"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_PROPORTIONAL_CONTROL_FACTOR"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"DEFAULT_PROVIDER"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSourceFactory","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DEFAULT_READ_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"DEFAULT_RELEASE_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_REPEAT_TOGGLE_MODES"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DEFAULT_REQUIREMENTS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_COLOR"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DISABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_DRAGGED_SIZE_DP"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_SCRUBBER_ENABLED_SIZE_DP"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_BACK_INCREMENT_MS"},{"p":"com.google.android.exoplayer2","c":"C","l":"DEFAULT_SEEK_FORWARD_INCREMENT_MS"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"DEFAULT_SEEK_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DEFAULT_SESSION_ID_GENERATOR"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DEFAULT_SESSION_KEEPALIVE_MS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_SHOW_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"DEFAULT_SILENCE_THRESHOLD_LEVEL"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DEFAULT_SLIDING_WINDOW_MAX_WEIGHT"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"DEFAULT_SOCKET_TIMEOUT_MILLIS"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TARGET_BUFFER_BYTES"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpFileAsserts","l":"DEFAULT_TEST_ASSET_DIRECTORY"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_TEXT_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"DEFAULT_TEXT_SIZE_FRACTION"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"DEFAULT_TIME_BAR_MIN_UPDATE_INTERVAL_MS"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"DEFAULT_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"DEFAULT_TIMESTAMP_SEARCH_BYTES"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_TOUCH_TARGET_HEIGHT_DP"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_BLACKLIST_MS"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DEFAULT_TRACK_EXCLUSION_MS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DEFAULT_UNPLAYED_COLOR"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DEFAULT_VIDEO_BUFFER_SIZE"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"DEFAULT_WEIGHT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_DURATION_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"DEFAULT_WINDOW_OFFSET_IN_FIRST_PERIOD_US"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"DEFAULT_WINDOW_UID"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"DEFAULT_WITHOUT_CONTEXT"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int, int)","url":"%3Cinit%3E(boolean,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"DefaultAllocator(boolean, int)","url":"%3Cinit%3E(boolean,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"DefaultAllowedCommandProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor...)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"DefaultAudioProcessorChain(AudioProcessor[], SilenceSkippingAudioProcessor, SonicAudioProcessor)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor[],com.google.android.exoplayer2.audio.SilenceSkippingAudioProcessor,com.google.android.exoplayer2.audio.SonicAudioProcessor)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[], boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[],boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, AudioProcessor[])","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor[])"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"DefaultAudioSink(AudioCapabilities, DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain,boolean,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"DefaultBandwidthMeter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"DefaultCastOptionsProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultCompositeSequenceableLoaderFactory","l":"DefaultCompositeSequenceableLoaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"DefaultContentMetadata(Map)","url":"%3Cinit%3E(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"DefaultDashChunkSource(ChunkExtractor.Factory, LoaderErrorThrower, DashManifest, BaseUrlExclusionList, int, int[], ExoTrackSelection, @com.google.android.exoplayer2.C.TrackType int, DataSource, long, int, boolean, List, PlayerEmsgHandler.PlayerTrackEmsgHandler)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.BaseUrlExclusionList,int,int[],com.google.android.exoplayer2.trackselection.ExoTrackSelection,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.upstream.DataSource,long,int,boolean,java.util.List,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler)"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"DefaultDatabaseProvider(SQLiteOpenHelper)","url":"%3Cinit%3E(android.database.sqlite.SQLiteOpenHelper)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, boolean)","url":"%3Cinit%3E(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, DataSource)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"DefaultDataSource(Context, String, int, int, boolean)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String, TransferListener)","url":"%3Cinit%3E(android.content.Context,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context, TransferListener, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSourceFactory","l":"DefaultDataSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloaderFactory","l":"DefaultDownloaderFactory(CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"DefaultDownloadIndex(DatabaseProvider)","url":"%3Cinit%3E(com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean, int)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap, boolean)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"DefaultDrmSessionManager(UUID, ExoMediaDrm, MediaDrmCallback, HashMap)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"DefaultDrmSessionManagerProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"DefaultExtractorInput(DataReader, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataReader,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"DefaultExtractorsFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsDataSourceFactory","l":"DefaultHlsDataSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"DefaultHlsExtractorFactory","l":"DefaultHlsExtractorFactory(int, boolean)","url":"%3Cinit%3E(int,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistParserFactory","l":"DefaultHlsPlaylistParserFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory, double)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,double)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"DefaultHlsPlaylistTracker(HlsDataSourceFactory, LoadErrorHandlingPolicy, HlsPlaylistParserFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int, boolean, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(java.lang.String,int,int,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"DefaultHttpDataSource(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"defaultInitializationVector"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"DefaultLoadControl(DefaultAllocator, int, int, int, int, int, boolean, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DefaultAllocator,int,int,int,int,int,boolean,int,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"DefaultLoadErrorHandlingPolicy(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"DefaultMediaCodecAdapterFactory","l":"DefaultMediaCodecAdapterFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"DefaultMediaDescriptionAdapter(PendingIntent)","url":"%3Cinit%3E(android.app.PendingIntent)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"DefaultMediaItemConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"DefaultMediaMetadataProvider(MediaControllerCompat, String)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context, ExtractorsFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"DefaultMediaSourceFactory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"DefaultPlaybackSessionManager(Supplier)","url":"%3Cinit%3E(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"defaultPositionUs"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int, long)","url":"%3Cinit%3E(android.content.Context,int,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"DefaultRenderersFactory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"DefaultRenderersFactoryAsserts","l":"DefaultRenderersFactoryAsserts()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"DefaultRtpPayloadReaderFactory","l":"DefaultRtpPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"DefaultSeekTimestampConverter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"DefaultShuffleOrder(int[], long)","url":"%3Cinit%3E(int[],long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"DefaultSsChunkSource(LoaderErrorThrower, SsManifest, int, ExoTrackSelection, DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.LoaderErrorThrower,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"DefaultTimeBar(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"DefaultTrackNameProvider(Resources)","url":"%3Cinit%3E(android.content.res.Resources)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context, ExoTrackSelection.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(DefaultTrackSelector.Parameters, ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"DefaultTrackSelector(ExoTrackSelection.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int, List)","url":"%3Cinit%3E(int,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"DefaultTsPayloadReaderFactory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"Definition(TrackGroup, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"delay(long)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"delete()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"delete()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"delete(File, DatabaseProvider)","url":"delete(java.io.File,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"delete(Uri, String, String[])","url":"delete(android.net.Uri,java.lang.String,java.lang.String[])"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"deleteTexture(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"deltaPicOrderAlwaysZeroFlag"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser.DeltaUpdateException","l":"DeltaUpdateException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"depth"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"dequeueInputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueInputBufferIndex()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"dequeueOutputBuffer()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"dequeueOutputBufferIndex(MediaCodec.BufferInfo)","url":"dequeueOutputBufferIndex(android.media.MediaCodec.BufferInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"describeContents()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"describeContents()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"describeContents()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"describeContents()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"description"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"description"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"description"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"Descriptor(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"descriptorBytes"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"destroyEglContext(EGLDisplay, EGLContext)","url":"destroyEglContext(android.opengl.EGLDisplay,android.opengl.EGLContext)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_CHARGING"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"DEVICE_DEBUG_INFO"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_IDLE"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"DEVICE_STORAGE_NOT_LOW"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"DeviceInfo(@com.google.android.exoplayer2.DeviceInfo.PlaybackType int, int, int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.DeviceInfo.PlaybackTypeint,int,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"diagnosticInfo"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"DIMEN_UNSET"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"disable()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"disable()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"disable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"disable(MediaSource.MediaSourceCaller)","url":"disable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Config","l":"disable5GNsaDisambiguation()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableChildSource(T)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"disabled(DecoderCounters)","url":"disabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"disabledTextTrackSelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"disabledTrackTypes"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"disableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"disableRenderer(int)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"disableSeeking()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"disableSeekingOnMp3Streams()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"disableTunneling()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_APP_OVERRIDE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_CHANNEL_COUNT_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_ENCODING_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_AUDIO_SAMPLE_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_DRM_SESSION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_INITIALIZATION_DATA_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MAX_INPUT_SIZE_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_MIME_TYPE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_OPERATING_RATE_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_REUSE_NOT_IMPLEMENTED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_MAX_RESOLUTION_EXCEEDED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_RESOLUTION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_VIDEO_ROTATION_CHANGED"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"DISCARD_REASON_WORKAROUND"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"discardBuffer(long, boolean)","url":"discardBuffer(long,boolean)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"discardReasons"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardSampleMetadataToRead()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardTo(long, boolean, boolean)","url":"discardTo(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"discardTo(long, boolean)","url":"discardTo(long,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToEnd()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardToRead()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"discardToSps(ByteBuffer)","url":"discardToSps(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamFrom(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"discardUpstreamSamples(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"discNumber"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_AUTO_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_INTERNAL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_REMOVE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SEEK_ADJUSTMENT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"DISCONTINUITY_REASON_SKIP"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"discontinuitySequence"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"dispatch(RecordedRequest)","url":"dispatch(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchKeyEvent(KeyEvent)","url":"dispatchKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"dispatchMediaKeyEvent(KeyEvent)","url":"dispatchMediaKeyEvent(android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"dispatchTouchEvent(MotionEvent)","url":"dispatchTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayHeight"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"displayTitle"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"displayWidth"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNext(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNext(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionAndScheduleNextImpl(ExoPlayer, DefaultTrackSelector, Surface, HandlerWrapper, ActionSchedule.ActionNode)","url":"doActionAndScheduleNextImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface,com.google.android.exoplayer2.util.HandlerWrapper,com.google.android.exoplayer2.testutil.ActionSchedule.ActionNode)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.AddMediaItems","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearMediaItems","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ClearVideoSurface","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"doActionImpl(ExoPlayer, DefaultTrackSelector, Surface)","url":"doActionImpl(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,android.view.Surface)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"domain"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"DONT_RETRY_FATAL"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"download(Downloader.ProgressListener)","url":"download(com.google.android.exoplayer2.offline.Downloader.ProgressListener)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int, DownloadProgress)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int,com.google.android.exoplayer2.offline.DownloadProgress)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"Download(DownloadRequest, int, long, long, long, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest,int,long,long,long,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(DownloadRequest)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"DownloadBuilder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadException","l":"DownloadException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"DownloadHelper(MediaItem, MediaSource, DefaultTrackSelector.Parameters, RendererCapabilities[])","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RendererCapabilities[])"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"downloadLicense(Format)","url":"downloadLicense(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory, Executor)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, DatabaseProvider, Cache, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.database.DatabaseProvider,com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"DownloadManager(Context, WritableDownloadIndex, DownloaderFactory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.offline.WritableDownloadIndex,com.google.android.exoplayer2.offline.DownloaderFactory)"},{"p":"com.google.android.exoplayer2.ui","c":"DownloadNotificationHelper","l":"DownloadNotificationHelper(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"DownloadProgress()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int, int)","url":"%3Cinit%3E(int,long,java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long, String, int)","url":"%3Cinit%3E(int,long,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"DownloadService(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(@com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long)","url":"downstreamFormatChanged(@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"downstreamFormatChanged(MediaLoadData)","url":"downstreamFormatChanged(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"doWork()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"doWork()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"drawableStateChanged()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DRM_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"drmConfiguration"},{"p":"com.google.android.exoplayer2","c":"Format","l":"drmInitData"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"drmInitData"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(DrmInitData.SchemeData...)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, DrmInitData.SchemeData...)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.drm.DrmInitData.SchemeData...)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"DrmInitData(String, List)","url":"%3Cinit%3E(java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysLoaded()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRemoved()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmKeysRestored()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeDatas"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"drmSchemeType"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"drmSession"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionAcquired(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"DrmSessionException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionManagerError(Exception)","url":"drmSessionManagerError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"drmSessionReleased()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"dropOutputBuffer(MediaCodecAdapter, int, long)","url":"dropOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"dropOutputBuffer(VideoDecoderOutputBuffer)","url":"dropOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedBufferCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"droppedFrames(int, long)","url":"droppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"droppedToKeyframeCount"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_HD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"DTS_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"DtsReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"DUMMY"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"Dummy()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"DummyExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"DummyExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"DummyMainThread()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"DummyTrackOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingRenderersFactory","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper.Dumpable","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"dump(Dumper)","url":"dump(com.google.android.exoplayer2.testutil.Dumper)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"DumpableFormat(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"Dumper()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig","l":"dumpFilesPrefix"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"durationMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"durationMs"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"durationsUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"durationsUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"durationUs"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"durationUs"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"durationUs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"durationUs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"durationUs"},{"p":"com.google.android.exoplayer2.text.dvb","c":"DvbDecoder","l":"DvbDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"DvbSubtitleInfo(String, int, byte[])","url":"%3Cinit%3E(java.lang.String,int,byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"dvbSubtitleInfos"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"DvbSubtitleReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"dvrWindowLengthUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"dynamic"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"E_AC3_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String, Throwable)","url":"e(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"e(String, String)","url":"e(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DEPRESSED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_DROP_SHADOW"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_OUTLINE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"EDGE_TYPE_RAISED"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"edgeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListDurations"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"editListMediaTimes"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"effectId"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler, EGLSurfaceTexture.TextureImageListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"EGLSurfaceTexture(Handler)","url":"%3Cinit%3E(android.os.Handler)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"elapsedRealtime()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"elapsedRealtimeEpochOffsetMs"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"elapsedRealtimeMs"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_BINARY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_FLOAT"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_MASTER"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_STRING"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"ELEMENT_TYPE_UNSIGNED_INT"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"elementId"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"elementSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"EmbeddedSampleStream(ChunkSampleStream, SampleQueue, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkSampleStream,com.google.android.exoplayer2.source.SampleQueue,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"EMPTY"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"EMPTY"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"EMPTY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"EMPTY"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorsFactory","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"EMPTY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"EMPTY"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"EMPTY"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"EMPTY"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"EMPTY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"EMPTY_BUFFER"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"EMPTY_BYTE_ARRAY"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"EmptySampleStream()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"enable()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"enable(MediaSource.MediaSourceCaller)","url":"enable(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"enable(RendererConfiguration, Format[], SampleStream, long, boolean, boolean, long, long)","url":"enable(com.google.android.exoplayer2.RendererConfiguration,com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,boolean,boolean,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableChildSource(T)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"enableCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"enabled(DecoderCounters)","url":"enabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"enabledCount"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"enableInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"enableRenderer(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"enableTunnelingV21()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"encode(EventMessage)","url":"encode(com.google.android.exoplayer2.metadata.emsg.EventMessage)"},{"p":"com.google.android.exoplayer2.text","c":"CueEncoder","l":"encode(List)","url":"encode(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderDelay"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderDelay"},{"p":"com.google.android.exoplayer2","c":"Format","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"encoderPadding"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"encoding"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ELD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_ER_BSAC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V1"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_HE_V2"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_LC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AAC_XHE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_AC4"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DOLBY_TRUEHD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_DTS_HD"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_E_AC3_JOC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_INVALID"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_MP3"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_16BIT_BIG_ENDIAN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_24BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_32BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_8BIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"ENCODING_PCM_FLOAT"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptedBlocks"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"encryptionIV"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"encryptionKey"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"END_OF_STREAM_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"endBlock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"endData()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"endedCount"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"endMasterElement(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endOffset"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkHolder","l":"endOfStream"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"endPositionMs"},{"p":"com.google.android.exoplayer2.util","c":"TraceUtil","l":"endSection()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"endTimeMs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"endTimeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"endTracks()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"endTracks()"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"endWrite(OutputStream)","url":"endWrite(java.io.OutputStream)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ensureCapacity(int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"ensureClassLoader(Bundle)","url":"ensureClassLoader(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"ensureSpaceForWrite(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"ensureUpdated()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"entrySet()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"equals(MediaDescriptionCompat, MediaDescriptionCompat)","url":"equals(android.support.v4.media.MediaDescriptionCompat,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"equals(Object)","url":"equals(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_BEHIND_LIVE_WINDOW"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_INIT_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODER_QUERY_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DECODING_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_CONTENT_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DEVICE_REVOKED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_DISALLOWED_OPERATION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_LICENSE_EXPIRED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_PROVISIONING_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SCHEME_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_SYSTEM_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_DRM_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_FAILED_RUNTIME_CHECK"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_BAD_HTTP_STATUS"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_FILE_NOT_FOUND"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_NO_PERMISSION"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_IO_UNSPECIFIED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_MALFORMED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_REMOTE_ERROR"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_TIMEOUT"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"ERROR_CODE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_EXO_MEDIA_DRM"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_LICENSE_ACQUISITION"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"ERROR_SOURCE_PROVISIONING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorCode"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"errorCode"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoException","l":"errorCode"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession.DrmSessionException","l":"errorCode"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"errorCount"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"errorInfoEquals(PlaybackException)","url":"errorInfoEquals(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"ErrorStateDrmSession(DrmSession.DrmSessionException)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DrmSession.DrmSessionException)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"escapeFileName(String)","url":"escapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"EsInfo(int, String, List, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.util.List,byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"essentialProperties"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder.FramePredicate","l":"evaluate(int, int, int, int, int)","url":"evaluate(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"evaluateQueueSize(long, List)","url":"evaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ATTRIBUTES_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_POSITION_ADVANCING"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_SINK_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AUDIO_UNDERRUN"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_AVAILABLE_COMMANDS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_BANDWIDTH_ESTIMATE"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DOWNSTREAM_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_LOADED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_REMOVED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_KEYS_RESTORED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_ACQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_MANAGER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DRM_SESSION_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_DROPPED_VIDEO_FRAMES"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_LOADING_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_IS_PLAYING_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_EXPIRED"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_KEY_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_CANCELED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_COMPLETED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_LOAD_STARTED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_ITEM_TRANSITION"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_MEDIA_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_METADATA"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAY_WHEN_READY_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_STATE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYER_RELEASED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_PLAYLIST_METADATA_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_POSITION_DISCONTINUITY"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"EVENT_PROVISION_REQUIRED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_RENDERED_FIRST_FRAME"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_REPEAT_MODE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_BACK_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SEEK_FORWARD_INCREMENT_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SHUFFLE_MODE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SKIP_SILENCE_ENABLED_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_SURFACE_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TIMELINE_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACK_SELECTION_PARAMETERS_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_TRACKS_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_UPSTREAM_DISCARDED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_CODEC_ERROR"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_INITIALIZED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DECODER_RELEASED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_DISABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_ENABLED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_FRAME_PROCESSING_OFFSET"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_INPUT_FORMAT_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VIDEO_SIZE_CHANGED"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"EVENT_VOLUME_CHANGED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"EventDispatcher()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"EventDispatcher(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"EventLogger(MappingTrackSelector)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.MappingTrackSelector)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"EventMessage(String, String, long, long, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long,byte[])"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageDecoder","l":"EventMessageDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessageEncoder","l":"EventMessageEncoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"eventPlaybackPositionMs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"events"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"Events(FlagSet, SparseArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"Events(FlagSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"EventStream(String, String, long, long[], EventMessage[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,long,long[],com.google.android.exoplayer2.metadata.emsg.EventMessage[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"eventStreams"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"eventTime"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"EventTime(long, Timeline, int, MediaSource.MediaPeriodId, long, Timeline, int, MediaSource.MediaPeriodId, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"EventTimeAndException(AnalyticsListener.EventTime, Exception)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"EventTimeAndFormat(AnalyticsListener.EventTime, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"EventTimeAndPlaybackState(AnalyticsListener.EventTime, @com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"%3Cinit%3E(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"EXACT"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedAudioConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedRendererCapabilitiesIfNecessary"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"exceedVideoConstraintsIfNecessary"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exception"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"exception"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionCleared"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"exceptionThrown"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"exclude(BaseUrl, long)","url":"exclude(com.google.android.exoplayer2.source.dash.manifest.BaseUrl,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"excludeMediaPlaylist(Uri, long)","url":"excludeMediaPlaylist(android.net.Uri,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"exclusionDurationMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"execute(RunnableFutureTask, boolean)","url":"execute(com.google.android.exoplayer2.util.RunnableFutureTask,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeKeyRequest(UUID, ExoMediaDrm.KeyRequest)","url":"executeKeyRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallback","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"executeProvisionRequest(UUID, ExoMediaDrm.ProvisionRequest)","url":"executeProvisionRequest(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"executeRunnable(Runnable)","url":"executeRunnable(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ExecuteRunnable","l":"ExecuteRunnable(String, Runnable)","url":"%3Cinit%3E(java.lang.String,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"exists()"},{"p":"com.google.android.exoplayer2.database","c":"ExoDatabaseProvider","l":"ExoDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"ExoHostedTest(String, long, boolean)","url":"%3Cinit%3E(java.lang.String,long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"ExoplayerCuesDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"ExoTimeoutException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_MEDIA_DURATION_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"EXPECTED_PLAYING_TIME_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"expectedPresentationTimeUs"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"experimentalFlushWithoutAudioTrackRelease()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalIsSleepingForOffload()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"experimentalSetEnableKeepAudioTrackOnSeek(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"experimentalSetForegroundModeTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"experimentalSetOffloadSchedulingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"DefaultMediaCodecAdapterFactory","l":"experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"experimentalUseProgressiveMediaSourceForSubtitles(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"EXTENDED_SAR"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"extension"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_ON"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"EXTENSION_RENDERER_MODE_PREFER"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_FROM_INDEX"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"EXTRA_INSTANCE_ID"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"EXTRA_TO_INDEX"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractAllSamplesFromFile(Extractor, Context, String)","url":"extractAllSamplesFromFile(com.google.android.exoplayer2.extractor.Extractor,android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri)","url":"extractSeekMap(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.testutil.FakeExtractorOutput,com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"extras"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"EXTRAS_SPEED"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"FACTORY"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"FACTORY"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"FACTORY"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"Factory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink.Factory","l":"Factory(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"Factory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(ChunkExtractor.Factory, DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.chunk.ChunkExtractor.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource.Factory","l":"Factory(Context, DataSource.Factory)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource.Factory","l":"Factory(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngine, Executor)","url":"%3Cinit%3E(org.chromium.net.CronetEngine,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"Factory(CronetEngineWrapper, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.ext.cronet.CronetEngineWrapper,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DashChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DashChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ExtractorsFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource.Factory","l":"Factory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.source.ProgressiveMediaExtractor.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Factory","l":"Factory(DataSource.Factory, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource.Factory","l":"Factory(FakeAdaptiveDataSet.Factory, FakeDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet.Factory,com.google.android.exoplayer2.testutil.FakeDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"Factory(HlsDataSourceFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsDataSourceFactory)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, int, int, float, float, Clock)","url":"%3Cinit%3E(int,int,int,int,int,float,float,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.Factory","l":"Factory(int, int, int, int, int, float)","url":"%3Cinit%3E(int,int,int,int,int,float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection.Factory","l":"Factory(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Factory","l":"Factory(long, double, Random)","url":"%3Cinit%3E(long,double,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"Factory(SsChunkSource.Factory, DataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.smoothstreaming.SsChunkSource.Factory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"FailOnCloseDataSink(Cache, AtomicBoolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.cache.Cache,java.util.concurrent.atomic.AtomicBoolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"failOnSpuriousAudioTimestamp"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_NONE"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"FAILURE_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"failureReason"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FAKE_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FAKE_PROVISION_REQUEST"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"FakeAdaptiveMediaPeriod(TrackGroupArray, MediaSourceEventListener.EventDispatcher, Allocator, FakeChunkSource.Factory, long, TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory,long,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"FakeAdaptiveMediaSource(Timeline, TrackGroupArray, FakeChunkSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.testutil.FakeChunkSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"FakeAudioRenderer(Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"FakeChunkSource(ExoTrackSelection, DataSource, FakeAdaptiveDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.ExoTrackSelection,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, boolean)","url":"%3Cinit%3E(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long, long, boolean)","url":"%3Cinit%3E(long,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"FakeClock(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeCryptoConfig","l":"FakeCryptoConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"fakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"FakeDataSet()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"FakeDataSource(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"FakeExoMediaDrm(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"FakeExtractorOutput(FakeTrackOutput.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTrackOutput.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"FakeMediaChunk(Format, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"FakeMediaChunkIterator(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"FakeMediaClockRenderer(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, FakeMediaPeriod.TrackDataFactory, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"FakeMediaPeriod(TrackGroupArray, Allocator, long, MediaSourceEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.upstream.Allocator,long,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, FakeMediaPeriod.TrackDataFactory, TrackGroupArray)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.testutil.FakeMediaPeriod.TrackDataFactory,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, DrmSessionManager, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"FakeMediaSource(Timeline, Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"FakeMediaSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"FakeMetadataEntry(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"FakeRenderer(@com.google.android.exoplayer2.C.TrackType int)","url":"%3Cinit%3E(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"FakeSampleStream(Allocator, MediaSourceEventListener.EventDispatcher, DrmSessionManager, DrmSessionEventListener.EventDispatcher, Format, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"FakeShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(int, Object...)","url":"%3Cinit%3E(int,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"FakeTimeline(Object[], FakeTimeline.TimelineWindowDefinition...)","url":"%3Cinit%3E(java.lang.Object[],com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"FakeTrackOutput(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"FakeTrackSelection(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"FakeTrackSelector(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"FakeTransferListener()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"FakeVideoRenderer(Handler, VideoRendererEventListener)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_LOCATION"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"FALLBACK_TYPE_TRACK"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"fallbackDecoderInitializationException"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"FallbackOptions(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"FallbackSelection(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"fastForwardActionIconResourceId"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"fatalErrorPlaybackCount"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_CONTENT_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_CACHE_FILE_METADATA"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_EXTERNAL"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"FEATURE_OFFLINE"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"FfmpegAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"FIELD_CUSTOM_ID_BASE"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"file"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"FileDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Exception)","url":"%3Cinit%3E(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, IOException)","url":"%3Cinit%3E(java.lang.String,java.io.IOException)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.FileDataSourceException","l":"FileDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"filename"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"FilteringHlsPlaylistParserFactory","l":"FilteringHlsPlaylistParserFactory(HlsPlaylistParserFactory, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory,java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"FilteringManifestParser(ParsingLoadable.Parser, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,java.util.List)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"filterRequirements(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"findNalUnit(byte[], int, int, boolean[])","url":"findNalUnit(byte[],int,int,boolean[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"findNextCueHeader(ParsableByteArray)","url":"findNextCueHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"findSyncBytePosition(byte[], int, int)","url":"findSyncBytePosition(byte[],int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"findTrueHdSyncframeOffset(ByteBuffer)","url":"findTrueHdSyncframeOffset(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"finishAllSessions(AnalyticsListener.EventTime)","url":"finishAllSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"first"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"firstPeriodIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"firstReportedTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, @com.google.android.exoplayer2.trackselection.TrackSelection.Type int, int, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int, @com.google.android.exoplayer2.trackselection.TrackSelection.Type int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int,@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"FixedTrackSelection(TrackGroup, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fixSmoothStreamingIsmManifestUri(Uri)","url":"fixSmoothStreamingIsmManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLAC"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"FlacDecoder(int, int, int, List)","url":"%3Cinit%3E(int,int,int,java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FlacExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"FlacSeekTableSeekMap(FlacStreamMetadata, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"flacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"FlacStreamMetadata(int, int, int, int, int, int, int, long, ArrayList, ArrayList)","url":"%3Cinit%3E(int,int,int,int,int,int,int,long,java.util.ArrayList,java.util.ArrayList)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader.FlacStreamMetadataHolder","l":"FlacStreamMetadataHolder(FlacStreamMetadata)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_CACHE_FRAGMENTATION"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_ALLOW_GZIP"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ALLOW_NON_IDR_KEYFRAMES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FLAG_AUDIBILITY_ENFORCED"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_BLOCK_ON_CACHE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_DATA_ALIGNMENT_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_DETECT_ACCESS_UNITS"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_DISABLE_ID3_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"FLAG_DISABLE_SEEK_FOR_CUES"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_DONT_CACHE_IF_LENGTH_UNKNOWN"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"FLAG_ENABLE_CONSTANT_BITRATE_SEEKING_ALWAYS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_ENABLE_EMSG_TRACK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"FLAG_ENABLE_INDEX_SEEKING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_AAC_STREAM"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_FOR_UNSET_LENGTH_REQUESTS"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"FLAG_IGNORE_CACHE_ON_ERROR"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_H264_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_IGNORE_SPLICE_INFO_STREAM"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"FLAG_MIGHT_NOT_USE_FULL_NETWORK_SPEED"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_OMIT_SAMPLE_DATA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DefaultTsPayloadReaderFactory","l":"FLAG_OVERRIDE_CAPTION_DESCRIPTORS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_PAYLOAD_UNIT_START_INDICATOR"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_PEEK"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"FLAG_RANDOM_ACCESS_INDICATOR"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_MOTION_PHOTO_METADATA"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_READ_SEF_DATA"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"FLAG_REQUIRE_FORMAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"FLAG_WORKAROUND_IGNORE_EDIT_LISTS"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FLAG_WORKAROUND_IGNORE_TFDT_BOX"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"flags"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"flags"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"flags"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"flip()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"floatElement(int, double)","url":"floatElement(int,double)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"flush()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"flush()"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"flush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"flush(int, int, int)","url":"flush(int,int,int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"flushDecoder()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"flushEvents()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReinitializeCodec()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"flushOrReleaseCodec()"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"FLV"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"FlvExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"FMT_FOURCC"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"fmtpParameters"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"focusSkipButton()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"focusSurface(EGLDisplay, EGLContext, EGLSurface, int, int)","url":"focusSurface(android.opengl.EGLDisplay,android.opengl.EGLContext,android.opengl.EGLSurface,int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ALBUMS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_ARTISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_GENRES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_MIXED"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_PLAYLISTS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_TITLES"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"FOLDER_TYPE_YEARS"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"folderType"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_EM"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PERCENT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"FONT_SIZE_UNIT_PIXEL"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"forAllSupportedMimeTypes()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkCryptoConfig","l":"forceAllowInsecureDecoderComponents"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forceDefaultLicenseUri"},{"p":"com.google.android.exoplayer2.mediacodec","c":"DefaultMediaCodecAdapterFactory","l":"forceDisableAsynchronous()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"forceDisableMediaCodecAsynchronousQueueing()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"forcedSessionTrackTypes"},{"p":"com.google.android.exoplayer2.mediacodec","c":"DefaultMediaCodecAdapterFactory","l":"forceEnableAsynchronous()"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"forceEnableMediaCodecAsynchronousQueueing()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceHighestSupportedBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"forceLowestBitrate"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"forceSessionsForAudioAndVideoTracks(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"forceStop()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forDash(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forDash(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forDash(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"FOREGROUND_NOTIFICATION_ID_NONE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"foregroundColor"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"foregroundPlaybackCount"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forHls(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forHls(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forHls(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"format"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.ConfigurationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"format"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"format"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"format"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"format"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"format"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"format"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"format"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"format"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_EXCEEDS_CAPABILITIES"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_HANDLED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_DRM"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_SUBTYPE"},{"p":"com.google.android.exoplayer2","c":"C","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"FORMAT_UNSUPPORTED_TYPE"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"format(Format)","url":"format(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"FormatHolder","l":"FormatHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"formatInvariant(String, Object...)","url":"formatInvariant(java.lang.String,java.lang.Object...)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"formats"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem, RenderersFactory, DataSource.Factory)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(Context, MediaItem)","url":"forMediaItem(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory, DrmSessionManager)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forMediaItem(MediaItem, DefaultTrackSelector.Parameters, RenderersFactory, DataSource.Factory)","url":"forMediaItem(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri, String)","url":"forProgressive(android.content.Context,android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forProgressive(Context, Uri)","url":"forProgressive(android.content.Context,android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"forResources(Iterable)","url":"forResources(java.lang.Iterable)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Context, Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.content.Context,android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory, DrmSessionManager, DefaultTrackSelector.Parameters)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"forSmoothStreaming(Uri, DataSource.Factory, RenderersFactory)","url":"forSmoothStreaming(android.net.Uri,com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"ForwardingAudioSink(AudioSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"ForwardingExtractorInput(ExtractorInput)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"ForwardingPlayer(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"ForwardingTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List, TrackOutput)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List,com.google.android.exoplayer2.extractor.TrackOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track, List)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track,java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster, Track)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int, TimestampAdjuster)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"FragmentedMp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameMbsOnlyFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"frameNumLength"},{"p":"com.google.android.exoplayer2","c":"Format","l":"frameRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"frameSize"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"frameSize"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkCryptoConfig","l":"FrameworkCryptoConfig(UUID, byte[], boolean)","url":"%3Cinit%3E(java.util.UUID,byte[],boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"framingFlag"},{"p":"com.google.android.exoplayer2","c":"Bundleable.Creator","l":"fromBundle(Bundle)","url":"fromBundle(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"fromBundleList(Bundleable.Creator, List)","url":"fromBundleList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"fromBundleNullableList(Bundleable.Creator, List, List)","url":"fromBundleNullableList(com.google.android.exoplayer2.Bundleable.Creator,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"fromBundleNullableSparseArray(Bundleable.Creator, SparseArray, SparseArray)","url":"fromBundleNullableSparseArray(com.google.android.exoplayer2.Bundleable.Creator,android.util.SparseArray,android.util.SparseArray)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"fromNullableBundle(Bundleable.Creator, Bundle, T)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle,T)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"fromNullableBundle(Bundleable.Creator, Bundle)","url":"fromNullableBundle(com.google.android.exoplayer2.Bundleable.Creator,android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(String)","url":"fromUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"fromUri(Uri)","url":"fromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[], int, int)","url":"fromUtf8Bytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"fromUtf8Bytes(byte[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"fullSegmentEncryptionKeyUri"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"GaplessInfoHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"Gav1Decoder(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"generalLevelIdc"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"generalProfileCompatibilityFlags"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"generalProfileIdc"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"generalProfileSpace"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"generalTierFlag"},{"p":"com.google.android.exoplayer2","c":"C","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"generateAudioSessionIdV21(Context)","url":"generateAudioSessionIdV21(android.content.Context)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateCurrentPlayerMediaPeriodEventTime()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"generateEventTime(Timeline, int, MediaSource.MediaPeriodId)","url":"generateEventTime(com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"generateNewId()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"genre"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"GeobFrame(String, String, String, byte[])","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"get(int)"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"get(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"get(int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"get(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"get(int)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"get(long, TimeUnit)","url":"get(long,java.util.concurrent.TimeUnit)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManagerProvider","l":"get(MediaItem)","url":"get(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, byte[])","url":"get(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, long)","url":"get(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"get(String, String)","url":"get(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAbandonedBeforeReadyRatio()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"getAc4SampleHeader(int, ParsableByteArray)","url":"getAc4SampleHeader(int,com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActionIndicesForCompactView(List, Player)","url":"getActionIndicesForCompactView(java.util.List,com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getActions(Player)","url":"getActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getActiveQueueItemId(Player)","url":"getActiveQueueItemId(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getActiveSessionId()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"getAdaptationSetIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAdaptiveMimeTypeForContentType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, boolean)","url":"getAdaptiveSupport(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getAdaptiveSupport(int, int, int[])","url":"getAdaptiveSupport(int,int,int[])"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getAdaptiveSupport(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdCountInAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getAdCountInGroup(AdPlaybackState, int)","url":"getAdCountInGroup(com.google.android.exoplayer2.source.ads.AdPlaybackState,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdDisplayContainer()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getAdditionalSessionProviders(Context)","url":"getAdditionalSessionProviders(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdDurationUs(int, int)","url":"getAdDurationUs(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupCount()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexAfterPositionUs(long, long)","url":"getAdGroupIndexAfterPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexAfterPositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"getAdGroupIndexForPositionUs(long, long)","url":"getAdGroupIndexForPositionUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupIndexForPositionUs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdGroupTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getAdjustedPlaybackSpeed(long, long)","url":"getAdjustedPlaybackSpeed(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getAdjustedSeekPositionUs(long, SeekParameters)","url":"getAdjustedSeekPositionUs(long,com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getAdjustedUpstreamFormat(Format)","url":"getAdjustedUpstreamFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"getAdjuster(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdOverlayInfos()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdResumePositionUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getAdsId()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"getAdsLoader()"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory.AdsLoaderProvider","l":"getAdsLoader(MediaItem.AdsConfiguration)","url":"getAdsLoader(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2.ui","c":"AdViewProvider","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getAdViewGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"getAll()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getAllData()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getAllocator()"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"getAllOutputBytes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"getAllowedCommands(MediaSession, MediaSession.ControllerInfo, SessionCommandGroup)","url":"getAllowedCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommandGroup)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"getAllTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAnalyticsCollector()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getAndClearOpenedDataSpecs()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getAndResetSeekPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getApplicationLooper()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getApproxBytesPerFrame()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"getAttribLocation(String)","url":"getAttribLocation(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"getAttributes()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValue(XmlPullParser, String)","url":"getAttributeValue(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"getAttributeValueIgnorePrefix(XmlPullParser, String)","url":"getAttributeValueIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getAudioAttributes()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"getAudioAttributesV21()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioComponent()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioContentTypeForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioFormat()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getAudioMediaMimeType(String)","url":"getAudioMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getAudioProcessors()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getAudioSessionId()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getAudioString()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioTrackChannelConfig(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getAudioUnderrunRate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getAudioUsageForStreamType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getAvailableCommands()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getAvailableCommands(Player.Commands)","url":"getAvailableCommands(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getAvailableSegmentCount(long, long)","url":"getAvailableSegmentCount(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"getBackBufferDurationUs()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getBandwidthMeter()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBigEndianInt(ByteBuffer, int)","url":"getBigEndianInt(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"getBinder(Bundle, String)","url":"getBinder(android.os.Bundle,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmap()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getBitmap(Context, String)","url":"getBitmap(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getBitmapHeight()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getBitrateEstimate()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPercentage()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getBufferedPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getBufferedPositionUs()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getBufferingState()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getBuildConfig()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getByteArray(Context, String)","url":"getByteArray(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getBytePosition()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getBytesDownloaded()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getBytesFromHexString(String)","url":"getBytesFromHexString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getBytesRead()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCache()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedBytes(String, long, long)","url":"getCachedBytes(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedLength(String, long, long)","url":"getCachedLength(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCachedSpans(String)","url":"getCachedSpans(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getCacheKey()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getCacheKeyFactory()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getCacheSpace()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getCameraMotionListener()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getCapabilities()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getCapabilities(Context)","url":"getCapabilities(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultCastOptionsProvider","l":"getCastOptions(Context)","url":"getCastOptions(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"getChannelCount(byte[])"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByChildUid(Object)","url":"getChildIndexByChildUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByPeriodIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildIndexByWindowIndex(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildPeriodUidFromConcatenatedUid(Object)","url":"getChildPeriodUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildTimelineUidFromConcatenatedUid(Object)","url":"getChildTimelineUidFromConcatenatedUid(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getChildUidByChildIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkDuration(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkDurationUs(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkEndTimeUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getChunkIndex()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getChunkIndex(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getChunkIndexByPosition(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getChunkSource()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getChunkStartTimeUs()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getClock()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodec()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecCountOfType(String, @com.google.android.exoplayer2.C.TrackType int)","url":"getCodecCountOfType(java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecInfo()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecMaxInputSize(MediaCodecInfo, Format, Format[])","url":"getCodecMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecMaxValues(MediaCodecInfo, Format, Format[])","url":"getCodecMaxValues(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecNeedsEosPropagation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getCodecOperatingRateV23(float, Format, Format[])","url":"getCodecOperatingRateV23(float,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format[])"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getCodecOutputMediaFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getCodecProfileAndLevel(Format)","url":"getCodecProfileAndLevel(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getCodecsCorrespondingToMimeType(String, String)","url":"getCodecsCorrespondingToMimeType(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCodecsOfType(String, @com.google.android.exoplayer2.C.TrackType int)","url":"getCodecsOfType(java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getCombinedPlaybackStats()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getCombineUpright()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCommaDelimitedSimpleClassNames(Object[])","url":"getCommaDelimitedSimpleClassNames(java.lang.Object[])"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getCompressibleDataSpec(Uri)","url":"getCompressibleDataSpec(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getConcatenatedUid(Object, Object)","url":"getConcatenatedUid(java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getConfiguration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getContentBufferedPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentDuration()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getContentLength(ContentMetadata)","url":"getContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getContentLength(String, String)","url":"getContentLength(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getContentMetadata(String)","url":"getContentMetadata(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getContentPosition()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getContentResumeOffsetUs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerAutoShow()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerHideOnTouch()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getControllerShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getCount()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCountryCode(Context)","url":"getCountryCode(android.content.Context)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getCreatedMediaPeriods()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getCryptoConfig()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getCryptoConfig()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getCryptoType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getCryptoType()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"getCryptoType(Format)","url":"getCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getCryptoType(Format)","url":"getCryptoType(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getCues(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getCues(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentAdGroupIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentAdIndexInAdGroup()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentText(Player)","url":"getCurrentContentText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentContentTitle(Player)","url":"getCurrentContentTitle(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.TextComponent","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentCues()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context, Display)","url":"getCurrentDisplayModeSize(android.content.Context,android.view.Display)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentDisplayModeSize(Context)","url":"getCurrentDisplayModeSize(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getCurrentDownloads()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"getCurrentIndex()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"getCurrentInputPosition()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultMediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentLargeIcon(Player, PlayerNotificationManager.BitmapCallback)","url":"getCurrentLargeIcon(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerNotificationManager.BitmapCallback)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentLiveOffset()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentManifest()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"getCurrentMappedTrackInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentMediaItemIndex()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getCurrentOrMainLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentPeriodIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentPosition()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getCurrentPositionUs(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.MediaDescriptionAdapter","l":"getCurrentSubText(Player)","url":"getCurrentSubText(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentTimeline()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentTrackGroups()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentTrackSelections()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentTracksInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentTracksInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getCurrentTracksInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getCurrentTracksInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getCurrentTracksInfo()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getCurrentUnixTimeMs()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlRequest()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getCurrentUrlResponseInfo()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getCurrentWindowIndex()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"getCustomAction(Player)","url":"getCustomAction(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"getCustomActions(Player)","url":"getCustomActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"getCustomCommands(MediaSession, MediaSession.ControllerInfo)","url":"getCustomCommands(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getData()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"getData()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getData()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(String)","url":"getData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"getData(Uri)","url":"getData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"getDataHolder()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getDataSet()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunkIterator","l":"getDataSpec()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"getDataSpec(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDataUriForString(String, String)","url":"getDataUriForString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getDebugString()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDecodedBitrate()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfo(String, boolean, boolean)","url":"getDecoderInfo(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getDecoderInfos(MediaCodecSelector, Format, boolean)","url":"getDecoderInfos(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecSelector","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfos(String, boolean, boolean)","url":"getDecoderInfos(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecoderInfosSortedByFormatSupport(List, Format)","url":"getDecoderInfosSortedByFormatSupport(java.util.List,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"getDecryptOnlyDecoderInfo()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getDefaultArtwork()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDefaultDisplayLocale()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDefaultPositionUs()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"getDefaults(Context)","url":"getDefaults(android.content.Context)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDefaultTrackSelectorParameters(Context)","url":"getDefaultTrackSelectorParameters(android.content.Context)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"getDefaultUrl()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getDeleteAfterDelivery()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getDeviceComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getDeviceInfo()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getDeviceVolume()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpUtil","l":"getDocumentSize(String)","url":"getDocumentSize(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getDownload()"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownload(String)","url":"getDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadIndex()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getDownloadManager()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getDownloadRequest(String, byte[])","url":"getDownloadRequest(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadIndex","l":"getDownloads(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getDownloadsPaused()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getDrmUuid(String)","url":"getDrmUuid(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getDroppedFramesRate()"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"getDtsFrameSize(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"getDummyDrmSessionManager()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getDummySeekMap()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"getDuration()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getDuration()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getDurationUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getDurationUs(long, long)","url":"getDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getEditedValues()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"getEglSurface(EGLDisplay, Object)","url":"getEglSurface(android.opengl.EGLDisplay,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getElapsedRealtimeOffsetMs()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"getElementType(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getEncoding(String, String)","url":"getEncoding(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getEndedRatio()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"getEndTimeUs()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getError()"},{"p":"com.google.android.exoplayer2","c":"C","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeForMediaDrmErrorCode(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmUtil","l":"getErrorCodeForMediaDrmException(Exception, int)","url":"getErrorCodeForMediaDrmException(java.lang.Exception,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getErrorCodeFromPlatformDiagnosticsInfo(String)","url":"getErrorCodeFromPlatformDiagnosticsInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"getErrorCodeName(@com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"getErrorCodeName(@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.util","c":"ErrorMessageProvider","l":"getErrorMessage(T)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTime(int)"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getEventTimeCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getExpectedBytes()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getExtractorInputFromPosition(DataSource, long, Uri)","url":"getExtractorInputFromPosition(com.google.android.exoplayer2.upstream.DataSource,long,android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getFallbackSelectionFor(LoadErrorHandlingPolicy.FallbackOptions, LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getFallbackSelectionFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.FallbackOptions,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getFatalErrorRatio()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getFirstAdIndexToPlay()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getFirstAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstAvailableSegmentNum(long, long)","url":"getFirstAvailableSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getFirstIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstPeriodIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getFirstSampleIndex(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"getFirstSampleNumber(ExtractorInput, FlacStreamMetadata)","url":"getFirstSampleNumber(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacStreamMetadata)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getFirstSampleTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getFirstSegmentNum()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getFirstTimestampUs()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getFirstWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getFirstWindowIndexByChildIndex(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"getFlag(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontColor()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontFamily()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSize()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getFontSizeUnit()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getForegroundNotification(List, int)","url":"getForegroundNotification(java.util.List,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getFormat(byte[], Metadata)","url":"getFormat(byte[],com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getFormat(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getFormatHolder()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getFormatId()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getFormatLanguageScore(Format, String, boolean)","url":"getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getFormatsRead()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getFormatSupport(Format)","url":"getFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getFormatSupport(int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getFormatSupportString(int)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"getFrameSize(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"getFrameStartMarker(ExtractorInput)","url":"getFrameStartMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"getFrameworkCryptoInfo()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getGzipSupport()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getH265NalUnitType(byte[], int)","url":"getH265NalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getHttpMethodString()"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil.DownloadIdProvider","l":"getId(DownloadRequest)","url":"getId(com.google.android.exoplayer2.offline.DownloadRequest)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpUtils","l":"getIncomingRtpDataSpec(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndex()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"getIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getIndexInTrackGroup(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getIndexOfPeriod(Object)","url":"getIndexOfPeriod(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"getIndexUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getIndividualAllocationLength()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getInitialization(Representation)","url":"getInitialization(com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"getInitializationUri()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getInitialStartTimeUs()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getInitialTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInMemoryDatabaseProvider()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getInputBufferPaddingSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getInputStream(Context, String)","url":"getInputStream(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getInputSurface()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getInputSurface()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getInstance()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getInstance(Context)","url":"getInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getIntegerCodeForString(String)","url":"getIntegerCodeForString(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getIsDisabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getItem(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getJoinTimeRatio()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getKeyId()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getKeyRequest(byte[], List, int, HashMap)","url":"getKeyRequest(byte[],java.util.List,int,java.util.HashMap)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getKeys()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getKeys()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"getKeySetId()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"getLargestQueuedTimestampUs()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getLargestReadTimestampUs()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getLastAdjustedTimestampUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getLastAvailableSegmentNum(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLastIndex()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastOpenedUri()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getLastResetPositionUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getLastResponseHeaders()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getLastWindowIndex(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getLength()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"getLicenseDurationRemainingSec(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"getLicenseDurationRemainingSec(DrmSession)","url":"getLicenseDurationRemainingSec(com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getLicenseServerUrl()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLine()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineAnchor()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getLineType()"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"getList(IBinder)","url":"getList(android.os.IBinder)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLoadControl()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getLocaleLanguageTag(Locale)","url":"getLocaleLanguageTag(java.util.Locale)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getLocalPort()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getLogLevel()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getLooper()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"getLooper()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getManifest()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getManifest(DataSource, DataSpec, boolean)","url":"getManifest(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getMappedTrackInfo(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getMasterPlaylist()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"getMaxChannelCount()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMaxDecodedFrameSize()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMaxInputSize(MediaCodecInfo, Format)","url":"getMaxInputSize(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMaxParallelDownloads()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getMaxSeekToPreviousPosition()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getMaxStars()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getMaxSupportedInstances()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanBandwidth()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialAudioFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanInitialVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanNonFatalErrorCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseBufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPauseCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekCount()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanSingleSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenNonFatalErrors()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanTimeBetweenRebuffers()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatBitrate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanVideoFormatHeight()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMeanWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaClockRenderer","l":"getMediaClock()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaCodecConfiguration(MediaCodecInfo, Format, MediaCrypto, float)","url":"getMediaCodecConfiguration(com.google.android.exoplayer2.mediacodec.MediaCodecInfo,com.google.android.exoplayer2.Format,android.media.MediaCrypto,float)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getMediaDescription(Player, int)","url":"getMediaDescription(com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getMediaDuration(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getMediaDurationForPlayoutDuration(long, float)","url":"getMediaDurationForPlayoutDuration(long,float)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getMediaFormat(Format, String, int, float)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getMediaFormat(Format, String, MediaCodecVideoRenderer.CodecMaxValues, float, boolean, int)","url":"getMediaFormat(com.google.android.exoplayer2.Format,java.lang.String,com.google.android.exoplayer2.video.MediaCodecVideoRenderer.CodecMaxValues,float,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemAt(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaItemCount()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getMediaMetadata()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMediaMimeType(String)","url":"getMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(ConcatenatingMediaSource.MediaSourceHolder, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Integer, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(MediaSource.MediaPeriodId, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(T, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(T,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getMediaPeriodIdForChildMediaPeriodId(Void, MediaSource.MediaPeriodId)","url":"getMediaPeriodIdForChildMediaPeriodId(java.lang.Void,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getMediaPeriodPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForAd(long, int, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getMediaPeriodPositionUsForContent(long, int, AdPlaybackState)","url":"getMediaPeriodPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getMediaSource(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getMediaSourceFactory()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getMediaTimeForChildMediaTime(T, long)","url":"getMediaTimeForChildMediaTime(T,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getMediaTimeMsAtRealtimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"getMediaTimeUsForPlayoutTimeMs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"DefaultMediaItemConverter","l":"getMetadata(MediaItem)","url":"getMetadata(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.DefaultMediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"getMetadata(Player)","url":"getMetadata(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getMetadataCopyWithAppendedEntriesFrom(Metadata)","url":"getMetadataCopyWithAppendedEntriesFrom(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getMetrics()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getMimeTypeFromMp4ObjectType(int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"getMimeTypeFromRtpMediaType(String)","url":"getMimeTypeFromRtpMediaType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getMinDurationToRetainAfterDiscardUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getMinimumLoadableRetryCount(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getMinRetryCount()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"getNalUnitType(byte[], int)","url":"getNalUnitType(byte[],int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getName()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getName()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getName()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"getName()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"getName()"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"getNetworkType()"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"getNewId()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getNextAdIndexToPlay(int, int)","url":"getNextAdIndexToPlay(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"getNextAdIndexToPlay(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getNextChunk(long, long, List, ChunkHolder)","url":"getNextChunk(long,long,java.util.List,com.google.android.exoplayer2.source.chunk.ChunkHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"getNextChunkIndex()"},{"p":"com.google.android.exoplayer2.text","c":"Subtitle","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"getNextEventTimeIndex(long)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getNextIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getNextLoadPositionUs()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getNextMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextPeriodIndex(int, Timeline.Period, Timeline.Window, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextPeriodIndex(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"getNextRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int, int)","url":"getNextRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getNextSegmentAvailableTimeUs(long, long)","url":"getNextSegmentAvailableTimeUs(long,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getNextWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getNextWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getNextWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getNonexistentUrl()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getNonFatalErrorRate()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getNotFoundUri()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getNotMetRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getNotMetRequirements(Context)","url":"getNotMetRequirements(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getNowUnixTimeMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"getNtpHost()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getOfflineLicenseKeySetId()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"getOngoing(Player)","url":"getOngoing(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"getOutput()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"getOutput()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"getOutputFormat()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"getOutputFormat(FfmpegAudioDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioDecoder)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"getOutputFormat(FlacDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.flac.FlacDecoder)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"getOutputFormat(OpusDecoder)","url":"getOutputFormat(com.google.android.exoplayer2.ext.opus.OpusDecoder)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getOutputFormat(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getOutputStreamOffsetUs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getOverlayFrameLayout()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"getOverride(TrackGroup)","url":"getOverride(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"getOverrides()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"getParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"getPath()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPauseAtEndOfMediaItems()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPayload()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getPcmEncodingForType(int, int)","url":"getPcmEncodingForType(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFormat(int, int, int)","url":"getPcmFormat(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPcmFrameSize(int, int)","url":"getPcmFrameSize(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"getPercent()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"getPercentDownloaded()"},{"p":"com.google.android.exoplayer2.upstream","c":"SlidingPercentile","l":"getPercentile(float)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getPeriod(int, Timeline.Period, boolean)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriod(int, Timeline.Period)","url":"getPeriod(int,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodByUid(Object, Timeline.Period)","url":"getPeriodByUid(java.lang.Object,com.google.android.exoplayer2.Timeline.Period)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPeriodCount()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationMs(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"getPeriodDurationUs(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPosition(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPositionUs(Timeline.Window, Timeline.Period, int, long, long)","url":"getPeriodPositionUs(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPeriodPositionUs(Timeline.Window, Timeline.Period, int, long)","url":"getPeriodPositionUs(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"getPixelCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlaybackLooper()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPlaybackParameters()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"getPlaybackSpeed()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlaybackState()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateAtTime(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackState int)","url":"getPlaybackStateDurationMs(@com.google.android.exoplayer2.analytics.PlaybackStats.PlaybackStateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"getPlaybackStats()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlaybackSuppressionReason()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getPlayer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlayerError()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlayerState()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getPlayerStateString()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylist()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlaylistMetadata()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"getPlaylistSnapshot(Uri, boolean)","url":"getPlaylistSnapshot(android.net.Uri,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getPlayoutDurationForMediaDuration(long, float)","url":"getPlayoutDurationForMediaDuration(long,float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getPlayWhenReady()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"getPosition()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"getPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"getPosition()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getPositionAnchor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"getPositionInFirstPeriodUs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowMs()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getPositionInWindowUs()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getPositionMs()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"getPositionUs()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"getPreferredQueueSize(long, List)","url":"getPreferredQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"getPreferredUpdateDelay()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionOverrideUs()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getPreparePositionUs()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"getPresentationTimeOffsetUs()"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.DefaultShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeShuffleOrder","l":"getPreviousIndex(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getPreviousMediaItemIndex()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getPreviousWindowIndex()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getPreviousWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getPreviousWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getPreviousWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getPreviousWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getPreviousWindowIndex(int, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"getPreviousWindowIndex(int,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCount(List)","url":"getPriorityCount(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"getPriorityCountAfterExclusion(List)","url":"getPriorityCountAfterExclusion(java.util.List)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"getProfileLevels()"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"getProgress(ProgressHolder)","url":"getProgress(com.google.android.exoplayer2.transformer.ProgressHolder)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyByteArray(String)","url":"getPropertyByteArray(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getPropertyString(String)","url":"getPropertyString(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getProvisionRequest()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getReadableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getReadIndex()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getReadingPositionUs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferRate()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getRebufferTimeRatio()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedProvisionRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"getReceivedSchemeDatas()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"getRedirectedUri(ContentMetadata)","url":"getRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"getReferenceCount()"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"getRegionEndTimeMs(long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"getRemovedAdGroupCount()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"getRemovedValues()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getRendererCapabilities(RenderersFactory)","url":"getRendererCapabilities(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererCount()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getRendererDisabled(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getRendererException()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererName(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderers()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getRenderersFactory()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getRendererType(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getRepeatMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getRepeatToggleModes()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher","l":"getRequestPath(RecordedRequest)","url":"getRequestPath(okhttp3.mockwebserver.RecordedRequest)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"getRequestType()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"getRequirements()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getResizeMode()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getResponseHeaders()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getResult()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"getRetryDelayMsFor(LoadErrorHandlingPolicy.LoadErrorInfo)","url":"getRetryDelayMsFor(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getRubyPosition()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"getRuntimeExceptionForUnexpected()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleCryptoData(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleData(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"getSampleDescriptionEncryptionBox(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"getSampleDurationUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleFlags(int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSampleFormats()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"getSampleNumber(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimesUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"getSampleTimeUs(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"getScheduler()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getSchemeUuid()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getSeekBackIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekBackIncrementMs()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getSeekForwardIncrement()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getSeekForwardIncrementMs()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"getSeekMap()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSeekParameters()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"getSeekPoints(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getSeekTimeRatio()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentCount()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentCount(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentDurationUs(long, long)","url":"getSegmentDurationUs(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentEndTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentNum(long, long)","url":"getSegmentNum(long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentNum(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"getSegments()"},{"p":"com.google.android.exoplayer2.source.dash.offline","c":"DashDownloader","l":"getSegments(DataSource, DashManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.DashManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"getSegments(DataSource, HlsPlaylist, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"getSegments(DataSource, M, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,M,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"getSegments(DataSource, SsManifest, boolean)","url":"getSegments(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getSegmentUrl(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"getSegmentUrl(Representation, long)","url":"getSegmentUrl(com.google.android.exoplayer2.source.dash.manifest.Representation,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectedIndex()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectedIndexInTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionData()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"getSelectionOverride(int, TrackGroupArray)","url":"getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"getSelectionReason()"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"getServedResources()"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"getSessionForMediaPeriodId(Timeline, MediaSource.MediaPeriodId)","url":"getSessionForMediaPeriodId(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowShuffleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowSubtitleButton()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowTimeoutMs()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"getShowVrButton()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"getShuffleMode()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getShuffleModeEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getSingletonInstance(Context)","url":"getSingletonInstance(android.content.Context)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"getSinkFormatSupport(Format)","url":"getSinkFormatSupport(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getSize()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getSkipCount(long, boolean)","url":"getSkipCount(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"getSkippedFrames()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.AudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink.DefaultAudioProcessorChain","l":"getSkippedOutputFrameCount()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getSkipSilenceEnabled()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"getSnapshot()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getSourceException()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getSpecificityScore(String, String, Set, String)","url":"getSpecificityScore(java.lang.String,java.lang.String,java.util.Set,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"getStarRating()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getStartTime(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"getStartTimeUs(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getState()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"getState()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"getStatusCode()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getStream()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getStream()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamDurationUs(Player, AdPlaybackState)","url":"getStreamDurationUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getStreamFormats()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getStreamKeys(List)","url":"getStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"getStreamMetadata()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(long, MediaPeriodId, AdPlaybackState)","url":"getStreamPositionUs(long,com.google.android.exoplayer2.source.MediaPeriodId,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUs(Player, AdPlaybackState)","url":"getStreamPositionUs(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForAd(long, int, int, AdPlaybackState)","url":"getStreamPositionUsForAd(long,int,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsUtil","l":"getStreamPositionUsForContent(long, int, AdPlaybackState)","url":"getStreamPositionUsForContent(long,int,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStreamTypeForAudioUsage(@com.google.android.exoplayer2.C.AudioUsage int)","url":"getStreamTypeForAudioUsage(@com.google.android.exoplayer2.C.AudioUsageint)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"getString(Context, String)","url":"getString(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"getStringForHttpMethod(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getStringForTime(StringBuilder, Formatter, long)","url":"getStringForTime(java.lang.StringBuilder,java.util.Formatter,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"getStyle()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrame(int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"getSubFrameCount()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getSubtitleView()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"getSupportedPrepareActions()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"getSupportedQueueNavigatorActions(Player)","url":"getSupportedQueueNavigatorActions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"getSupportedRequirements(Requirements)","url":"getSupportedRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"getSupportedTypes()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"getSurface()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"getSurfaceTexture()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getSystemLanguageCodes()"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"getTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"getTarget()"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"getTargetLiveOffsetUs()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTestResources()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getText()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextAlignment()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTextComponent()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTextMediaMimeType(String)","url":"getTextMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSize()"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getTextSizeType()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"getThrowableString(Throwable)","url":"getThrowableString(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"getTimeline()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getTimelineByChildIndex(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"getTimestampOffsetUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"getTimeToFirstByteEstimateUs()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"getTimeUs(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"getTimeUsAtPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DecoderCountersUtil","l":"getTotalBufferCount(DecoderCounters)","url":"getTotalBufferCount(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getTotalBufferedDuration()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"getTotalBytesAllocated()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalElapsedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalJoinTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPausedTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayAndWaitTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalPlayTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalRebufferTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalSeekTimeMs()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getTotalWaitTimeMs()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getTrackGroup()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"getTrackGroupInfos()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"getTrackGroups()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackGroups(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"getTrackId()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackNameProvider","l":"getTrackName(Format)","url":"getTrackName(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"getTrackOutputProvider(BaseMediaChunkOutput)","url":"getTrackOutputProvider(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getTrackSelectionParameters()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getTrackSelectionParameters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelectionParameters()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getTrackSelectionParameters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getTrackSelectionParameters()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"getTrackSelections(int, int)","url":"getTrackSelections(int,int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getTrackSelector()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTrackSupport(int, int, int)","url":"getTrackSupport(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"getTrackSupport(int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTrackType()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"getTrackType()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackType(String)","url":"getTrackType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getTrackTypeOfCodec(String)","url":"getTrackTypeOfCodec(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getTrackTypeString(@com.google.android.exoplayer2.C.TrackType int)","url":"getTrackTypeString(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"getTransferListener()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getTransferListenerDataSource()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"getTunnelingSupport(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"getType()"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"getType(Uri)","url":"getType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"getTypeForPcmEncoding(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getTypeSupport(@com.google.android.exoplayer2.C.TrackType int)","url":"getTypeSupport(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"getUid()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"getUid()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getUidOfPeriod(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"getUnexpectedException()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"getUniformLocation(String)","url":"getUniformLocation(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"getUniforms()"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"getUnmappedTrackGroups()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getUpstreamFormat()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"getUpstreamPriorityTaskManager()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_resourceNotFound_returnsNullIfNotOpened()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"getUri_returnsNonNullValueOnlyWhileOpen()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"getUri()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet","l":"getUri(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseArtwork()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getUseController()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"getUseLazyPreparation()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUserAgent(Context, String)","url":"getUserAgent(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"getUtf8Bytes(String)","url":"getUtf8Bytes(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"getVersion()"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"getVersion(SQLiteDatabase, int, String)","url":"getVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getVerticalType()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoChangeFrameRateStrategy()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoChangeFrameRateStrategy()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoChangeFrameRateStrategy()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoChangeFrameRateStrategy()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoComponent()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoDecoderCounters()"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"getVideoDecoderOutputBufferRenderer()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoFormat()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoFrameMetadataListener()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"getVideoMediaMimeType(String)","url":"getVideoMediaMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"getVideoScalingMode()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getVideoSize()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"getVideoString()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"getVideoSurface()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"getVideoSurfaceView()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"getVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"getVolume()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"getWaitTimeRatio()"},{"p":"com.google.android.exoplayer2","c":"AbstractConcatenatedTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"getWindow(int, Timeline.Window, long)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindow(int, Timeline.Window)","url":"getWindow(int,com.google.android.exoplayer2.Timeline.Window)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"getWindowColor()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline","l":"getWindowCount()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"getWindowIndexForChildWindowIndex(ConcatenatingMediaSource.MediaSourceHolder, int)","url":"getWindowIndexForChildWindowIndex(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"getWindowIndexForChildWindowIndex(T, int)","url":"getWindowIndexForChildWindowIndex(T,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataBytes()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"getWrappedMetadataFormat()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"getWrappedPlayer()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.database","c":"DefaultDatabaseProvider","l":"getWritableDatabase()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"getWriteIndex()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"getWriteIndices()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"glAssertionsEnabled"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.GlException","l":"GlException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"group"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"group"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_AUDIO"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_SUBTITLE"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"GROUP_INDEX_VARIANT"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"groupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"groupId"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"groupIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"groupIndex"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"groupKey"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_DISABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_ENABLED"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"GZIP_SUPPORT_FORCED"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"gzip(byte[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"H262Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"H263Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"H264Reader(SeiReader, boolean, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"H265Reader(SeiReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SeiReader)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"H265SpsData(int, boolean, int, int, int[], int, int, int, int, float)","url":"%3Cinit%3E(int,boolean,int,int,int[],int,int,int,int,float)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAddIDExtraData(MatroskaExtractor.Track, ExtractorInput, int)","url":"handleBlockAddIDExtraData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"handleBlockAdditionalData(MatroskaExtractor.Track, int, ExtractorInput, int)","url":"handleBlockAdditionalData(com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor.Track,int,com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleBuffer(ByteBuffer, long, int)","url":"handleBuffer(java.nio.ByteBuffer,long,int)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.AudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"handleBuffer(ByteBuffer)","url":"handleBuffer(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"handleDiscontinuity()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleInputBufferSupplementalData(DecoderInputBuffer)","url":"handleInputBufferSupplementalData(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(ExoPlayer, int, Object)","url":"handleMessage(com.google.android.exoplayer2.ExoPlayer,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Target","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"handleMessage(int, Object)","url":"handleMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"handleMessage(Message)","url":"handleMessage(android.os.Message)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"handlePendingSeek(ExtractorInput, PositionHolder)","url":"handlePendingSeek(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareComplete(AdsMediaSource, int, int)","url":"handlePrepareComplete(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"handlePrepareError(AdsMediaSource, int, int, IOException)","url":"handlePrepareError(com.google.android.exoplayer2.source.ads.AdsMediaSource,int,int,java.io.IOException)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"HandlerMessage(long, FakeClock.ClockHandler, int, int, int, Object, Runnable)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.testutil.FakeClock.ClockHandler,int,int,int,java.lang.Object,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"hardwareAccelerated"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAbsoluteSizeSpanBetween(int, int)","url":"hasAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasAlignmentSpanBetween(int, int)","url":"hasAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasBackgroundColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBackgroundColorSpanBetween(int, int)","url":"hasBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldItalicSpanBetween(int, int)","url":"hasBoldItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasBoldSpanBetween(int, int)","url":"hasBoldSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"hasCaptions(Player)","url":"hasCaptions(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hasData()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasEndTag"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"hasFatalError()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"hasFontColor()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasForegroundColorSpanBetween(int, int)","url":"hasForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"hasGaplessInfo()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"hasGapTag"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndException","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"hashCode()"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput.CryptoData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"hashCode()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"hashCode()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"hashCode()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"hashCode()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"hashCode()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"hashCode()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"hashCode()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"DefaultContentMetadata","l":"hashCode()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hashCode()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"hashCode()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"hasIndependentSegments"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasItalicSpanBetween(int, int)","url":"hasItalicSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"hasMessages(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasNextWindow()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAbsoluteSizeSpanBetween(int, int)","url":"hasNoAbsoluteSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoAlignmentSpanBetween(int, int)","url":"hasNoAlignmentSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoBackgroundColorSpanBetween(int, int)","url":"hasNoBackgroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoForegroundColorSpanBetween(int, int)","url":"hasNoForegroundColorSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoHorizontalTextInVerticalContextSpanBetween(int, int)","url":"hasNoHorizontalTextInVerticalContextSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRelativeSizeSpanBetween(int, int)","url":"hasNoRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoRubySpanBetween(int, int)","url":"hasNoRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoSpans()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStrikethroughSpanBetween(int, int)","url":"hasNoStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoStyleSpanBetween(int, int)","url":"hasNoStyleSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTextEmphasisSpanBetween(int, int)","url":"hasNoTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoTypefaceSpanBetween(int, int)","url":"hasNoTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasNoUnderlineSpanBetween(int, int)","url":"hasNoUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"hasPendingData()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"hasPendingOutput()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"hasPlayedAdGroup(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasPositiveStartOffset"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"hasPreviousWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"hasProgramDateTime"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"hasReadStreamToEnd()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRelativeSizeSpanBetween(int, int)","url":"hasRelativeSizeSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasRubySpanBetween(int, int)","url":"hasRubySpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"hasSelectionOverride(int, TrackGroupArray)","url":"hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasStrikethroughSpanBetween(int, int)","url":"hasStrikethroughSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"hasSupplementalData()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTextEmphasisSpanBetween(int, int)","url":"hasTextEmphasisSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasTypefaceSpanBetween(int, int)","url":"hasTypefaceSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"hasUnderlineSpanBetween(int, int)","url":"hasUnderlineSpanBetween(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"hasUnplayedAds()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"hdrStaticInfo"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"HEADER_SIZE_FOR_PARSER"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"Header()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"headerFields"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"HeartRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"height"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"height"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"height"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"height"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"height"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hide()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"hideController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"hideImmediately()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"hideScrubber(long)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls.offline","c":"HlsDownloader","l":"HlsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"HlsMasterPlaylist(String, List, List, List, List, List, List, Format, List, boolean, Map, List)","url":"%3Cinit%3E(java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.Format,java.util.List,boolean,java.util.Map,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"HlsMediaPeriod(HlsExtractorFactory, HlsPlaylistTracker, HlsDataSourceFactory, TransferListener, DrmSessionManager, DrmSessionEventListener.EventDispatcher, LoadErrorHandlingPolicy, MediaSourceEventListener.EventDispatcher, Allocator, CompositeSequenceableLoaderFactory, boolean, @com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.HlsExtractorFactory,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker,com.google.android.exoplayer2.source.hls.HlsDataSourceFactory,com.google.android.exoplayer2.upstream.TransferListener,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.upstream.Allocator,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,boolean,@com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataTypeint,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"HlsMediaPlaylist(int, String, List, long, boolean, long, boolean, int, long, int, long, long, boolean, boolean, boolean, DrmInitData, List, List, HlsMediaPlaylist.ServerControl, Map)","url":"%3Cinit%3E(int,java.lang.String,java.util.List,long,boolean,long,boolean,int,long,int,long,long,boolean,boolean,boolean,com.google.android.exoplayer2.drm.DrmInitData,java.util.List,java.util.List,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.ServerControl,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"HlsPlaylist(String, List, boolean)","url":"%3Cinit%3E(java.lang.String,java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"HlsPlaylistParser(HlsMasterPlaylist, HlsMediaPlaylist)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"HlsTrackMetadataEntry(String, String, List)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"holdBackUs"},{"p":"com.google.android.exoplayer2.text.span","c":"HorizontalTextInVerticalContextSpan","l":"HorizontalTextInVerticalContextSpan()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"HostActivity()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_GET"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_HEAD"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"HTTP_METHOD_POST"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(DataSpec, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"HttpDataSourceException(String, IOException, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HttpDataSourceTestEnv","l":"HttpDataSourceTestEnv()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, boolean, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"HttpMediaDrmCallback(String, HttpDataSource.Factory)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpMethod"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"httpRequestHeaders"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String, Throwable)","url":"i(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"i(String, String)","url":"i(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyDecoder","l":"IcyDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"IcyHeaders(int, String, String, String, boolean, int)","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,java.lang.String,boolean,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"IcyInfo(byte[], String, String)","url":"%3Cinit%3E(byte[],java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"id"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"id"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"id"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"id"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"id"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"id"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"id"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"id"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"ID"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"ID_UNSET"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"id()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_HEADER_LENGTH"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"ID3_SCHEME_ID_AOM"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"ID3_TAG"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"Id3Decoder(Id3Decoder.FramePredicate)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"Id3Frame(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"Id3Peeker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"Id3Reader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"identifier"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"IllegalClippingException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"IllegalMergeException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"IllegalSeekPositionException(Timeline, int, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"iLog(int)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"IMAGE_JPEG"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_DEFAULT"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_HIGH"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_LOW"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_MIN"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"IMPORTANCE_UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"inbandEventStreams"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"increaseClearDataFirstSubSampleBy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"increaseDeviceVolume()"},{"p":"com.google.android.exoplayer2.testutil","c":"DumpableFormat","l":"index"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"INDEX_UNBOUNDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"INDEX_UNSET"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(Format)","url":"indexOf(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"indexOf(int)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"indexOf(TrackGroup)","url":"indexOf(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"IndexSeekMap(long[], long[], long)","url":"%3Cinit%3E(long[],long[],long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(String)","url":"inferContentType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri, String)","url":"inferContentType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentType(Uri)","url":"inferContentType(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inferContentTypeForUriAndMimeType(Uri, String)","url":"inferContentTypeForUriAndMimeType(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromMimeType(String)","url":"inferFileTypeFromMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromResponseHeaders(Map>)","url":"inferFileTypeFromResponseHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"inferFileTypeFromUri(Uri)","url":"inferFileTypeFromUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"inflate(ParsableByteArray, ParsableByteArray, Inflater)","url":"inflate(com.google.android.exoplayer2.util.ParsableByteArray,com.google.android.exoplayer2.util.ParsableByteArray,java.util.zip.Inflater)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"info"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunk","l":"init(BaseMediaChunkOutput)","url":"init(com.google.android.exoplayer2.source.chunk.BaseMediaChunkOutput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"init(ChunkExtractor.TrackOutputProvider, long, long)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"init(ChunkExtractor.TrackOutputProvider)","url":"init(com.google.android.exoplayer2.source.chunk.ChunkExtractor.TrackOutputProvider)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"init(DataReader, Uri, Map>, long, long, ExtractorOutput)","url":"init(com.google.android.exoplayer2.upstream.DataReader,android.net.Uri,java.util.Map,long,long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"init(ExtractorOutput)","url":"init(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"init(int)"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"init(long, int, ByteBuffer)","url":"init(long,int,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoderOutputBuffer","l":"init(long, int)","url":"init(long,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"init(MappingTrackSelector.MappedTrackInfo, int, boolean, List, Comparator, TrackSelectionView.TrackSelectionListener)","url":"init(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,boolean,java.util.List,java.util.Comparator,com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"init(TimestampAdjuster, ExtractorOutput, TsPayloadReader.TrackIdGenerator)","url":"init(com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ExtractorOutput,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"init(TrackSelector.InvalidationListener, BandwidthMeter)","url":"init(com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener,com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"initForPrivateFrame(int, int)","url":"initForPrivateFrame(int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"initForYuvFrame(int, int, int, int, int)","url":"initForYuvFrame(int,int,int,int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"INITIAL_DRM_REQUEST_RETRY_COUNT"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialAudioFormatBitrateCount"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"InitializationChunk(DataSource, DataSpec, Format, int, Object, ChunkExtractor)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.chunk.ChunkExtractor)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationData"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"initializationData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"initializationDataEquals(Format)","url":"initializationDataEquals(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"InitializationException(int, int, int, int, Format, boolean, Exception)","url":"%3Cinit%3E(int,int,int,int,com.google.android.exoplayer2.Format,boolean,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"initializationSegment"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"initialize(Loader, SntpClient.InitializationCallback)","url":"initialize(com.google.android.exoplayer2.upstream.Loader,com.google.android.exoplayer2.util.SntpClient.InitializationCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"initialSeek(int, long)","url":"initialSeek(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource.InitialTimeline","l":"InitialTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatBitrateCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"initialVideoFormatHeightCount"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"inputAudioFormat"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"inputBufferCount"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"inputFormatChanged(Format, DecoderReuseEvaluation)","url":"inputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"InputReaderAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"inputSize"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"insert(Uri, ContentValues)","url":"insert(android.net.Uri,android.content.ContentValues)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"INSTANCE"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"InsufficientCapacityException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"integerElement(int, long)","url":"integerElement(int,long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"InternalFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"invalidate()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"invalidate()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"invalidateForegroundNotification()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionMetadata()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionPlaybackState()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"invalidateMediaSessionQueue()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"invalidateUpstreamFormatAdjustment()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidContentTypeException","l":"InvalidContentTypeException(String, DataSpec)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, Map>, DataSpec)","url":"%3Cinit%3E(int,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, IOException, Map>, DataSpec, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.io.IOException,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"InvalidResponseCodeException(int, String, Map>, DataSpec)","url":"%3Cinit%3E(int,java.lang.String,java.util.Map,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.IterationFinishedEvent","l":"invoke(T, FlagSet)","url":"invoke(T,com.google.android.exoplayer2.util.FlagSet)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet.Event","l":"invoke(T)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"isAbsolute(String)","url":"isAbsolute(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isActionSegment()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isActive()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"isAd()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"isAdInErrorState(int, int)","url":"isAdInErrorState(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"isAdtsSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isAfterLast()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isAnimationEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isAudio(String)","url":"isAudio(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioChannelCountSupportedV21(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isAudioSampleRateSupportedV21(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isAutomotive(Context)","url":"isAutomotive(android.content.Context)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Library","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"isAvailable()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isBeforeFirst()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"isBlacklisted(int, long)","url":"isBlacklisted(int,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isCached"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCached(String, long, long)","url":"isCached(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"isCacheFolderLocked(File)","url":"isCacheFolderLocked(java.io.File)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"isCanceled()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isCancelled()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"isCausedByPositionOutOfRange(IOException)","url":"isCausedByPositionOutOfRange(java.io.IOException)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isChargingRequired()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isClosed()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isCodecSupported(Format)","url":"isCodecSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCommandAvailable(@com.google.android.exoplayer2.Player.Command int)","url":"isCommandAvailable(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCommandAvailable(@com.google.android.exoplayer2.Player.Command int)","url":"isCommandAvailable(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCommandAvailable(@com.google.android.exoplayer2.Player.Command int)","url":"isCommandAvailable(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"isControllerFullyVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"isControllerVisible()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"isCryptoSchemeSupported(UUID)","url":"isCryptoSchemeSupported(java.util.UUID)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentMediaItemDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentMediaItemDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentMediaItemDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentMediaItemLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentMediaItemLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentMediaItemLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentMediaItemSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentMediaItemSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentMediaItemSeekable()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowDynamic()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowLive()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isCurrentWindowSeekable()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isDecodeOnly()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"isDeviceMuted()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"isDone()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isDynamic"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isDynamic"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultLoadErrorHandlingPolicy","l":"isEligibleForFallback(IOException)","url":"isEligibleForFallback(java.io.IOException)"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"isEmpty()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"isEnabled"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"isEnabled()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingHighResolutionPcm(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isEncodingLinearPcm(int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"isEncrypted"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"isEncrypted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"isEnded()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"isEnded()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isEnded()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser, String)","url":"isEndTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isEndTag(XmlPullParser)","url":"isEndTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult, int)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isEquivalent(TrackSelectorResult)","url":"isEquivalent(com.google.android.exoplayer2.trackselection.TrackSelectorResult)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"isErrorSegment()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashWrappingSegmentIndex","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"isExplicit()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"isFallbackAvailable(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isFirst()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"isFlagSet(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isFormatSupported(Format)","url":"isFormatSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"isFormatSupported(MediaDescription)","url":"isFormatSupported(com.google.android.exoplayer2.source.rtsp.MediaDescription)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isFullyVisible()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isHdr10PlusOutOfBandMetadataSupported()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isHeart()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"isHighBitDepthSupported()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isHoleSpan()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isIdle()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isIdleRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isImage(String)","url":"isImage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isIndependent"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"isInitialized()"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"isKeyFrame()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"isLast()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"isLastPeriod(int, Timeline.Period, Timeline.Window, @com.google.android.exoplayer2.Player.RepeatMode int, boolean)","url":"isLastPeriod(int,com.google.android.exoplayer2.Timeline.Period,com.google.android.exoplayer2.Timeline.Window,@com.google.android.exoplayer2.Player.RepeatModeint,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isLastSampleQueued()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"isLevel1Element(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLinebreak(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isLinethrough()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"isLive"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isLive"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isLive()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"isLoadCompleted()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isLoading()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isLoading()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"isLoading()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"isLoading()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isLoadingFinished()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isLocalFileUri(Uri)","url":"isLocalFileUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isMatroska(String)","url":"isMatroska(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"isNalUnitSei(String, byte)","url":"isNalUnitSei(java.lang.String,byte)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"isNetwork"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isNetworkRequired()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"isNewerThan(HlsMediaPlaylist)","url":"isNewerThan(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea708Decoder","l":"isNewSubtitleDataAvailable()"},{"p":"com.google.android.exoplayer2","c":"C","l":"ISO88591_NAME"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoColorPrimariesToColorSpace(int)"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"isOpen()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"isOpened()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"isOpenEnded()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isOrdered"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"isoTransferCharacteristicsToColorTransfer(int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isPackedAudioExtractor()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isPlaceholder"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"isPlayable"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlaying()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPlaying()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"isPlayingAd()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"isPreload"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isPrepared()"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isProtectedContentExtensionSupported(Context)","url":"isProtectedContentExtensionSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"isPsshAtom(byte[])"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"isPublic"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isRated()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"isReady()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"isReady()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"isReady(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.InitializationException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"isRecoverable"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"isRendererEnabled(int)"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"isRepeatModeEnabled(@com.google.android.exoplayer2.Player.RepeatMode int, int)","url":"isRepeatModeEnabled(@com.google.android.exoplayer2.Player.RepeatModeint,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.LoadErrorAction","l":"isRetry()"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"isReusable()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"isRoot"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format, Format, boolean)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isSeamlessAdaptationSupported(Format)","url":"isSeamlessAdaptationSupported(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"isSecureSupported(Context)","url":"isSecureSupported(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"isSeekable"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"isSeekable"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"ConstantBitrateSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacSeekTableSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"IndexSeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"isSeekable()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"isSeeking()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"isSegmentAvailableAtFullNetworkSpeed(long, long)","url":"isSegmentAvailableAtFullNetworkSpeed(long,long)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"isSelected()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"isServerSideInserted"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"isServerSideInsertedAdGroup(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSetParametersSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"isSetParametersSupported()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"isSimulatingUnknownLength()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"isSingleWindow()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"isSnapshotValid(Uri)","url":"isSnapshotValid(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"isSourceReady()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"isStartOfTsPacket(byte[], int, int, int)","url":"isStartOfTsPacket(byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser, String)","url":"isStartTag(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTag(XmlPullParser)","url":"isStartTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"XmlPullParserUtil","l":"isStartTagIgnorePrefix(XmlPullParser, String)","url":"isStartTagIgnorePrefix(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isStorageNotLowRequired()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"isSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"isSupported(int, boolean)","url":"isSupported(int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"isSurfacelessContextExtensionSupported()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"isSurfaceValid"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"isSyncWord(int)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"isTerminalState()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isText(String)","url":"isText(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"isThumbsUp()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"isTrackSelected(int)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"isTrackSupported(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"isTv(Context)","url":"isTv(android.content.Context)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"isTypeSelected(@com.google.android.exoplayer2.C.TrackType int)","url":"isTypeSelected(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"isTypeSupportedOrEmpty(@com.google.android.exoplayer2.C.TrackType int)","url":"isTypeSupportedOrEmpty(@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"isUnderline()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"isUnmeteredNetworkRequired()"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"isVideo(String)","url":"isVideo(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"isVideoSizeAndRateSupportedV21(int, int, double)","url":"isVideoSizeAndRateSupportedV21(int,int,double)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"isVisible()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"isWaitingForRequirements()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"isWebvttHeaderLine(ParsableByteArray)","url":"isWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"isWindowColorSet()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.AudioTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"isWithinConstraints"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"isWithinMaxConstraints"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"iterator()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveDataSet.Iterator","l":"Iterator(FakeAdaptiveDataSet, int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeAdaptiveDataSet,int,int)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"iv"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"JPEG"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"JpegExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"jumpDrawablesToCurrentState()"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"key"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"key"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"key"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"key"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"KEY_ANDROID_CAPTURE_FPS"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_CONTENT_ID"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CONTENT_LENGTH"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_CUSTOM_PREFIX"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_DOWNLOAD_REQUEST"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_FOREGROUND"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_PCM_ENCODING_EXTENDED"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"KEY_PIXEL_WIDTH_HEIGHT_RATIO_FLOAT"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadata","l":"KEY_REDIRECTED_URI"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_REQUIREMENTS"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_AVAILABLE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_KEY"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"KEY_STATUS_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"KEY_STOP_REASON"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"KEY_TYPE_STREAMING"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"keyForField(int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String, int)","url":"%3Cinit%3E(byte[],java.lang.String,int)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"KeyRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"keySetId"},{"p":"com.google.android.exoplayer2.drm","c":"KeysExpiredException","l":"KeysExpiredException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyStatus","l":"KeyStatus(int, byte[])","url":"%3Cinit%3E(int,byte[])"},{"p":"com.google.android.exoplayer2","c":"Format","l":"label"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"label"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"lang"},{"p":"com.google.android.exoplayer2","c":"Format","l":"language"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"language"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"language"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"language"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"language"},{"p":"com.google.android.exoplayer2","c":"C","l":"LANGUAGE_UNDETERMINED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"lastFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastMediaSequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"lastPartIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"lastPeriodIndex"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"lastTouchTimestamp"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"LatmReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"LeanbackPlayerAdapter(Context, Player, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.Player,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"LeastRecentlyUsedCacheEvictor(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"length"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"length"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"length"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"length"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData.Segment","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"length"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"length"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"length"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"length"},{"p":"com.google.android.exoplayer2","c":"C","l":"LENGTH_UNSET"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"length()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"length()"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"level"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"levelIdc"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"LibflacAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"Libgav1VideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioProcessor...)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"LibopusAudioRenderer(Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"LibraryLoader(String...)","url":"%3Cinit%3E(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int, int, int, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"LibvpxVideoRenderer(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseRequestHeaders"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"licenseServerUrl"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"licenseUri"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"limit()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"line"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_FRACTION"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"LINE_TYPE_NUMBER"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineAnchor"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(int[], int)","url":"linearSearch(int[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"linearSearch(long[], long)","url":"linearSearch(long[],long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"lineType"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"ListenerSet(Looper, Clock, ListenerSet.IterationFinishedEvent)","url":"%3Cinit%3E(android.os.Looper,com.google.android.exoplayer2.util.Clock,com.google.android.exoplayer2.util.ListenerSet.IterationFinishedEvent)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"liveConfiguration"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"LiveConfiguration(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.LiveContentUnsupportedException","l":"LiveContentUnsupportedException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ContainerMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"DataChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"InitializationChunk","l":"load()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaChunk","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Loadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load()"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, DataSpec, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"load(DataSource, ParsingLoadable.Parser, Uri, int)","url":"load(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"loadAsset(Context, String)","url":"loadAsset(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, int)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCanceled(LoadEventInfo, MediaLoadData)","url":"loadCanceled(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation, int)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadChunkIndex(DataSource, int, Representation)","url":"loadChunkIndex(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, int)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadCompleted(LoadEventInfo, MediaLoadData)","url":"loadCompleted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadDurationMs"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"Loader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, int, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,int,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadError(LoadEventInfo, MediaLoadData, IOException, boolean)","url":"loadError(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"LoadErrorInfo(LoadEventInfo, MediaLoadData, IOException, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"loaders"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"loadEventInfo"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,long)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"LoadEventInfo(long, DataSpec, Uri, Map>, long, long, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadFormatWithDrmInitData(DataSource, Period)","url":"loadFormatWithDrmInitData(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Period)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadInitializationData(ChunkExtractor, DataSource, Representation, boolean)","url":"loadInitializationData(com.google.android.exoplayer2.source.chunk.ChunkExtractor,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.source.dash.manifest.Representation,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadManifest(DataSource, Uri)","url":"loadManifest(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation, int)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"loadSampleFormat(DataSource, int, Representation)","url":"loadSampleFormat(com.google.android.exoplayer2.upstream.DataSource,int,com.google.android.exoplayer2.source.dash.manifest.Representation)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, int)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"loadStarted(LoadEventInfo, MediaLoadData)","url":"loadStarted(com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"loadTaskId"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"loadTaskId"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"localConfiguration"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"localeIndicator"},{"p":"com.google.android.exoplayer2.drm","c":"LocalMediaDrmCallback","l":"LocalMediaDrmCallback(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"location"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ALL"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_ERROR"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_INFO"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_OFF"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"LOG_LEVEL_WARNING"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"logd(String)","url":"logd(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"loge(String)","url":"loge(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"logMetrics(DecoderCounters, DecoderCounters)","url":"logMetrics(com.google.android.exoplayer2.decoder.DecoderCounters,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"LongArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"lookAheadCount"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,int)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"LoopingMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"majorVersion"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"manifest"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MANUFACTURER"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"mapping"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"MappingTrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_FILLED"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_OPEN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_FILL_UNKNOWN"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_CIRCLE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_DOT"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_NONE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"MARK_SHAPE_SESAME"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"markAsProcessed(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"marker"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markFill"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"markSeekOperationFinished(boolean, long)","url":"markSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"markShape"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"MaskingMediaPeriod(MediaSource.MediaPeriodId, Allocator, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.upstream.Allocator,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"MaskingMediaSource(MediaSource, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"masterPlaylist"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"matches(UUID)","url":"matches(java.util.UUID)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MATROSKA"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"MatroskaExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"MAX_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_FRAME_SIZE_BYTES"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MAX_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"MAX_PLAYING_TIME_DISCREPANCY_MS"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MAX_SIZE"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MAX_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"MAX_SUPPORTED_INSTANCES_UNKNOWN"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"MAX_WINDOWS_FOR_MULTI_WINDOW_TIME_BAR"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxAudioChannelCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxBlockSizeSamples"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"maxConsecutiveDroppedBufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"maxFrameSize"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"maxH264DecodableFrameSize()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxHeight"},{"p":"com.google.android.exoplayer2","c":"Format","l":"maxInputSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxOffsetMs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"maxPlaybackSpeed"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"maxRebufferTimeMs"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"maxVideoWidth"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"maxVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"maxWidth"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"maybeApplyOverride(MappingTrackSelector.MappedTrackInfo, DefaultTrackSelector.Parameters, int, ExoTrackSelection.Definition)","url":"maybeApplyOverride(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"maybeDropBuffersToKeyframe(long, boolean)","url":"maybeDropBuffersToKeyframe(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"maybeDropBuffersToKeyframe(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"maybeInitCodecOrBypass()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"maybeRefreshManifestBeforeLoadingNextChunk(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, MediaItem...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,com.google.android.exoplayer2.MediaItem...)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"maybeRequestReadExternalStoragePermission(Activity, Uri...)","url":"maybeRequestReadExternalStoragePermission(android.app.Activity,android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"maybeSetArtworkData(byte[], @com.google.android.exoplayer2.MediaMetadata.PictureType int)","url":"maybeSetArtworkData(byte[],@com.google.android.exoplayer2.MediaMetadata.PictureTypeint)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetByteBuffer(MediaFormat, String, byte[])","url":"maybeSetByteBuffer(android.media.MediaFormat,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetColorInfo(MediaFormat, ColorInfo)","url":"maybeSetColorInfo(android.media.MediaFormat,com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetFloat(MediaFormat, String, float)","url":"maybeSetFloat(android.media.MediaFormat,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetInteger(MediaFormat, String, int)","url":"maybeSetInteger(android.media.MediaFormat,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"maybeSetString(MediaFormat, String, String)","url":"maybeSetString(android.media.MediaFormat,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"maybeSkipTag(XmlPullParser)","url":"maybeSkipTag(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoaderErrorThrower.Dummy","l":"maybeThrowError(int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPlaylistRefreshError(Uri)","url":"maybeThrowPlaylistRefreshError(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"maybeThrowPrepareError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"maybeThrowPrimaryPlaylistRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"maybeThrowSourceInfoRefreshError()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"maybeThrowStreamError()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"MdtaMetadataEntry(String, byte[], int, int)","url":"%3Cinit%3E(java.lang.String,byte[],int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"MEDIA_ID"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_AUTO"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_REPEAT"},{"p":"com.google.android.exoplayer2","c":"Player","l":"MEDIA_ITEM_TRANSITION_REASON_SEEK"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunk","l":"MediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioCapabilities, AudioProcessor...)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioCapabilities,com.google.android.exoplayer2.audio.AudioProcessor...)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener, AudioSink)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener,com.google.android.exoplayer2.audio.AudioSink)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector, Handler, AudioRendererEventListener)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,android.os.Handler,com.google.android.exoplayer2.audio.AudioRendererEventListener)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"MediaCodecAudioRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecDecoderException","l":"MediaCodecDecoderException(Throwable, MediaCodecInfo)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"MediaCodecRenderer(@com.google.android.exoplayer2.C.TrackType int, MediaCodecAdapter.Factory, MediaCodecSelector, boolean, float)","url":"%3Cinit%3E(@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,boolean,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"MediaCodecVideoDecoderException(Throwable, MediaCodecInfo, Surface)","url":"%3Cinit%3E(java.lang.Throwable,com.google.android.exoplayer2.mediacodec.MediaCodecInfo,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int, float)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factory, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Factory,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,boolean,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long, Handler, VideoRendererEventListener, int)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long,android.os.Handler,com.google.android.exoplayer2.video.VideoRendererEventListener,int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector, long)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"MediaCodecVideoRenderer(Context, MediaCodecSelector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"mediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"MediaDrmCallbackException(DataSpec, Uri, Map>, long, Throwable)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,android.net.Uri,java.util.Map,long,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaEndTimeMs"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"mediaFormat"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaId"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.MediaIdEqualityChecker","l":"MediaIdEqualityChecker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"MediaIdMediaItemProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"mediaItem"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"mediaItem"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"mediaItem"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"mediaItemIndex"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.LoadErrorInfo","l":"mediaLoadData"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, long)","url":"%3Cinit%3E(int,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"MediaLoadData(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"mediaMetadata"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"MediaParserChunkExtractor(@com.google.android.exoplayer2.C.TrackType int, Format, List)","url":"%3Cinit%3E(@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"MediaParserExtractorAdapter()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"MediaParserHlsMediaChunkExtractor(MediaParser, OutputConsumerAdapterV30, Format, boolean, ImmutableList, int)","url":"%3Cinit%3E(android.media.MediaParser,com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30,com.google.android.exoplayer2.Format,boolean,com.google.common.collect.ImmutableList,int)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"mediaPeriod"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"mediaPeriodId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(MediaPeriodId)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, int, int, long)","url":"%3Cinit%3E(java.lang.Object,int,int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long, int)","url":"%3Cinit%3E(java.lang.Object,long,int)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object, long)","url":"%3Cinit%3E(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaPeriodId","l":"MediaPeriodId(Object)","url":"%3Cinit%3E(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsManifest","l":"mediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"mediaPlaylistUrls"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"mediaSequence"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"mediaSession"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"MediaSessionConnector(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"MediaSourceTestRunner(MediaSource, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"mediaStartTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"mediaTimeHistory"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"mediaUri"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"merge(DecoderCounters)","url":"merge(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"merge(DrmInitData)","url":"merge(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"merge(PlaybackStats...)","url":"merge(com.google.android.exoplayer2.analytics.PlaybackStats...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, CompositeSequenceableLoaderFactory, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, boolean, MediaSource...)","url":"%3Cinit%3E(boolean,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(boolean, MediaSource...)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"MergingMediaSource(MediaSource...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"messageData"},{"p":"com.google.android.exoplayer2","c":"Format","l":"metadata"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"METADATA_BLOCK_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_EMSG"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"METADATA_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"METADATA_TYPE_PICTURE"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"METADATA_TYPE_SEEK_TABLE"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"METADATA_TYPE_STREAM_INFO"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"METADATA_TYPE_VORBIS_COMMENT"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"Metadata(Metadata.Entry...)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.Metadata.Entry...)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"MetadataInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"metadataInterval"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper,com.google.android.exoplayer2.metadata.MetadataDecoderFactory)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"MetadataRenderer(MetadataOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.metadata.MetadataOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"C","l":"MICROS_PER_SECOND"},{"p":"com.google.android.exoplayer2","c":"C","l":"MILLIS_PER_SECOND"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsBetweenReference"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"millisecondsDeviations"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"mimeType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"mimeType"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"mimeType"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"mimeType"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"mimeType"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"MIN_DATA_CHANNEL_TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"MIN_FRAME_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PITCH"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"MIN_PLAYBACK_SPEED"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"MIN_SEQUENCE_NUMBER"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"MIN_SPEED_SUPPORTED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minBlockSizeSamples"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minBufferTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"minFrameSize"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minOffsetMs"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"minorVersion"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"minPlaybackSpeed"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"minUpdatePeriodMs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"minValue(SparseLongArray)","url":"minValue(android.util.SparseLongArray)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoBitrate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoFrameRate"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"minVideoWidth"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"minVolume"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser.MissingFieldException","l":"MissingFieldException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"MlltFrame(int, int, int, int[], int[])","url":"%3Cinit%3E(int,int,int,int[],int[])"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"mode"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"mode"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_DOWNLOAD"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_HLS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_MULTI_PMT"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_NO_OFFSET"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_PLAYBACK"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_QUERY"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"MODE_RELEASE"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"MODE_SHARED"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"MODE_SINGLE_PMT"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"Mode(boolean, int, int, int)","url":"%3Cinit%3E(boolean,int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"MODEL"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"modifyTrack(Track)","url":"modifyTrack(com.google.android.exoplayer2.extractor.mp4.Track)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"moreInformationURL"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"MotionPhotoMetadata(long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"move(int, int)","url":"move(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"moveItems(List, int, int, int)","url":"moveItems(java.util.List,int,int,int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"moveMediaItem(int, int)","url":"moveMediaItem(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.MoveMediaItem","l":"MoveMediaItem(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"moveMediaItems(int, int, int)","url":"moveMediaItems(int,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int, Handler, Runnable)","url":"moveMediaSource(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"moveMediaSource(int, int)","url":"moveMediaSource(int,int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"movePlaylistItem(int, int)","url":"movePlaylistItem(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToFirst()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToLast()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToNext()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPosition(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadCursor","l":"moveToPrevious()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"movieTimescale"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP3"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int, long)","url":"%3Cinit%3E(int,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"Mp3Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"MP4"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"Mp4Extractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"Mp4WebvttDecoder","l":"Mp4WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"MpegAudioReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"mpegFramesBetweenReference"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_ATTRIBUTES"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUDIO_SESSION_ID"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_AUX_EFFECT_INFO"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CAMERA_MOTION_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_CHANGE_FRAME_RATE_STRATEGY"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SCALING_MODE"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_SKIP_SILENCE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_FRAME_METADATA_LISTENER"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VIDEO_OUTPUT"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_VOLUME"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"MSG_SET_WAKEUP_LISTENER"},{"p":"com.google.android.exoplayer2","c":"C","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"msToUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"multiRowAlignment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.MultiSegmentBase","l":"MultiSegmentBase(RangedUri, long, long, long, long, List, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.MultiSegmentRepresentation","l":"MultiSegmentRepresentation(long, Format, List, SegmentBase.MultiSegmentBase, List)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"multiSession"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedAudioFormat"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"muxedCaptionFormats"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"NAL_START_CODE"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"nalUnitLengthFieldLength"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"name"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"name"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"name"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"name"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"name"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"name"},{"p":"com.google.android.exoplayer2","c":"C","l":"NANOS_PER_SECOND"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"needsReconfiguration()"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_2G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_3G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_4G"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_NSA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_5G_SA"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_CELLULAR_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_ETHERNET"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OFFLINE"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"NETWORK_TYPE_WIFI"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"NETWORK_UNMETERED"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(String)","url":"newData(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newData(Uri)","url":"newData(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"newDefaultData()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"newFormat"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newInitializationChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, Format, int, Object, RangedUri, RangedUri)","url":"newInitializationChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.Format,int,java.lang.Object,com.google.android.exoplayer2.source.dash.manifest.RangedUri,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List, String)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase, List)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"newInstance(long, Format, List, SegmentBase)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"newInstance(long, Format, String, long, long, long, long, List, String, long)","url":"newInstance(long,com.google.android.exoplayer2.Format,java.lang.String,long,long,long,long,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"newInstance(String, String, String, MediaCodecInfo.CodecCapabilities, boolean, boolean, boolean, boolean, boolean)","url":"newInstance(java.lang.String,java.lang.String,java.lang.String,android.media.MediaCodecInfo.CodecCapabilities,boolean,boolean,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"newInstance(UUID)","url":"newInstance(java.util.UUID)"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"newInstanceV17(Context, boolean)","url":"newInstanceV17(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"newMediaChunk(DefaultDashChunkSource.RepresentationHolder, DataSource, @com.google.android.exoplayer2.C.TrackType int, Format, int, Object, long, int, long, long)","url":"newMediaChunk(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,com.google.android.exoplayer2.upstream.DataSource,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format,int,java.lang.Object,long,int,long,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"newNoDataInstance()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"newPlayerTrackEmsgHandler()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"newSingleThreadExecutor(String)","url":"newSingleThreadExecutor(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, boolean, HttpDataSource.Factory, Map, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,boolean,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"newWidevineInstance(String, HttpDataSource.Factory, DrmSessionEventListener.EventDispatcher)","url":"newWidevineInstance(java.lang.String,com.google.android.exoplayer2.upstream.HttpDataSource.Factory,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"NEXT_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"next()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"next()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"nextActionIconResourceId"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"nextAdGroupIndex"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"NO_AUX_EFFECT_ID"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Decoder","l":"NO_FRAMES_PREDICATE"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"NO_TIMESTAMP_IN_RANGE_RESULT"},{"p":"com.google.android.exoplayer2","c":"Format","l":"NO_VALUE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"NONE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"nonFatalErrorHistory"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"NoOpCacheEvictor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"normalizeLanguageCode(String)","url":"normalizeLanguageCode(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"normalizeMimeType(String)","url":"normalizeMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"normalizeUndeterminedLanguageToNull(String)","url":"normalizeUndeterminedLanguageToNull(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"NoSampleRenderer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"NOT_CACHED"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"NOT_IN_LOOKUP_TABLE"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"NOT_SET"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"notificationListener"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"notifyRebuffer()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"notifySeekStarted()"},{"p":"com.google.android.exoplayer2.testutil","c":"NoUidTimeline","l":"NoUidTimeline(Timeline)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayAppend(T[], T)","url":"nullSafeArrayAppend(T[],T)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayConcatenation(T[], T[])","url":"nullSafeArrayConcatenation(T[],T[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopy(T[], int)","url":"nullSafeArrayCopy(T[],int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeArrayCopyOfRange(T[], int, int)","url":"nullSafeArrayCopyOfRange(T[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"nullSafeListToArray(List, T[])","url":"nullSafeListToArray(java.util.List,T[])"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedLocations"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfExcludedTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfLocations"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackOptions","l":"numberOfTracks"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfClearData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numBytesOfEncryptedData"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"numSubSamples"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int, Object)","url":"obtainMessage(int,int,int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, int, int)","url":"obtainMessage(int,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int, Object)","url":"obtainMessage(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"obtainMessage(int)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.drm.DefaultDrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"OfflineLicenseHelper(UUID, ExoMediaDrm.Provider, MediaDrmCallback, Map, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider,com.google.android.exoplayer2.drm.MediaDrmCallback,java.util.Map,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocation","l":"offset"},{"p":"com.google.android.exoplayer2","c":"Format","l":"OFFSET_SAMPLE_RELATIVE"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"offsets"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"OGG"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"OggExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String, CacheControl, HttpDataSource.RequestProperties)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl,com.google.android.exoplayer2.upstream.HttpDataSource.RequestProperties)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"OkHttpDataSource(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener, CacheControl)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener,okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String, TransferListener)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory, String)","url":"%3Cinit%3E(okhttp3.Call.Factory,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSourceFactory","l":"OkHttpDataSourceFactory(Call.Factory)","url":"%3Cinit%3E(okhttp3.Call.Factory)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"oldFormat"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Callback","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onActionScheduleFinished()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdClicked()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat, int)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onAddQueueItem(Player, MediaDescriptionCompat)","url":"onAddQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdLoadError(AdsMediaSource.AdLoadException, DataSpec)","url":"onAdLoadError(com.google.android.exoplayer2.source.ads.AdsMediaSource.AdLoadException,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onAdPlaybackStarted(AnalyticsListener.EventTime, String, String)","url":"onAdPlaybackStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdPlaybackState(AdPlaybackState)","url":"onAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader.EventListener","l":"onAdTapped()"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout.AspectRatioListener","l":"onAspectRatioUpdated(float, float, boolean)","url":"onAspectRatioUpdated(float,float,boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onAttachedToHost(PlaybackGlueHost)","url":"onAttachedToHost(androidx.leanback.media.PlaybackGlueHost)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onAttachedToWindow()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioAttributesChanged(AnalyticsListener.EventTime, AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioAttributesChanged(AudioAttributes)","url":"onAudioAttributesChanged(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver.Listener","l":"onAudioCapabilitiesChanged(AudioCapabilities)","url":"onAudioCapabilitiesChanged(com.google.android.exoplayer2.audio.AudioCapabilities)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioCodecError(AnalyticsListener.EventTime, Exception)","url":"onAudioCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioCodecError(Exception)","url":"onAudioCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onAudioDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderInitialized(String, long, long)","url":"onAudioDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDecoderReleased(AnalyticsListener.EventTime, String)","url":"onAudioDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDecoderReleased(String)","url":"onAudioDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioDisabled(DecoderCounters)","url":"onAudioDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioEnabled(DecoderCounters)","url":"onAudioEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioInputFormatChanged(Format)","url":"onAudioInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioPositionAdvancing(AnalyticsListener.EventTime, long)","url":"onAudioPositionAdvancing(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioSessionIdChanged(AnalyticsListener.EventTime, int)","url":"onAudioSessionIdChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSessionIdChanged(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioSinkError(AnalyticsListener.EventTime, Exception)","url":"onAudioSinkError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onAudioSinkError(Exception)","url":"onAudioSinkError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onAudioUnderrun(AnalyticsListener.EventTime, int, long, long)","url":"onAudioUnderrun(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onAudioUnderrun(int, long, long)","url":"onAudioUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onAvailableCommandsChanged(AnalyticsListener.EventTime, Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onAvailableCommandsChanged(Player.Commands)","url":"onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long)","url":"onBandwidthEstimate(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener","l":"onBandwidthSample(int, long, long)","url":"onBandwidthSample(int,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onBind(Intent)","url":"onBind(android.content.Intent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.BitmapCallback","l":"onBitmap(Bitmap)","url":"onBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onBytesTransferred(DataSource, DataSpec, boolean, int)","url":"onBytesTransferred(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCachedBytesRead(long, long)","url":"onCachedBytesRead(long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.EventListener","l":"onCacheIgnored(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onCacheInitialized()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotion(long, float[])","url":"onCameraMotion(long,float[])"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionListener","l":"onCameraMotionReset()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionAvailable()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"SessionAvailabilityListener","l":"onCastSessionUnavailable()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"onChildSourceInfoRefreshed(ConcatenatingMediaSource.MediaSourceHolder, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"onChildSourceInfoRefreshed(Integer, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Integer,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"onChildSourceInfoRefreshed(MediaSource.MediaPeriodId, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"onChildSourceInfoRefreshed(T, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(T,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"onChildSourceInfoRefreshed(Void, MediaSource, Timeline)","url":"onChildSourceInfoRefreshed(java.lang.Void,com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadCompleted(Chunk)","url":"onChunkLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"onChunkLoadError(Chunk, boolean, LoadErrorHandlingPolicy.LoadErrorInfo, LoadErrorHandlingPolicy)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk,boolean,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"onChunkLoadError(Chunk)","url":"onChunkLoadError(com.google.android.exoplayer2.source.chunk.Chunk)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onClosed()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecError(Exception)","url":"onCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecInitialized(String, long, long)","url":"onCodecInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onCodecReleased(String)","url":"onCodecReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CommandReceiver","l":"onCommand(Player, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onCommand(Player, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCommand(Player, String, Bundle, ResultReceiver)","url":"onCommand(com.google.android.exoplayer2.Player,java.lang.String,android.os.Bundle,android.os.ResultReceiver)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.AllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"onCommandRequest(MediaSession, MediaSession.ControllerInfo, SessionCommand)","url":"onCommandRequest(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onConfigure(AudioProcessor.AudioFormat)","url":"onConfigure(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"onConfigured(MediaFormat, Surface, MediaCrypto, int)","url":"onConfigured(android.media.MediaFormat,android.view.Surface,android.media.MediaCrypto,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onContentAspectRatioChanged(AspectRatioFrameLayout, float)","url":"onContentAspectRatioChanged(com.google.android.exoplayer2.ui.AspectRatioFrameLayout,float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"onContinueLoadingRequested(ChunkSampleStream)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onContinueLoadingRequested(HlsSampleStreamWrapper)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onContinueLoadingRequested(MediaPeriod)","url":"onContinueLoadingRequested(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader.Callback","l":"onContinueLoadingRequested(T)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"onCreate()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onCreate(Bundle)","url":"onCreate(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.database","c":"StandaloneDatabaseProvider","l":"onCreate(SQLiteDatabase)","url":"onCreate(android.database.sqlite.SQLiteDatabase)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaIdMediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.MediaItemProvider","l":"onCreateMediaItem(MediaSession, MediaSession.ControllerInfo, String)","url":"onCreateMediaItem(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.text","c":"TextOutput","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"onCues(List)","url":"onCues(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onCurrentMediaItemIndexChanged(Player)","url":"onCurrentMediaItemIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onCurrentMediaItemIndexChanged(Player)","url":"onCurrentMediaItemIndexChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CustomActionProvider","l":"onCustomAction(Player, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"onCustomAction(Player, String, Bundle)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.CustomActionReceiver","l":"onCustomAction(Player, String, Intent)","url":"onCustomAction(com.google.android.exoplayer2.Player,java.lang.String,android.content.Intent)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.CustomCommandProvider","l":"onCustomCommand(MediaSession, MediaSession.ControllerInfo, SessionCommand, Bundle)","url":"onCustomCommand(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,androidx.media2.session.SessionCommand,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestPublishTimeExpired(long)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerEmsgCallback","l":"onDashManifestRefreshRequested()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"onDataRead(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderDisabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderEnabled(AnalyticsListener.EventTime, int, DecoderCounters)","url":"onDecoderEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInitialized(AnalyticsListener.EventTime, int, String, long)","url":"onDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDecoderInputFormatChanged(AnalyticsListener.EventTime, int, Format)","url":"onDecoderInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onDestroy()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"onDetachedFromHost()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onDetachedFromWindow()"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceInfoChanged(DeviceInfo)","url":"onDeviceInfoChanged(com.google.android.exoplayer2.DeviceInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onDeviceVolumeChanged(int, boolean)","url":"onDeviceVolumeChanged(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onDisabled()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DisconnectedCallback","l":"onDisconnected(MediaSession, MediaSession.ControllerInfo)","url":"onDisconnected(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onDiscontinuity()"},{"p":"com.google.android.exoplayer2.database","c":"StandaloneDatabaseProvider","l":"onDowngrade(SQLiteDatabase, int, int)","url":"onDowngrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadChanged(DownloadManager, Download, Exception)","url":"onDownloadChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onDownloadRemoved(DownloadManager, Download)","url":"onDownloadRemoved(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onDownloadsPausedChanged(DownloadManager, boolean)","url":"onDownloadsPausedChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDownstreamFormatChanged(AnalyticsListener.EventTime, MediaLoadData)","url":"onDownstreamFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDownstreamFormatChanged(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onDownstreamFormatChanged(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onDraw(Canvas)","url":"onDraw(android.graphics.Canvas)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysLoaded(AnalyticsListener.EventTime)","url":"onDrmKeysLoaded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysLoaded(int, MediaSource.MediaPeriodId)","url":"onDrmKeysLoaded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRemoved(AnalyticsListener.EventTime)","url":"onDrmKeysRemoved(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRemoved(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRemoved(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmKeysRestored(AnalyticsListener.EventTime)","url":"onDrmKeysRestored(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmKeysRestored(int, MediaSource.MediaPeriodId)","url":"onDrmKeysRestored(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionAcquired(AnalyticsListener.EventTime, int)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionAcquired(AnalyticsListener.EventTime)","url":"onDrmSessionAcquired(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId, int)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionAcquired(int, MediaSource.MediaPeriodId)","url":"onDrmSessionAcquired(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionManagerError(AnalyticsListener.EventTime, Exception)","url":"onDrmSessionManagerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionManagerError(int, MediaSource.MediaPeriodId, Exception)","url":"onDrmSessionManagerError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDrmSessionReleased(AnalyticsListener.EventTime)","url":"onDrmSessionReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onDrmSessionReleased(int, MediaSource.MediaPeriodId)","url":"onDrmSessionReleased(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onDroppedFrames(int, long)","url":"onDroppedFrames(int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onDroppedVideoFrames(AnalyticsListener.EventTime, int, long)","url":"onDroppedVideoFrames(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long, int)","url":"oneByteSample(long,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"oneByteSample(long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onEnabled()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onEnabled(boolean, boolean)","url":"onEnabled(boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onEnabled(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnEventListener","l":"onEvent(ExoMediaDrm, byte[], int, int, byte[])","url":"onEvent(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onEvents(Player, AnalyticsListener.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.analytics.AnalyticsListener.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onEvents(Player, Player.Events)","url":"onEvents(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Player.Events)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalOffloadSchedulingEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioOffloadListener","l":"onExperimentalSleepingForOffloadChanged(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnExpirationUpdateListener","l":"onExpirationUpdate(ExoMediaDrm, byte[], long)","url":"onExpirationUpdate(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onFinished()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onFlush()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onFocusChanged(boolean, int, Rect)","url":"onFocusChanged(boolean,int,android.graphics.Rect)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onFormatChanged(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onFormatChanged(Format)","url":"onFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture.TextureImageListener","l":"onFrameAvailable()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"onFrameAvailable(SurfaceTexture)","url":"onFrameAvailable(android.graphics.SurfaceTexture)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.OnFrameRenderedListener","l":"onFrameRendered(MediaCodecAdapter, long, long)","url":"onFrameRendered(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.OnFullScreenModeChangedListener","l":"onFullScreenModeChanged(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onIdle(DownloadManager)","url":"onIdle(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitializationFailed(IOException)","url":"onInitializationFailed(java.io.IOException)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityEvent(AccessibilityEvent)","url":"onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)","url":"onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient.InitializationCallback","l":"onInitialized()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"onInitialized(DownloadManager)","url":"onInitialized(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onInputFormatChanged(FormatHolder)","url":"onInputFormatChanged(com.google.android.exoplayer2.FormatHolder)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onIsPlayingChanged(AnalyticsListener.EventTime, boolean)","url":"onIsPlayingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onIsPlayingChanged(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onKeyDown(int, KeyEvent)","url":"onKeyDown(int,android.view.KeyEvent)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.OnKeyStatusChangeListener","l":"onKeyStatusChange(ExoMediaDrm, byte[], List, boolean)","url":"onKeyStatusChange(com.google.android.exoplayer2.drm.ExoMediaDrm,byte[],java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"onLayout(boolean, int, int, int, int)","url":"onLayout(boolean,int,int,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCanceled(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCanceled(Chunk, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.source.chunk.Chunk,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCanceled(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCanceled(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCanceled(ParsingLoadable, long, long, boolean)","url":"onLoadCanceled(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCanceled(T, long, long, boolean)","url":"onLoadCanceled(T,long,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadCompleted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadCompleted(Chunk, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.source.chunk.Chunk,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadCompleted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadCompleted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadCompleted(ParsingLoadable, long, long)","url":"onLoadCompleted(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadCompleted(T, long, long)","url":"onLoadCompleted(T,long,long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.ReleaseCallback","l":"onLoaderReleased()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadError(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"onLoadError(Chunk, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.source.chunk.Chunk,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadError(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, boolean)","url":"onLoadError(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData,java.io.IOException,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"onLoadError(ParsingLoadable, long, long, IOException, int)","url":"onLoadError(com.google.android.exoplayer2.upstream.ParsingLoadable,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.Callback","l":"onLoadError(T, long, long, IOException, int)","url":"onLoadError(T,long,long,java.io.IOException,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadingChanged(AnalyticsListener.EventTime, boolean)","url":"onLoadingChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onLoadingChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onLoadStarted(AnalyticsListener.EventTime, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onLoadStarted(int, MediaSource.MediaPeriodId, LoadEventInfo, MediaLoadData)","url":"onLoadStarted(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.LoadEventInfo,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy","l":"onLoadTaskConcluded(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMaxSeekToPreviousPositionChanged(AnalyticsListener.EventTime, long)","url":"onMaxSeekToPreviousPositionChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMaxSeekToPreviousPositionChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMaxSeekToPreviousPositionChanged(long)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onMeasure(int, int)","url":"onMeasure(int,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaButtonEventHandler","l":"onMediaButtonEvent(Player, Intent)","url":"onMediaButtonEvent(com.google.android.exoplayer2.Player,android.content.Intent)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,@com.google.android.exoplayer2.Player.MediaItemTransitionReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMediaItemTransition(AnalyticsListener.EventTime, MediaItem, int)","url":"onMediaItemTransition(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaItem,int)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,@com.google.android.exoplayer2.Player.MediaItemTransitionReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,@com.google.android.exoplayer2.Player.MediaItemTransitionReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,@com.google.android.exoplayer2.Player.MediaItemTransitionReasonint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onMediaItemTransition(MediaItem, @com.google.android.exoplayer2.Player.MediaItemTransitionReason int)","url":"onMediaItemTransition(com.google.android.exoplayer2.MediaItem,@com.google.android.exoplayer2.Player.MediaItemTransitionReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMediaMetadataChanged(MediaMetadata)","url":"onMediaMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget.Callback","l":"onMessageArrived()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onMetadata(AnalyticsListener.EventTime, Metadata)","url":"onMetadata(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataOutput","l":"onMetadata(Metadata)","url":"onMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver.Listener","l":"onNetworkTypeChanged(int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onNextFrame(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationCancelled(int, boolean)","url":"onNotificationCancelled(int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.NotificationListener","l":"onNotificationPosted(int, Notification, boolean)","url":"onNotificationPosted(int,android.app.Notification,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferEmptying()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onOffloadBufferFull(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onOutputFormatChanged(Format, MediaFormat)","url":"onOutputFormatChanged(com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onPause()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onPause()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackParametersChanged(AnalyticsListener.EventTime, PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackParametersChanged(PlaybackParameters)","url":"onPlaybackParametersChanged(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackStateChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.State int)","url":"onPlaybackStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener.Callback","l":"onPlaybackStatsReady(AnalyticsListener.EventTime, PlaybackStats)","url":"onPlaybackStatsReady(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.analytics.PlaybackStats)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int)","url":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int)","url":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int)","url":"onPlaybackSuppressionReasonChanged(@com.google.android.exoplayer2.Player.PlaybackSuppressionReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.PlaybackSuppressionReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int)","url":"onPlaybackSuppressionReasonChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.PlaybackSuppressionReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayerError(AnalyticsListener.EventTime, PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPlayerError(PlaybackException)","url":"onPlayerError(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayerErrorChanged(PlaybackException)","url":"onPlayerErrorChanged(com.google.android.exoplayer2.PlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onPlayerErrorInternal(ExoPlaybackException)","url":"onPlayerErrorInternal(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerReleased(AnalyticsListener.EventTime)","url":"onPlayerReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayerStateChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.State int)","url":"onPlayerStateChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayerStateChanged(boolean, @com.google.android.exoplayer2.Player.State int)","url":"onPlayerStateChanged(boolean,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayerStateChanged(boolean, @com.google.android.exoplayer2.Player.State int)","url":"onPlayerStateChanged(boolean,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistChanged()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistEventListener","l":"onPlaylistError(Uri, LoadErrorHandlingPolicy.LoadErrorInfo, boolean)","url":"onPlaylistError(android.net.Uri,com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlaylistMetadataChanged(AnalyticsListener.EventTime, MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlaylistMetadataChanged(MediaMetadata)","url":"onPlaylistMetadataChanged(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPlaylistRefreshRequired(Uri)","url":"onPlaylistRefreshRequired(android.net.Uri)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPlayWhenReadyChanged(boolean, @com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason int)","url":"onPlayWhenReadyChanged(boolean,@com.google.android.exoplayer2.Player.PlayWhenReadyChangeReasonint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onPlayWhenReadyChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionAdvancing(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(@com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onPositionDiscontinuity(AnalyticsListener.EventTime, Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"onPositionDiscontinuity(com.google.android.exoplayer2.Player.PositionInfo,com.google.android.exoplayer2.Player.PositionInfo,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onPositionReset()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onPositionReset(long, boolean)","url":"onPositionReset(long,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.PostConnectCallback","l":"onPostConnect(MediaSession, MediaSession.ControllerInfo)","url":"onPostConnect(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepare(boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareComplete(MediaSource.MediaPeriodId)","url":"onPrepareComplete(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"onPrepared()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepared(DownloadHelper)","url":"onPrepared(com.google.android.exoplayer2.offline.DownloadHelper)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod.Callback","l":"onPrepared(MediaPeriod)","url":"onPrepared(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper.Callback","l":"onPrepareError(DownloadHelper, IOException)","url":"onPrepareError(com.google.android.exoplayer2.offline.DownloadHelper,java.io.IOException)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod.PrepareListener","l":"onPrepareError(MediaSource.MediaPeriodId, IOException)","url":"onPrepareError(com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,java.io.IOException)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromMediaId(String, boolean, Bundle)","url":"onPrepareFromMediaId(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromSearch(String, boolean, Bundle)","url":"onPrepareFromSearch(java.lang.String,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.PlaybackPreparer","l":"onPrepareFromUri(Uri, boolean, Bundle)","url":"onPrepareFromUri(android.net.Uri,boolean,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PrimaryPlaylistListener","l":"onPrimaryPlaylistRefreshed(HlsMediaPlaylist)","url":"onPrimaryPlaylistRefreshed(com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedOutputBuffer(long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedStreamChange()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onProcessedTunneledBuffer(long)"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader.ProgressListener","l":"onProgress(long, long, float)","url":"onProgress(long,long,float)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheWriter.ProgressListener","l":"onProgress(long, long, long)","url":"onProgress(long,long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.ProgressUpdateListener","l":"onProgressUpdate(long, long)","url":"onProgressUpdate(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onQueueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onQueueInputBuffer(DecoderInputBuffer)","url":"onQueueInputBuffer(com.google.android.exoplayer2.decoder.DecoderInputBuffer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"onRebuffer()"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"onReceivingFirstPacket(long, int)","url":"onReceivingFirstPacket(long,int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onReleased()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"onRemoveQueueItem(Player, MediaDescriptionCompat)","url":"onRemoveQueueItem(com.google.android.exoplayer2.Player,android.support.v4.media.MediaDescriptionCompat)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRenderedFirstFrame()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRenderedFirstFrame(AnalyticsListener.EventTime, Object, long)","url":"onRenderedFirstFrame(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onRenderedFirstFrame(Object, long)","url":"onRenderedFirstFrame(java.lang.Object,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onRendererOffsetChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onRepeatModeChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onRepeatModeChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.RepeatMode int)","url":"onRepeatModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onRequirementsStateChanged(DownloadManager, Requirements, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.offline.DownloadManager,com.google.android.exoplayer2.scheduler.Requirements,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher.Listener","l":"onRequirementsStateChanged(RequirementsWatcher, int)","url":"onRequirementsStateChanged(com.google.android.exoplayer2.scheduler.RequirementsWatcher,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"onReset()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onReset()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onResume()"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"onResume()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onRtlPropertiesChanged(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleCompleted(int, long, int, int, int, MediaCodec.CryptoInfo)","url":"onSampleCompleted(int,long,int,int,int,android.media.MediaCodec.CryptoInfo)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSampleDataFound(int, MediaParser.InputReader)","url":"onSampleDataFound(int,android.media.MediaParser.InputReader)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.ReleaseCallback","l":"onSampleStreamReleased(ChunkSampleStream)","url":"onSampleStreamReleased(com.google.android.exoplayer2.source.chunk.ChunkSampleStream)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubMove(TimeBar, long)","url":"onScrubMove(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStart(TimeBar, long)","url":"onScrubStart(com.google.android.exoplayer2.ui.TimeBar,long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar.OnScrubListener","l":"onScrubStop(TimeBar, long, boolean)","url":"onScrubStop(com.google.android.exoplayer2.ui.TimeBar,long,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekBackIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekBackIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekBackIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"onSeekFinished()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekForwardIncrementChanged(AnalyticsListener.EventTime, long)","url":"onSeekForwardIncrementChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekForwardIncrementChanged(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onSeekMapFound(MediaParser.SeekMap)","url":"onSeekMapFound(android.media.MediaParser.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"onSeekOperationFinished(boolean, long)","url":"onSeekOperationFinished(boolean,long)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSeekProcessed()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekProcessed(AnalyticsListener.EventTime)","url":"onSeekProcessed(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSeekStarted(AnalyticsListener.EventTime)","url":"onSeekStarted(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"onSelectionActivated(Object)","url":"onSelectionActivated(java.lang.Object)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionActive(AnalyticsListener.EventTime, String)","url":"onSessionActive(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionCreated(AnalyticsListener.EventTime, String)","url":"onSessionCreated(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager.Listener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onSessionFinished(AnalyticsListener.EventTime, String, boolean)","url":"onSessionFinished(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.CaptionCallback","l":"onSetCaptioningEnabled(Player, boolean)","url":"onSetCaptioningEnabled(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.RatingCallback","l":"onSetRating(MediaSession, MediaSession.ControllerInfo, String, Rating)","url":"onSetRating(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo,java.lang.String,androidx.media2.common.Rating)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat, Bundle)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.RatingCallback","l":"onSetRating(Player, RatingCompat)","url":"onSetRating(com.google.android.exoplayer2.Player,android.support.v4.media.RatingCompat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onShuffleModeChanged(AnalyticsListener.EventTime, boolean)","url":"onShuffleModeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onShuffleModeEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipBackward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipBackward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.SkipCallback","l":"onSkipForward(MediaSession, MediaSession.ControllerInfo)","url":"onSkipForward(androidx.media2.session.MediaSession,androidx.media2.session.MediaSession.ControllerInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean)","url":"onSkipSilenceEnabledChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onSkipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToNext(Player)","url":"onSkipToNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToNext(Player)","url":"onSkipToNext(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToPrevious(Player)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToPrevious(Player)","url":"onSkipToPrevious(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onSkipToQueueItem(Player, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onSkipToQueueItem(Player, long)","url":"onSkipToQueueItem(com.google.android.exoplayer2.Player,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onSleep(long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"onSourceInfoRefreshed(long, boolean, boolean)","url":"onSourceInfoRefreshed(long,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource.MediaSourceCaller","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onSourceInfoRefreshed(MediaSource, Timeline)","url":"onSourceInfoRefreshed(com.google.android.exoplayer2.source.MediaSource,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanAdded(Cache, CacheSpan)","url":"onSpanAdded(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanRemoved(Cache, CacheSpan)","url":"onSpanRemoved(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache.Listener","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onSpanTouched(Cache, CacheSpan, CacheSpan)","url":"onSpanTouched(com.google.android.exoplayer2.upstream.cache.Cache,com.google.android.exoplayer2.upstream.cache.CacheSpan,com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStart()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity.HostedTest","l":"onStart(HostActivity, Surface, FrameLayout)","url":"onStart(com.google.android.exoplayer2.testutil.HostActivity,android.view.Surface,android.widget.FrameLayout)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onStartCommand(Intent, int, int)","url":"onStartCommand(android.content.Intent,int,int)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStarted()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStarted()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"onStartFile(Cache, String, long, long)","url":"onStartFile(com.google.android.exoplayer2.upstream.cache.Cache,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStartJob(JobParameters)","url":"onStartJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"onStop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"onStopJob(JobParameters)","url":"onStopJob(android.app.job.JobParameters)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"onStopped()"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onStopped()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"onStreamChanged(Format[], long, long)","url":"onStreamChanged(com.google.android.exoplayer2.Format[],long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"onSurfaceChanged(Surface)","url":"onSurfaceChanged(android.view.Surface)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onSurfaceSizeChanged(AnalyticsListener.EventTime, int, int)","url":"onSurfaceSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onSurfaceSizeChanged(int, int)","url":"onSurfaceSizeChanged(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"onTaskRemoved(Intent)","url":"onTaskRemoved(android.content.Intent)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"onThreadBlocked()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTimelineChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTimelineChanged(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.QueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"onTimelineChanged(Player)","url":"onTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"onTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"onTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTouchEvent(MotionEvent)","url":"onTouchEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"onTrackballEvent(MotionEvent)","url":"onTrackballEvent(android.view.MotionEvent)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackCountFound(int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"onTrackDataFound(int, MediaParser.TrackData)","url":"onTrackDataFound(int,android.media.MediaParser.TrackData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onTracksChanged(AnalyticsListener.EventTime, TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksChanged(TrackGroupArray, TrackSelectionArray)","url":"onTracksChanged(com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.TrackSelectionArray)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView.TrackSelectionListener","l":"onTrackSelectionChanged(boolean, List)","url":"onTrackSelectionChanged(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTrackSelectionParametersChanged(TrackSelectionParameters)","url":"onTrackSelectionParametersChanged(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector.InvalidationListener","l":"onTrackSelectionsInvalidated()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onTracksInfoChanged(AnalyticsListener.EventTime, TracksInfo)","url":"onTracksInfoChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.TracksInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.EventListener","l":"onTracksInfoChanged(TracksInfo)","url":"onTracksInfoChanged(com.google.android.exoplayer2.TracksInfo)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onTracksInfoChanged(TracksInfo)","url":"onTracksInfoChanged(com.google.android.exoplayer2.TracksInfo)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onTracksInfoChanged(TracksInfo)","url":"onTracksInfoChanged(com.google.android.exoplayer2.TracksInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder.DialogCallback","l":"onTracksSelected(boolean, List)","url":"onTracksSelected(boolean,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"onTracksSelected(Renderer[], TrackGroupArray, ExoTrackSelection[])","url":"onTracksSelected(com.google.android.exoplayer2.Renderer[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.ExoTrackSelection[])"},{"p":"com.google.android.exoplayer2","c":"BundleListRetriever","l":"onTransact(int, Parcel, Parcel, int)","url":"onTransact(int,android.os.Parcel,android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferEnd(DataSource, DataSpec, boolean)","url":"onTransferEnd(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferInitializing(DataSource, DataSpec, boolean)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferInitializing(DataSpec)","url":"onTransferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.FakeTransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TransferListener","l":"onTransferStart(DataSource, DataSpec, boolean)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"onTransferStart(DataSpec)","url":"onTransferStart(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationCompleted(MediaItem)","url":"onTransformationCompleted(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Listener","l":"onTransformationError(MediaItem, Exception)","url":"onTransformationError(com.google.android.exoplayer2.MediaItem,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"onTruncatedSegmentParsed()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.Listener","l":"onUnderrun(int, long, long)","url":"onUnderrun(int,long,long)"},{"p":"com.google.android.exoplayer2.database","c":"StandaloneDatabaseProvider","l":"onUpgrade(SQLiteDatabase, int, int)","url":"onUpgrade(android.database.sqlite.SQLiteDatabase,int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onUpstreamDiscarded(AnalyticsListener.EventTime, MediaLoadData)","url":"onUpstreamDiscarded(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"onUpstreamDiscarded(int, MediaSource.MediaPeriodId, MediaLoadData)","url":"onUpstreamDiscarded(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue.UpstreamFormatChangedListener","l":"onUpstreamFormatChanged(Format)","url":"onUpstreamFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoCodecError(AnalyticsListener.EventTime, Exception)","url":"onVideoCodecError(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoCodecError(Exception)","url":"onVideoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderInitialized(AnalyticsListener.EventTime, String, long)","url":"onVideoDecoderInitialized(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderInitialized(String, long, long)","url":"onVideoDecoderInitialized(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDecoderReleased(AnalyticsListener.EventTime, String)","url":"onVideoDecoderReleased(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDecoderReleased(String)","url":"onVideoDecoderReleased(java.lang.String)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoDisabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoDisabled(DecoderCounters)","url":"onVideoDisabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoEnabled(AnalyticsListener.EventTime, DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoEnabled(DecoderCounters)","url":"onVideoEnabled(com.google.android.exoplayer2.decoder.DecoderCounters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameMetadataListener","l":"onVideoFrameAboutToBeRendered(long, long, Format, MediaFormat)","url":"onVideoFrameAboutToBeRendered(long,long,com.google.android.exoplayer2.Format,android.media.MediaFormat)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoFrameProcessingOffset(AnalyticsListener.EventTime, long, int)","url":"onVideoFrameProcessingOffset(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoFrameProcessingOffset(long, int)","url":"onVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoInputFormatChanged(AnalyticsListener.EventTime, Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format, DecoderReuseEvaluation)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoInputFormatChanged(Format)","url":"onVideoInputFormatChanged(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, int, int, int, float)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,int,int,float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVideoSizeChanged(AnalyticsListener.EventTime, VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener","l":"onVideoSizeChanged(VideoSize)","url":"onVideoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceCreated(Surface)","url":"onVideoSurfaceCreated(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView.VideoSurfaceListener","l":"onVideoSurfaceDestroyed(Surface)","url":"onVideoSurfaceDestroyed(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView.VisibilityListener","l":"onVisibilityChange(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2.util","c":"EventLogger","l":"onVolumeChanged(AnalyticsListener.EventTime, float)","url":"onVolumeChanged(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,float)"},{"p":"com.google.android.exoplayer2","c":"Player.Listener","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"onVolumeChanged(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager.Listener","l":"onWaitingForRequirementsChanged(DownloadManager, boolean)","url":"onWaitingForRequirementsChanged(com.google.android.exoplayer2.offline.DownloadManager,boolean)"},{"p":"com.google.android.exoplayer2","c":"Renderer.WakeupListener","l":"onWakeup()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"open()"},{"p":"com.google.android.exoplayer2.util","c":"ConditionVariable","l":"open()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"open(DataSpec)","url":"open(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"openAssetFile(Uri, String)","url":"openAssetFile(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(IOException, DataSpec, int)","url":"%3Cinit%3E(java.io.IOException,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.OpenException","l":"OpenException(String, DataSpec, int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.upstream.DataSpec,int)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"openRead()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"openSession()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"OpusDecoder(int, int, int, List, CryptoConfig, boolean)","url":"%3Cinit%3E(int,int,int,java.util.List,com.google.android.exoplayer2.decoder.CryptoConfig,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusGetVersion()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"opusIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.OtherTrackScore","l":"OtherTrackScore(Format, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"outOfNetworkIndicator"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"outputAudioFormat"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"OutputConsumerAdapterV30(Format, @com.google.android.exoplayer2.C.TrackType int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,@com.google.android.exoplayer2.C.TrackTypeint,boolean)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"outputFloat"},{"p":"com.google.android.exoplayer2.extractor","c":"TrueHdSampleRechunker","l":"outputPendingSampleMetadata(TrackOutput, TrackOutput.CryptoData)","url":"outputPendingSampleMetadata(com.google.android.exoplayer2.extractor.TrackOutput,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"overallRating"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"overestimatedResult(long, long)","url":"overestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"overridePreparePositionUs(long)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"owner"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetFinished()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"packetStarted(long, int)","url":"packetStarted(long,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"padding"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EAGERLY_EXPOSE_TRACK_TYPE"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CAPTION_FORMATS"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_CHUNK_INDEX_AS_MEDIA_FORMAT"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_EXPOSE_DUMMY_SEEK_MAP"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IGNORE_TIMESTAMP_OFFSET"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_IN_BAND_CRYPTO_INFO"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_INCLUDE_SUPPLEMENTAL_DATA"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"PARAMETER_OVERRIDE_IN_BAND_CAPTION_DECLARATIONS"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"ParametersBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"parent"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"ParsableBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[], int)","url":"%3Cinit%3E(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"ParsableByteArray(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"ParsableNalUnitBitArray(byte[], int, int)","url":"%3Cinit%3E(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(byte[], int)","url":"parse(byte[],int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"parse(Map>)","url":"parse(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"parse(ParsableByteArray)","url":"parse(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.offline","c":"FilteringManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable.Parser","l":"parse(Uri, InputStream)","url":"parse(android.net.Uri,java.io.InputStream)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc3SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeInfo(ParsableBitArray)","url":"parseAc3SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseAc3SyncframeSize(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4AnnexEFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseAc4AnnexEFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeAudioSampleCount(ByteBuffer)","url":"parseAc4SyncframeAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeInfo(ParsableBitArray)","url":"parseAc4SyncframeInfo(com.google.android.exoplayer2.util.ParsableBitArray)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"parseAc4SyncframeSize(byte[], int)","url":"parseAc4SyncframeSize(byte[],int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSet(XmlPullParser, List, SegmentBase, long, long, long, long, long)","url":"parseAdaptationSet(org.xmlpull.v1.XmlPullParser,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAdaptationSetChild(XmlPullParser)","url":"parseAdaptationSetChild(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseAlacAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAudioChannelConfiguration(XmlPullParser)","url":"parseAudioChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil","l":"parseAudioSpecificConfig(ParsableBitArray, boolean)","url":"parseAudioSpecificConfig(com.google.android.exoplayer2.util.ParsableBitArray,boolean)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseAvailabilityTimeOffsetUs(XmlPullParser, long)","url":"parseAvailabilityTimeOffsetUs(org.xmlpull.v1.XmlPullParser,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseBaseUrl(XmlPullParser, List)","url":"parseBaseUrl(org.xmlpull.v1.XmlPullParser,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea608AccessibilityChannel(List)","url":"parseCea608AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseCea708AccessibilityChannel(List)","url":"parseCea708AccessibilityChannel(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"parseCea708InitializationData(List)","url":"parseCea708InitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentProtection(XmlPullParser)","url":"parseContentProtection(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseContentType(XmlPullParser)","url":"parseContentType(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseCssColor(String)","url":"parseCssColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"parseCue(ParsableByteArray, List)","url":"parseCue(com.google.android.exoplayer2.util.ParsableByteArray,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDateTime(XmlPullParser, String, long)","url":"parseDateTime(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDescriptor(XmlPullParser, String)","url":"parseDescriptor(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDolbyChannelConfiguration(XmlPullParser)","url":"parseDolbyChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsAudioSampleCount(ByteBuffer)","url":"parseDtsAudioSampleCount(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"DtsUtil","l":"parseDtsFormat(byte[], String, String, DrmInitData)","url":"parseDtsFormat(byte[],java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseDuration(XmlPullParser, String, long)","url":"parseDuration(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseEAc3AnnexFFormat(ParsableByteArray, String, String, DrmInitData)","url":"parseEAc3AnnexFFormat(com.google.android.exoplayer2.util.ParsableByteArray,java.lang.String,java.lang.String,com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEac3SupplementalProperties(List)","url":"parseEac3SupplementalProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEvent(XmlPullParser, String, String, long, ByteArrayOutputStream)","url":"parseEvent(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String,long,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventObject(XmlPullParser, ByteArrayOutputStream)","url":"parseEventObject(org.xmlpull.v1.XmlPullParser,java.io.ByteArrayOutputStream)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseEventStream(XmlPullParser)","url":"parseEventStream(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFloat(XmlPullParser, String, float)","url":"parseFloat(org.xmlpull.v1.XmlPullParser,java.lang.String,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseFrameRate(XmlPullParser, float)","url":"parseFrameRate(org.xmlpull.v1.XmlPullParser,float)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseH265SpsNalUnit(byte[], int, int)","url":"parseH265SpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseH265SpsNalUnitPayload(byte[], int, int)","url":"parseH265SpsNalUnitPayload(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInitialization(XmlPullParser)","url":"parseInitialization(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseInt(XmlPullParser, String, int)","url":"parseInt(org.xmlpull.v1.XmlPullParser,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLabel(XmlPullParser)","url":"parseLabel(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLastSegmentNumberSupplementalProperty(List)","url":"parseLastSegmentNumberSupplementalProperty(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseLong(XmlPullParser, String, long)","url":"parseLong(org.xmlpull.v1.XmlPullParser,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMediaPresentationDescription(XmlPullParser, BaseUrl)","url":"parseMediaPresentationDescription(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.BaseUrl)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil","l":"parseMpegAudioFrameSampleCount(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseMpegChannelConfiguration(XmlPullParser)","url":"parseMpegChannelConfiguration(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parsePercentage(String)","url":"parsePercentage(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parsePeriod(XmlPullParser, List, long, long, long, long)","url":"parsePeriod(org.xmlpull.v1.XmlPullParser,java.util.List,long,long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnit(byte[], int, int)","url":"parsePpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parsePpsNalUnitPayload(byte[], int, int)","url":"parsePpsNalUnitPayload(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseProgramInformation(XmlPullParser)","url":"parseProgramInformation(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRangedUrl(XmlPullParser, String, String)","url":"parseRangedUrl(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRepresentation(XmlPullParser, List, String, String, int, int, float, int, int, String, List, List, List, List, SegmentBase, long, long, long, long, long)","url":"parseRepresentation(org.xmlpull.v1.XmlPullParser,java.util.List,java.lang.String,java.lang.String,int,int,float,int,int,java.lang.String,java.util.List,java.util.List,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"ParserException","l":"ParserException(String, Throwable, boolean, int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromAccessibilityDescriptors(List)","url":"parseRoleFlagsFromAccessibilityDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromDashRoleScheme(String)","url":"parseRoleFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromProperties(List)","url":"parseRoleFlagsFromProperties(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseRoleFlagsFromRoleDescriptors(List)","url":"parseRoleFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseSchemeSpecificData(byte[], UUID)","url":"parseSchemeSpecificData(byte[],java.util.UUID)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentBase(XmlPullParser, SegmentBase.SingleSegmentBase)","url":"parseSegmentBase(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentList(XmlPullParser, SegmentBase.SegmentList, long, long, long, long, long)","url":"parseSegmentList(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentList,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTemplate(XmlPullParser, SegmentBase.SegmentTemplate, List, long, long, long, long, long)","url":"parseSegmentTemplate(org.xmlpull.v1.XmlPullParser,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SegmentTemplate,java.util.List,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentTimeline(XmlPullParser, long, long)","url":"parseSegmentTimeline(org.xmlpull.v1.XmlPullParser,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSegmentUrl(XmlPullParser)","url":"parseSegmentUrl(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromDashRoleScheme(String)","url":"parseSelectionFlagsFromDashRoleScheme(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseSelectionFlagsFromRoleDescriptors(List)","url":"parseSelectionFlagsFromRoleDescriptors(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseServiceDescription(XmlPullParser)","url":"parseServiceDescription(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnit(byte[], int, int)","url":"parseSpsNalUnit(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"parseSpsNalUnitPayload(byte[], int, int)","url":"parseSpsNalUnitPayload(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseString(XmlPullParser, String, String)","url":"parseString(org.xmlpull.v1.XmlPullParser,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseText(XmlPullParser, String)","url":"parseText(org.xmlpull.v1.XmlPullParser,java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"parseTimestampUs(String)","url":"parseTimestampUs(java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"parseTrueHdSyncframeAudioSampleCount(ByteBuffer, int)","url":"parseTrueHdSyncframeAudioSampleCount(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ColorParser","l":"parseTtmlColor(String)","url":"parseTtmlColor(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseTvaAudioPurposeCsValue(String)","url":"parseTvaAudioPurposeCsValue(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUrlTemplate(XmlPullParser, String, UrlTemplate)","url":"parseUrlTemplate(org.xmlpull.v1.XmlPullParser,java.lang.String,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser","l":"parseUtcTiming(XmlPullParser)","url":"parseUtcTiming(org.xmlpull.v1.XmlPullParser)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseUuid(byte[])"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"PsshAtomUtil","l":"parseVersion(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDateTime(String)","url":"parseXsDateTime(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"parseXsDuration(String)","url":"parseXsDuration(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, DataSpec, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"ParsingLoadable(DataSource, Uri, int, ParsingLoadable.Parser)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,android.net.Uri,int,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Part","l":"Part(String, HlsMediaPlaylist.Segment, long, int, long, DrmInitData, String, String, long, long, boolean, boolean, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"partHoldBackUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"parts"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"partTargetDurationUs"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PassthroughSectionPayloadReader","l":"PassthroughSectionPayloadReader(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"pause()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"pause()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"pause()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"pause()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"pauseActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"pauseDownloads()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadData"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"payloadType"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pcmEncoding"},{"p":"com.google.android.exoplayer2","c":"Format","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"peakBitrate"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peek(byte[], int, int)","url":"peek(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekChar()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int, boolean)","url":"peekFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"peekFully(byte[], int, int)","url":"peekFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekFullyQuietly(ExtractorInput, byte[], int, int, boolean)","url":"peekFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"Id3Peeker","l":"peekId3Data(ExtractorInput, Id3Decoder.FramePredicate)","url":"peekId3Data(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.metadata.id3.Id3Decoder.FramePredicate)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"peekId3Metadata(ExtractorInput, boolean)","url":"peekId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"peekSourceId()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"peekToLength(ExtractorInput, byte[], int, int)","url":"peekToLength(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"peekUnsignedByte()"},{"p":"com.google.android.exoplayer2","c":"C","l":"PERCENTAGE_UNSET"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"PercentageRating(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadProgress","l":"percentDownloaded"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"performAccessibilityAction(int, Bundle)","url":"performAccessibilityAction(int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"performClick()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"Period()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List, Descriptor)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List,com.google.android.exoplayer2.source.dash.manifest.Descriptor)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"Period(String, long, List)","url":"%3Cinit%3E(java.lang.String,long,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"periodCount"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"periodIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"periodUid"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"periodUid"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"perSampleIvSize"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"PesReader(ElementaryStreamReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader)"},{"p":"com.google.android.exoplayer2.text.pgs","c":"PgsDecoder","l":"PgsDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoPresentationTimestampUs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoSize"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"photoStartPosition"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCntLsbLength"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"picOrderCountType"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"picParameterSetId"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_A_BRIGHT_COLORED_FISH"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BACK_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ARTIST_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_BAND_ORCHESTRA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_COMPOSER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_CONDUCTOR"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_PERFORMANCE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_DURING_RECORDING"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FILE_ICON_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_FRONT_COVER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_ILLUSTRATION"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAD_ARTIST_PERFORMER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LEAFLET_PAGE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_LYRICIST"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_OTHER"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_PUBLISHER_STUDIO_LOGO"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"PICTURE_TYPE_RECORDING_LOCATION"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureData"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"PictureFrame(int, String, String, int, int, int, int, byte[])","url":"%3Cinit%3E(int,java.lang.String,java.lang.String,int,int,int,int,byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"pictureType"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"pitch"},{"p":"com.google.android.exoplayer2","c":"Format","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"pixelWidthHeightRatio"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"PLACEHOLDER"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource.PlaceholderTimeline","l":"PlaceholderTimeline(MediaItem)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"PlatformScheduler(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler.PlatformSchedulerService","l":"PlatformSchedulerService()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_REMOTE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"play()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"play()"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"play()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"play()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"play()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"playActionIconResourceId"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYBACK_OFFLOAD_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYBACK_OFFLOAD_SUPPORTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ABANDONED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_ENDED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_FAILED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_INTERRUPTED_BY_AD"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_BACKGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_JOINING_FOREGROUND"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_NOT_STARTED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PAUSED_BUFFERING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_PLAYING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SEEKING"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_STOPPED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"PLAYBACK_STATE_SUPPRESSED_BUFFERING"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"Player","l":"PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"PLAYBACK_TYPE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"PLAYBACK_TYPE_REMOTE"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackCount"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(Bundle)","url":"%3Cinit%3E(android.os.Bundle)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int, long)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint,long)"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"PlaybackException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float, float)","url":"%3Cinit%3E(float,float)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"PlaybackParameters(float)","url":"%3Cinit%3E(float)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"playbackPositionUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"playbackProperties"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats.EventTimeAndPlaybackState","l":"playbackState"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"playbackStateHistory"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStatsListener","l":"PlaybackStatsListener(boolean, PlaybackStatsListener.Callback)","url":"%3Cinit%3E(boolean,com.google.android.exoplayer2.analytics.PlaybackStatsListener.Callback)"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"playbackType"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"playClearContentWithoutKey"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"playClearSamplesWithoutKeys()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"PlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"PlayerEmsgHandler(DashManifest, PlayerEmsgHandler.PlayerEmsgCallback, Allocator)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.DashManifest,com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerEmsgCallback,com.google.android.exoplayer2.upstream.Allocator)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"PlayerMessage(PlayerMessage.Sender, PlayerMessage.Target, Timeline, int, Clock, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.PlayerMessage.Sender,com.google.android.exoplayer2.PlayerMessage.Target,com.google.android.exoplayer2.Timeline,int,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"PlayerNotificationManager(Context, String, int, PlayerNotificationManager.MediaDescriptionAdapter, PlayerNotificationManager.NotificationListener, PlayerNotificationManager.CustomActionReceiver, int, int, int, int, int, int, int, int, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String,int,com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter,com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener,com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver,int,int,int,int,int,int,int,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"PlayerRunnable()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"PlayerTarget()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"PlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_EVENT"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"PLAYLIST_TYPE_VOD"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"PlaylistResetException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"PlaylistStuckException(Uri)","url":"%3Cinit%3E(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"playlistType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"playlistUri"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"PLAYREADY_CUSTOM_DATA_KEY"},{"p":"com.google.android.exoplayer2","c":"C","l":"PLAYREADY_UUID"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"playToEndOfStream()"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilPosition(ExoPlayer, int, long)","url":"playUntilPosition(com.google.android.exoplayer2.ExoPlayer,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilPosition(int, long)","url":"playUntilPosition(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.PlayUntilPosition","l":"PlayUntilPosition(String, int, long)","url":"%3Cinit%3E(java.lang.String,int,long)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"playUntilStartOfMediaItem(ExoPlayer, int)","url":"playUntilStartOfMediaItem(com.google.android.exoplayer2.ExoPlayer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"playUntilStartOfMediaItem(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointOffsets"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"pointSampleNumbers"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"poll(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFirst()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"pollFloor(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populate(MediaMetadata)","url":"populate(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(List)","url":"populateFromMetadata(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"populateFromMetadata(Metadata)","url":"populateFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata.Entry","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"populateMediaMetadata(MediaMetadata.Builder)","url":"populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"position"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"position"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"position"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"position"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"position"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_AFTER"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_BEFORE"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"POSITION_OUT_OF_RANGE"},{"p":"com.google.android.exoplayer2.text.span","c":"TextAnnotation","l":"POSITION_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"POSITION_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"positionAdvancing(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"positionAnchor"},{"p":"com.google.android.exoplayer2.extractor","c":"PositionHolder","l":"PositionHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"positionInFirstPeriodUs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, MediaItem, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,com.google.android.exoplayer2.MediaItem,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"PositionInfo(Object, int, Object, int, long, long, int, int)","url":"%3Cinit%3E(java.lang.Object,int,java.lang.Object,int,long,long,int,int)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"positionInWindowUs"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"positionMs"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"positionMs"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"positionResetCount"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"post(Runnable)","url":"post(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postAtFrontOfQueue(Runnable)","url":"postAtFrontOfQueue(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"postDelayed(Runnable, long)","url":"postDelayed(java.lang.Runnable,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"postOrRun(Handler, Runnable)","url":"postOrRun(android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"PpsData(int, int, boolean)","url":"%3Cinit%3E(int,int,boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)","url":"preacquireSession(android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"preciseStart"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioMimeTypes"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredAudioRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextLanguages"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredTextRoleFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"preferredVideoMimeTypes"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"prepare()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"prepare()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"prepare()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"prepare(DownloadHelper.Callback)","url":"prepare(com.google.android.exoplayer2.offline.DownloadHelper.Callback)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"prepare(MediaPeriod.Callback, long)","url":"prepare(com.google.android.exoplayer2.source.MediaPeriod.Callback,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource, boolean, boolean)","url":"prepare(com.google.android.exoplayer2.source.MediaSource,boolean,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"prepare(MediaSource)","url":"prepare(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Prepare","l":"Prepare(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareChildSource(T, MediaSource)","url":"prepareChildSource(T,com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"preparePeriod(MediaPeriod, long)","url":"preparePeriod(com.google.android.exoplayer2.source.MediaPeriod,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"prepareSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"prepareSource(MediaSource.MediaSourceCaller, TransferListener)","url":"prepareSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller,com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"prepareSourceInternal(TransferListener)","url":"prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"preRelease()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"presentationStartTimeMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"presentationTimeOffsetUs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"presentationTimesUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"PREVIOUS_SYNC"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"previous()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"previous()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"previousActionIconResourceId"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"primaryTrackType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"priority"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_DOWNLOAD"},{"p":"com.google.android.exoplayer2","c":"C","l":"PRIORITY_PLAYBACK"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"PriorityDataSource(DataSource, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSourceFactory","l":"PriorityDataSourceFactory(DataSource.Factory, PriorityTaskManager, int)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource.Factory,com.google.android.exoplayer2.util.PriorityTaskManager,int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"PriorityTaskManager()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager.PriorityTooLowException","l":"PriorityTooLowException(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PRIVATE_STREAM_1"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"privateData"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"PrivFrame(String, byte[])","url":"%3Cinit%3E(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceed(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedNonBlocking(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"proceedOrThrow(int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"process(ByteBuffer, ByteBuffer)","url":"process(java.nio.ByteBuffer,java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"processOutputBuffer(long, long, MediaCodecAdapter, ByteBuffer, int, int, int, long, boolean, boolean, Format)","url":"processOutputBuffer(long,long,com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,java.nio.ByteBuffer,int,int,int,long,boolean,boolean,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"DolbyVisionConfig","l":"profile"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"profileIdc"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"Program(Context, String, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"Program(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"Program(String[], String[])","url":"%3Cinit%3E(java.lang.String[],java.lang.String[])"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"programInformation"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"ProgramInformation(String, String, String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"programSpliceFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePlaybackPositionUs"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"programSplicePts"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"progress"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_AVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_NO_TRANSFORMATION"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_UNAVAILABLE"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"PROGRESS_STATE_WAITING_FOR_AVAILABILITY"},{"p":"com.google.android.exoplayer2.transformer","c":"ProgressHolder","l":"ProgressHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"ProgressiveDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_CUBEMAP"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_EQUIRECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"PROJECTION_RECTANGULAR"},{"p":"com.google.android.exoplayer2","c":"Format","l":"projectionData"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_LICENSE_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.drm","c":"WidevineUtil","l":"PROPERTY_PLAYBACK_DURATION_REMAINING"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"protectionElement"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"ProtectionElement(UUID, byte[], TrackEncryptionBox[])","url":"%3Cinit%3E(java.util.UUID,byte[],com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[])"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"protectionSchemes"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideKeyResponse(byte[], byte[])","url":"provideKeyResponse(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"provideProvisionResponse(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.ProvisionRequest","l":"ProvisionRequest(byte[], String)","url":"%3Cinit%3E(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"PS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"PsExtractor(TimestampAdjuster)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"ptsAdjustment"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"ptsTime"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"ptsToUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"publishTimeMs"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"purpose"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CLOSE_AD"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_CONTROLS"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_NOT_VISIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"PURPOSE_OTHER"},{"p":"com.google.android.exoplayer2.util","c":"BundleUtil","l":"putBinder(Bundle, String, IBinder)","url":"putBinder(android.os.Bundle,java.lang.String,android.os.IBinder)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"putDownload(Download)","url":"putDownload(com.google.android.exoplayer2.offline.Download)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"putInt(int, int)","url":"putInt(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"query(Uri, String[], String, String[], String)","url":"query(android.net.Uri,java.lang.String[],java.lang.String,java.lang.String[],java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"queryKeyStatus()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"queryKeyStatus(byte[])"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueEndOfStream()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"queueEvent(int, ListenerSet.Event)","url":"queueEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"queueInput(ByteBuffer)","url":"queueInput(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"queueInputBuffer(I)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueInputBuffer(int, int, int, long, int)","url":"queueInputBuffer(int,int,int,long,int)"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"queueInputBuffer(SubtitleInputBuffer)","url":"queueInputBuffer(com.google.android.exoplayer2.text.SubtitleInputBuffer)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"queueSecureInputBuffer(int, int, CryptoInfo, long, int)","url":"queueSecureInputBuffer(int,int,com.google.android.exoplayer2.decoder.CryptoInfo,long,int)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RandomizedMp3Decoder","l":"RandomizedMp3Decoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"RandomTrackSelection(TrackGroup, int[], int, Random)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],int,java.util.Random)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"RangedUri(String, long, long)","url":"%3Cinit%3E(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2","c":"C","l":"RATE_UNSET"},{"p":"com.google.android.exoplayer2","c":"Rating","l":"RATING_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RAW_RESOURCE_SCHEME"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"RawCcExtractor(Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"rawMetadata"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"RawResourceDataSource(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String, Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource.RawResourceDataSourceException","l":"RawResourceDataSourceException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read()"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"AssetDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ContentDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataReader","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DummyDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"PriorityDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"RawResourceDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSource","l":"read(byte[], int, int)","url":"read(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceInputStream","l":"read(byte[])"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"read(ByteBuffer)","url":"read(java.nio.ByteBuffer)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"read(ExtractorInput, PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"read(ExtractorInput)","url":"read(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"read(FormatHolder, DecoderInputBuffer, int, boolean)","url":"read(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"read(PositionHolder)","url":"read(com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(byte[], int, int)","url":"readBits(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBitsToLong(int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"readBoolean(Parcel)","url":"readBoolean(android.os.Parcel)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(byte[], int, int)","url":"readBytes(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ByteBuffer, int)","url":"readBytes(java.nio.ByteBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readBytes(ParsableBitArray, int)","url":"readBytes(com.google.android.exoplayer2.util.ParsableBitArray,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int, Charset)","url":"readBytesAsString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"readBytesAsString(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"readData(FormatHolder, DecoderInputBuffer, int)","url":"readData(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDelimiterTerminatedString(char)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"readDiscontinuity()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readDouble()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceUtil","l":"readExactly(DataSource, int)","url":"readExactly(com.google.android.exoplayer2.upstream.DataSource,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readFloat()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader","l":"readFrameBlockSizeSamplesFromKey(ParsableByteArray, int)","url":"readFrameBlockSizeSamplesFromKey(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int, boolean)","url":"readFully(byte[],int,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"readFully(byte[], int, int)","url":"readFully(byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"readFullyQuietly(ExtractorInput, byte[], int, int)","url":"readFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,byte[],int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readId3Metadata(ExtractorInput, boolean)","url":"readId3Metadata(com.google.android.exoplayer2.extractor.ExtractorInput,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLine()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLittleEndianUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readMetadataBlock(ExtractorInput, FlacMetadataReader.FlacStreamMetadataHolder)","url":"readMetadataBlock(com.google.android.exoplayer2.extractor.ExtractorInput,com.google.android.exoplayer2.extractor.FlacMetadataReader.FlacStreamMetadataHolder)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readNullTerminatedString(int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsUtil","l":"readPcrFromPacket(ParsableByteArray, int, int)","url":"readPcrFromPacket(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readSeekTableMetadataBlock(ParsableByteArray)","url":"readSeekTableMetadataBlock(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readSignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"readSource(FormatHolder, DecoderInputBuffer, int)","url":"readSource(com.google.android.exoplayer2.FormatHolder,com.google.android.exoplayer2.decoder.DecoderInputBuffer,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacMetadataReader","l":"readStreamMarker(ExtractorInput)","url":"readStreamMarker(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int, Charset)","url":"readString(int,java.nio.charset.Charset)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readString(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readSynchSafeInt()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceUtil","l":"readToEnd(DataSource)","url":"readToEnd(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedByte()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"readUnsignedExpGolombCodedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedFixedPoint1616()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedInt24()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedIntToInt()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedLongToLong()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUnsignedShort()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"readUtf8EncodedLong()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray, boolean, boolean)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray,boolean,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisCommentHeader(ParsableByteArray)","url":"readVorbisCommentHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisIdentificationHeader(ParsableByteArray)","url":"readVorbisIdentificationHeader(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"readVorbisModes(ParsableByteArray, int)","url":"readVorbisModes(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"realtimeMs"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"reason"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"reason"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSourceException","l":"reason"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_INSTANTIATION_ERROR"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_INVALID_PERIOD_COUNT"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_NOT_SEEKABLE_TO_START"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource.IllegalMergeException","l":"REASON_PERIOD_COUNT_MISMATCH"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource.IllegalClippingException","l":"REASON_START_EXCEEDS_END"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"REASON_UNSUPPORTED_SCHEME"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"reasonDetail"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingDay"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingMonth"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"recordingYear"},{"p":"com.google.android.exoplayer2.source.hls","c":"BundledHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.source.hls","c":"MediaParserHlsMediaChunkExtractor","l":"recreate()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"recursiveDelete(File)","url":"recursiveDelete(java.io.File)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeSequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source","c":"SequenceableLoader","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"reevaluateBuffer(long)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"refreshPlaylist(Uri)","url":"refreshPlaylist(android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"refreshSourceInfo(Timeline)","url":"refreshSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"register()"},{"p":"com.google.android.exoplayer2.robolectric","c":"PlaybackOutput","l":"register(ExoPlayer, CapturingRenderersFactory)","url":"register(com.google.android.exoplayer2.ExoPlayer,com.google.android.exoplayer2.testutil.CapturingRenderersFactory)"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"register(NetworkTypeObserver.Listener)","url":"register(com.google.android.exoplayer2.util.NetworkTypeObserver.Listener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"registerCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"registerCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"registerCustomMimeType(String, String, @com.google.android.exoplayer2.C.TrackType int)","url":"registerCustomMimeType(java.lang.String,java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registeredModules()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"registerModule(String)","url":"registerModule(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"REJECT_PAYWALL_TYPES"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeDiscontinuitySequence"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"relativeStartTimeUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"relativeToDefaultPosition"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"relativeToLiveWindow"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"release()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"release()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionManager.DrmSessionReference","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"release()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"release()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"release()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaParserChunkExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"release()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"release()"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"release()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"release()"},{"p":"com.google.android.exoplayer2.text.cea","c":"Cea608Decoder","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"CachedRegionTracker","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"release()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"release()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"release()"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"release()"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation)","url":"release(com.google.android.exoplayer2.upstream.Allocation)"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"release(Allocation[])","url":"release(com.google.android.exoplayer2.upstream.Allocation[])"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"release(ChunkSampleStream.ReleaseCallback)","url":"release(com.google.android.exoplayer2.source.chunk.ChunkSampleStream.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"release(DrmSessionEventListener.EventDispatcher)","url":"release(com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"release(Loader.ReleaseCallback)","url":"release(com.google.android.exoplayer2.upstream.Loader.ReleaseCallback)"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseChildSource(T)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"releaseCodec()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"releaseCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseDay"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"releaseDecoder()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"releaseHoleSpan(CacheSpan)","url":"releaseHoleSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"releaseLicense(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseMediaPeriod(MediaPeriod)","url":"releaseMediaPeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseMonth"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, boolean)","url":"releaseOutputBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"releaseOutputBuffer(int, long)","url":"releaseOutputBuffer(int,long)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"releaseOutputBuffer(O)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderOutputBuffer.Owner","l":"releaseOutputBuffer(S)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"releaseOutputBuffer(VideoDecoderOutputBuffer)","url":"releaseOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"releasePeriod()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"LoopingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releasePeriod(MediaPeriod)","url":"releasePeriod(com.google.android.exoplayer2.source.MediaPeriod)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"releaseSource()"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"releaseSource(MediaSource.MediaSourceCaller)","url":"releaseSource(com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"CompositeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"MergingMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"releaseSourceInternal()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"releaseYear"},{"p":"com.google.android.exoplayer2","c":"Timeline.RemotableTimeline","l":"RemotableTimeline(ImmutableList, ImmutableList, int[])","url":"%3Cinit%3E(com.google.common.collect.ImmutableList,com.google.common.collect.ImmutableList,int[])"},{"p":"com.google.android.exoplayer2.offline","c":"Downloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"ProgressiveDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"remove()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"remove(@com.google.android.exoplayer2.Player.Command int)","url":"remove(@com.google.android.exoplayer2.Player.Commandint)"},{"p":"com.google.android.exoplayer2.util","c":"CopyOnWriteMultiset","l":"remove(E)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor.QueueDataAdapter","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"remove(int)"},{"p":"com.google.android.exoplayer2.util","c":"PriorityTaskManager","l":"remove(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"remove(String)","url":"remove(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"remove(T)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeAll(@com.google.android.exoplayer2.Player.Command int...)","url":"removeAll(@com.google.android.exoplayer2.Player.Commandint...)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeAll(int...)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeAllDownloads()"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAnalyticsListener(AnalyticsListener)","url":"removeAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeAudioOffloadListener(ExoPlayer.AudioOffloadListener)","url":"removeAudioOffloadListener(com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeCallbacksAndMessages(Object)","url":"removeCallbacksAndMessages(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"removedAdGroupCount"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"removeDownload(String)","url":"removeDownload(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeDrmEventListener(DrmSessionEventListener)","url":"removeDrmEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"removeEventListener(BandwidthMeter.EventListener)","url":"removeEventListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"removeEventListener(DrmSessionEventListener)","url":"removeEventListener(com.google.android.exoplayer2.drm.DrmSessionEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"BaseMediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSource","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"removeEventListener(MediaSourceEventListener)","url":"removeEventListener(com.google.android.exoplayer2.source.MediaSourceEventListener)"},{"p":"com.google.android.exoplayer2","c":"Player.Commands.Builder","l":"removeIf(@com.google.android.exoplayer2.Player.Command int, boolean)","url":"removeIf(@com.google.android.exoplayer2.Player.Commandint,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet.Builder","l":"removeIf(int, boolean)","url":"removeIf(int,boolean)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"removeListener(AnalyticsListener)","url":"removeListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"BandwidthMeter.EventListener.EventDispatcher","l":"removeListener(BandwidthMeter.EventListener)","url":"removeListener(com.google.android.exoplayer2.upstream.BandwidthMeter.EventListener)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"removeListener(DownloadManager.Listener)","url":"removeListener(com.google.android.exoplayer2.offline.DownloadManager.Listener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"removeListener(HlsPlaylistTracker.PlaylistEventListener)","url":"removeListener(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PlaylistEventListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"removeListener(Player.EventListener)","url":"removeListener(com.google.android.exoplayer2.Player.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"removeListener(Player.Listener)","url":"removeListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeListener(String, Cache.Listener)","url":"removeListener(java.lang.String,com.google.android.exoplayer2.upstream.cache.Cache.Listener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"removeListener(TimeBar.OnScrubListener)","url":"removeListener(com.google.android.exoplayer2.ui.TimeBar.OnScrubListener)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItem(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItem","l":"RemoveMediaItem(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"removeMediaItems(int, int)","url":"removeMediaItems(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.RemoveMediaItems","l":"RemoveMediaItems(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int, Handler, Runnable)","url":"removeMediaSource(int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSource(int)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int, Handler, Runnable)","url":"removeMediaSourceRange(int,int,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"removeMediaSourceRange(int, int)","url":"removeMediaSourceRange(int,int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"removeMessages(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"removePlaylistItem(int)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"removeQueryParameter(Uri, String)","url":"removeQueryParameter(android.net.Uri,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"removeRange(List, int, int)","url":"removeRange(java.util.List,int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeResource(String)","url":"removeResource(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"removeSpan(CacheSpan)","url":"removeSpan(com.google.android.exoplayer2.upstream.cache.CacheSpan)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"removeVersion(SQLiteDatabase, int, String)","url":"removeVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener)","url":"removeVideoSurfaceListener(com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView.VideoSurfaceListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"removeVisibilityListener(PlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"removeVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"removeVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"render(long, long)","url":"render(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"renderedFirstFrame(Object)","url":"renderedFirstFrame(java.lang.Object)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"renderedOutputBufferCount"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_EXCEEDS_CAPABILITIES_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_NO_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_PLAYABLE_TRACKS"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector.MappedTrackInfo","l":"RENDERER_SUPPORT_UNSUPPORTED_TRACKS"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"RendererConfiguration(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"rendererConfigurations"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormat"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererFormatSupport"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererIndex"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"rendererName"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"renderers"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBuffer(MediaCodecAdapter, int, long)","url":"renderOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBuffer(VideoDecoderOutputBuffer, long, Format)","url":"renderOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,long,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"renderOutputBufferToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderOutputBufferToSurface(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"renderOutputBufferV21(MediaCodecAdapter, int, long, long)","url":"renderOutputBufferV21(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"renderToEndOfStream()"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"renderToSurface(VideoDecoderOutputBuffer, Surface)","url":"renderToSurface(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer,android.view.Surface)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"Rendition(Uri, Format, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.RenditionReport","l":"RenditionReport(Uri, long, int)","url":"%3Cinit%3E(android.net.Uri,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"renditionReports"},{"p":"com.google.android.exoplayer2.drm","c":"OfflineLicenseHelper","l":"renewLicense(byte[])"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ALL"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_OFF"},{"p":"com.google.android.exoplayer2","c":"Player","l":"REPEAT_MODE_ONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ALL"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"RepeatModeUtil","l":"REPEAT_TOGGLE_MODE_ONE"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"repeat(Action, long)","url":"repeat(com.google.android.exoplayer2.testutil.Action,long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context, int)","url":"%3Cinit%3E(android.content.Context,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"RepeatModeActionProvider","l":"RepeatModeActionProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource","l":"replaceManifestUri(Uri)","url":"replaceManifestUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"replaceOutputBuffer(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"replacePlaylistItem(int, MediaItem)","url":"replacePlaylistItem(int,androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"replaceSession(DrmSession, DrmSession)","url":"replaceSession(com.google.android.exoplayer2.drm.DrmSession,com.google.android.exoplayer2.drm.DrmSession)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"replaceStream(Format[], SampleStream, long, long)","url":"replaceStream(com.google.android.exoplayer2.Format[],com.google.android.exoplayer2.source.SampleStream,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadHelper","l":"replaceTrackSelections(int, DefaultTrackSelector.Parameters)","url":"replaceTrackSelections(int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"reportVideoFrameProcessingOffset(long, int)","url":"reportVideoFrameProcessingOffset(long,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"representation"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"representationHolders"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"RepresentationInfo(Format, List, SegmentBase, String, ArrayList, ArrayList, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"representations"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationSegmentIterator","l":"RepresentationSegmentIterator(DefaultDashChunkSource.RepresentationHolder, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.DefaultDashChunkSource.RepresentationHolder,long,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"request"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_NAME"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"REQUEST_HEADER_ENABLE_METADATA_VALUE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_INITIAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_NONE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RELEASE"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_RENEWAL"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm.KeyRequest","l":"REQUEST_TYPE_UPDATE"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"requestAds(DataSpec, Object, ViewGroup)","url":"requestAds(com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,android.view.ViewGroup)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"requestHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"RequestProperties()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"RequestSet(FakeDataSet)","url":"%3Cinit%3E(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer.InsufficientCapacityException","l":"requiredCapacity"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"Requirements(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"RequirementsWatcher(Context, RequirementsWatcher.Listener, Requirements)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.scheduler.RequirementsWatcher.Listener,com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"LeastRecentlyUsedCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"NoOpCacheEvictor","l":"requiresCacheSpanTouches()"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"requiresSecureDecoder(byte[], String)","url":"requiresSecureDecoder(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"requiresSecureDecoder(byte[], String)","url":"requiresSecureDecoder(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"requiresSecureDecoder(byte[], String)","url":"requiresSecureDecoder(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"requiresSecureDecoder(byte[], String)","url":"requiresSecureDecoder(byte[],java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"requiresSecureDecoder(String)","url":"requiresSecureDecoder(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ErrorStateDrmSession","l":"requiresSecureDecoder(String)","url":"requiresSecureDecoder(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.LicenseServer","l":"requiringProvisioningThenAllowingSchemeDatas(List...)","url":"requiringProvisioningThenAllowingSchemeDatas(java.util.List...)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"reset()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"BaseAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"TrueHdSampleRechunker","l":"reset()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.chunk","c":"MediaChunkIterator","l":"reset()"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"reset()"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"CapturingAudioSink","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"reset()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"SlidingPercentile","l":"reset()"},{"p":"com.google.android.exoplayer2.upstream","c":"TimeToFirstByteEstimator","l":"reset()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"reset(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"reset(byte[], int, int)","url":"reset(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[], int)","url":"reset(byte[],int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"reset(int)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"reset(long)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"reset(ParsableByteArray)","url":"reset(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"resetBytesRead()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"resetCodecStateForFlush()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"resetCodecStateForRelease()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"resetCount"},{"p":"com.google.android.exoplayer2.util","c":"NetworkTypeObserver","l":"resetForTests()"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"resetPeekPosition()"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"resetPosition(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"resetProvisioning()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"resetSupplementalData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FILL"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_HEIGHT"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_FIXED_WIDTH"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"RESIZE_MODE_ZOOM"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolve(String, String)","url":"resolve(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashUtil","l":"resolveCacheKey(Representation, RangedUri)","url":"resolveCacheKey(com.google.android.exoplayer2.source.dash.manifest.Representation,com.google.android.exoplayer2.source.dash.manifest.RangedUri)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveDataSpec(DataSpec)","url":"resolveDataSpec(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource.Resolver","l":"resolveReportedUri(Uri)","url":"resolveReportedUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"resolveSeekPositionUs(long, long, long)","url":"resolveSeekPositionUs(long,long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"resolvesToUnknownLength()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"resolvesToUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"UriUtil","l":"resolveToUri(String, String)","url":"resolveToUri(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUri(String)","url":"resolveUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"resolveUriString(String)","url":"resolveUriString(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"ResolvingDataSource","l":"ResolvingDataSource(DataSource, ResolvingDataSource.Resolver)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.ResolvingDataSource.Resolver)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound_transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"resourceNotFound()"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseBody"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseCode"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"responseHeaders"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.InvalidResponseCodeException","l":"responseMessage"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"restoreKeys(byte[], byte[])","url":"restoreKeys(byte[],byte[])"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"result"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_BUFFER_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_CONTINUE"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_END_OF_INPUT"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_FORMAT_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_MAX_LENGTH_EXCEEDED"},{"p":"com.google.android.exoplayer2","c":"C","l":"RESULT_NOTHING_READ"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"RESULT_SEEK"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"resumeDownloads()"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"retainBackBufferFromKeyframe()"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(Context, MediaItem)","url":"retrieveMetadata(android.content.Context,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"MetadataRetriever","l":"retrieveMetadata(MediaSourceFactory, MediaItem)","url":"retrieveMetadata(com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"RETRY_RESET_ERROR_COUNT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"retry()"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_NO"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_FLUSH"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITH_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderReuseEvaluation","l":"REUSE_RESULT_YES_WITHOUT_RECONFIGURATION"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"REVISION_ID_DEFAULT"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"revisionId"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation","l":"revisionId"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"rewindActionIconResourceId"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"RIFF_FOURCC"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ALTERNATE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_CAPTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_COMMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DESCRIBES_VIDEO"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_DUB"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EASY_TO_READ"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_EMERGENCY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_MAIN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SIGN"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUBTITLE"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_SUPPLEMENTARY"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRANSCRIBES_DIALOG"},{"p":"com.google.android.exoplayer2","c":"C","l":"ROLE_FLAG_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"Format","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"roleFlags"},{"p":"com.google.android.exoplayer2","c":"Format","l":"rotationDegrees"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource","l":"RtmpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSourceFactory","l":"RtmpDataSourceFactory(TransferListener)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"RTP_VERSION"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"RtpAc3Reader(RtpPayloadFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.rtsp.RtpPayloadFormat)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"RtpPayloadFormat(Format, int, int, Map)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,int,int,java.util.Map)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPayloadFormat","l":"rtpPayloadType"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.RtspPlaybackException","l":"RtspPlaybackException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"RubySpan(String, int)","url":"%3Cinit%3E(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text.span","c":"RubySpan","l":"rubyText"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread.TestRunnable","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"run()"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"run()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerRunnable","l":"run(ExoPlayer)","url":"run(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier, long, Clock)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runLooperUntil(Looper, Supplier)","url":"runLooperUntil(android.os.Looper,com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier, long, Clock)","url":"runMainLooperUntil(com.google.common.base.Supplier,long,com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.robolectric","c":"RobolectricUtil","l":"runMainLooperUntil(Supplier)","url":"runMainLooperUntil(com.google.common.base.Supplier)"},{"p":"com.google.android.exoplayer2.util","c":"RunnableFutureTask","l":"RunnableFutureTask()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(int, Runnable)","url":"runOnMainThread(int,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runOnMainThread(Runnable)","url":"runOnMainThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"runOnPlaybackThread(Runnable)","url":"runOnPlaybackThread(java.lang.Runnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long, boolean)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"runTest(HostActivity.HostedTest, long)","url":"runTest(com.google.android.exoplayer2.testutil.HostActivity.HostedTest,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(DummyMainThread.TestRunnable)","url":"runTestOnMainThread(com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"runTestOnMainThread(int, DummyMainThread.TestRunnable)","url":"runTestOnMainThread(int,com.google.android.exoplayer2.testutil.DummyMainThread.TestRunnable)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilError(ExoPlayer)","url":"runUntilError(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPendingCommandsAreFullyHandled(ExoPlayer)","url":"runUntilPendingCommandsAreFullyHandled(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlaybackState(Player, @com.google.android.exoplayer2.Player.State int)","url":"runUntilPlaybackState(com.google.android.exoplayer2.Player,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPlayWhenReady(Player, boolean)","url":"runUntilPlayWhenReady(com.google.android.exoplayer2.Player,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilPositionDiscontinuity(Player, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"runUntilPositionDiscontinuity(com.google.android.exoplayer2.Player,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer)","url":"runUntilReceiveOffloadSchedulingEnabledNewState(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilRenderedFirstFrame(ExoPlayer)","url":"runUntilRenderedFirstFrame(com.google.android.exoplayer2.ExoPlayer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilSleepingForOffload(ExoPlayer, boolean)","url":"runUntilSleepingForOffload(com.google.android.exoplayer2.ExoPlayer,boolean)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player, Timeline)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestPlayerRunHelper","l":"runUntilTimelineChanged(Player)","url":"runUntilTimelineChanged(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector.MediaMetadataProvider","l":"sameAs(MediaMetadataCompat, MediaMetadataCompat)","url":"sameAs(android.support.v4.media.MediaMetadataCompat,android.support.v4.media.MediaMetadataCompat)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_ENCRYPTION"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_MAIN"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"SAMPLE_DATA_PART_SUPPLEMENTAL"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util","l":"SAMPLE_HEADER_SIZE"},{"p":"com.google.android.exoplayer2.audio","c":"OpusUtil","l":"SAMPLE_RATE"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SAMPLE_RATE_NO_CHANGE"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream.FakeSampleStreamItem","l":"sample(long, int, byte[])","url":"sample(long,int,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"sampleBufferReadCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleCount"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(DataReader, int, boolean, int)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(DataReader, int, boolean)","url":"sampleData(com.google.android.exoplayer2.upstream.DataReader,int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleData(ParsableByteArray, int, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleData(ParsableByteArray, int)","url":"sampleData(com.google.android.exoplayer2.util.ParsableByteArray,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler.PlayerTrackEmsgHandler","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackOutput","l":"sampleMetadata(long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrueHdSampleRechunker","l":"sampleMetadata(TrackOutput, long, int, int, int, TrackOutput.CryptoData)","url":"sampleMetadata(com.google.android.exoplayer2.extractor.TrackOutput,long,int,int,int,com.google.android.exoplayer2.extractor.TrackOutput.CryptoData)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleMimeType"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"sampleNumber"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacFrameReader.SampleNumberHolder","l":"SampleNumberHolder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"SampleQueue(Allocator, Looper, DrmSessionManager, DrmSessionEventListener.EventDispatcher)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.Allocator,android.os.Looper,com.google.android.exoplayer2.drm.DrmSessionManager,com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher)"},{"p":"com.google.android.exoplayer2.source.hls","c":"SampleQueueMappingException","l":"SampleQueueMappingException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"Ac4Util.SyncFrameInfo","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRate"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"sampleRate"},{"p":"com.google.android.exoplayer2.audio","c":"AacUtil.Config","l":"sampleRateHz"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"sampleRateLookupKey"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"samplesPerFrame"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"sampleTransformation"},{"p":"com.google.android.exoplayer2","c":"C","l":"SANS_SERIF_NAME"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamp(long, long, long)","url":"scaleLargeTimestamp(long,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestamps(List, long, long)","url":"scaleLargeTimestamps(java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"scaleLargeTimestampsInPlace(long[], long, long)","url":"scaleLargeTimestampsInPlace(long[],long,long)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"PlatformScheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Scheduler","l":"schedule(Requirements, String, String)","url":"schedule(com.google.android.exoplayer2.scheduler.Requirements,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler.SchedulerWorker","l":"SchedulerWorker(Context, WorkerParameters)","url":"%3Cinit%3E(android.content.Context,androidx.work.WorkerParameters)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"scheme"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSchemeDataSource","l":"SCHEME_DATA"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"SchemeData(UUID, String, String, byte[])","url":"%3Cinit%3E(java.util.UUID,java.lang.String,java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeDataCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"schemeIdUri"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"schemeType"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"schemeType"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"SCTE35_SCHEME_ID"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"SDK_INT"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSeeker","l":"searchForTimestamp(ExtractorInput, long)","url":"searchForTimestamp(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"second"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"SectionReader(SectionPayloadReader)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.ts.SectionPayloadReader)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"secure"},{"p":"com.google.android.exoplayer2.video","c":"DummySurface","l":"secure"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_NONE"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_PROTECTED_PBUFFER"},{"p":"com.google.android.exoplayer2.util","c":"EGLSurfaceTexture","l":"SECURE_MODE_SURFACELESS_CONTEXT"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer.DecoderInitializationException","l":"secureDecoderRequired"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DtsReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"DvbSubtitleReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"ElementaryStreamReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H262Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H263Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H264Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"H265Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Id3Reader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"LatmReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"MpegAudioReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PesReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SectionReader","l":"seek()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader","l":"seek()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long, boolean)","url":"seek(int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(int, long)","url":"seek(int,long)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"BundledExtractorsAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaParserExtractorAdapter","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpAc3Reader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","c":"RtpPayloadReader","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"seek(long, long)","url":"seek(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seek(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Seek","l":"Seek(String, long)","url":"%3Cinit%3E(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"seekAndWait(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekBack()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekForward()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekForward()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekMap"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"seekMap(SeekMap)","url":"seekMap(com.google.android.exoplayer2.extractor.SeekMap)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekOperationParams"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekOperationParams","l":"SeekOperationParams(long, long, long, long, long, long, long)","url":"%3Cinit%3E(long,long,long,long,long,long,long)"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"SeekParameters(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"SeekPoint(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint, SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint,com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"SeekPoints(SeekPoint)","url":"%3Cinit%3E(com.google.android.exoplayer2.extractor.SeekPoint)"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"seekTable"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata.SeekTable","l":"SeekTable(long[], long[])","url":"%3Cinit%3E(long[],long[])"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"seekTo(int, long)","url":"seekTo(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"seekTo(long, boolean)","url":"seekTo(long,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"seekTo(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToDefaultPosition(int)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNext()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToNextWindow()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"seekToPosition(ExtractorInput, long, PositionHolder)","url":"seekToPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long,com.google.android.exoplayer2.extractor.PositionHolder)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"seekToPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPrevious()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousMediaItem()"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"seekToPreviousWindow()"},{"p":"com.google.android.exoplayer2.testutil","c":"TestUtil","l":"seekToTimeUs(Extractor, SeekMap, long, DataSource, FakeTrackOutput, Uri)","url":"seekToTimeUs(com.google.android.exoplayer2.extractor.Extractor,com.google.android.exoplayer2.extractor.SeekMap,long,com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.testutil.FakeTrackOutput,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"seekToUs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"Segment(long, DataSpec)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"Segment(long, long, int)","url":"%3Cinit%3E(long,long,int)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, HlsMediaPlaylist.Segment, String, long, int, long, DrmInitData, String, String, long, long, boolean, List)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment,java.lang.String,long,int,long,com.google.android.exoplayer2.drm.DrmInitData,java.lang.String,java.lang.String,long,long,boolean,java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"Segment(String, long, long, String, String)","url":"%3Cinit%3E(java.lang.String,long,long,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifestParser.RepresentationInfo","l":"segmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase","l":"SegmentBase(RangedUri, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader","l":"SegmentDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"segmentIndex"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentList","l":"SegmentList(RangedUri, long, long, long, long, List, long, List, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,java.util.List,long,long)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"segments"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"segments"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTemplate","l":"SegmentTemplate(RangedUri, long, long, long, long, long, List, long, UrlTemplate, UrlTemplate, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,long,java.util.List,long,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,com.google.android.exoplayer2.source.dash.manifest.UrlTemplate,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SegmentTimelineElement","l":"SegmentTimelineElement(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"SeiReader","l":"SeiReader(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAllTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], DefaultTrackSelector.Parameters)","url":"selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectAudioTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2.source.dash","c":"BaseUrlExclusionList","l":"selectBaseUrl(List)","url":"selectBaseUrl(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource.RepresentationHolder","l":"selectedBaseUrl"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"selectEmbeddedTrack(long, int)","url":"selectEmbeddedTrack(long,int)"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_AUTOSELECT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_FLAG_FORCED"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_ADAPTIVE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_INITIAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_MANUAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_TRICK_PLAY"},{"p":"com.google.android.exoplayer2","c":"C","l":"SELECTION_REASON_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"Format","l":"selectionFlags"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"selectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int...)","url":"%3Cinit%3E(int,int...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"SelectionOverride(int, int[], @com.google.android.exoplayer2.trackselection.TrackSelection.Type int)","url":"%3Cinit%3E(int,int[],@com.google.android.exoplayer2.trackselection.TrackSelection.Typeint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"selections"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectOtherTrack(int, TrackGroupArray, int[][], DefaultTrackSelector.Parameters)","url":"selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTextTrack(TrackGroupArray, int[][], DefaultTrackSelector.Parameters, String)","url":"selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAdaptiveMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"selectTracks(ExoTrackSelection[], boolean[], SampleStream[], boolean[], long)","url":"selectTracks(com.google.android.exoplayer2.trackselection.ExoTrackSelection[],boolean[],com.google.android.exoplayer2.source.SampleStream[],boolean[],long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(MappingTrackSelector.MappedTrackInfo, int[][][], int[], MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"MappingTrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"selectTracks(RendererCapabilities[], TrackGroupArray, MediaSource.MediaPeriodId, Timeline)","url":"selectTracks(com.google.android.exoplayer2.RendererCapabilities[],com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"selectUndeterminedTextLanguage"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"selectVideoTrack(TrackGroupArray, int[][], int, DefaultTrackSelector.Parameters, boolean)","url":"selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int[][],int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"send()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendAddDownload(Context, Class, DownloadRequest, int, boolean)","url":"sendAddDownload(android.content.Context,java.lang.Class,com.google.android.exoplayer2.offline.DownloadRequest,int,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessage(int)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageAtTime(int, long)","url":"sendEmptyMessageAtTime(int,long)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendEmptyMessageDelayed(int, int)","url":"sendEmptyMessageDelayed(int,int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"sendEvent(AnalyticsListener.EventTime, int, ListenerSet.Event)","url":"sendEvent(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"sendEvent(int, ListenerSet.Event)","url":"sendEvent(int,com.google.android.exoplayer2.util.ListenerSet.Event)"},{"p":"com.google.android.exoplayer2.audio","c":"AuxEffectInfo","l":"sendLevel"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long, boolean)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, int, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"sendMessage(PlayerMessage.Target, long)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage.Sender","l":"sendMessage(PlayerMessage)","url":"sendMessage(com.google.android.exoplayer2.PlayerMessage)"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper","l":"sendMessageAtFrontOfQueue(HandlerWrapper.Message)","url":"sendMessageAtFrontOfQueue(com.google.android.exoplayer2.util.HandlerWrapper.Message)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, int, long, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,int,long,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SendMessages","l":"SendMessages(String, PlayerMessage.Target, long)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlayerMessage.Target,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendPauseDownloads(Context, Class, boolean)","url":"sendPauseDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveAllDownloads(Context, Class, boolean)","url":"sendRemoveAllDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendRemoveDownload(Context, Class, String, boolean)","url":"sendRemoveDownload(android.content.Context,java.lang.Class,java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendResumeDownloads(Context, Class, boolean)","url":"sendResumeDownloads(android.content.Context,java.lang.Class,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetRequirements(Context, Class, Requirements, boolean)","url":"sendSetRequirements(android.content.Context,java.lang.Class,com.google.android.exoplayer2.scheduler.Requirements,boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"sendSetStopReason(Context, Class, String, int, boolean)","url":"sendSetStopReason(android.content.Context,java.lang.Class,java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock.HandlerMessage","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"HandlerWrapper.Message","l":"sendToTarget()"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"separateColorPlaneFlag"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.PpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"seqParameterSetId"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"sequenceNumber"},{"p":"com.google.android.exoplayer2","c":"C","l":"SERIF_NAME"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"serverControl"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"ServerControl(long, boolean, long, long, boolean)","url":"%3Cinit%3E(long,boolean,long,long,boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"ServerSideInsertedAdsMediaSource(MediaSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"serviceDescription"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"ServiceDescriptionElement(long, long, long, float, float)","url":"%3Cinit%3E(long,long,long,float,float)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"serviceLocation"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"SessionCallbackBuilder(Context, SessionPlayerConnector)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.ext.media2.SessionPlayerConnector)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"sessionForClearTypes"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkCryptoConfig","l":"sessionId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"sessionKeyDrmInitData"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player, MediaItemConverter)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ext.media2.MediaItemConverter)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"SessionPlayerConnector(Player)","url":"%3Cinit%3E(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.decoder","c":"CryptoInfo","l":"set(int, int[], int[], byte[], byte[], int, int, int)","url":"set(int,int[],int[],byte[],byte[],int,int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(Map)","url":"set(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"set(Object, MediaItem, Object, long, long, long, boolean, boolean, MediaItem.LiveConfiguration, long, long, int, int, long)","url":"set(java.lang.Object,com.google.android.exoplayer2.MediaItem,java.lang.Object,long,long,long,boolean,boolean,com.google.android.exoplayer2.MediaItem.LiveConfiguration,long,long,int,int,long)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long, AdPlaybackState, boolean)","url":"set(java.lang.Object,java.lang.Object,int,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,boolean)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"set(Object, Object, int, long, long)","url":"set(java.lang.Object,java.lang.Object,int,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, byte[])","url":"set(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, long)","url":"set(java.lang.String,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.RequestProperties","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"set(TrackSelectionParameters)","url":"set(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"set(TrackSelectionParameters)","url":"set(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAccessibilityChannel(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setActionSchedule(ActionSchedule)","url":"setActionSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdErrorListener(AdErrorEvent.AdErrorListener)","url":"setAdErrorListener(com.google.ads.interactivemedia.v3.api.AdErrorEvent.AdErrorListener)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdEventListener(AdEvent.AdEventListener)","url":"setAdEventListener(com.google.ads.interactivemedia.v3.api.AdEvent.AdEventListener)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setAdGroupTimesMs(long[], boolean[], int)","url":"setAdGroupTimesMs(long[],boolean[],int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdMediaMimeTypes(List)","url":"setAdMediaMimeTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source.ads","c":"ServerSideInsertedAdsMediaSource","l":"setAdPlaybackState(AdPlaybackState)","url":"setAdPlaybackState(com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdPreloadTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdsConfiguration(MediaItem.AdsConfiguration)","url":"setAdsConfiguration(com.google.android.exoplayer2.MediaItem.AdsConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration.Builder","l":"setAdsId(Object)","url":"setAdsId(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdsLoaderProvider(DefaultMediaSourceFactory.AdsLoaderProvider)","url":"setAdsLoaderProvider(com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(String)","url":"setAdTagUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri, Object)","url":"setAdTagUri(android.net.Uri,java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.AdsConfiguration.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setAdTagUri(Uri)","url":"setAdTagUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAdtsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setAdUiElements(Set)","url":"setAdUiElements(java.util.Set)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setAdViewProvider(AdViewProvider)","url":"setAdViewProvider(com.google.android.exoplayer2.ui.AdViewProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumArtist(CharSequence)","url":"setAlbumArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setAlbumTitle(CharSequence)","url":"setAlbumTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setAllocator(DefaultAllocator)","url":"setAllocator(com.google.android.exoplayer2.upstream.DefaultAllocator)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedChannelCountAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowAudioMixedSampleRateAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setAllowChunklessPreparation(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setAllowCrossProtocolRedirects(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setAllowedCapturePolicy(@com.google.android.exoplayer2.C.AudioAllowedCapturePolicy int)","url":"setAllowedCapturePolicy(@com.google.android.exoplayer2.C.AudioAllowedCapturePolicyint)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setAllowedCommandProvider(SessionCallbackBuilder.AllowedCommandProvider)","url":"setAllowedCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.AllowedCommandProvider)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setAllowedVideoJoiningTimeMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowMultipleAdaptiveSelections(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setAllowMultipleOverrides(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setAllowPreparation(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoMixedMimeTypeAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setAllowVideoNonSeamlessAdaptiveness(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setAmrExtractorFlags(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAnalyticsCollector(AnalyticsCollector)","url":"setAnalyticsCollector(com.google.android.exoplayer2.analytics.AnalyticsCollector)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setAnalyticsListener(AnalyticsListener)","url":"setAnalyticsListener(com.google.android.exoplayer2.analytics.AnalyticsListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setAnimationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedFontSizes(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setApplyEmbeddedStyles(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtist(CharSequence)","url":"setArtist(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[], Integer)","url":"setArtworkData(byte[],java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkData(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setArtworkUri(Uri)","url":"setArtworkUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setAspectRatioListener(AspectRatioFrameLayout.AspectRatioListener)","url":"setAspectRatioListener(com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setAudioAttributes(AudioAttributes, boolean)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioAttributes(AudioAttributes)","url":"setAudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setAudioAttributes(AudioAttributesCompat)","url":"setAudioAttributes(androidx.media.AudioAttributesCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetAudioAttributes","l":"SetAudioAttributes(String, AudioAttributes, boolean)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.audio.AudioAttributes,boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setAudioMimeType(String)","url":"setAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setAudioSessionId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setAuxEffectInfo(AuxEffectInfo)","url":"setAuxEffectInfo(com.google.android.exoplayer2.audio.AuxEffectInfo)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setAverageBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBackBuffer(int, boolean)","url":"setBackBuffer(int,boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setBadgeIconType(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setBandwidthMeter(BandwidthMeter)","url":"setBandwidthMeter(com.google.android.exoplayer2.upstream.BandwidthMeter)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmap(Bitmap)","url":"setBitmap(android.graphics.Bitmap)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setBitmapHeight(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setBold(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setBottomPaddingFraction(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Attribute","l":"setBuffer(float[], int)","url":"setBuffer(float[],int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setBufferDurationsMs(int, int, int, int)","url":"setBufferDurationsMs(int,int,int,int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setBufferedPosition(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setBufferSize(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setBytesDownloaded(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCache(Cache)","url":"setCache(com.google.android.exoplayer2.upstream.cache.Cache)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setCacheControl(CacheControl)","url":"setCacheControl(okhttp3.CacheControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCacheKey(String)","url":"setCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheKeyFactory(CacheKeyFactory)","url":"setCacheKeyFactory(com.google.android.exoplayer2.upstream.cache.CacheKeyFactory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheReadDataSourceFactory(DataSource.Factory)","url":"setCacheReadDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setCacheWriteDataSinkFactory(DataSink.Factory)","url":"setCacheWriteDataSinkFactory(com.google.android.exoplayer2.upstream.DataSink.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.PlayerTarget","l":"setCallback(ActionSchedule.PlayerTarget.Callback)","url":"setCallback(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setCameraMotionListener(CameraMotionListener)","url":"setCameraMotionListener(com.google.android.exoplayer2.video.spherical.CameraMotionListener)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCaptionCallback(MediaSessionConnector.CaptionCallback)","url":"setCaptionCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CaptionCallback)"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"setChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setChannelCount(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelDescriptionResourceId(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelImportance(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setChannelNameResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipEndPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClippingConfiguration(MediaItem.ClippingConfiguration)","url":"setClippingConfiguration(com.google.android.exoplayer2.MediaItem.ClippingConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"setClippingError(ClippingMediaSource.IllegalClippingException)","url":"setClippingError(com.google.android.exoplayer2.source.ClippingMediaSource.IllegalClippingException)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setClipStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setClock(Clock)","url":"setClock(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCodecs(String)","url":"setCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColor(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setColorInfo(ColorInfo)","url":"setColorInfo(com.google.android.exoplayer2.video.ColorInfo)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setColorized(boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setCombineUpright(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setCompanionAdSlots(Collection)","url":"setCompanionAdSlots(java.util.Collection)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setCompilation(CharSequence)","url":"setCompilation(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setComposer(CharSequence)","url":"setComposer(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setCompositeSequenceableLoaderFactory(CompositeSequenceableLoaderFactory)","url":"setCompositeSequenceableLoaderFactory(com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setConductor(CharSequence)","url":"setConductor(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setConnectionTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setConnectTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingAlwaysEnabled(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setConstantBitrateSeekingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setContainerMimeType(String)","url":"setContainerMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"setContent(long, Subtitle, long)","url":"setContent(long,com.google.android.exoplayer2.text.Subtitle,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setContentLength(ContentMetadataMutations, long)","url":"setContentLength(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setContentLength(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setContentType(@com.google.android.exoplayer2.C.AudioContentType int)","url":"setContentType(@com.google.android.exoplayer2.C.AudioContentTypeint)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setContentTypePredicate(Predicate)","url":"setContentTypePredicate(com.google.common.base.Predicate)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setContext(Context)","url":"setContext(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setContinueLoadingCheckIntervalBytes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerAutoShow(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideDuringAds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerHideOnTouch(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setControllerOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setControllerVisibilityListener(PlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.PlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)","url":"setControllerVisibilityListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.VisibilityListener)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setCryptoType(@com.google.android.exoplayer2.C.CryptoType int)","url":"setCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)"},{"p":"com.google.android.exoplayer2.util","c":"MediaFormatUtil","l":"setCsdBuffers(MediaFormat, List)","url":"setCsdBuffers(android.media.MediaFormat,java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setCsrc(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setCues(List)","url":"setCues(java.util.List)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setCurrentPosition(long)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setCurrentStreamFinal()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomActionProviders(MediaSessionConnector.CustomActionProvider...)","url":"setCustomActionProviders(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CustomActionProvider...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setCustomActionReceiver(PlayerNotificationManager.CustomActionReceiver)","url":"setCustomActionReceiver(com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionReceiver)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setCustomCacheKey(String)","url":"setCustomCacheKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setCustomCommandProvider(SessionCallbackBuilder.CustomCommandProvider)","url":"setCustomCommandProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.CustomCommandProvider)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setCustomData(Object)","url":"setCustomData(java.lang.Object)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int, Bundle)","url":"setCustomErrorMessage(java.lang.CharSequence,int,android.os.Bundle)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence, int)","url":"setCustomErrorMessage(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setCustomErrorMessage(CharSequence)","url":"setCustomErrorMessage(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setCustomMetadata(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setData(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(String, byte[])","url":"setData(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setData(Uri, byte[])","url":"setData(android.net.Uri,byte[])"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"InputReaderAdapterV30","l":"setDataReader(DataReader, long)","url":"setDataReader(com.google.android.exoplayer2.upstream.DataReader,long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDebugLoggingEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setDebugModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setDecoderOutputMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDeduplicateConsecutiveFormats(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setDefaultArtwork(Drawable)","url":"setDefaultArtwork(android.graphics.drawable.Drawable)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.BaseFactory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.Factory","l":"setDefaultRequestProperties(Map)","url":"setDefaultRequestProperties(java.util.Map)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setDefaults(int)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setDefaultStereoMode(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setDeleteAfterDelivery(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDescription(CharSequence)","url":"setDescription(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setDetachSurfaceTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setDeviceMuted(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.DeviceComponent","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setDeviceVolume(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTextTrackSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int)","url":"setDisabledTextTrackSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setDisabledTrackTypes(Set)","url":"setDisabledTrackTypes(java.util.Set)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setDisabledTrackTypes(Set)","url":"setDisabledTrackTypes(java.util.Set)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDiscNumber(Integer)","url":"setDiscNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setDisconnectedCallback(SessionCallbackBuilder.DisconnectedCallback)","url":"setDisconnectedCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.DisconnectedCallback)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setDiscontinuityPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setDispatchUnsupportedActionsEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setDisplayTitle(CharSequence)","url":"setDisplayTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setDownloadingStatesToQueued()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmConfiguration(MediaItem.DrmConfiguration)","url":"setDrmConfiguration(com.google.android.exoplayer2.MediaItem.DrmConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"setDrmHttpDataSourceFactory(HttpDataSource.Factory)","url":"setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setDrmInitData(DrmInitData)","url":"setDrmInitData(com.google.android.exoplayer2.drm.DrmInitData)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmKeySetId(byte[])"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseRequestHeaders(Map)","url":"setDrmLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(String)","url":"setDrmLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmLicenseUri(Uri)","url":"setDrmLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmMultiSession(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearPeriods(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmSessionForClearTypes(List)","url":"setDrmSessionForClearTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"setDrmSessionManager(DrmSessionManager)","url":"setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"setDrmSessionManagerProvider(DrmSessionManagerProvider)","url":"setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManagerProvider","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"setDrmUserAgent(String)","url":"setDrmUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setDrmUuid(UUID)","url":"setDrmUuid(java.util.UUID)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.AssertionConfig.Builder","l":"setDumpFilesPrefix(String)","url":"setDumpFilesPrefix(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setDuration(long)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setDurationUs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioFloatOutput(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioOffload(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableAudioTrackPlaybackParams(boolean)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setEnableContinuousPlayback(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setEnableDecoderFallback(boolean)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setEnabledPlaybackActions(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderDelay(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setEncoderPadding(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"setEndPositionMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setEnforceValidKeyResponses(boolean)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setErrorMessageProvider(ErrorMessageProvider)","url":"setErrorMessageProvider(com.google.android.exoplayer2.util.ErrorMessageProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setEventListener(CacheDataSource.EventListener)","url":"setEventListener(com.google.android.exoplayer2.upstream.cache.CacheDataSource.EventListener)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedAudioConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedRendererCapabilitiesIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setExceedVideoConstraintsIfNecessary(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setExpectedBytes(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setExpectedPlayerEndedCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setExtensionRendererMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setExtraAdGroupMarkers(long[], boolean[])","url":"setExtraAdGroupMarkers(long[],boolean[])"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setExtractorFactory(HlsExtractorFactory)","url":"setExtractorFactory(com.google.android.exoplayer2.source.hls.HlsExtractorFactory)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setExtractorOutput(ExtractorOutput)","url":"setExtractorOutput(com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setExtractorsFactory(ExtractorsFactory)","url":"setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setExtras(Bundle)","url":"setExtras(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setFailureReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setFakeDataSet(FakeDataSet)","url":"setFakeDataSet(com.google.android.exoplayer2.testutil.FakeDataSet)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setFallbackFactory(HttpDataSource.Factory)","url":"setFallbackFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setFallbackMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setFallbackTargetLiveOffsetMs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setFastForwardActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setFastForwardIncrementMs(int)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"setFinalStreamEndPositionUs(long)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFixedTextSize(int, float)","url":"setFixedTextSize(int,float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFlacExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setFlags(@com.google.android.exoplayer2.C.AudioFlags int)","url":"setFlags(@com.google.android.exoplayer2.C.AudioFlagsint)"},{"p":"com.google.android.exoplayer2.decoder","c":"Buffer","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setFlags(int)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setFlattenForSlowMotion(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloat(float)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setFloats(float[])"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setFocusSkipButtonWhenAvailable(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setFolderType(Integer)","url":"setFolderType(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontColor(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontFamily(String)","url":"setFontFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSize(float)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setFontSizeUnit(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setForceDefaultLicenseUri(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setForcedSessionTrackTypes(List)","url":"setForcedSessionTrackTypes(java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceHighestSupportedBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setForceLowestBitrate(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setForceUseRtpTcp(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setForegroundMode(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"setForHeaderData(int)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float, boolean)","url":"setFractionalTextSize(float,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setFractionalTextSize(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setFragmentedMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink.Factory","l":"setFragmentSize(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setFrameRate(float)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromMetadata(Metadata)","url":"setFromMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.extractor","c":"GaplessInfoHolder","l":"setFromXingHeaderValue(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setGenre(CharSequence)","url":"setGenre(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setGroup(String)","url":"setGroup(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setGzipSupport(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setHandleAudioBecomingNoisy(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setHandler(Handler)","url":"setHandler(android.os.Handler)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setHandleSetCookieRequests(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setHandleWakeLock(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setHeight(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpBody(byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpMethod(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setHttpRequestHeaders(Map)","url":"setHttpRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setId(String)","url":"setId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setImaSdkSettings(ImaSdkSettings)","url":"setImaSdkSettings(com.google.ads.interactivemedia.v3.api.ImaSdkSettings)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setIndex(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AdditionalFailureInfo","l":"setInfo(String)","url":"setInfo(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(int, long)","url":"setInitialBitrateEstimate(int,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setInitialBitrateEstimate(String)","url":"setInitialBitrateEstimate(java.lang.String)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"setInitialInputBufferSize(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setInitializationData(List)","url":"setInitializationData(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setIsDisabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSource.Factory","l":"setIsNetwork(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setIsPlayable(Boolean)","url":"setIsPlayable(java.lang.Boolean)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setItalic(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setKeepContentOnPlayerReset(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setKeepPostFor302Redirects(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setKey(String)","url":"setKey(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyCountIncrement(int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setKeyRequestParameters(Map)","url":"setKeyRequestParameters(java.util.Map)"},{"p":"com.google.android.exoplayer2.drm","c":"HttpMediaDrmCallback","l":"setKeyRequestProperty(String, String)","url":"setKeyRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setKeySetId(byte[])"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setKeyTimeIncrement(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setLanguage(String)","url":"setLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setLength(long)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"setLibraries(@com.google.android.exoplayer2.C.CryptoType int, String...)","url":"setLibraries(@com.google.android.exoplayer2.C.CryptoTypeint,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"setLibraries(@com.google.android.exoplayer2.C.CryptoType int, String...)","url":"setLibraries(@com.google.android.exoplayer2.C.CryptoTypeint,java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacLibrary","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2.util","c":"LibraryLoader","l":"setLibraries(String...)","url":"setLibraries(java.lang.String...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setLicenseRequestHeaders(Map)","url":"setLicenseRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setLicenseUri(String)","url":"setLicenseUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setLicenseUri(Uri)","url":"setLicenseUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setLimit(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLine(float, @com.google.android.exoplayer2.text.Cue.LineType int)","url":"setLine(float,@com.google.android.exoplayer2.text.Cue.LineTypeint)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setLineAnchor(@com.google.android.exoplayer2.text.Cue.AnchorType int)","url":"setLineAnchor(@com.google.android.exoplayer2.text.Cue.AnchorTypeint)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setLinethrough(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setListener(AudioSink.Listener)","url":"setListener(com.google.android.exoplayer2.audio.AudioSink.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"setListener(PlaybackSessionManager.Listener)","url":"setListener(com.google.android.exoplayer2.analytics.PlaybackSessionManager.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"setListener(TranscodingTransformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.TranscodingTransformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setListener(TranscodingTransformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.TranscodingTransformer.Listener)"},{"p":"com.google.android.exoplayer2.upstream","c":"FileDataSource.Factory","l":"setListener(TransferListener)","url":"setListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setListener(Transformer.Listener)","url":"setListener(com.google.android.exoplayer2.transformer.Transformer.Listener)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveConfiguration(MediaItem.LiveConfiguration)","url":"setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMaxSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveMinSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLivePlaybackSpeedControl(LivePlaybackSpeedControl)","url":"setLivePlaybackSpeedControl(com.google.android.exoplayer2.LivePlaybackSpeedControl)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLivePresentationDelayMs(long, boolean)","url":"setLivePresentationDelayMs(long,boolean)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLivePresentationDelayMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLiveTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLoadControl(LoadControl)","url":"setLoadControl(com.google.android.exoplayer2.LoadControl)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSourceFactory","l":"setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy)","url":"setLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogLevel(int)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"setLogStackTraces(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setLooper(Looper)","url":"setLooper(android.os.Looper)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setManifest(Object)","url":"setManifest(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setManifestParser(ParsingLoadable.Parser)","url":"setManifestParser(com.google.android.exoplayer2.upstream.ParsingLoadable.Parser)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setMarker(boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMatroskaExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxAudioChannelCount(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setMaxConcurrentSessions(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMaxInputSize(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMaxLiveOffsetErrorMsForUnitSpeed(long)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMaxMediaBitrate(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"setMaxOffsetMs(long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMaxParallelDownloads(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"setMaxPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSize(int, int)","url":"setMaxVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMaxVideoSizeSd()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaButtonEventHandler(MediaSessionConnector.MediaButtonEventHandler)","url":"setMediaButtonEventHandler(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaButtonEventHandler)"},{"p":"com.google.android.exoplayer2","c":"DefaultRenderersFactory","l":"setMediaCodecSelector(MediaCodecSelector)","url":"setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setMediaDescriptionAdapter(PlayerNotificationManager.MediaDescriptionAdapter)","url":"setMediaDescriptionAdapter(com.google.android.exoplayer2.ui.PlayerNotificationManager.MediaDescriptionAdapter)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaId(String)","url":"setMediaId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, boolean)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,boolean)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem, long)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItem(MediaItem)","url":"setMediaItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setMediaItem(MediaItem)","url":"setMediaItem(androidx.media2.common.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setMediaItemProvider(SessionCallbackBuilder.MediaItemProvider)","url":"setMediaItemProvider(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.MediaItemProvider)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setMediaItems(List, boolean)","url":"setMediaItems(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setMediaItems(List, int, long)","url":"setMediaItems(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setMediaItems(List)","url":"setMediaItems(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItems","l":"SetMediaItems(String, int, long, MediaSource...)","url":"%3Cinit%3E(java.lang.String,int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetMediaItemsResetPosition","l":"SetMediaItemsResetPosition(String, boolean, MediaSource...)","url":"%3Cinit%3E(java.lang.String,boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setMediaLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMediaMetadata(MediaMetadata)","url":"setMediaMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMediaMetadataProvider(MediaSessionConnector.MediaMetadataProvider)","url":"setMediaMetadataProvider(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.MediaMetadataProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setMediaSessionToken(MediaSessionCompat.Token)","url":"setMediaSessionToken(android.support.v4.media.session.MediaSessionCompat.Token)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, boolean)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource, long)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSource(MediaSource)","url":"setMediaSource(com.google.android.exoplayer2.source.MediaSource)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setMediaSourceFactory(MediaSourceFactory)","url":"setMediaSourceFactory(com.google.android.exoplayer2.source.MediaSourceFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(boolean, MediaSource...)","url":"setMediaSources(boolean,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(int, long, MediaSource...)","url":"setMediaSources(int,long,com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, boolean)","url":"setMediaSources(java.util.List,boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List, int, long)","url":"setMediaSources(java.util.List,int,long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setMediaSources(List)","url":"setMediaSources(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setMediaSources(MediaSource...)","url":"setMediaSources(com.google.android.exoplayer2.source.MediaSource...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setMediaUri(Uri)","url":"setMediaUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setMetadata(Metadata)","url":"setMetadata(com.google.android.exoplayer2.metadata.Metadata)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setMetadataDeduplicationEnabled(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setMetadataType(@com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataType int)","url":"setMetadataType(@com.google.android.exoplayer2.source.hls.HlsMediaSource.MetadataTypeint)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setMimeType(String)","url":"setMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"setMinOffsetMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"setMinPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinPossibleLiveOffsetSmoothingFactor(float)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setMinRetryCount(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setMinUpdateIntervalMs(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoBitrate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoFrameRate(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setMinVideoSize(int, int)","url":"setMinVideoSize(int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager","l":"setMode(int, byte[])","url":"setMode(int,byte[])"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp3ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setMp4ExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setMultiRowAlignment(Layout.Alignment)","url":"setMultiRowAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setMultiSession(boolean)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setMuxedCaptionFormats(List)","url":"setMuxedCaptionFormats(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setName(String)","url":"setName(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter","l":"setNetworkTypeOverride(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline, boolean)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaSource","l":"setNewSourceInfo(Timeline)","url":"setNewSourceInfo(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNextActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.util","c":"NotificationUtil","l":"setNotification(Context, int, Notification)","url":"setNotification(android.content.Context,int,android.app.Notification)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setNotificationListener(PlayerNotificationManager.NotificationListener)","url":"setNotificationListener(com.google.android.exoplayer2.ui.PlayerNotificationManager.NotificationListener)"},{"p":"com.google.android.exoplayer2.util","c":"SntpClient","l":"setNtpHost(String)","url":"setNtpHost(java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnEventListener(ExoMediaDrm.OnEventListener)","url":"setOnEventListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnExpirationUpdateListener(ExoMediaDrm.OnExpirationUpdateListener)","url":"setOnExpirationUpdateListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOnFrameRenderedListener(MediaCodecAdapter.OnFrameRenderedListener, Handler)","url":"setOnFrameRenderedListener(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.OnFrameRenderedListener,android.os.Handler)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setOnFullScreenModeChangedListener(StyledPlayerControlView.OnFullScreenModeChangedListener)","url":"setOnFullScreenModeChangedListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.OnFullScreenModeChangedListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setOnKeyStatusChangeListener(ExoMediaDrm.OnKeyStatusChangeListener)","url":"setOnKeyStatusChangeListener(com.google.android.exoplayer2.drm.ExoMediaDrm.OnKeyStatusChangeListener)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"setOutput(Object)","url":"setOutput(java.lang.Object)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderOutputBufferRenderer","l":"setOutputBuffer(VideoDecoderOutputBuffer)","url":"setOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setOutputMimeType(String)","url":"setOutputMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Gav1Decoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"setOutputMode(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setOutputSampleRateHz(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setOutputSurface(Surface)","url":"setOutputSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setOutputSurfaceV23(MediaCodecAdapter, Surface)","url":"setOutputSurfaceV23(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setOverallRating(Rating)","url":"setOverallRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverride(DefaultTrackSelector.SelectionOverride)","url":"setOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.Builder","l":"setOverrideForType(TrackSelectionOverrides.TrackSelectionOverride)","url":"setOverrideForType(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setOverrides(List)","url":"setOverrides(java.util.List)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPadding(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setParameters(Bundle)","url":"setParameters(android.os.Bundle)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(DefaultTrackSelector.ParametersBuilder)","url":"setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector","l":"setParameters(TrackSelectionParameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"setParameters(TrackSelectionParameters)","url":"setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPauseActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPauseAtEndOfMediaItems(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPayload(Object)","url":"setPayload(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadData(byte[])"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setPayloadType(byte)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPcmEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPeakBitrate(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingOutputEndOfStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPendingPlaybackException(ExoPlaybackException)","url":"setPendingPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setPercentDownloaded(float)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setPitch(float)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setPixelWidthHeightRatio(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPlayActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setPlayAdBeforeStartPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"MediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"setPlaybackParameters(PlaybackParameters)","url":"setPlaybackParameters(com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlaybackParameters","l":"SetPlaybackParameters(String, PlaybackParameters)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.PlaybackParameters)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlaybackPreparer(MediaSessionConnector.PlaybackPreparer)","url":"setPlaybackPreparer(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer)"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"setPlaybackSpeed(float, float)","url":"setPlaybackSpeed(float,float)"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaybackSpeed(float)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setPlayClearContentWithoutKey(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setPlayClearSamplesWithoutKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedAdMarkerColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPlayedColor(int)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"setPlayer(Player, Looper)","url":"setPlayer(com.google.android.exoplayer2.Player,android.os.Looper)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setPlayer(Player)","url":"setPlayer(com.google.android.exoplayer2.Player)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setPlayerListener(Player.Listener)","url":"setPlayerListener(com.google.android.exoplayer2.Player.Listener)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setPlaylist(List, MediaMetadata)","url":"setPlaylist(java.util.List,androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setPlaylistMetadata(MediaMetadata)","url":"setPlaylistMetadata(com.google.android.exoplayer2.MediaMetadata)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistParserFactory(HlsPlaylistParserFactory)","url":"setPlaylistParserFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParserFactory)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setPlaylistTrackerFactory(HlsPlaylistTracker.Factory)","url":"setPlaylistTrackerFactory(com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.Factory)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetPlayWhenReady","l":"SetPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPosition(float)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(int, long)","url":"setPosition(int,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"setPosition(int)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.ui","c":"TimeBar","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setPosition(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setPositionAnchor(@com.google.android.exoplayer2.text.Cue.AnchorType int)","url":"setPositionAnchor(@com.google.android.exoplayer2.text.Cue.AnchorTypeint)"},{"p":"com.google.android.exoplayer2.text","c":"ExoplayerCuesDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoder","l":"setPositionUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setPostConnectCallback(SessionCallbackBuilder.PostConnectCallback)","url":"setPostConnectCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.PostConnectCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguage(String)","url":"setPreferredAudioLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioLanguages(String...)","url":"setPreferredAudioLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeType(String)","url":"setPreferredAudioMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioMimeTypes(String...)","url":"setPreferredAudioMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setPreferredAudioRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguage(String)","url":"setPreferredTextLanguage(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)","url":"setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextLanguages(String...)","url":"setPreferredTextLanguages(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setPreferredTextRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeType(String)","url":"setPreferredVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setPreferredVideoMimeTypes(String...)","url":"setPreferredVideoMimeTypes(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setPreparationComplete()"},{"p":"com.google.android.exoplayer2.source","c":"MaskingMediaPeriod","l":"setPrepareListener(MaskingMediaPeriod.PrepareListener)","url":"setPrepareListener(com.google.android.exoplayer2.source.MaskingMediaPeriod.PrepareListener)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setPreviousActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setPrioritizeTimeOverSizeThresholds(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setPriority(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setPriorityTaskManager(PriorityTaskManager)","url":"setPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setProgressUpdateListener(PlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.PlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setProgressUpdateListener(StyledPlayerControlView.ProgressUpdateListener)","url":"setProgressUpdateListener(com.google.android.exoplayer2.ui.StyledPlayerControlView.ProgressUpdateListener)"},{"p":"com.google.android.exoplayer2.ext.leanback","c":"LeanbackPlayerAdapter","l":"setProgressUpdatingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setProjectionData(byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyByteArray(String, byte[])","url":"setPropertyByteArray(java.lang.String,byte[])"},{"p":"com.google.android.exoplayer2.drm","c":"DummyExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"ExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"setPropertyString(String, String)","url":"setPropertyString(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setProportionalControlFactor(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"setProvisionsRequired(int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueEditor(MediaSessionConnector.QueueEditor)","url":"setQueueEditor(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueEditor)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setQueueNavigator(MediaSessionConnector.QueueNavigator)","url":"setQueueNavigator(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.QueueNavigator)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(String, int)","url":"setRandomData(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet","l":"setRandomData(Uri, int)","url":"setRandomData(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"setRatingCallback(MediaSessionConnector.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRatingCallback(SessionCallbackBuilder.RatingCallback)","url":"setRatingCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.RatingCallback)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setReadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingDay(Integer)","url":"setRecordingDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingMonth(Integer)","url":"setRecordingMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setRecordingYear(Integer)","url":"setRecordingYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"ContentMetadataMutations","l":"setRedirectedUri(ContentMetadataMutations, Uri)","url":"setRedirectedUri(com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations,android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"setRelativeToDefaultPosition(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"setRelativeToLiveWindow(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseDay(Integer)","url":"setReleaseDay(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseMonth(Integer)","url":"setReleaseMonth(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setReleaseTimeoutMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setReleaseYear(Integer)","url":"setReleaseYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveAudio(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer.Builder","l":"setRemoveVideo(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setRendererDisabled(int, boolean)","url":"setRendererDisabled(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRendererDisabled","l":"SetRendererDisabled(String, int, boolean)","url":"%3Cinit%3E(java.lang.String,int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderers(Renderer...)","url":"setRenderers(com.google.android.exoplayer2.Renderer...)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setRenderersFactory(RenderersFactory)","url":"setRenderersFactory(com.google.android.exoplayer2.RenderersFactory)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"setRenderTimeLimitMs(long)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatMode int)","url":"setRepeatMode(@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setRepeatMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetRepeatMode","l":"SetRepeatMode(String, @com.google.android.exoplayer2.Player.RepeatMode int)","url":"%3Cinit%3E(java.lang.String,@com.google.android.exoplayer2.Player.RepeatModeint)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setRepeatToggleModes(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setRequestPriority(int)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource","l":"setRequestProperty(String, String)","url":"setRequestProperty(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setRequirements(Requirements)","url":"setRequirements(com.google.android.exoplayer2.scheduler.Requirements)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setResetOnNetworkTypeChange(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setResetTimeoutOnRedirects(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AspectRatioFrameLayout","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setResizeMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"setRetryPosition(long, E)","url":"setRetryPosition(long,E)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setRewindActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setRewindIncrementMs(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setRoleFlags(@com.google.android.exoplayer2.C.RoleFlags int)","url":"setRoleFlags(@com.google.android.exoplayer2.C.RoleFlagsint)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setRotationDegrees(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setRubyPosition(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleMimeType(String)","url":"setSampleMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"setSampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSampleRate(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"setSamplerTexId(int, int)","url":"setSamplerTexId(int,int)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSampleTimestampUpperLimitFilterUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"setSchedule(ActionSchedule)","url":"setSchedule(com.google.android.exoplayer2.testutil.ActionSchedule)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration.Builder","l":"setScheme(UUID)","url":"setScheme(java.util.UUID)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setScrubberColor(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekBackIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setSeekForwardIncrementMs(long)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSeekParameters(SeekParameters)","url":"setSeekParameters(com.google.android.exoplayer2.SeekParameters)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"setSeekTargetUs(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSeekTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod","l":"setSeekToUsOffset(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setSelectedParserName(String)","url":"setSelectedParserName(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int)","url":"setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlagsint)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlags int)","url":"setSelectionFlags(@com.google.android.exoplayer2.C.SelectionFlagsint)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectionOverride(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)","url":"setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setSelectUndeterminedTextLanguage(boolean)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSequenceNumber(int)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setSessionAvailabilityListener(SessionAvailabilityListener)","url":"setSessionAvailabilityListener(com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setSessionKeepaliveMs(long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setShearDegrees(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowBuffering(int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setShowDisableOption(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowFastForwardButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowMultiWindowTimeBar(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowNextButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowPreviousButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowRewindButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowShuffleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowSubtitleButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShowVrButton(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"setShuffleMode(int)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setShuffleModeEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleModeEnabled","l":"SetShuffleModeEnabled(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder, Handler, Runnable)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder,android.os.Handler,java.lang.Runnable)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.source","c":"ConcatenatingMediaSource","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setShuffleOrder(ShuffleOrder)","url":"setShuffleOrder(com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetShuffleOrder","l":"SetShuffleOrder(String, ShuffleOrder)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.source.ShuffleOrder)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setShutterBackgroundColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateIOErrors(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulatePartialReads(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.Builder","l":"setSimulateUnknownLength(boolean)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setSize(float)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder","l":"setSkipCallback(SessionCallbackBuilder.SkipCallback)","url":"setSkipCallback(com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setSkipSilenceEnabled(boolean)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultBandwidthMeter.Builder","l":"setSlidingWindowMaxWeight(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setSmallIcon(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setSmallIconResourceId(int)"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"setSpeed(float)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setSsrc(int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"setStartPositionMs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration.Builder","l":"setStartsAtKeyFrame(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStartTimeMs(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setStartTimeUs(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setState(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStatesToRemoving()"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setStereoMode(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"setStopActionIconResourceId(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStopReason(int)"},{"p":"com.google.android.exoplayer2.offline","c":"DefaultDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadManager","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.offline","c":"WritableDownloadIndex","l":"setStopReason(String, int)","url":"setStopReason(java.lang.String,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.Builder","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"DefaultMediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setStreamKeys(List)","url":"setStreamKeys(java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setStreamKeys(StreamKey...)","url":"setStreamKeys(com.google.android.exoplayer2.offline.StreamKey...)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setStyle(CaptionStyleCompat)","url":"setStyle(com.google.android.exoplayer2.ui.CaptionStyleCompat)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setSubsampleOffsetUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setSubtitle(CharSequence)","url":"setSubtitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitleConfigurations(List)","url":"setSubtitleConfigurations(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setSubtitles(List)","url":"setSubtitles(java.util.List)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"setSupportedContentTypes(int...)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setSupportedFormats(Format...)","url":"setSupportedFormats(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"ProgressiveMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsMediaSource.Factory","l":"setTag(Object)","url":"setTag(java.lang.Object)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl.Builder","l":"setTargetBufferBytes(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"setTargetBufferSize(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetClasses(String[])","url":"setTargetClasses(java.lang.String[])"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetId(String)","url":"setTargetId(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl.Builder","l":"setTargetLiveOffsetIncrementOnRebufferMs(long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"LivePlaybackSpeedControl","l":"setTargetLiveOffsetOverrideUs(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration.Builder","l":"setTargetOffsetMs(long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetTagName(String)","url":"setTargetTagName(java.lang.String)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setTargetVoice(String)","url":"setTargetVoice(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setText(CharSequence)","url":"setText(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextAlignment(Layout.Alignment)","url":"setTextAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setTextSize(float, @com.google.android.exoplayer2.text.Cue.TextSizeType int)","url":"setTextSize(float,@com.google.android.exoplayer2.text.Cue.TextSizeTypeint)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTheme(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setThrowsWhenUsingWrongThread(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setTimeBarMinUpdateInterval(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTimeline(Timeline)","url":"setTimeline(com.google.android.exoplayer2.Timeline)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setTimeoutMs(long)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket.Builder","l":"setTimestamp(long)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"OutputConsumerAdapterV30","l":"setTimestampAdjuster(TimestampAdjuster)","url":"setTimestampAdjuster(com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTitle(CharSequence)","url":"setTitle(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalDiscCount(Integer)","url":"setTotalDiscCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTotalTrackCount(Integer)","url":"setTotalTrackCount(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackFormatComparator(Comparator)","url":"setTrackFormatComparator(java.util.Comparator)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTrackId(String)","url":"setTrackId(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"setTrackNameProvider(TrackNameProvider)","url":"setTrackNameProvider(com.google.android.exoplayer2.ui.TrackNameProvider)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setTrackNumber(Integer)","url":"setTrackNumber(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTrackSelectionOverrides(TrackSelectionOverrides)","url":"setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setTrackSelectionOverrides(TrackSelectionOverrides)","url":"setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setTrackSelectionParameters(TrackSelectionParameters)","url":"setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setTrackSelectionParameters(TrackSelectionParameters)","url":"setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setTrackSelectionParameters(TrackSelectionParameters)","url":"setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setTrackSelectionParameters(TrackSelectionParameters)","url":"setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setTrackSelectionParameters(TrackSelectionParameters)","url":"setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setTrackSelector(DefaultTrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setTrackSelector(TrackSelector)","url":"setTrackSelector(com.google.android.exoplayer2.trackselection.TrackSelector)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.ext.rtmp","c":"RtmpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setTransferListener(TransferListener)","url":"setTransferListener(com.google.android.exoplayer2.upstream.TransferListener)"},{"p":"com.google.android.exoplayer2.source","c":"SingleSampleMediaSource.Factory","l":"setTreatLoadErrorsAsEndOfStream(boolean)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionCallbackBuilder.DefaultAllowedCommandProvider","l":"setTrustedPackageNames(List)","url":"setTrustedPackageNames(java.util.List)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorFlags(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorMode(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorsFactory","l":"setTsExtractorTimestampSearchBytes(int)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setTunnelingEnabled(boolean)"},{"p":"com.google.android.exoplayer2","c":"PlayerMessage","l":"setType(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"setUnderline(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"setUnplayedColor(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUpdateTimeMs(long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamDataSourceFactory(DataSource.Factory)","url":"setUpstreamDataSourceFactory(com.google.android.exoplayer2.upstream.DataSource.Factory)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"setUpstreamFormatChangeListener(SampleQueue.UpstreamFormatChangedListener)","url":"setUpstreamFormatChangeListener(com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriority(int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSource.Factory","l":"setUpstreamPriorityTaskManager(PriorityTaskManager)","url":"setUpstreamPriorityTaskManager(com.google.android.exoplayer2.util.PriorityTaskManager)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(String)","url":"setUri(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest.TestResource.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.testutil","c":"DownloadBuilder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUri(Uri)","url":"setUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec.Builder","l":"setUriPositionOffset(long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes.Builder","l":"setUsage(@com.google.android.exoplayer2.C.AudioUsage int)","url":"setUsage(@com.google.android.exoplayer2.C.AudioUsageint)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseArtwork(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseChronometer(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setUseController(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUseDrmSessionsForClearContent(@com.google.android.exoplayer2.C.TrackType int...)","url":"setUseDrmSessionsForClearContent(@com.google.android.exoplayer2.C.TrackTypeint...)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseFastForwardActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"setUseLazyPreparation(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseNextActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePlayPauseActions(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUsePreviousActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2.ext.cronet","c":"CronetDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.okhttp","c":"OkHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtspMediaSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultHttpDataSource.Factory","l":"setUserAgent(String)","url":"setUserAgent(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultStyle()"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setUserDefaultTextSize()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindAction(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseRewindActionInCompactView(boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setUserRating(Rating)","url":"setUserRating(com.google.android.exoplayer2.Rating)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"setUseSensorRotation(boolean)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsMediaSource.Factory","l":"setUseSessionKeys(boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setUseStopAction(boolean)"},{"p":"com.google.android.exoplayer2.drm","c":"DefaultDrmSessionManager.Builder","l":"setUuidAndExoMediaDrmProvider(UUID, ExoMediaDrm.Provider)","url":"setUuidAndExoMediaDrmProvider(java.util.UUID,com.google.android.exoplayer2.drm.ExoMediaDrm.Provider)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVastLoadTimeoutMs(int)"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"setVersion(SQLiteDatabase, int, String, int)","url":"setVersion(android.database.sqlite.SQLiteDatabase,int,java.lang.String,int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setVerticalType(@com.google.android.exoplayer2.text.Cue.VerticalType int)","url":"setVerticalType(@com.google.android.exoplayer2.text.Cue.VerticalTypeint)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader.Builder","l":"setVideoAdPlayerCallback(VideoAdPlayer.VideoAdPlayerCallback)","url":"setVideoAdPlayerCallback(com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer.VideoAdPlayerCallback)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoChangeFrameRateStrategy(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoFrameMetadataListener(VideoFrameMetadataListener)","url":"setVideoFrameMetadataListener(com.google.android.exoplayer2.video.VideoFrameMetadataListener)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer.Builder","l":"setVideoMimeType(String)","url":"setVideoMimeType(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setVideoScalingMode(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"setVideoSurface()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.SetVideoSurface","l":"SetVideoSurface(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setVideoSurface(Surface)","url":"setVideoSurface(android.view.Surface)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setVideoSurfaceHolder(SurfaceHolder)","url":"setVideoSurfaceHolder(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setVideoSurfaceView(SurfaceView)","url":"setVideoSurfaceView(android.view.SurfaceView)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.VideoComponent","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setVideoTextureView(TextureView)","url":"setVideoTextureView(android.view.TextureView)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSize(int, int, boolean)","url":"setViewportSize(int,int,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.ParametersBuilder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters.Builder","l":"setViewportSizeToPhysicalDisplaySize(Context, boolean)","url":"setViewportSizeToPhysicalDisplaySize(android.content.Context,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"setViewType(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"setVisibility(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.AudioComponent","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"setVolume(float)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"setVrButtonListener(View.OnClickListener)","url":"setVrButtonListener(android.view.View.OnClickListener)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer","l":"setWakeMode(@com.google.android.exoplayer2.C.WakeMode int)","url":"setWakeMode(@com.google.android.exoplayer2.C.WakeModeint)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayer.Builder","l":"setWakeMode(@com.google.android.exoplayer2.C.WakeMode int)","url":"setWakeMode(@com.google.android.exoplayer2.C.WakeModeint)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"setWakeMode(@com.google.android.exoplayer2.C.WakeMode int)","url":"setWakeMode(@com.google.android.exoplayer2.C.WakeModeint)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer.Builder","l":"setWakeMode(@com.google.android.exoplayer2.C.WakeMode int)","url":"setWakeMode(@com.google.android.exoplayer2.C.WakeModeint)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"setWakeMode(int)"},{"p":"com.google.android.exoplayer2","c":"Format.Builder","l":"setWidth(int)"},{"p":"com.google.android.exoplayer2.text","c":"Cue.Builder","l":"setWindowColor(int)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setWriter(CharSequence)","url":"setWriter(java.lang.CharSequence)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata.Builder","l":"setYear(Integer)","url":"setYear(java.lang.Integer)"},{"p":"com.google.android.exoplayer2.robolectric","c":"ShadowMediaCodecConfig","l":"ShadowMediaCodecConfig()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"sharedInitializeOrWait(boolean, long)","url":"sharedInitializeOrWait(boolean,long)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"shearDegrees"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"shouldCancelChunkLoad(long, Chunk, List)","url":"shouldCancelChunkLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeChunkSource","l":"shouldCancelLoad(long, Chunk, List)","url":"shouldCancelLoad(long,com.google.android.exoplayer2.source.chunk.Chunk,java.util.List)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldContinueLoading(long, long, float)","url":"shouldContinueLoading(long,long,float)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long, boolean)","url":"shouldDropBuffersToKeyframe(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropBuffersToKeyframe(long, long)","url":"shouldDropBuffersToKeyframe(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldDropOutputBuffer(long, long, boolean)","url":"shouldDropOutputBuffer(long,long,boolean)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldDropOutputBuffer(long, long)","url":"shouldDropOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"shouldEvaluateQueueSize(long, List)","url":"shouldEvaluateQueueSize(long,java.util.List)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldForceRenderOutputBuffer(long, long)","url":"shouldForceRenderOutputBuffer(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"shouldInitCodec(MediaCodecInfo)","url":"shouldInitCodec(com.google.android.exoplayer2.mediacodec.MediaCodecInfo)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"shouldPlayAdGroup()"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeAudioRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeVideoRenderer","l":"shouldProcessBuffer(long, long)","url":"shouldProcessBuffer(long,long)"},{"p":"com.google.android.exoplayer2","c":"DefaultLoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2","c":"LoadControl","l":"shouldStartPlayback(long, float, boolean, long)","url":"shouldStartPlayback(long,float,boolean,long)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"shouldUseBypass(Format)","url":"shouldUseBypass(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_ALWAYS"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_NEVER"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"SHOW_BUFFERING_WHEN_PLAYING"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"show()"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"showController()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber()"},{"p":"com.google.android.exoplayer2.ui","c":"DefaultTimeBar","l":"showScrubber(long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter","l":"signalEndOfInputStream()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"SynchronousMediaCodecAdapter","l":"signalEndOfInputStream()"},{"p":"com.google.android.exoplayer2.source","c":"SilenceMediaSource","l":"SilenceMediaSource(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"SilenceSkippingAudioProcessor","l":"SilenceSkippingAudioProcessor(long, long, short)","url":"%3Cinit%3E(long,long,short)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[], boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[],boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, byte[])","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,byte[])"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider, byte[], boolean, boolean)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider,byte[],boolean,boolean)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor, DatabaseProvider)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor,com.google.android.exoplayer2.database.DatabaseProvider)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"SimpleCache(File, CacheEvictor)","url":"%3Cinit%3E(java.io.File,com.google.android.exoplayer2.upstream.cache.CacheEvictor)"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoder","l":"SimpleDecoder(I[], O[])","url":"%3Cinit%3E(I[],O[])"},{"p":"com.google.android.exoplayer2.decoder","c":"SimpleDecoderOutputBuffer","l":"SimpleDecoderOutputBuffer(DecoderOutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.DecoderOutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(Context, RenderersFactory, TrackSelector, MediaSourceFactory, LoadControl, BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)","url":"%3Cinit%3E(android.content.Context,com.google.android.exoplayer2.RenderersFactory,com.google.android.exoplayer2.trackselection.TrackSelector,com.google.android.exoplayer2.source.MediaSourceFactory,com.google.android.exoplayer2.LoadControl,com.google.android.exoplayer2.upstream.BandwidthMeter,com.google.android.exoplayer2.analytics.AnalyticsCollector,boolean,com.google.android.exoplayer2.util.Clock,android.os.Looper)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"SimpleExoPlayer(SimpleExoPlayer.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.SimpleExoPlayer.Builder)"},{"p":"com.google.android.exoplayer2.metadata","c":"SimpleMetadataDecoder","l":"SimpleMetadataDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SimpleSubtitleDecoder","l":"SimpleSubtitleDecoder(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput.SimulatedIOException","l":"SimulatedIOException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateIOErrors"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulatePartialReads"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"simulateUnknownLength"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"SINGLE_WINDOW_UID"},{"p":"com.google.android.exoplayer2.source.ads","c":"SinglePeriodAdTimeline","l":"SinglePeriodAdTimeline(Timeline, AdPlaybackState)","url":"%3Cinit%3E(com.google.android.exoplayer2.Timeline,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, MediaItem)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,boolean,java.lang.Object,java.lang.Object)"},{"p":"com.google.android.exoplayer2.source","c":"SinglePeriodTimeline","l":"SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration)","url":"%3Cinit%3E(long,long,long,long,long,long,long,boolean,boolean,java.lang.Object,com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.MediaItem.LiveConfiguration)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"SingleSampleMediaChunk","l":"SingleSampleMediaChunk(DataSource, DataSpec, Format, int, Object, long, long, long, @com.google.android.exoplayer2.C.TrackType int, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSpec,com.google.android.exoplayer2.Format,int,java.lang.Object,long,long,long,@com.google.android.exoplayer2.C.TrackTypeint,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMediaPeriod.TrackDataFactory","l":"singleSampleWithTimeUs(long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"SegmentBase.SingleSegmentBase","l":"SingleSegmentBase(RangedUri, long, long, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"SingleSegmentRepresentation(long, Format, List, SegmentBase.SingleSegmentBase, List, String, long)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_DIRECTLY"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_SUPPORTED_WITH_TRANSCODING"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"SINK_FORMAT_UNSUPPORTED"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"sinkSupportsFormat(Format)","url":"sinkSupportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"size"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"size()"},{"p":"com.google.android.exoplayer2","c":"Player.Events","l":"size()"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.Events","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"FlagSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"ListenerSet","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"size()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"size()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"sizes"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"skip(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skip(int)"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"skipAd()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBit()"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableNalUnitBitArray","l":"skipBits(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableBitArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.util","c":"ParsableByteArray","l":"skipBytes(int)"},{"p":"com.google.android.exoplayer2.source","c":"EmptySampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source","c":"SampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkSampleStream.EmbeddedSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"skipData(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int, boolean)","url":"skipFully(int,boolean)"},{"p":"com.google.android.exoplayer2.extractor","c":"DefaultExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ForwardingExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorInput","l":"skipFully(int)"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorUtil","l":"skipFullyQuietly(ExtractorInput, int)","url":"skipFullyQuietly(com.google.android.exoplayer2.extractor.ExtractorInput,int)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"skipInputUntilPosition(ExtractorInput, long)","url":"skipInputUntilPosition(com.google.android.exoplayer2.extractor.ExtractorInput,long)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"skipOutputBuffer(MediaCodecAdapter, int, long)","url":"skipOutputBuffer(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter,int,long)"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"skipOutputBuffer(VideoDecoderOutputBuffer)","url":"skipOutputBuffer(com.google.android.exoplayer2.decoder.VideoDecoderOutputBuffer)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedInputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderOutputBuffer","l":"skippedOutputBufferCount"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner.Builder","l":"skipSettingMediaSources()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"skipSilenceEnabledChanged(boolean)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"skipSource(long)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToNextPlaylistItem()"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPlaylistItem(int)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"skipToPreviousPlaylistItem()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.ServerControl","l":"skipUntilUs"},{"p":"com.google.android.exoplayer2.upstream","c":"SlidingPercentile","l":"SlidingPercentile(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"SlowMotionData(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"smallIconResourceId"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"SmtaMetadataEntry(float, int)","url":"%3Cinit%3E(float,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"sneakyThrow(Throwable)","url":"sneakyThrow(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor","c":"Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.amr","c":"AmrExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.flv","c":"FlvExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"JpegExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp3","c":"Mp3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"FragmentedMp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Mp4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ogg","c":"OggExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.rawcc","c":"RawCcExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac3Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"Ac4Extractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"AdtsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"sniff(ExtractorInput)","url":"sniff(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"sniffFirst"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"softwareOnly"},{"p":"com.google.android.exoplayer2.audio","c":"SonicAudioProcessor","l":"SonicAudioProcessor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"source"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"sourceId(int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject","l":"spanned()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"speed"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"speedDivisor"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"SphericalGLSurfaceView","l":"SphericalGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source","c":"SampleQueue","l":"splice()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"SpliceCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventCancelIndicator"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"spliceEventId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"spliceImmediateFlag"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInfoDecoder","l":"SpliceInfoDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"SpliceNullCommand()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"split(String, String)","url":"split(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitAtFirst(String, String)","url":"splitAtFirst(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"splitCodecs(String)","url":"splitCodecs(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"CodecSpecificDataUtil","l":"splitNalUnits(byte[])"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"SpsData(int, int, int, int, int, int, float, boolean, boolean, int, int, int, boolean)","url":"%3Cinit%3E(int,int,int,int,int,int,float,boolean,boolean,int,int,int,boolean)"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.ssa","c":"SsaDecoder","l":"SsaDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, CacheDataSource.Factory)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","c":"SsDownloader","l":"SsDownloader(MediaItem, ParsingLoadable.Parser, CacheDataSource.Factory, Executor)","url":"%3Cinit%3E(com.google.android.exoplayer2.MediaItem,com.google.android.exoplayer2.upstream.ParsingLoadable.Parser,com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory,java.util.concurrent.Executor)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"SsManifest(int, int, long, long, long, int, boolean, SsManifest.ProtectionElement, SsManifest.StreamElement[])","url":"%3Cinit%3E(int,int,long,long,long,int,boolean,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.ProtectionElement,com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifestParser","l":"SsManifestParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"ssrc"},{"p":"com.google.android.exoplayer2.database","c":"StandaloneDatabaseProvider","l":"StandaloneDatabaseProvider(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"StandaloneMediaClock(Clock)","url":"%3Cinit%3E(com.google.android.exoplayer2.util.Clock)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int, float)","url":"%3Cinit%3E(int,float)"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"StarRating(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"start"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"START"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"start()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"start()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"start()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"start()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"start()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"start(AdsMediaSource, DataSpec, Object, AdViewProvider, AdsLoader.EventListener)","url":"start(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.upstream.DataSpec,java.lang.Object,com.google.android.exoplayer2.ui.AdViewProvider,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"start(boolean)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"start(Context, Class)","url":"start(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"start(Uri, MediaSourceEventListener.EventDispatcher, HlsPlaylistTracker.PrimaryPlaylistListener)","url":"start(android.net.Uri,com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher,com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker.PrimaryPlaylistListener)"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"startBlock(String)","url":"startBlock(java.lang.String)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startFile(String, long, long)","url":"startFile(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadService","l":"startForeground(Context, Class)","url":"startForeground(android.content.Context,java.lang.Class)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"startForegroundService(Context, Intent)","url":"startForegroundService(android.content.Context,android.content.Intent)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader","l":"startLoading(T, Loader.Callback, int)","url":"startLoading(T,com.google.android.exoplayer2.upstream.Loader.Callback,int)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"startMasterElement(int, long, long)","url":"startMasterElement(int,long,long)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Period","l":"startMs"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startOffset"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"StartOffsetExtractorOutput(long, ExtractorOutput)","url":"%3Cinit%3E(long,com.google.android.exoplayer2.extractor.ExtractorOutput)"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startOffsetUs"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"startPositionMs"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWrite(String, long, long)","url":"startReadWrite(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"SimpleCache","l":"startReadWriteNonBlocking(String, long, long)","url":"startReadWriteNonBlocking(java.lang.String,long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"TrueHdSampleRechunker","l":"startSample(ExtractorInput)","url":"startSample(com.google.android.exoplayer2.extractor.ExtractorInput)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"startsAtKeyFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"startTimeMs"},{"p":"com.google.android.exoplayer2.offline","c":"SegmentDownloader.Segment","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"startTimeUs"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, ParcelFileDescriptor)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,android.os.ParcelFileDescriptor)"},{"p":"com.google.android.exoplayer2.transformer","c":"TranscodingTransformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.transformer","c":"Transformer","l":"startTransformation(MediaItem, String)","url":"startTransformation(com.google.android.exoplayer2.MediaItem,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"AtomicFile","l":"startWrite()"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"state"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_BUFFERING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_COMPLETED"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_DISABLED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_DOWNLOADING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_ENDED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_ERROR"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_FAILED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_IDLE"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENED_WITH_KEYS"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_OPENING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_QUEUED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"STATE_READY"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSession","l":"STATE_RELEASED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_REMOVING"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_RESTARTING"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"STATE_STARTED"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STATE_STOPPED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"states"},{"p":"com.google.android.exoplayer2.upstream","c":"StatsDataSource","l":"StatsDataSource(DataSource)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource)"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_LEFT_RIGHT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_MONO"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_STEREO_MESH"},{"p":"com.google.android.exoplayer2","c":"C","l":"STEREO_MODE_TOP_BOTTOM"},{"p":"com.google.android.exoplayer2","c":"Format","l":"stereoMode"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"STOP_REASON_NONE"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"Renderer","l":"stop()"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2.scheduler","c":"RequirementsWatcher","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"DefaultHlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"stop()"},{"p":"com.google.android.exoplayer2.util","c":"StandaloneMediaClock","l":"stop()"},{"p":"com.google.android.exoplayer2.ext.ima","c":"ImaAdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsLoader","l":"stop(AdsMediaSource, AdsLoader.EventListener)","url":"stop(com.google.android.exoplayer2.source.ads.AdsMediaSource,com.google.android.exoplayer2.source.ads.AdsLoader.EventListener)"},{"p":"com.google.android.exoplayer2","c":"ForwardingPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"Player","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2","c":"SimpleExoPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"CastPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"stop(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.Stop","l":"Stop(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerNotificationManager.Builder","l":"stopActionIconResourceId"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"stopReason"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"STREAM_INFO_BLOCK_SIZE"},{"p":"com.google.android.exoplayer2.extractor.flac","c":"FlacConstants","l":"STREAM_MARKER_SIZE"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_DTMF"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_MUSIC"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_RING"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_SYSTEM"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE0"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE1"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_TYPE2"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"STREAM_TYPE_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"C","l":"STREAM_TYPE_VOICE_CALL"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"StreamElement(String, String, @com.google.android.exoplayer2.C.TrackType int, String, long, String, int, int, int, int, String, Format[], List, long)","url":"%3Cinit%3E(java.lang.String,java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint,java.lang.String,long,java.lang.String,int,int,int,int,java.lang.String,com.google.android.exoplayer2.Format[],java.util.List,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"streamElements"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"streamIndex"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"StreamKey(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"streamKeys"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"streamKeys"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util.SyncFrameInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.EsInfo","l":"streamType"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"EbmlProcessor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor.mkv","c":"MatroskaExtractor","l":"stringElement(int, String)","url":"stringElement(int,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"StubExoPlayer","l":"StubExoPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.testutil","c":"StubPlayer","l":"StubPlayer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_BOLD_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_ITALIC"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"STYLE_NORMAL"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerControlView","l":"StyledPlayerControlView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"StyledPlayerView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long, long)","url":"subrange(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"subrange(long)"},{"p":"com.google.android.exoplayer2.text.subrip","c":"SubripDecoder","l":"SubripDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"subsampleOffsetUs"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(DataSpec...)","url":"subset(com.google.android.exoplayer2.upstream.DataSpec...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(String...)","url":"subset(java.lang.String...)"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"subset(Uri...)","url":"subset(android.net.Uri...)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"subtitle"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, @com.google.android.exoplayer2.C.SelectionFlags int, @com.google.android.exoplayer2.C.RoleFlags int, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,@com.google.android.exoplayer2.C.SelectionFlagsint,@com.google.android.exoplayer2.C.RoleFlagsint,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String, @com.google.android.exoplayer2.C.SelectionFlags int)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String,@com.google.android.exoplayer2.C.SelectionFlagsint)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.Subtitle","l":"Subtitle(Uri, String, String)","url":"%3Cinit%3E(android.net.Uri,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"subtitleConfigurations"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String, Throwable)","url":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderException","l":"SubtitleDecoderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleExtractor","l":"SubtitleExtractor(SubtitleDecoder, Format)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.SubtitleDecoder,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"subtitleGroupId"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleInputBuffer","l":"SubtitleInputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleOutputBuffer","l":"SubtitleOutputBuffer()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"subtitles"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"subtitles"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"SubtitleView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"subtractWithOverflowDefault(long, long, long)","url":"subtractWithOverflowDefault(long,long,long)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"subType"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"suggestedPresentationDelayMs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"supplementalData"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"supplementalProperties"},{"p":"com.google.android.exoplayer2.ext.opus","c":"OpusLibrary","l":"supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int)","url":"supportsCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int)","url":"supportsCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"supportsEncoding(int)"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DefaultAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"ForwardingAudioSink","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"LibvpxVideoRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.metadata","c":"MetadataRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"SubtitleDecoderFactory","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video.spherical","c":"CameraMotionRenderer","l":"supportsFormat(Format)","url":"supportsFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"MediaCodecAudioRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"supportsFormat(MediaCodecSelector, Format)","url":"supportsFormat(com.google.android.exoplayer2.mediacodec.MediaCodecSelector,com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegLibrary","l":"supportsFormat(String)","url":"supportsFormat(java.lang.String)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsFormatDrm(Format)","url":"supportsFormatDrm(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.audio","c":"DecoderAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.flac","c":"LibflacAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.ext.opus","c":"LibopusAudioRenderer","l":"supportsFormatInternal(Format)","url":"supportsFormatInternal(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2","c":"BaseRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"NoSampleRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","c":"FfmpegAudioRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"supportsMixedMimeTypeAdaptation()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource","l":"supportsRangeRequests()"},{"p":"com.google.android.exoplayer2.testutil","c":"WebServerDispatcher.Resource.Builder","l":"supportsRangeRequests(boolean)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecAdapter.Configuration","l":"surface"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceChanged(SurfaceHolder, int, int, int)","url":"surfaceChanged(android.view.SurfaceHolder,int,int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceCreated(SurfaceHolder)","url":"surfaceCreated(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.testutil","c":"HostActivity","l":"surfaceDestroyed(SurfaceHolder)","url":"surfaceDestroyed(android.view.SurfaceHolder)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoDecoderException","l":"surfaceIdentityHashCode"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"svcTemporalLayerCount"},{"p":"com.google.android.exoplayer2.ui","c":"PlayerView","l":"switchTargetView(Player, PlayerView, PlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.PlayerView,com.google.android.exoplayer2.ui.PlayerView)"},{"p":"com.google.android.exoplayer2.ui","c":"StyledPlayerView","l":"switchTargetView(Player, StyledPlayerView, StyledPlayerView)","url":"switchTargetView(com.google.android.exoplayer2.Player,com.google.android.exoplayer2.ui.StyledPlayerView,com.google.android.exoplayer2.ui.StyledPlayerView)"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"SystemClock()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.database","c":"DatabaseProvider","l":"TABLE_PREFIX"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"tableExists(SQLiteDatabase, String)","url":"tableExists(android.database.sqlite.SQLiteDatabase,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"tag"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"tag"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoHostedTest","l":"tag"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"TAG"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylist","l":"tags"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"targetDurationUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"targetFoundResult(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ServiceDescriptionElement","l":"targetOffsetMs"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor","l":"TeeAudioProcessor(TeeAudioProcessor.AudioBufferSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.TeeAudioProcessor.AudioBufferSink)"},{"p":"com.google.android.exoplayer2.upstream","c":"TeeDataSource","l":"TeeDataSource(DataSource, DataSink)","url":"%3Cinit%3E(com.google.android.exoplayer2.upstream.DataSource,com.google.android.exoplayer2.upstream.DataSink)"},{"p":"com.google.android.exoplayer2.robolectric","c":"TestDownloadManagerListener","l":"TestDownloadManagerListener(DownloadManager)","url":"%3Cinit%3E(com.google.android.exoplayer2.offline.DownloadManager)"},{"p":"com.google.android.exoplayer2.testutil","c":"TestExoPlayerBuilder","l":"TestExoPlayerBuilder(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"text"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"text"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"text"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_EXOPLAYER_CUES"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_ABSOLUTE"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TEXT_SIZE_TYPE_FRACTIONAL_IGNORE_PADDING"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_SSA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"TEXT_VTT"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textAlignment"},{"p":"com.google.android.exoplayer2.text.span","c":"TextEmphasisSpan","l":"TextEmphasisSpan(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"TextInformationFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper, SubtitleDecoderFactory)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper,com.google.android.exoplayer2.text.SubtitleDecoderFactory)"},{"p":"com.google.android.exoplayer2.text","c":"TextRenderer","l":"TextRenderer(TextOutput, Looper)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.TextOutput,android.os.Looper)"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSize"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"textSizeType"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.TextTrackScore","l":"TextTrackScore(Format, DefaultTrackSelector.Parameters, int, String)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil","l":"TEXTURE_ID_UNSET"},{"p":"com.google.android.exoplayer2.ext.av1","c":"Libgav1VideoRenderer","l":"THREAD_COUNT_AUTODETECT"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm.Builder","l":"throwNotProvisionedExceptionFromGetKeyRequest()"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"throwPlaybackException(ExoPlaybackException)","url":"throwPlaybackException(com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.ThrowPlaybackException","l":"ThrowPlaybackException(String, ExoPlaybackException)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.ExoPlaybackException)"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"ThumbRating(boolean)","url":"%3Cinit%3E(boolean)"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_END_OF_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TIME_UNSET"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"TimedValueQueue","l":"TimedValueQueue(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"timeline"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"timeline"},{"p":"com.google.android.exoplayer2.source","c":"ForwardingTimeline","l":"timeline"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED"},{"p":"com.google.android.exoplayer2","c":"Player","l":"TIMELINE_CHANGE_REASON_SOURCE_UPDATE"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"Timeline()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter, TimelineQueueEditor.MediaDescriptionEqualityChecker)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionEqualityChecker)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueEditor","l":"TimelineQueueEditor(MediaControllerCompat, TimelineQueueEditor.QueueDataAdapter, TimelineQueueEditor.MediaDescriptionConverter)","url":"%3Cinit%3E(android.support.v4.media.session.MediaControllerCompat,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.QueueDataAdapter,com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor.MediaDescriptionConverter)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat, int)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat,int)"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"TimelineQueueNavigator","l":"TimelineQueueNavigator(MediaSessionCompat)","url":"%3Cinit%3E(android.support.v4.media.session.MediaSessionCompat)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(boolean, boolean, long)","url":"%3Cinit%3E(boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState, MediaItem)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState,com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, boolean, boolean, long, long, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,boolean,boolean,long,long,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long, AdPlaybackState)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long,com.google.android.exoplayer2.source.ads.AdPlaybackState)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object, boolean, boolean, long)","url":"%3Cinit%3E(int,java.lang.Object,boolean,boolean,long)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"TimelineWindowDefinition(int, Object)","url":"%3Cinit%3E(int,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"DummyMainThread","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2.testutil","c":"MediaSourceTestRunner","l":"TIMEOUT_MS"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_DETACH_SURFACE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_RELEASE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_SET_FOREGROUND_MODE"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"TIMEOUT_OPERATION_UNDEFINED"},{"p":"com.google.android.exoplayer2","c":"ExoTimeoutException","l":"timeoutOperation"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"timescale"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"timescale"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"timeShiftBufferDepthMs"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"timestamp"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"TimestampAdjuster(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2.source.hls","c":"TimestampAdjusterProvider","l":"TimestampAdjusterProvider()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"timestampMs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker","l":"timestampSeeker"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"timesUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderOutputBuffer","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"timeUs"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"timeUs"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.BinarySearchSeekMap","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.DefaultSeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.SeekTimestampConverter","l":"timeUsToTargetTime(long)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"title"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"title"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"ProgramInformation","l":"title"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.Segment","l":"title"},{"p":"com.google.android.exoplayer2.util","c":"LongArray","l":"toArray()"},{"p":"com.google.android.exoplayer2","c":"Bundleable","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"HeartRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PercentageRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackException","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.Commands","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"StarRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"ThumbRating","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toBundle()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"toBundle()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"toBundle()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"toBundle()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides","l":"toBundle()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"toBundle()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toBundle()"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"toBundle()"},{"p":"com.google.android.exoplayer2","c":"Timeline","l":"toBundle(boolean)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"toBundleArrayList(Collection)","url":"toBundleArrayList(java.util.Collection)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"toBundleList(List)","url":"toBundleList(java.util.List)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"toBundleSparseArray(SparseArray)","url":"toBundleSparseArray(android.util.SparseArray)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toByteArray(InputStream)","url":"toByteArray(java.io.InputStream)"},{"p":"com.google.android.exoplayer2.source.mediaparser","c":"MediaParserUtil","l":"toCaptionsMediaFormat(Format)","url":"toCaptionsMediaFormat(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toHexString(byte[])"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceAfterUs"},{"p":"com.google.android.exoplayer2","c":"SeekParameters","l":"toleranceBeforeUs"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toLogString(Format)","url":"toLogString(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toLong(int, int)","url":"toLong(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toMediaItem()"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaItem(MediaQueueItem)","url":"toMediaItem(com.google.android.gms.cast.MediaQueueItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"DefaultMediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.ext.cast","c":"MediaItemConverter","l":"toMediaQueueItem(MediaItem)","url":"toMediaQueueItem(com.google.android.exoplayer2.MediaItem)"},{"p":"com.google.android.exoplayer2.util","c":"BundleableUtil","l":"toNullableBundle(Bundleable)","url":"toNullableBundle(com.google.android.exoplayer2.Bundleable)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"toString()"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilities","l":"toString()"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.AudioFormat","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"ChunkIndex","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.SeekPoints","l":"toString()"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekPoint","l":"toString()"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"Id3Frame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceCommand","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"toString()"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"toString()"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"RangedUri","l":"toString()"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"toString()"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"toString()"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"Dumper","l":"toString()"},{"p":"com.google.android.exoplayer2.testutil","c":"ExtractorAsserts.SimulationConfig","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"toString()"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheSpan","l":"toString()"},{"p":"com.google.android.exoplayer2.video","c":"ColorInfo","l":"toString()"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioFormatTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalAudioUnderruns"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection.AdaptationCheckpoint","l":"totalBandwidth"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthBytes"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalBandwidthTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"totalBufferedDurationMs"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalDiscCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalDroppedFrames"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialAudioFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatBitrate"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalInitialVideoFormatHeight"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseBufferCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalPauseCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalRebufferCount"},{"p":"com.google.android.exoplayer2.extractor","c":"FlacStreamMetadata","l":"totalSamples"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalSeekCount"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"totalTrackCount"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalValidJoinTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatBitrateTimeProduct"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeMs"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"totalVideoFormatHeightTimeProduct"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"totalVideoFrameProcessingOffsetUs"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"toUnsignedLong(int)"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"TRACE_ENABLED"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_AUDIO"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CAMERA_MOTION"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_IMAGE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_METADATA"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_TEXT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TRACK_TYPE_VIDEO"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"Track(int, @com.google.android.exoplayer2.C.TrackType int, long, long, long, Format, int, TrackEncryptionBox[], int, long[], long[])","url":"%3Cinit%3E(int,@com.google.android.exoplayer2.C.TrackTypeint,long,long,long,com.google.android.exoplayer2.Format,int,com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox[],int,long[],long[])"},{"p":"com.google.android.exoplayer2.extractor","c":"ExtractorOutput","l":"track(int, @com.google.android.exoplayer2.C.TrackType int)","url":"track(int,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BaseMediaChunkOutput","l":"track(int, @com.google.android.exoplayer2.C.TrackType int)","url":"track(int,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"ChunkExtractor.TrackOutputProvider","l":"track(int, @com.google.android.exoplayer2.C.TrackType int)","url":"track(int,@com.google.android.exoplayer2.C.TrackTypeint)"},{"p":"com.google.android.exoplayer2.extractor","c":"DummyExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.jpeg","c":"StartOffsetExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.source.chunk","c":"BundledChunkExtractor","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"track(int, int)","url":"track(int,int)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"TrackEncryptionBox","l":"TrackEncryptionBox(boolean, String, int, byte[], int, int, byte[])","url":"%3Cinit%3E(boolean,java.lang.String,int,byte[],int,int,byte[])"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"trackEncryptionBoxes"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackFormat"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackFormat"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"trackGroup"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroup","l":"TrackGroup(Format...)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format...)"},{"p":"com.google.android.exoplayer2.source","c":"TrackGroupArray","l":"TrackGroupArray(TrackGroup...)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup...)"},{"p":"com.google.android.exoplayer2","c":"TracksInfo.TrackGroupInfo","l":"TrackGroupInfo(TrackGroup, int[], @com.google.android.exoplayer2.C.TrackType int, boolean[])","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,int[],@com.google.android.exoplayer2.C.TrackTypeint,boolean[])"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.TrackIdGenerator","l":"TrackIdGenerator(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"trackIndex"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"trackIndexes"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"trackNumber"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"trackOutputs"},{"p":"com.google.android.exoplayer2.trackselection","c":"BaseTrackSelection","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"tracks"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionArray","l":"TrackSelectionArray(TrackSelection...)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelection...)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionData"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, DefaultTrackSelector, int)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.DefaultTrackSelector,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionDialogBuilder","l":"TrackSelectionDialogBuilder(Context, CharSequence, MappingTrackSelector.MappedTrackInfo, int, TrackSelectionDialogBuilder.DialogCallback)","url":"%3Cinit%3E(android.content.Context,java.lang.CharSequence,com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int,com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder.DialogCallback)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"TrackSelectionOverride(TrackGroup, List)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,java.util.List)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionOverrides.TrackSelectionOverride","l":"TrackSelectionOverride(TrackGroup)","url":"%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"trackSelectionOverrides"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"TrackSelectionParameters(TrackSelectionParameters.Builder)","url":"%3Cinit%3E(com.google.android.exoplayer2.trackselection.TrackSelectionParameters.Builder)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"trackSelectionReason"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet, int)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet,int)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.ui","c":"TrackSelectionView","l":"TrackSelectionView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelector","l":"TrackSelector()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],java.lang.Object)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"TrackSelectorResult(RendererConfiguration[], ExoTrackSelection[], TracksInfo, Object)","url":"%3Cinit%3E(com.google.android.exoplayer2.RendererConfiguration[],com.google.android.exoplayer2.trackselection.ExoTrackSelection[],com.google.android.exoplayer2.TracksInfo,java.lang.Object)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExtractorOutput","l":"tracksEnded"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectorResult","l":"tracksInfo"},{"p":"com.google.android.exoplayer2","c":"TracksInfo","l":"TracksInfo(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2.source","c":"MediaLoadData","l":"trackType"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"trailingParts"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferEnded()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferInitializing(DataSpec)","url":"transferInitializing(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"transferListenerCallbacks()"},{"p":"com.google.android.exoplayer2.upstream","c":"BaseDataSource","l":"transferStarted(DataSpec)","url":"transferStarted(com.google.android.exoplayer2.upstream.DataSpec)"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_CEA608_CDAT"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"TRANSFORMATION_NONE"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"transformType"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"triggerEvent(Predicate, int, int, byte[])","url":"triggerEvent(com.google.common.base.Predicate,int,int,byte[])"},{"p":"com.google.android.exoplayer2.upstream","c":"Allocator","l":"trim()"},{"p":"com.google.android.exoplayer2.upstream","c":"DefaultAllocator","l":"trim()"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_MAX_RATE_BYTES_PER_SECOND"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_RECHUNK_SAMPLE_COUNT"},{"p":"com.google.android.exoplayer2.audio","c":"Ac3Util","l":"TRUEHD_SYNCFRAME_PREFIX_LENGTH"},{"p":"com.google.android.exoplayer2.extractor","c":"TrueHdSampleRechunker","l":"TrueHdSampleRechunker()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"truncateAscii(CharSequence, int)","url":"truncateAscii(java.lang.CharSequence,int)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"TS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_PACKET_SIZE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_ADTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AAC_LATM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AC4"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_AIT"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DC2_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_DVBSUBS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_E_AC3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H262"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H263"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H264"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_H265"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_HDMV_DTS"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_ID3"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_MPA_LSF"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_STREAM_TYPE_SPLICE_INFO"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TS_SYNC_BYTE"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory, int)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory,int)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int, TimestampAdjuster, TsPayloadReader.Factory)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.util.TimestampAdjuster,com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Factory)"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsExtractor","l":"TsExtractor(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.ttml","c":"TtmlDecoder","l":"TtmlDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2","c":"RendererConfiguration","l":"tunneling"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"tunneling"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_NOT_SUPPORTED"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORT_MASK"},{"p":"com.google.android.exoplayer2","c":"RendererCapabilities","l":"TUNNELING_SUPPORTED"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.Parameters","l":"tunnelingEnabled"},{"p":"com.google.android.exoplayer2.text.tx3g","c":"Tx3gDecoder","l":"Tx3gDecoder(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"type"},{"p":"com.google.android.exoplayer2.extractor.mp4","c":"Track","l":"type"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"TsPayloadReader.DvbSubtitleInfo","l":"type"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"type"},{"p":"com.google.android.exoplayer2.source.chunk","c":"Chunk","l":"type"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"AdaptationSet","l":"type"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.StreamElement","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.SelectionOverride","l":"type"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection.Definition","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"LoadErrorHandlingPolicy.FallbackSelection","l":"type"},{"p":"com.google.android.exoplayer2.upstream","c":"ParsingLoadable","l":"type"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeCryptoConfig","l":"TYPE"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_AD_GROUP"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_ALAW"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_ALL_ADS"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_CLOSE"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_CUSTOM_BASE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_DASH"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_FLOAT"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_HLS"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_IMA_ADPCM"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_MLAW"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_NO_TIMESTAMP"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_OPEN"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_OTHER"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_PCM"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_OVERESTIMATED"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_POSITION_UNDERESTIMATED"},{"p":"com.google.android.exoplayer2.upstream","c":"HttpDataSource.HttpDataSourceException","l":"TYPE_READ"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_REMOTE"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_RENDERER"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_RTSP"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_SOURCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"TYPE_SS"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"TYPE_TARGET_TIMESTAMP_FOUND"},{"p":"com.google.android.exoplayer2","c":"ExoPlaybackException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdsMediaSource.AdLoadException","l":"TYPE_UNEXPECTED"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelection","l":"TYPE_UNSET"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"TYPE_WAVE_FORMAT_EXTENSIBLE"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"typeface"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"typeIndicator"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UDP_PORT_UNSET"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource","l":"UdpDataSource(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"UdpDataSource.UdpDataSourceException","l":"UdpDataSourceException(Throwable, @com.google.android.exoplayer2.PlaybackException.ErrorCode int)","url":"%3Cinit%3E(java.lang.Throwable,@com.google.android.exoplayer2.PlaybackException.ErrorCodeint)"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"uid"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"uid"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"Cache","l":"UID_UNSET"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"unappliedRotationDegrees"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpec_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedDataSpecWithGzipFlag_readUntilEnd()"},{"p":"com.google.android.exoplayer2.testutil","c":"DataSourceContractTest","l":"unboundedReadsAreIndefinite()"},{"p":"com.google.android.exoplayer2.extractor","c":"BinarySearchSeeker.TimestampSearchResult","l":"underestimatedResult(long, long)","url":"underestimatedResult(long,long)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioRendererEventListener.EventDispatcher","l":"underrun(int, long, long)","url":"underrun(int,long,long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"unescapeFileName(String)","url":"unescapeFileName(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil","l":"unescapeStream(byte[], int)","url":"unescapeStream(byte[],int)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.UnexpectedDiscontinuityException","l":"UnexpectedDiscontinuityException(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.upstream","c":"Loader.UnexpectedLoaderException","l":"UnexpectedLoaderException(Throwable)","url":"%3Cinit%3E(java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioProcessor.UnhandledAudioFormatException","l":"UnhandledAudioFormatException(AudioProcessor.AudioFormat)","url":"%3Cinit%3E(com.google.android.exoplayer2.audio.AudioProcessor.AudioFormat)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Uniform","l":"Uniform(String, int, int)","url":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"uniqueProgramId"},{"p":"com.google.android.exoplayer2","c":"DeviceInfo","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"UNKNOWN"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"UnrecognizedInputFormatException(String, Uri)","url":"%3Cinit%3E(java.lang.String,android.net.Uri)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioCapabilitiesReceiver","l":"unregister()"},{"p":"com.google.android.exoplayer2.ext.mediasession","c":"MediaSessionConnector","l":"unregisterCustomCommandReceiver(MediaSessionConnector.CommandReceiver)","url":"unregisterCustomCommandReceiver(com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.CommandReceiver)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long, long)","url":"%3Cinit%3E(long,long)"},{"p":"com.google.android.exoplayer2.extractor","c":"SeekMap.Unseekable","l":"Unseekable(long)","url":"%3Cinit%3E(long)"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2","c":"MediaItem.ClippingProperties","l":"UNSET"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LiveConfiguration","l":"UNSET"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest","l":"UNSET_LOOKAHEAD"},{"p":"com.google.android.exoplayer2.source","c":"ShuffleOrder.UnshuffledShuffleOrder","l":"UnshuffledShuffleOrder(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"UNSPECIFIED"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceFactory","l":"UNSUPPORTED"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int, Exception)","url":"%3Cinit%3E(int,java.lang.Exception)"},{"p":"com.google.android.exoplayer2.drm","c":"UnsupportedDrmException","l":"UnsupportedDrmException(int)","url":"%3Cinit%3E(int)"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.UnsupportedEglVersionException","l":"UnsupportedEglVersionException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest.UnsupportedRequestException","l":"UnsupportedRequestException()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"update(byte[], int, int, byte[], int)","url":"update(byte[],int,int,byte[],int)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"update(Uri, ContentValues, String, String[])","url":"update(android.net.Uri,android.content.ContentValues,java.lang.String,java.lang.String[])"},{"p":"com.google.android.exoplayer2.util","c":"DebugTextViewHelper","l":"updateAndPost()"},{"p":"com.google.android.exoplayer2.source","c":"ClippingMediaPeriod","l":"updateClipping(long, long)","url":"updateClipping(long,long)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateCodecOperatingRate()"},{"p":"com.google.android.exoplayer2.video","c":"DecoderVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateDroppedBufferCounters(int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesFlushingCipher","l":"updateInPlace(byte[], int, int)","url":"updateInPlace(byte[],int,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateManifest(DashManifest, int)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest,int)"},{"p":"com.google.android.exoplayer2.source.dash","c":"PlayerEmsgHandler","l":"updateManifest(DashManifest)","url":"updateManifest(com.google.android.exoplayer2.source.dash.manifest.DashManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateManifest(SsManifest)","url":"updateManifest(com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest)"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsCollector","l":"updateMediaPeriodQueueInfo(List, MediaSource.MediaPeriodId)","url":"updateMediaPeriodQueueInfo(java.util.List,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecRenderer","l":"updateOutputFormatForTime(long)"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionUtil","l":"updateParametersWithOverride(DefaultTrackSelector.Parameters, int, TrackGroupArray, boolean, DefaultTrackSelector.SelectionOverride)","url":"updateParametersWithOverride(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.source.TrackGroupArray,boolean,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"},{"p":"com.google.android.exoplayer2.ext.media2","c":"SessionPlayerConnector","l":"updatePlaylistMetadata(MediaMetadata)","url":"updatePlaylistMetadata(androidx.media2.common.MediaMetadata)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"AdaptiveTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"ExoTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"FixedTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.trackselection","c":"RandomTrackSelection","l":"updateSelectedTrack(long, long, long, List, MediaChunkIterator[])","url":"updateSelectedTrack(long,long,long,java.util.List,com.google.android.exoplayer2.source.chunk.MediaChunkIterator[])"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessions(AnalyticsListener.EventTime)","url":"updateSessions(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithDiscontinuity(AnalyticsListener.EventTime, @com.google.android.exoplayer2.Player.DiscontinuityReason int)","url":"updateSessionsWithDiscontinuity(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime,@com.google.android.exoplayer2.Player.DiscontinuityReasonint)"},{"p":"com.google.android.exoplayer2.analytics","c":"DefaultPlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackSessionManager","l":"updateSessionsWithTimelineChange(AnalyticsListener.EventTime)","url":"updateSessionsWithTimelineChange(com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime)"},{"p":"com.google.android.exoplayer2.offline","c":"Download","l":"updateTimeMs"},{"p":"com.google.android.exoplayer2.source.dash","c":"DashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.dash","c":"DefaultDashChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"DefaultSsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","c":"SsChunkSource","l":"updateTrackSelection(ExoTrackSelection)","url":"updateTrackSelection(com.google.android.exoplayer2.trackselection.ExoTrackSelection)"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer","l":"updateVideoFrameProcessingOffsetCounters(long)"},{"p":"com.google.android.exoplayer2.offline","c":"ActionFileUpgradeUtil","l":"upgradeAndDelete(File, ActionFileUpgradeUtil.DownloadIdProvider, DefaultDownloadIndex, boolean, boolean)","url":"upgradeAndDelete(java.io.File,com.google.android.exoplayer2.offline.ActionFileUpgradeUtil.DownloadIdProvider,com.google.android.exoplayer2.offline.DefaultDownloadIndex,boolean,boolean)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(int, long, long)","url":"upstreamDiscarded(int,long,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"upstreamDiscarded(MediaLoadData)","url":"upstreamDiscarded(com.google.android.exoplayer2.source.MediaLoadData)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"Clock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2.util","c":"SystemClock","l":"uptimeMillis()"},{"p":"com.google.android.exoplayer2","c":"MediaItem.LocalConfiguration","l":"uri"},{"p":"com.google.android.exoplayer2","c":"MediaItem.SubtitleConfiguration","l":"uri"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"LoadEventInfo","l":"uri"},{"p":"com.google.android.exoplayer2.source","c":"UnrecognizedInputFormatException","l":"uri"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Representation.SingleSegmentRepresentation","l":"uri"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeDataSet.FakeData","l":"uri"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uri"},{"p":"com.google.android.exoplayer2.drm","c":"MediaDrmCallbackException","l":"uriAfterRedirects"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"uriPositionOffset"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"uris"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"url"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"url"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Rendition","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist.SegmentBase","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistResetException","l":"url"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsPlaylistTracker.PlaylistStuckException","l":"url"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"UrlLinkFrame(String, String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioAttributes","l":"usage"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ALARM"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_ACCESSIBILITY"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANCE_SONIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_ASSISTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_GAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_MEDIA"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_DELAYED"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_INSTANT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_COMMUNICATION_REQUEST"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_EVENT"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_NOTIFICATION_RINGTONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_UNKNOWN"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION"},{"p":"com.google.android.exoplayer2","c":"C","l":"USAGE_VOICE_COMMUNICATION_SIGNALLING"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"USE_TRACK_COLOR_SETTINGS"},{"p":"com.google.android.exoplayer2.util","c":"GlUtil.Program","l":"use()"},{"p":"com.google.android.exoplayer2.testutil","c":"CacheAsserts.RequestSet","l":"useBoundedDataSpecFor(String)","url":"useBoundedDataSpecFor(java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_IDENTIFIER_GA94"},{"p":"com.google.android.exoplayer2.extractor","c":"CeaUtil","l":"USER_DATA_TYPE_CODE_MPEG_CC"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"userRating"},{"p":"com.google.android.exoplayer2","c":"C","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"usToMs(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToNonWrappedPts(long)"},{"p":"com.google.android.exoplayer2.util","c":"TimestampAdjuster","l":"usToWrappedPts(long)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.ComponentSplice","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand.Event","l":"utcSpliceTime"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"DashManifest","l":"utcTiming"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"UtcTimingElement(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF16LE_NAME"},{"p":"com.google.android.exoplayer2","c":"C","l":"UTF8_NAME"},{"p":"com.google.android.exoplayer2","c":"MediaItem.DrmConfiguration","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"uuid"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkCryptoConfig","l":"uuid"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","c":"SsManifest.ProtectionElement","l":"uuid"},{"p":"com.google.android.exoplayer2","c":"C","l":"UUID_NIL"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeExoMediaDrm","l":"VALID_PROVISION_RESPONSE"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttParserUtil","l":"validateWebvttHeaderLine(ParsableByteArray)","url":"validateWebvttHeaderLine(com.google.android.exoplayer2.util.ParsableByteArray)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"validJoinTimeCount"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"value"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"value"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"value"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"Descriptor","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"EventStream","l":"value"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"UtcTimingElement","l":"value"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variableDefinitions"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"Variant(Uri, Format, String, String, String, String)","url":"%3Cinit%3E(android.net.Uri,com.google.android.exoplayer2.Format,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"VariantInfo(int, int, String, String, String, String)","url":"%3Cinit%3E(int,int,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"variantInfos"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"variants"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.CommentHeader","l":"vendor"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecInfo","l":"vendor"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil","l":"verifyVorbisHeaderCapturePattern(int, ParsableByteArray, boolean)","url":"verifyVorbisHeaderCapturePattern(int,com.google.android.exoplayer2.util.ParsableByteArray,boolean)"},{"p":"com.google.android.exoplayer2.audio","c":"MpegAudioUtil.Header","l":"version"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"version"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMediaPlaylist","l":"version"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"version"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_INT"},{"p":"com.google.android.exoplayer2","c":"ExoPlayerLibraryInfo","l":"VERSION_SLASHY"},{"p":"com.google.android.exoplayer2.database","c":"VersionTable","l":"VERSION_UNSET"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_LR"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"VERTICAL_TYPE_RL"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"verticalType"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_AV1"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DIVX"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_DOLBY_VISION"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_FLV"},{"p":"com.google.android.exoplayer2.testutil","c":"ExoPlayerTestRunner","l":"VIDEO_FORMAT"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H263"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H264"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_H265"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MATROSKA"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP2T"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MP4V"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_MPEG2"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_OGG"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_NONE"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_SURFACE_YUV"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_OUTPUT_MODE_YUV"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_PS"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_DEFAULT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT"},{"p":"com.google.android.exoplayer2","c":"C","l":"VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM"},{"p":"com.google.android.exoplayer2.extractor.ts","c":"PsExtractor","l":"VIDEO_STREAM_MASK"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_UNKNOWN"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VC1"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP8"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_VP9"},{"p":"com.google.android.exoplayer2.util","c":"MimeTypes","l":"VIDEO_WEBM"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoCodecError(Exception)","url":"videoCodecError(java.lang.Exception)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context, AttributeSet)","url":"%3Cinit%3E(android.content.Context,android.util.AttributeSet)"},{"p":"com.google.android.exoplayer2.video","c":"VideoDecoderGLSurfaceView","l":"VideoDecoderGLSurfaceView(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"VideoDecoderOutputBuffer(DecoderOutputBuffer.Owner)","url":"%3Cinit%3E(com.google.android.exoplayer2.decoder.DecoderOutputBuffer.Owner)"},{"p":"com.google.android.exoplayer2.analytics","c":"PlaybackStats","l":"videoFormatHistory"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderCounters","l":"videoFrameProcessingOffsetCount"},{"p":"com.google.android.exoplayer2.video","c":"VideoFrameReleaseHelper","l":"VideoFrameReleaseHelper(Context)","url":"%3Cinit%3E(android.content.Context)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist.Variant","l":"videoGroupId"},{"p":"com.google.android.exoplayer2.source.hls.playlist","c":"HlsMasterPlaylist","l":"videos"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoSize"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int, int, float)","url":"%3Cinit%3E(int,int,int,float)"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"VideoSize(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.google.android.exoplayer2.video","c":"VideoRendererEventListener.EventDispatcher","l":"videoSizeChanged(VideoSize)","url":"videoSizeChanged(com.google.android.exoplayer2.video.VideoSize)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"videoStartPosition"},{"p":"com.google.android.exoplayer2.trackselection","c":"DefaultTrackSelector.VideoTrackScore","l":"VideoTrackScore(Format, DefaultTrackSelector.Parameters, int, boolean)","url":"%3Cinit%3E(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,boolean)"},{"p":"com.google.android.exoplayer2.ui","c":"AdOverlayInfo","l":"view"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_CANVAS"},{"p":"com.google.android.exoplayer2.ui","c":"SubtitleView","l":"VIEW_TYPE_WEB"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportHeight"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportOrientationMayChange"},{"p":"com.google.android.exoplayer2.trackselection","c":"TrackSelectionParameters","l":"viewportWidth"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisBitArray","l":"VorbisBitArray(byte[])","url":"%3Cinit%3E(byte[])"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"VorbisComment(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.VorbisIdHeader","l":"VorbisIdHeader(int, int, int, int, int, int, int, int, boolean, byte[])","url":"%3Cinit%3E(int,int,int,int,int,int,int,int,boolean,byte[])"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxDecoder","l":"VpxDecoder(int, int, int, CryptoConfig, int)","url":"%3Cinit%3E(int,int,int,com.google.android.exoplayer2.decoder.CryptoConfig,int)"},{"p":"com.google.android.exoplayer2.ext.vp9","c":"VpxLibrary","l":"vpxIsSecureDecodeSupported()"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String, Throwable)","url":"w(java.lang.String,java.lang.String,java.lang.Throwable)"},{"p":"com.google.android.exoplayer2.util","c":"Log","l":"w(String, String)","url":"w(java.lang.String,java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForIsLoading(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForIsLoading","l":"WaitForIsLoading(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForMessage(ActionSchedule.PlayerTarget)","url":"waitForMessage(com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForMessage","l":"WaitForMessage(String, ActionSchedule.PlayerTarget)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPendingPlayerCommands()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPendingPlayerCommands","l":"WaitForPendingPlayerCommands(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlaybackState(@com.google.android.exoplayer2.Player.State int)","url":"waitForPlaybackState(@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlaybackState","l":"WaitForPlaybackState(String, @com.google.android.exoplayer2.Player.State int)","url":"%3Cinit%3E(java.lang.String,@com.google.android.exoplayer2.Player.Stateint)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPlayWhenReady(boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPlayWhenReady","l":"WaitForPlayWhenReady(String, boolean)","url":"%3Cinit%3E(java.lang.String,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForPositionDiscontinuity()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForPositionDiscontinuity","l":"WaitForPositionDiscontinuity(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged()"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String, Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.testutil","c":"Action.WaitForTimelineChanged","l":"WaitForTimelineChanged(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"ActionSchedule.Builder","l":"waitForTimelineChanged(Timeline, @com.google.android.exoplayer2.Player.TimelineChangeReason int)","url":"waitForTimelineChanged(com.google.android.exoplayer2.Timeline,@com.google.android.exoplayer2.Player.TimelineChangeReasonint)"},{"p":"com.google.android.exoplayer2.decoder","c":"DecoderInputBuffer","l":"waitingForKeys"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_LOCAL"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NETWORK"},{"p":"com.google.android.exoplayer2","c":"C","l":"WAKE_MODE_NONE"},{"p":"com.google.android.exoplayer2.mediacodec","c":"MediaCodecUtil","l":"warmDecoderInfoCache(String, boolean, boolean)","url":"warmDecoderInfoCache(java.lang.String,boolean,boolean)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WAV"},{"p":"com.google.android.exoplayer2.audio","c":"WavUtil","l":"WAVE_FOURCC"},{"p":"com.google.android.exoplayer2.extractor.wav","c":"WavExtractor","l":"WavExtractor()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.audio","c":"TeeAudioProcessor.WavFileAudioBufferSink","l":"WavFileAudioBufferSink(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.util","c":"FileTypes","l":"WEBVTT"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCssStyle","l":"WebvttCssStyle()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueInfo","l":"WebvttCueInfo(Cue, long, long)","url":"%3Cinit%3E(com.google.android.exoplayer2.text.Cue,long,long)"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttCueParser","l":"WebvttCueParser()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text.webvtt","c":"WebvttDecoder","l":"WebvttDecoder()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.source.hls","c":"WebvttExtractor","l":"WebvttExtractor(String, TimestampAdjuster)","url":"%3Cinit%3E(java.lang.String,com.google.android.exoplayer2.util.TimestampAdjuster)"},{"p":"com.google.android.exoplayer2.source.dash.manifest","c":"BaseUrl","l":"weight"},{"p":"com.google.android.exoplayer2","c":"C","l":"WIDEVINE_UUID"},{"p":"com.google.android.exoplayer2","c":"Format","l":"width"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"width"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.H265SpsData","l":"width"},{"p":"com.google.android.exoplayer2.util","c":"NalUnitUtil.SpsData","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"AvcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"HevcConfig","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"MediaCodecVideoRenderer.CodecMaxValues","l":"width"},{"p":"com.google.android.exoplayer2.video","c":"VideoSize","l":"width"},{"p":"com.google.android.exoplayer2","c":"BasePlayer","l":"window"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"Window()","url":"%3Cinit%3E()"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColor"},{"p":"com.google.android.exoplayer2.ui","c":"CaptionStyleCompat","l":"windowColor"},{"p":"com.google.android.exoplayer2.text","c":"Cue","l":"windowColorSet"},{"p":"com.google.android.exoplayer2","c":"IllegalSeekPositionException","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowIndex"},{"p":"com.google.android.exoplayer2","c":"Timeline.Period","l":"windowIndex"},{"p":"com.google.android.exoplayer2.analytics","c":"AnalyticsListener.EventTime","l":"windowIndex"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"windowIndex"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeTimeline.TimelineWindowDefinition","l":"windowOffsetInFirstPeriodUs"},{"p":"com.google.android.exoplayer2.source","c":"MediaPeriodId","l":"windowSequenceNumber"},{"p":"com.google.android.exoplayer2","c":"Timeline.Window","l":"windowStartTimeMs"},{"p":"com.google.android.exoplayer2.extractor","c":"VorbisUtil.Mode","l":"windowType"},{"p":"com.google.android.exoplayer2","c":"Player.PositionInfo","l":"windowUid"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.AbsoluteSized","l":"withAbsoluteSize(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdCount(int, int)","url":"withAdCount(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withAdditionalHeaders(Map)","url":"withAdditionalHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(int, long...)","url":"withAdDurationsUs(int,long...)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdDurationsUs(long[])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdDurationsUs(long[][])"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdGroupTimeUs(int, long)","url":"withAdGroupTimeUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdLoadError(int, int)","url":"withAdLoadError(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdResumePositionUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdState(int, int)","url":"withAdState(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withAdUri(int, int, Uri)","url":"withAdUri(int,int,android.net.Uri)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAdUri(Uri, int)","url":"withAdUri(android.net.Uri,int)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Aligned","l":"withAlignment(Layout.Alignment)","url":"withAlignment(android.text.Layout.Alignment)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withAllAdsSkipped()"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Colored","l":"withColor(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentDurationUs(long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withContentResumeOffsetUs(int, long)","url":"withContentResumeOffsetUs(int,long)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withContentResumeOffsetUs(long)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.Typefaced","l":"withFamily(String)","url":"withFamily(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.WithSpanFlags","l":"withFlags(int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withIsServerSideInserted(boolean)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withIsServerSideInserted(int, boolean)","url":"withIsServerSideInserted(int,boolean)"},{"p":"com.google.android.exoplayer2","c":"Format","l":"withManifestFormatInfo(Format)","url":"withManifestFormatInfo(com.google.android.exoplayer2.Format)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.EmphasizedText","l":"withMarkAndPosition(int, int, int)","url":"withMarkAndPosition(int,int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withNewAdGroup(int, long)","url":"withNewAdGroup(int,long)"},{"p":"com.google.android.exoplayer2.source","c":"MediaSourceEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId, long)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,long)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmSessionEventListener.EventDispatcher","l":"withParameters(int, MediaSource.MediaPeriodId)","url":"withParameters(int,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withPlayedAd(int, int)","url":"withPlayedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withRemovedAdGroupCount(int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withRequestHeaders(Map)","url":"withRequestHeaders(java.util.Map)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RelativeSized","l":"withSizeChange(float)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAd(int, int)","url":"withSkippedAd(int,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState","l":"withSkippedAdGroup(int)"},{"p":"com.google.android.exoplayer2","c":"PlaybackParameters","l":"withSpeed(float)"},{"p":"com.google.android.exoplayer2.testutil.truth","c":"SpannedSubject.RubyText","l":"withTextAndPosition(String, int)","url":"withTextAndPosition(java.lang.String,int)"},{"p":"com.google.android.exoplayer2.source.ads","c":"AdPlaybackState.AdGroup","l":"withTimeUs(long)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSpec","l":"withUri(Uri)","url":"withUri(android.net.Uri)"},{"p":"com.google.android.exoplayer2.drm","c":"FrameworkCryptoConfig","l":"WORKAROUND_DEVICE_NEEDS_KEYS_TO_CONFIGURE_CODEC"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(Context, String)","url":"%3Cinit%3E(android.content.Context,java.lang.String)"},{"p":"com.google.android.exoplayer2.ext.workmanager","c":"WorkManagerScheduler","l":"WorkManagerScheduler(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.google.android.exoplayer2.testutil","c":"FailOnCloseDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"ByteArrayDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream","c":"DataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.cache","c":"CacheDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.upstream.crypto","c":"AesCipherDataSink","l":"write(byte[], int, int)","url":"write(byte[],int,int)"},{"p":"com.google.android.exoplayer2.util","c":"Util","l":"writeBoolean(Parcel, boolean)","url":"writeBoolean(android.os.Parcel,boolean)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeSampleStream","l":"writeData(long)"},{"p":"com.google.android.exoplayer2.testutil","c":"AssetContentProvider","l":"writeDataToPipe(ParcelFileDescriptor, Uri, String, Bundle, Object)","url":"writeDataToPipe(android.os.ParcelFileDescriptor,android.net.Uri,java.lang.String,android.os.Bundle,java.lang.Object)"},{"p":"com.google.android.exoplayer2.audio","c":"AudioSink.WriteException","l":"WriteException(int, Format, boolean)","url":"%3Cinit%3E(int,com.google.android.exoplayer2.Format,boolean)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"writer"},{"p":"com.google.android.exoplayer2.source.rtsp","c":"RtpPacket","l":"writeToBuffer(byte[], int, int)","url":"writeToBuffer(byte[],int,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.drm","c":"DrmInitData.SchemeData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata","c":"Metadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","c":"AppInfoTable","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.emsg","c":"EventMessage","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"PictureFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.flac","c":"VorbisComment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyHeaders","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.icy","c":"IcyInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ApicFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"BinaryFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"ChapterTocFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"CommentFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"GeobFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"InternalFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"MlltFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"PrivFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"TextInformationFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.id3","c":"UrlLinkFrame","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MdtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"MotionPhotoMetadata","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SlowMotionData.Segment","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.mp4","c":"SmtaMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"PrivateCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceNullCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceScheduleCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"TimeSignalCommand","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"DownloadRequest","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.offline","c":"StreamKey","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.scheduler","c":"Requirements","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.source.hls","c":"HlsTrackMetadataEntry.VariantInfo","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.testutil","c":"FakeMetadataEntry","l":"writeToParcel(Parcel, int)","url":"writeToParcel(android.os.Parcel,int)"},{"p":"com.google.android.exoplayer2.metadata.scte35","c":"SpliceInsertCommand.ComponentSplice","l":"writeToParcel(Parcel)","url":"writeToParcel(android.os.Parcel)"},{"p":"com.google.android.exoplayer2","c":"MediaMetadata","l":"year"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"yuvPlanes"},{"p":"com.google.android.exoplayer2.decoder","c":"VideoDecoderOutputBuffer","l":"yuvStrides"}] diff --git a/docs/doc/reference/member-search-index.zip b/docs/doc/reference/member-search-index.zip index db9830057c4a20a66620858a500873fefcfba88c..16086650ad9b301515c4fdc15fca419d93ce604b 100644 GIT binary patch literal 140976 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 C^Ru=9 literal 136486 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 wol>7jB_np*(^k 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 z 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 diff --git a/docs/doc/reference/overview-tree.html b/docs/doc/reference/overview-tree.html index 5104fc92a2..bfdf8a377d 100644 --- a/docs/doc/reference/overview-tree.html +++ b/docs/doc/reference/overview-tree.html @@ -99,14 +99,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.audio,
    • com.google.android.exoplayer2.database,
    • com.google.android.exoplayer2.decoder,
    • -
    • com.google.android.exoplayer2.device,
    • com.google.android.exoplayer2.drm,
    • com.google.android.exoplayer2.ext.av1,
    • com.google.android.exoplayer2.ext.cast,
    • com.google.android.exoplayer2.ext.cronet,
    • com.google.android.exoplayer2.ext.ffmpeg,
    • com.google.android.exoplayer2.ext.flac,
    • -
    • com.google.android.exoplayer2.ext.gvr,
    • com.google.android.exoplayer2.ext.ima,
    • com.google.android.exoplayer2.ext.leanback,
    • com.google.android.exoplayer2.ext.media2,
    • @@ -322,10 +320,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.BasePlayer (implements com.google.android.exoplayer2.Player) +
    • com.google.android.exoplayer2.BaseRenderer (implements com.google.android.exoplayer2.Renderer, com.google.android.exoplayer2.RendererCapabilities)
    • -
    • com.google.android.exoplayer2.util.BundleableUtils
    • +
    • com.google.android.exoplayer2.util.BundleableUtil
    • com.google.android.exoplayer2.source.chunk.BundledChunkExtractor (implements com.google.android.exoplayer2.source.chunk.ChunkExtractor, com.google.android.exoplayer2.extractor.ExtractorOutput)
    • com.google.android.exoplayer2.source.BundledExtractorsAdapter (implements com.google.android.exoplayer2.source.ProgressiveMediaExtractor)
    • com.google.android.exoplayer2.source.hls.BundledHlsMediaChunkExtractor (implements com.google.android.exoplayer2.source.hls.HlsMediaChunkExtractor)
    • @@ -407,11 +408,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.testutil.CacheAsserts.RequestSet
    • com.google.android.exoplayer2.upstream.cache.CacheDataSink (implements com.google.android.exoplayer2.upstream.DataSink)
    • com.google.android.exoplayer2.upstream.cache.CacheDataSink.Factory (implements com.google.android.exoplayer2.upstream.DataSink.Factory)
    • -
    • com.google.android.exoplayer2.upstream.cache.CacheDataSinkFactory (implements com.google.android.exoplayer2.upstream.DataSink.Factory)
    • com.google.android.exoplayer2.upstream.cache.CacheDataSource (implements com.google.android.exoplayer2.upstream.DataSource)
    • com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
    • -
    • com.google.android.exoplayer2.upstream.cache.CacheDataSourceFactory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
    • -
    • com.google.android.exoplayer2.upstream.cache.CachedRegionTracker (implements com.google.android.exoplayer2.upstream.cache.Cache.Listener)
    • +
    • com.google.android.exoplayer2.upstream.CachedRegionTracker (implements com.google.android.exoplayer2.upstream.cache.Cache.Listener)
    • com.google.android.exoplayer2.upstream.cache.CacheSpan (implements java.lang.Comparable<T>)
    • com.google.android.exoplayer2.upstream.cache.CacheWriter
    • com.google.android.exoplayer2.ui.CaptionStyleCompat
    • @@ -442,12 +441,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.source.chunk.ChunkSampleStream.EmbeddedSampleStream (implements com.google.android.exoplayer2.source.SampleStream)
    • com.google.android.exoplayer2.source.ClippingMediaPeriod (implements com.google.android.exoplayer2.source.MediaPeriod, com.google.android.exoplayer2.source.MediaPeriod.Callback)
    • com.google.android.exoplayer2.util.CodecSpecificDataUtil
    • -
    • com.google.android.exoplayer2.video.ColorInfo (implements android.os.Parcelable)
    • +
    • com.google.android.exoplayer2.video.ColorInfo (implements com.google.android.exoplayer2.Bundleable)
    • com.google.android.exoplayer2.util.ColorParser
    • com.google.android.exoplayer2.source.CompositeSequenceableLoader (implements com.google.android.exoplayer2.source.SequenceableLoader)
    • com.google.android.exoplayer2.util.ConditionVariable
    • com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap (implements com.google.android.exoplayer2.extractor.SeekMap)
    • com.google.android.exoplayer2.upstream.cache.ContentMetadataMutations
    • +
    • android.content.ContentProvider (implements android.content.ComponentCallbacks2) + +
    • android.content.Context
    • +
    • com.google.android.exoplayer2.text.SubtitleExtractor (implements com.google.android.exoplayer2.extractor.Extractor)
    • android.view.Surface (implements android.os.Parcelable)
    • +
    • com.google.android.exoplayer2.decoder.DecoderOutputBuffer.Owner<S>
    • com.google.android.exoplayer2.audio.DefaultAudioSink.AudioProcessorChain
    • com.google.android.exoplayer2.source.DefaultMediaSourceFactory.AdsLoaderProvider
    • -
    • com.google.android.exoplayer2.device.DeviceListener - -
    • com.google.android.exoplayer2.offline.Downloader
    • com.google.android.exoplayer2.offline.Downloader.ProgressListener
    • com.google.android.exoplayer2.offline.DownloaderFactory
    • @@ -1391,7 +1411,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.util.EGLSurfaceTexture.TextureImageListener
    • com.google.android.exoplayer2.extractor.ts.ElementaryStreamReader
    • com.google.android.exoplayer2.util.ErrorMessageProvider<T>
    • -
    • com.google.android.exoplayer2.drm.ExoMediaCrypto
    • com.google.android.exoplayer2.drm.ExoMediaDrm
    • com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener
    • com.google.android.exoplayer2.drm.ExoMediaDrm.OnExpirationUpdateListener
    • @@ -1400,7 +1419,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.ExoPlayer.AudioComponent
    • com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener
    • com.google.android.exoplayer2.ExoPlayer.DeviceComponent
    • -
    • com.google.android.exoplayer2.ExoPlayer.MetadataComponent
    • com.google.android.exoplayer2.ExoPlayer.TextComponent
    • com.google.android.exoplayer2.ExoPlayer.VideoComponent
    • com.google.android.exoplayer2.trackselection.ExoTrackSelection.Factory
    • @@ -1462,13 +1480,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.source.MediaSourceFactory
    • com.google.android.exoplayer2.metadata.MetadataDecoder
    • com.google.android.exoplayer2.metadata.MetadataDecoderFactory
    • -
    • com.google.android.exoplayer2.metadata.MetadataOutput - -
    • +
    • com.google.android.exoplayer2.metadata.MetadataOutput
    • com.google.android.exoplayer2.util.NetworkTypeObserver.Listener
    • -
    • com.google.android.exoplayer2.decoder.OutputBuffer.Owner<S>
    • android.os.Parcelable @@ -1603,6 +1608,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.C.AudioContentType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.AudioFlags (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.AudioFocusGain (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.C.AudioManagerOffloadMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.AudioUsage (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.BufferFlags (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.ColorRange (implements java.lang.annotation.Annotation)
    • @@ -1610,6 +1616,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.C.ColorTransfer (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.ContentType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.CryptoMode (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.C.CryptoType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.DataType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.Encoding (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.FormatSupport (implements java.lang.annotation.Annotation)
    • @@ -1618,8 +1625,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.C.Projection (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.RoleFlags (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.SelectionFlags (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.C.SelectionReason (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.StereoMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.StreamType (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.C.TrackType (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.VideoOutputMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.VideoScalingMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.C.WakeMode (implements java.lang.annotation.Annotation)
    • @@ -1640,7 +1650,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Mode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.DefaultRenderersFactory.ExtensionRendererMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.extractor.ts.DefaultTsPayloadReaderFactory.Flags (implements java.lang.annotation.Annotation)
    • -
    • com.google.android.exoplayer2.device.DeviceInfo.PlaybackType (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.DeviceInfo.PlaybackType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.offline.Download.FailureReason (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.offline.Download.State (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.drm.DrmSession.State (implements java.lang.annotation.Annotation)
    • @@ -1682,8 +1692,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.ui.PlayerNotificationManager.Priority (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.ui.PlayerNotificationManager.Visibility (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.ui.PlayerView.ShowBuffering (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.Renderer.MessageType (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.Renderer.State (implements java.lang.annotation.Annotation)
    • -
    • com.google.android.exoplayer2.Renderer.VideoScalingMode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.RendererCapabilities.Capabilities (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.RendererCapabilities.FormatSupport (implements java.lang.annotation.Annotation)
    • @@ -1699,6 +1709,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
    • com.google.android.exoplayer2.text.span.TextEmphasisSpan.MarkShape (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.extractor.mp4.Track.Transformation (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.extractor.TrackOutput.SampleDataPart (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.trackselection.TrackSelection.Type (implements java.lang.annotation.Annotation)
    • +
    • com.google.android.exoplayer2.transformer.TranscodingTransformer.ProgressState (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.transformer.Transformer.ProgressState (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.extractor.ts.TsExtractor.Mode (implements java.lang.annotation.Annotation)
    • com.google.android.exoplayer2.extractor.ts.TsPayloadReader.Flags (implements java.lang.annotation.Annotation)
    • diff --git a/docs/doc/reference/package-search-index.js b/docs/doc/reference/package-search-index.js index 19d9ffaf00..0f77c66240 100644 --- a/docs/doc/reference/package-search-index.js +++ b/docs/doc/reference/package-search-index.js @@ -1 +1 @@ -packageSearchIndex = [{"l":"All Packages","url":"allpackages-index.html"},{"l":"com.google.android.exoplayer2"},{"l":"com.google.android.exoplayer2.analytics"},{"l":"com.google.android.exoplayer2.audio"},{"l":"com.google.android.exoplayer2.database"},{"l":"com.google.android.exoplayer2.decoder"},{"l":"com.google.android.exoplayer2.device"},{"l":"com.google.android.exoplayer2.drm"},{"l":"com.google.android.exoplayer2.ext.av1"},{"l":"com.google.android.exoplayer2.ext.cast"},{"l":"com.google.android.exoplayer2.ext.cronet"},{"l":"com.google.android.exoplayer2.ext.ffmpeg"},{"l":"com.google.android.exoplayer2.ext.flac"},{"l":"com.google.android.exoplayer2.ext.gvr"},{"l":"com.google.android.exoplayer2.ext.ima"},{"l":"com.google.android.exoplayer2.ext.leanback"},{"l":"com.google.android.exoplayer2.ext.media2"},{"l":"com.google.android.exoplayer2.ext.mediasession"},{"l":"com.google.android.exoplayer2.ext.okhttp"},{"l":"com.google.android.exoplayer2.ext.opus"},{"l":"com.google.android.exoplayer2.ext.rtmp"},{"l":"com.google.android.exoplayer2.ext.vp9"},{"l":"com.google.android.exoplayer2.ext.workmanager"},{"l":"com.google.android.exoplayer2.extractor"},{"l":"com.google.android.exoplayer2.extractor.amr"},{"l":"com.google.android.exoplayer2.extractor.flac"},{"l":"com.google.android.exoplayer2.extractor.flv"},{"l":"com.google.android.exoplayer2.extractor.jpeg"},{"l":"com.google.android.exoplayer2.extractor.mkv"},{"l":"com.google.android.exoplayer2.extractor.mp3"},{"l":"com.google.android.exoplayer2.extractor.mp4"},{"l":"com.google.android.exoplayer2.extractor.ogg"},{"l":"com.google.android.exoplayer2.extractor.rawcc"},{"l":"com.google.android.exoplayer2.extractor.ts"},{"l":"com.google.android.exoplayer2.extractor.wav"},{"l":"com.google.android.exoplayer2.mediacodec"},{"l":"com.google.android.exoplayer2.metadata"},{"l":"com.google.android.exoplayer2.metadata.dvbsi"},{"l":"com.google.android.exoplayer2.metadata.emsg"},{"l":"com.google.android.exoplayer2.metadata.flac"},{"l":"com.google.android.exoplayer2.metadata.icy"},{"l":"com.google.android.exoplayer2.metadata.id3"},{"l":"com.google.android.exoplayer2.metadata.mp4"},{"l":"com.google.android.exoplayer2.metadata.scte35"},{"l":"com.google.android.exoplayer2.offline"},{"l":"com.google.android.exoplayer2.robolectric"},{"l":"com.google.android.exoplayer2.scheduler"},{"l":"com.google.android.exoplayer2.source"},{"l":"com.google.android.exoplayer2.source.ads"},{"l":"com.google.android.exoplayer2.source.chunk"},{"l":"com.google.android.exoplayer2.source.dash"},{"l":"com.google.android.exoplayer2.source.dash.manifest"},{"l":"com.google.android.exoplayer2.source.dash.offline"},{"l":"com.google.android.exoplayer2.source.hls"},{"l":"com.google.android.exoplayer2.source.hls.offline"},{"l":"com.google.android.exoplayer2.source.hls.playlist"},{"l":"com.google.android.exoplayer2.source.mediaparser"},{"l":"com.google.android.exoplayer2.source.rtsp"},{"l":"com.google.android.exoplayer2.source.rtsp.reader"},{"l":"com.google.android.exoplayer2.source.smoothstreaming"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.manifest"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.offline"},{"l":"com.google.android.exoplayer2.testutil"},{"l":"com.google.android.exoplayer2.testutil.truth"},{"l":"com.google.android.exoplayer2.text"},{"l":"com.google.android.exoplayer2.text.cea"},{"l":"com.google.android.exoplayer2.text.dvb"},{"l":"com.google.android.exoplayer2.text.pgs"},{"l":"com.google.android.exoplayer2.text.span"},{"l":"com.google.android.exoplayer2.text.ssa"},{"l":"com.google.android.exoplayer2.text.subrip"},{"l":"com.google.android.exoplayer2.text.ttml"},{"l":"com.google.android.exoplayer2.text.tx3g"},{"l":"com.google.android.exoplayer2.text.webvtt"},{"l":"com.google.android.exoplayer2.trackselection"},{"l":"com.google.android.exoplayer2.transformer"},{"l":"com.google.android.exoplayer2.ui"},{"l":"com.google.android.exoplayer2.upstream"},{"l":"com.google.android.exoplayer2.upstream.cache"},{"l":"com.google.android.exoplayer2.upstream.crypto"},{"l":"com.google.android.exoplayer2.util"},{"l":"com.google.android.exoplayer2.video"},{"l":"com.google.android.exoplayer2.video.spherical"}] \ No newline at end of file +packageSearchIndex = [{"l":"All Packages","url":"allpackages-index.html"},{"l":"com.google.android.exoplayer2"},{"l":"com.google.android.exoplayer2.analytics"},{"l":"com.google.android.exoplayer2.audio"},{"l":"com.google.android.exoplayer2.database"},{"l":"com.google.android.exoplayer2.decoder"},{"l":"com.google.android.exoplayer2.drm"},{"l":"com.google.android.exoplayer2.ext.av1"},{"l":"com.google.android.exoplayer2.ext.cast"},{"l":"com.google.android.exoplayer2.ext.cronet"},{"l":"com.google.android.exoplayer2.ext.ffmpeg"},{"l":"com.google.android.exoplayer2.ext.flac"},{"l":"com.google.android.exoplayer2.ext.ima"},{"l":"com.google.android.exoplayer2.ext.leanback"},{"l":"com.google.android.exoplayer2.ext.media2"},{"l":"com.google.android.exoplayer2.ext.mediasession"},{"l":"com.google.android.exoplayer2.ext.okhttp"},{"l":"com.google.android.exoplayer2.ext.opus"},{"l":"com.google.android.exoplayer2.ext.rtmp"},{"l":"com.google.android.exoplayer2.ext.vp9"},{"l":"com.google.android.exoplayer2.ext.workmanager"},{"l":"com.google.android.exoplayer2.extractor"},{"l":"com.google.android.exoplayer2.extractor.amr"},{"l":"com.google.android.exoplayer2.extractor.flac"},{"l":"com.google.android.exoplayer2.extractor.flv"},{"l":"com.google.android.exoplayer2.extractor.jpeg"},{"l":"com.google.android.exoplayer2.extractor.mkv"},{"l":"com.google.android.exoplayer2.extractor.mp3"},{"l":"com.google.android.exoplayer2.extractor.mp4"},{"l":"com.google.android.exoplayer2.extractor.ogg"},{"l":"com.google.android.exoplayer2.extractor.rawcc"},{"l":"com.google.android.exoplayer2.extractor.ts"},{"l":"com.google.android.exoplayer2.extractor.wav"},{"l":"com.google.android.exoplayer2.mediacodec"},{"l":"com.google.android.exoplayer2.metadata"},{"l":"com.google.android.exoplayer2.metadata.dvbsi"},{"l":"com.google.android.exoplayer2.metadata.emsg"},{"l":"com.google.android.exoplayer2.metadata.flac"},{"l":"com.google.android.exoplayer2.metadata.icy"},{"l":"com.google.android.exoplayer2.metadata.id3"},{"l":"com.google.android.exoplayer2.metadata.mp4"},{"l":"com.google.android.exoplayer2.metadata.scte35"},{"l":"com.google.android.exoplayer2.offline"},{"l":"com.google.android.exoplayer2.robolectric"},{"l":"com.google.android.exoplayer2.scheduler"},{"l":"com.google.android.exoplayer2.source"},{"l":"com.google.android.exoplayer2.source.ads"},{"l":"com.google.android.exoplayer2.source.chunk"},{"l":"com.google.android.exoplayer2.source.dash"},{"l":"com.google.android.exoplayer2.source.dash.manifest"},{"l":"com.google.android.exoplayer2.source.dash.offline"},{"l":"com.google.android.exoplayer2.source.hls"},{"l":"com.google.android.exoplayer2.source.hls.offline"},{"l":"com.google.android.exoplayer2.source.hls.playlist"},{"l":"com.google.android.exoplayer2.source.mediaparser"},{"l":"com.google.android.exoplayer2.source.rtsp"},{"l":"com.google.android.exoplayer2.source.rtsp.reader"},{"l":"com.google.android.exoplayer2.source.smoothstreaming"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.manifest"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.offline"},{"l":"com.google.android.exoplayer2.testutil"},{"l":"com.google.android.exoplayer2.testutil.truth"},{"l":"com.google.android.exoplayer2.text"},{"l":"com.google.android.exoplayer2.text.cea"},{"l":"com.google.android.exoplayer2.text.dvb"},{"l":"com.google.android.exoplayer2.text.pgs"},{"l":"com.google.android.exoplayer2.text.span"},{"l":"com.google.android.exoplayer2.text.ssa"},{"l":"com.google.android.exoplayer2.text.subrip"},{"l":"com.google.android.exoplayer2.text.ttml"},{"l":"com.google.android.exoplayer2.text.tx3g"},{"l":"com.google.android.exoplayer2.text.webvtt"},{"l":"com.google.android.exoplayer2.trackselection"},{"l":"com.google.android.exoplayer2.transformer"},{"l":"com.google.android.exoplayer2.ui"},{"l":"com.google.android.exoplayer2.upstream"},{"l":"com.google.android.exoplayer2.upstream.cache"},{"l":"com.google.android.exoplayer2.upstream.crypto"},{"l":"com.google.android.exoplayer2.util"},{"l":"com.google.android.exoplayer2.video"},{"l":"com.google.android.exoplayer2.video.spherical"}] diff --git a/docs/doc/reference/package-search-index.zip b/docs/doc/reference/package-search-index.zip index e44be4048f48dccfe5db6635d21022371b75bd61..500208654fd21ed102fff01b8f1891216f59080e 100644 GIT binary patch delta 491 zcmV@6aWYa2mp?SW04J41Q!zcv5{y`e^Rpa34WI2ZW_>F;gfJod;>ePJxifr$wQqd1B5QAy;XVH@tAvJblgI z6!bNfIkxjPiZk7;0+y4SHxTuXE>x$qs+~Woupd&K^%KQ>dBXXkcG9T-o&r~^Uv5^U z`B1JPUAX;Fe{MBb`d$$kwxX`Yjaz&2S_vabSNU`lkv<)7?`p+Kb9O57n4Jn)#>-cs zm4+esMcQgh>Qg|=#Y>lq?1ZicaVeuziTv&=mpz0Pzo#e*!%QTmk?9007?X+m`?U delta 500 zcmV@6aWYa2mtI(HIWTh1P2NEjge?ie`0#|Ry=iyLK1ImVEv?^ zEf8z)k`~km!w@r$8X{J(N+d32n zH0ce~&T&7W_zv-2)qR=6oPu&In(*{WW*Z7#`*!>Bf03b(G8C=rlC{k|luXZVz3AeLee)De9LPIK1Ty0g_ z-D`dnOM((_|8K4TsHJkxEd38w6xr$>N~hh~7Sah@uZ6b4?>A6O2MD!6s;(Xa002x7 q002-+0Rj{N6aWYa2mtI(HB+@gs;(Xa002x7lXe0<24w;O0000^9^uRY diff --git a/docs/doc/reference/serialized-form.html b/docs/doc/reference/serialized-form.html index 7ddcf4a956..1a0828f33a 100644 --- a/docs/doc/reference/serialized-form.html +++ b/docs/doc/reference/serialized-form.html @@ -227,7 +227,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
      • errorCode

        -
        int errorCode
        +
        @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode
        An error code which identifies the cause of the playback failure.
      • @@ -370,6 +370,23 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

        Package com.google.android.exoplayer2.decoder

          +
        • + + +

          Class com.google.android.exoplayer2.decoder.CryptoException extends Exception implements Serializable

          +
            +
          • +

            Serialized Fields

            +
              +
            • +

              errorCode

              +
              int errorCode
              +
              A component specific error code.
              +
            • +
            +
          • +
          +
        • @@ -404,23 +421,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

          Package com.google.android.exoplayer2.drm

            -
          • - - -

            Class com.google.android.exoplayer2.drm.DecryptionException extends Exception implements Serializable

            -
              -
            • -

              Serialized Fields

              -
                -
              • -

                errorCode

                -
                int errorCode
                -
                A component specific error code.
                -
              • -
              -
            • -
            -
          • @@ -441,7 +441,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
            • errorCode

              -
              int errorCode
              +
              @com.google.android.exoplayer2.PlaybackException.ErrorCode int errorCode
              The PlaybackException.ErrorCode that corresponds to the failure.
            @@ -944,7 +944,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
            • reason

              -
              int reason
              +
              @com.google.android.exoplayer2.PlaybackException.ErrorCode int reason
              The reason of this DataSourceException, should be one of the ERROR_CODE_IO_* in PlaybackException.ErrorCode.
            • @@ -1075,6 +1075,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));

              Class com.google.android.exoplayer2.util.EGLSurfaceTexture.GlException extends RuntimeException implements Serializable

              +
            • + + +

              Class com.google.android.exoplayer2.util.GlUtil.GlException extends RuntimeException implements Serializable

              +
            • +
            • + + +

              Class com.google.android.exoplayer2.util.GlUtil.UnsupportedEglVersionException extends Exception implements Serializable

              +
            • diff --git a/docs/doc/reference/type-search-index.js b/docs/doc/reference/type-search-index.js index 427279dba2..2b170009fe 100644 --- a/docs/doc/reference/type-search-index.js +++ b/docs/doc/reference/type-search-index.js @@ -1 +1 @@ -typeSearchIndex = [{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.AacAudioObjectType"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AbsoluteSized"},{"p":"com.google.android.exoplayer2","l":"AbstractConcatenatedTimeline"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util"},{"p":"com.google.android.exoplayer2.testutil","l":"Action"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.AdaptationCheckpoint"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"AdaptationSet"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.AdaptiveSupport"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil.AdaptiveTrackSelectionFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"AdditionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.AddMediaItems"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdGroup"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory.AdsLoaderProvider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdState"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsReader"},{"p":"com.google.android.exoplayer2.ui","l":"AdViewProvider"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSink"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSource"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesFlushingCipher"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Aligned"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocation"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.AllowedCommandProvider"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsCollector"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener"},{"p":"com.google.android.exoplayer2.text","l":"Cue.AnchorType"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AndSpanFlags"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ApicFrame"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTable"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTableDecoder"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.AppManagedProvider"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.AspectRatioListener"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig"},{"p":"com.google.android.exoplayer2.util","l":"Assertions"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource.AssetDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"AtomicFile"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Attribute"},{"p":"com.google.android.exoplayer2","l":"C.AudioAllowedCapturePolicy"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.AudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilities"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioComponent"},{"p":"com.google.android.exoplayer2","l":"C.AudioContentType"},{"p":"com.google.android.exoplayer2","l":"C.AudioFlags"},{"p":"com.google.android.exoplayer2","l":"C.AudioFocusGain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.AudioFormat"},{"p":"com.google.android.exoplayer2.audio","l":"AudioListener"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioOffloadListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.AudioTrackScore"},{"p":"com.google.android.exoplayer2","l":"C.AudioUsage"},{"p":"com.google.android.exoplayer2.audio","l":"AuxEffectInfo"},{"p":"com.google.android.exoplayer2.video","l":"AvcConfig"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter"},{"p":"com.google.android.exoplayer2.audio","l":"BaseAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"BaseDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.BaseFactory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkIterator"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkOutput"},{"p":"com.google.android.exoplayer2.source","l":"BaseMediaSource"},{"p":"com.google.android.exoplayer2","l":"BasePlayer"},{"p":"com.google.android.exoplayer2","l":"BaseRenderer"},{"p":"com.google.android.exoplayer2.trackselection","l":"BaseTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"BaseUrl"},{"p":"com.google.android.exoplayer2.source.dash","l":"BaseUrlExclusionList"},{"p":"com.google.android.exoplayer2.source","l":"BehindLiveWindowException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"BinaryFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.BinarySearchSeekMap"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.BitmapCallback"},{"p":"com.google.android.exoplayer2.decoder","l":"Buffer"},{"p":"com.google.android.exoplayer2","l":"C.BufferFlags"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.BufferReplacementMode"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl.Builder"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl.Builder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.Builder"},{"p":"com.google.android.exoplayer2","l":"Format.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"Player.Commands.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.Builder"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader.Builder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.Builder"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource.Builder"},{"p":"com.google.android.exoplayer2.text","l":"Cue.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter.Builder"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet.Builder"},{"p":"com.google.android.exoplayer2","l":"Bundleable"},{"p":"com.google.android.exoplayer2.util","l":"BundleableUtils"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BundledChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"BundledExtractorsAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"BundledHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2","l":"BundleListRetriever"},{"p":"com.google.android.exoplayer2.util","l":"BundleUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSource"},{"p":"com.google.android.exoplayer2","l":"C"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.CacheDataSinkException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSinkFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSourceFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CachedRegionTracker"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheEvictor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.CacheException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.CacheIgnoredReason"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheKeyFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheSpan"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener.Callback"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.Callback"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod.Callback"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget.Callback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Callback"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionListener"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionRenderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.Capabilities"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CaptionCallback"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingAudioSink"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingRenderersFactory"},{"p":"com.google.android.exoplayer2.ext.cast","l":"CastPlayer"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea608Decoder"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea708Decoder"},{"p":"com.google.android.exoplayer2.extractor","l":"CeaUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterTocFrame"},{"p":"com.google.android.exoplayer2.source.chunk","l":"Chunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkHolder"},{"p":"com.google.android.exoplayer2.extractor","l":"ChunkIndex"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearMediaItems"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.CleartextNotPermittedException"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearVideoSurface"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingProperties"},{"p":"com.google.android.exoplayer2.util","l":"Clock"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer.CodecMaxValues"},{"p":"com.google.android.exoplayer2.util","l":"CodecSpecificDataUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Colored"},{"p":"com.google.android.exoplayer2.video","l":"ColorInfo"},{"p":"com.google.android.exoplayer2.util","l":"ColorParser"},{"p":"com.google.android.exoplayer2","l":"C.ColorRange"},{"p":"com.google.android.exoplayer2","l":"C.ColorSpace"},{"p":"com.google.android.exoplayer2","l":"C.ColorTransfer"},{"p":"com.google.android.exoplayer2","l":"Player.Command"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CommandReceiver"},{"p":"com.google.android.exoplayer2","l":"Player.Commands"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"CommentFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.CommentHeader"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.source","l":"CompositeMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoader"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"ConditionVariable"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.Config"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Config"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Configuration"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.ConfigurationException"},{"p":"com.google.android.exoplayer2.extractor","l":"ConstantBitrateSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"Consumer"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ContainerMediaChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource.ContentDataSourceException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadata"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadataMutations"},{"p":"com.google.android.exoplayer2","l":"C.ContentType"},{"p":"com.google.android.exoplayer2","l":"ControlDispatcher"},{"p":"com.google.android.exoplayer2.util","l":"CopyOnWriteMultiset"},{"p":"com.google.android.exoplayer2","l":"Bundleable.Creator"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSourceFactory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetUtil"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.CryptoData"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoInfo"},{"p":"com.google.android.exoplayer2","l":"C.CryptoMode"},{"p":"com.google.android.exoplayer2.text","l":"Cue"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CustomActionProvider"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.CustomActionReceiver"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.CustomCommandProvider"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource"},{"p":"com.google.android.exoplayer2.source.dash.offline","l":"DashDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifest"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashManifestStaleException"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashSegmentIndex"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashUtil"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashWrappingSegmentIndex"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseIOException"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"DataChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"DataReader"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSchemeDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceInputStream"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec"},{"p":"com.google.android.exoplayer2","l":"C.DataType"},{"p":"com.google.android.exoplayer2.util","l":"DebugTextViewHelper"},{"p":"com.google.android.exoplayer2.decoder","l":"Decoder"},{"p":"com.google.android.exoplayer2.audio","l":"DecoderAudioRenderer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderCounters"},{"p":"com.google.android.exoplayer2.testutil","l":"DecoderCountersUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderDiscardReasons"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer.DecoderInitializationException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil.DecoderQueryException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderReuseResult"},{"p":"com.google.android.exoplayer2.video","l":"DecoderVideoRenderer"},{"p":"com.google.android.exoplayer2.drm","l":"DecryptionException"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultAllocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DefaultAllowedCommandProvider"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.DefaultAudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultCastOptionsProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultCompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"DefaultContentMetadata"},{"p":"com.google.android.exoplayer2","l":"DefaultControlDispatcher"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource"},{"p":"com.google.android.exoplayer2.database","l":"DefaultDatabaseProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSourceFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloadIndex"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorsFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultLoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultMediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.DefaultMediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultPlaybackSessionManager"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"DefaultRenderersFactoryAsserts"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"DefaultRtpPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.DefaultSeekTimestampConverter"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.DefaultShuffleOrder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTimeBar"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTrackNameProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Definition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser.DeltaUpdateException"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Descriptor"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.DeviceComponent"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo"},{"p":"com.google.android.exoplayer2.device","l":"DeviceListener"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder.DialogCallback"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DisconnectedCallback"},{"p":"com.google.android.exoplayer2","l":"Player.DiscontinuityReason"},{"p":"com.google.android.exoplayer2.video","l":"DolbyVisionConfig"},{"p":"com.google.android.exoplayer2.offline","l":"Download"},{"p":"com.google.android.exoplayer2.testutil","l":"DownloadBuilder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadCursor"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader"},{"p":"com.google.android.exoplayer2.offline","l":"DownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil.DownloadIdProvider"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadIndex"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager"},{"p":"com.google.android.exoplayer2.ui","l":"DownloadNotificationHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadProgress"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadService"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.DrmSessionException"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager.DrmSessionReference"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DtsReader"},{"p":"com.google.android.exoplayer2.audio","l":"DtsUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower.Dummy"},{"p":"com.google.android.exoplayer2.upstream","l":"DummyDataSource"},{"p":"com.google.android.exoplayer2.drm","l":"DummyExoMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread"},{"p":"com.google.android.exoplayer2.video","l":"DummySurface"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper.Dumpable"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpableFormat"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpFileAsserts"},{"p":"com.google.android.exoplayer2.text.dvb","l":"DvbDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.DvbSubtitleInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DvbSubtitleReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat.EdgeType"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"ElementaryStreamReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor.ElementType"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.EmbeddedSampleStream"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.EmphasizedText"},{"p":"com.google.android.exoplayer2.source","l":"EmptySampleStream"},{"p":"com.google.android.exoplayer2","l":"C.Encoding"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata.Entry"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.ErrorCode"},{"p":"com.google.android.exoplayer2.util","l":"ErrorMessageProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil.ErrorSource"},{"p":"com.google.android.exoplayer2.drm","l":"ErrorStateDrmSession"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.EsInfo"},{"p":"com.google.android.exoplayer2","l":"Player.Event"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.Event"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.Event"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventFlags"},{"p":"com.google.android.exoplayer2","l":"Player.EventListener"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.EventListener"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.EventListener"},{"p":"com.google.android.exoplayer2.util","l":"EventLogger"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessage"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageDecoder"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageEncoder"},{"p":"com.google.android.exoplayer2","l":"Player.Events"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.Events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"EventStream"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventTime"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndException"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndFormat"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ExecuteRunnable"},{"p":"com.google.android.exoplayer2.database","l":"ExoDatabaseProvider"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoHostedTest"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer"},{"p":"com.google.android.exoplayer2","l":"ExoPlayerLibraryInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory.ExtensionRendererMode"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.ExtractorFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorOutput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorsFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorUtil"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource.Factory"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink"},{"p":"com.google.android.exoplayer2.offline","l":"Download.FailureReason"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAudioRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunk"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunkIterator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaClockRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream.FakeSampleStreamItem"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelection"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelector"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.FakeTransferListener"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackOptions"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackSelection"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackType"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegDecoderException"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegLibrary"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.FieldNumber"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.FileDataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes"},{"p":"com.google.android.exoplayer2.offline","l":"FilterableManifest"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"FilteringHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.offline","l":"FilteringManifestParser"},{"p":"com.google.android.exoplayer2.trackselection","l":"FixedTrackSelection"},{"p":"com.google.android.exoplayer2.util","l":"FlacConstants"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoderException"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacLibrary"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacSeekTableSeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader.FlacStreamMetadataHolder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Flags"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Flags"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Flags"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet"},{"p":"com.google.android.exoplayer2.extractor.flv","l":"FlvExtractor"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.FolderType"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.FontSizeUnit"},{"p":"com.google.android.exoplayer2","l":"Format"},{"p":"com.google.android.exoplayer2","l":"FormatHolder"},{"p":"com.google.android.exoplayer2","l":"C.FormatSupport"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.FormatSupport"},{"p":"com.google.android.exoplayer2.audio","l":"ForwardingAudioSink"},{"p":"com.google.android.exoplayer2.extractor","l":"ForwardingExtractorInput"},{"p":"com.google.android.exoplayer2","l":"ForwardingPlayer"},{"p":"com.google.android.exoplayer2.source","l":"ForwardingTimeline"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder.FramePredicate"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaCrypto"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"GaplessInfoHolder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Decoder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1DecoderException"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Library"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"GeobFrame"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.GlException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil"},{"p":"com.google.android.exoplayer2.ext.gvr","l":"GvrAudioProcessor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H262Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H263Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H264Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H265Reader"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock.HandlerMessage"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil.Header"},{"p":"com.google.android.exoplayer2","l":"HeartRating"},{"p":"com.google.android.exoplayer2.video","l":"HevcConfig"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls.offline","l":"HlsDownloader"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsManifest"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaPeriod"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry"},{"p":"com.google.android.exoplayer2.text.span","l":"HorizontalTextInVerticalContextSpan"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity.HostedTest"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException"},{"p":"com.google.android.exoplayer2.testutil","l":"HttpDataSourceTestEnv"},{"p":"com.google.android.exoplayer2.drm","l":"HttpMediaDrmCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.HttpMethod"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpUtil"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyDecoder"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyHeaders"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Frame"},{"p":"com.google.android.exoplayer2.extractor","l":"Id3Peeker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Id3Reader"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException"},{"p":"com.google.android.exoplayer2","l":"IllegalSeekPositionException"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil.Importance"},{"p":"com.google.android.exoplayer2.extractor","l":"IndexSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient.InitializationCallback"},{"p":"com.google.android.exoplayer2.source.chunk","l":"InitializationChunk"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.InitializationException"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource.InitialTimeline"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"InputReaderAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.InsufficientCapacityException"},{"p":"com.google.android.exoplayer2.util","l":"IntArrayQueue"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"InternalFrame"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector.InvalidationListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.InvalidAudioTrackTimestampException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidContentTypeException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidResponseCodeException"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.IterationFinishedEvent"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Iterator"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"JpegExtractor"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest"},{"p":"com.google.android.exoplayer2.drm","l":"KeysExpiredException"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyStatus"},{"p":"com.google.android.exoplayer2.text.span","l":"LanguageFeatureSpan"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"LatmReader"},{"p":"com.google.android.exoplayer2.ext.leanback","l":"LeanbackPlayerAdapter"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"LeastRecentlyUsedCacheEvictor"},{"p":"com.google.android.exoplayer2.ext.flac","l":"LibflacAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Libgav1VideoRenderer"},{"p":"com.google.android.exoplayer2.ext.opus","l":"LibopusAudioRenderer"},{"p":"com.google.android.exoplayer2.util","l":"LibraryLoader"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"LibvpxVideoRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.LicenseServer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.LineType"},{"p":"com.google.android.exoplayer2","l":"Player.Listener"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.Listener"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager.Listener"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Listener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.Listener"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Listener"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.LiveContentUnsupportedException"},{"p":"com.google.android.exoplayer2","l":"LivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Loadable"},{"p":"com.google.android.exoplayer2","l":"LoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.LoadErrorAction"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.LoadErrorInfo"},{"p":"com.google.android.exoplayer2.source","l":"LoadEventInfo"},{"p":"com.google.android.exoplayer2.drm","l":"LocalMediaDrmCallback"},{"p":"com.google.android.exoplayer2.util","l":"Log"},{"p":"com.google.android.exoplayer2.util","l":"LongArray"},{"p":"com.google.android.exoplayer2.source","l":"LoopingMediaSource"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkFill"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkShape"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MdtaMetadataEntry"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaButtonEventHandler"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunkIterator"},{"p":"com.google.android.exoplayer2.util","l":"MediaClock"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter"},{"p":"com.google.android.exoplayer2.audio","l":"MediaCodecAudioRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecDecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecSelector"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoDecoderException"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.MediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaDescriptionConverter"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallback"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallbackException"},{"p":"com.google.android.exoplayer2.util","l":"MediaFormatUtil"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaIdEqualityChecker"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaIdMediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"MediaItem"},{"p":"com.google.android.exoplayer2.ext.cast","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"Player.MediaItemTransitionReason"},{"p":"com.google.android.exoplayer2.source","l":"MediaLoadData"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaParserChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"MediaParserExtractorAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"MediaParserHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"MediaParserUtil"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriodId"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaPeriodId"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaSourceCaller"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaSourceTestRunner"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper.Message"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.MetadataComponent"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoder"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoderFactory"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataInputBuffer"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataOutput"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataRenderer"},{"p":"com.google.android.exoplayer2","l":"MetadataRetriever"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.MetadataType"},{"p":"com.google.android.exoplayer2.util","l":"MimeTypes"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser.MissingFieldException"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.MissingSchemeDataException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"MlltFrame"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Mode"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.Mode"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor.Mode"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MotionPhotoMetadata"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.MoveMediaItem"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"Mp4WebvttDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"MpegAudioReader"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.MultiSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.MultiSegmentRepresentation"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil"},{"p":"com.google.android.exoplayer2","l":"C.NetworkType"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver"},{"p":"com.google.android.exoplayer2.util","l":"NonNullApi"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"NoOpCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"NoSampleRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.NotificationListener"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"NoUidTimeline"},{"p":"com.google.android.exoplayer2.drm","l":"OfflineLicenseHelper"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OffloadMode"},{"p":"com.google.android.exoplayer2.extractor.ogg","l":"OggExtractor"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnExpirationUpdateListener"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.OnFrameRenderedListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.OnFullScreenModeChangedListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnKeyStatusChangeListener"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar.OnScrubListener"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.OpenException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoder"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoderException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusLibrary"},{"p":"com.google.android.exoplayer2.audio","l":"OpusUtil"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.OtherTrackScore"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"OutputConsumerAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"OutputBuffer.Owner"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.ParametersBuilder"},{"p":"com.google.android.exoplayer2.util","l":"ParsableBitArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableByteArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableNalUnitBitArray"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable.Parser"},{"p":"com.google.android.exoplayer2","l":"ParserException"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Part"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PassthroughSectionPayloadReader"},{"p":"com.google.android.exoplayer2","l":"C.PcmEncoding"},{"p":"com.google.android.exoplayer2","l":"PercentageRating"},{"p":"com.google.android.exoplayer2","l":"Timeline.Period"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Period"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PesReader"},{"p":"com.google.android.exoplayer2.text.pgs","l":"PgsDecoder"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"PictureFrame"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.PictureType"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource.PlaceholderTimeline"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler.PlatformSchedulerService"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackActions"},{"p":"com.google.android.exoplayer2","l":"PlaybackException"},{"p":"com.google.android.exoplayer2.robolectric","l":"PlaybackOutput"},{"p":"com.google.android.exoplayer2","l":"PlaybackParameters"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackPreparer"},{"p":"com.google.android.exoplayer2","l":"MediaItem.PlaybackProperties"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener"},{"p":"com.google.android.exoplayer2","l":"Player.PlaybackSuppressionReason"},{"p":"com.google.android.exoplayer2.device","l":"DeviceInfo.PlaybackType"},{"p":"com.google.android.exoplayer2","l":"Player"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerEmsgCallback"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerTrackEmsgHandler"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistEventListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistResetException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistStuckException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.PlaylistType"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.PlayUntilPosition"},{"p":"com.google.android.exoplayer2","l":"Player.PlayWhenReadyChangeReason"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation.Position"},{"p":"com.google.android.exoplayer2.extractor","l":"PositionHolder"},{"p":"com.google.android.exoplayer2","l":"Player.PositionInfo"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.PostConnectCallback"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.PpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Prepare"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod.PrepareListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PrimaryPlaylistListener"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Priority"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager.PriorityTooLowException"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"PrivateCommand"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"PrivFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ProgramInformation"},{"p":"com.google.android.exoplayer2.transformer","l":"ProgressHolder"},{"p":"com.google.android.exoplayer2.offline","l":"ProgressiveDownloader"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader.ProgressListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter.ProgressListener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.ProgressState"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2","l":"C.Projection"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.ProtectionElement"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.Provider"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.ProvisionRequest"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PsExtractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"PsshAtomUtil"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Purpose"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.QueueDataAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueNavigator"},{"p":"com.google.android.exoplayer2.robolectric","l":"RandomizedMp3Decoder"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"RangedUri"},{"p":"com.google.android.exoplayer2","l":"Rating"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.RatingCallback"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.RatingCallback"},{"p":"com.google.android.exoplayer2.extractor.rawcc","l":"RawCcExtractor"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource.RawResourceDataSourceException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadDataResult"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadFlags"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor.ReadResult"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException.Reason"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RelativeSized"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.ReleaseCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.ReleaseCallback"},{"p":"com.google.android.exoplayer2","l":"Timeline.RemotableTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItem"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItems"},{"p":"com.google.android.exoplayer2","l":"Renderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities"},{"p":"com.google.android.exoplayer2","l":"RendererConfiguration"},{"p":"com.google.android.exoplayer2","l":"RenderersFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Rendition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.RenditionReport"},{"p":"com.google.android.exoplayer2","l":"Player.RepeatMode"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"RepeatModeActionProvider"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil.RepeatToggleModes"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationHolder"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser.RepresentationInfo"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationSegmentIterator"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.RequestProperties"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts.RequestSet"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest.RequestType"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements.RequirementFlags"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.ResizeMode"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Resolver"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource"},{"p":"com.google.android.exoplayer2.util","l":"ReusableBufferedOutputStream"},{"p":"com.google.android.exoplayer2.robolectric","l":"RobolectricUtil"},{"p":"com.google.android.exoplayer2","l":"C.RoleFlags"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpAc3Reader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPayloadFormat"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpUtils"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.RtspPlaybackException"},{"p":"com.google.android.exoplayer2.text.span","l":"RubySpan"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RubyText"},{"p":"com.google.android.exoplayer2.util","l":"RunnableFutureTask"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.SampleDataPart"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader.SampleNumberHolder"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue"},{"p":"com.google.android.exoplayer2.source.hls","l":"SampleQueueMappingException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream"},{"p":"com.google.android.exoplayer2.scheduler","l":"Scheduler"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler.SchedulerWorker"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData.SchemeData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionReader"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.SecureMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Seek"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekOperationParams"},{"p":"com.google.android.exoplayer2","l":"SeekParameters"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekPoint"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.SeekPoints"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata.SeekTable"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekTimestampConverter"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData.Segment"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader.Segment"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Segment"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData.Segment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.SegmentBase"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentList"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTimelineElement"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SeiReader"},{"p":"com.google.android.exoplayer2","l":"C.SelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionOverride"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Sender"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SendMessages"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.ServerControl"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ServiceDescriptionElement"},{"p":"com.google.android.exoplayer2.ext.cast","l":"SessionAvailabilityListener"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionPlayerConnector"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetAudioAttributes"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItems"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItemsResetPosition"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlaybackParameters"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRendererDisabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRepeatMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleModeEnabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetVideoSurface"},{"p":"com.google.android.exoplayer2.robolectric","l":"ShadowMediaCodecConfig"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource"},{"p":"com.google.android.exoplayer2.audio","l":"SilenceSkippingAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"SimpleCache"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer"},{"p":"com.google.android.exoplayer2.metadata","l":"SimpleMetadataDecoder"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleOutputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SimpleSubtitleDecoder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.SimulatedIOException"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.SimulationConfig"},{"p":"com.google.android.exoplayer2.source.ads","l":"SinglePeriodAdTimeline"},{"p":"com.google.android.exoplayer2.source","l":"SinglePeriodTimeline"},{"p":"com.google.android.exoplayer2.source.chunk","l":"SingleSampleMediaChunk"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SingleSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.SingleSegmentRepresentation"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.SinkFormatSupport"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.SkipCallback"},{"p":"com.google.android.exoplayer2.util","l":"SlidingPercentile"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SmtaMetadataEntry"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient"},{"p":"com.google.android.exoplayer2.audio","l":"SonicAudioProcessor"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject"},{"p":"com.google.android.exoplayer2.text.span","l":"SpanUtil"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInfoDecoder"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceNullCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.SpsData"},{"p":"com.google.android.exoplayer2.text.ssa","l":"SsaDecoder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","l":"SsDownloader"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"StandaloneMediaClock"},{"p":"com.google.android.exoplayer2","l":"StarRating"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"StartOffsetExtractorOutput"},{"p":"com.google.android.exoplayer2","l":"Player.State"},{"p":"com.google.android.exoplayer2","l":"Renderer.State"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.State"},{"p":"com.google.android.exoplayer2.offline","l":"Download.State"},{"p":"com.google.android.exoplayer2.upstream","l":"StatsDataSource"},{"p":"com.google.android.exoplayer2","l":"C.StereoMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Stop"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.StreamElement"},{"p":"com.google.android.exoplayer2.offline","l":"StreamKey"},{"p":"com.google.android.exoplayer2","l":"C.StreamType"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo.StreamType"},{"p":"com.google.android.exoplayer2.testutil","l":"StubExoPlayer"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.StyleFlags"},{"p":"com.google.android.exoplayer2.text.subrip","l":"SubripDecoder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderException"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderFactory"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleInputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleOutputBuffer"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter"},{"p":"com.google.android.exoplayer2.util","l":"SystemClock"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Target"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"TeeDataSource"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestDownloadManagerListener"},{"p":"com.google.android.exoplayer2.testutil","l":"TestExoPlayerBuilder"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestPlayerRunHelper"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread.TestRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"TestUtil"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.TextComponent"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"TextInformationFrame"},{"p":"com.google.android.exoplayer2.text","l":"TextOutput"},{"p":"com.google.android.exoplayer2.text","l":"TextRenderer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.TextSizeType"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.TextTrackScore"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.TextureImageListener"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ThrowPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ThumbRating"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar"},{"p":"com.google.android.exoplayer2.util","l":"TimedValueQueue"},{"p":"com.google.android.exoplayer2","l":"Timeline"},{"p":"com.google.android.exoplayer2.testutil","l":"TimelineAsserts"},{"p":"com.google.android.exoplayer2","l":"Player.TimelineChangeReason"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueNavigator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline.TimelineWindowDefinition"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException.TimeoutOperation"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"TimeSignalCommand"},{"p":"com.google.android.exoplayer2.util","l":"TimestampAdjuster"},{"p":"com.google.android.exoplayer2.source.hls","l":"TimestampAdjusterProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSearchResult"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSeeker"},{"p":"com.google.android.exoplayer2.upstream","l":"TimeToFirstByteEstimator"},{"p":"com.google.android.exoplayer2.util","l":"TraceUtil"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod.TrackDataFactory"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"TrackEncryptionBox"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroup"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroupArray"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.TrackIdGenerator"},{"p":"com.google.android.exoplayer2.ui","l":"TrackNameProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.TrackOutputProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionArray"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView.TrackSelectionListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectorResult"},{"p":"com.google.android.exoplayer2.upstream","l":"TransferListener"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track.Transformation"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsUtil"},{"p":"com.google.android.exoplayer2.text.ttml","l":"TtmlDecoder"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.TunnelingSupport"},{"p":"com.google.android.exoplayer2.text.tx3g","l":"Tx3gDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException.Type"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException.Type"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException.Type"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes.Type"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Typefaced"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource.UdpDataSourceException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.UnexpectedDiscontinuityException"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.UnexpectedLoaderException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.UnhandledAudioFormatException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Uniform"},{"p":"com.google.android.exoplayer2.util","l":"UnknownNull"},{"p":"com.google.android.exoplayer2.source","l":"UnrecognizedInputFormatException"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.Unseekable"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.UnshuffledShuffleOrder"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedMediaCrypto"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.UnsupportedRequestException"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue.UpstreamFormatChangedListener"},{"p":"com.google.android.exoplayer2.util","l":"UriUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"UrlLinkFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UrlTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UtcTimingElement"},{"p":"com.google.android.exoplayer2.util","l":"Util"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Variant"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry.VariantInfo"},{"p":"com.google.android.exoplayer2.database","l":"VersionTable"},{"p":"com.google.android.exoplayer2.text","l":"Cue.VerticalType"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.VideoComponent"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderGLSurfaceView"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderInputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBufferRenderer"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameMetadataListener"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameReleaseHelper"},{"p":"com.google.android.exoplayer2.video","l":"VideoListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoOutputMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoScalingMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.VideoScalingMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoSize"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView.VideoSurfaceListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.VideoTrackScore"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView.ViewType"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Visibility"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisBitArray"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.VorbisIdHeader"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoder"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoderException"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxLibrary"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForIsLoading"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForMessage"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPendingPlayerCommands"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPositionDiscontinuity"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForTimelineChanged"},{"p":"com.google.android.exoplayer2","l":"C.WakeMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.WakeupListener"},{"p":"com.google.android.exoplayer2.extractor.wav","l":"WavExtractor"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.WavFileAudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"WavUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueInfo"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueParser"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttDecoder"},{"p":"com.google.android.exoplayer2.source.hls","l":"WebvttExtractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttParserUtil"},{"p":"com.google.android.exoplayer2.drm","l":"WidevineUtil"},{"p":"com.google.android.exoplayer2","l":"Timeline.Window"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.WithSpanFlags"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler"},{"p":"com.google.android.exoplayer2.offline","l":"WritableDownloadIndex"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.WriteException"},{"p":"com.google.android.exoplayer2.util","l":"XmlPullParserUtil"}] \ No newline at end of file +typeSearchIndex = [{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.AacAudioObjectType"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AbsoluteSized"},{"p":"com.google.android.exoplayer2","l":"AbstractConcatenatedTimeline"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util"},{"p":"com.google.android.exoplayer2.testutil","l":"Action"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.AdaptationCheckpoint"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"AdaptationSet"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.AdaptiveSupport"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil.AdaptiveTrackSelectionFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"AdditionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.AddMediaItems"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdGroup"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory.AdsLoaderProvider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdState"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsReader"},{"p":"com.google.android.exoplayer2.ui","l":"AdViewProvider"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSink"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSource"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesFlushingCipher"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Aligned"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocation"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.AllowedCommandProvider"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsCollector"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener"},{"p":"com.google.android.exoplayer2.text","l":"Cue.AnchorType"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AndSpanFlags"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ApicFrame"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTable"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTableDecoder"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.AppManagedProvider"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.AspectRatioListener"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig"},{"p":"com.google.android.exoplayer2.util","l":"Assertions"},{"p":"com.google.android.exoplayer2.testutil","l":"AssetContentProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource.AssetDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"AtomicFile"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Attribute"},{"p":"com.google.android.exoplayer2","l":"C.AudioAllowedCapturePolicy"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.AudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilities"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioComponent"},{"p":"com.google.android.exoplayer2","l":"C.AudioContentType"},{"p":"com.google.android.exoplayer2","l":"C.AudioFlags"},{"p":"com.google.android.exoplayer2","l":"C.AudioFocusGain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.AudioFormat"},{"p":"com.google.android.exoplayer2","l":"C.AudioManagerOffloadMode"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioOffloadListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.AudioTrackScore"},{"p":"com.google.android.exoplayer2","l":"C.AudioUsage"},{"p":"com.google.android.exoplayer2.audio","l":"AuxEffectInfo"},{"p":"com.google.android.exoplayer2.video","l":"AvcConfig"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter"},{"p":"com.google.android.exoplayer2.audio","l":"BaseAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"BaseDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.BaseFactory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkIterator"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkOutput"},{"p":"com.google.android.exoplayer2.source","l":"BaseMediaSource"},{"p":"com.google.android.exoplayer2","l":"BasePlayer"},{"p":"com.google.android.exoplayer2","l":"BaseRenderer"},{"p":"com.google.android.exoplayer2.trackselection","l":"BaseTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"BaseUrl"},{"p":"com.google.android.exoplayer2.source.dash","l":"BaseUrlExclusionList"},{"p":"com.google.android.exoplayer2.source","l":"BehindLiveWindowException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"BinaryFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.BinarySearchSeekMap"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.BitmapCallback"},{"p":"com.google.android.exoplayer2.decoder","l":"Buffer"},{"p":"com.google.android.exoplayer2","l":"C.BufferFlags"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.BufferReplacementMode"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl.Builder"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl.Builder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.Builder"},{"p":"com.google.android.exoplayer2","l":"Format.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.SubtitleConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"Player.Commands.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.Builder"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader.Builder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.Builder"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource.Builder"},{"p":"com.google.android.exoplayer2.text","l":"Cue.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionOverrides.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"TranscodingTransformer.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter.Builder"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet.Builder"},{"p":"com.google.android.exoplayer2","l":"Bundleable"},{"p":"com.google.android.exoplayer2.util","l":"BundleableUtil"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BundledChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"BundledExtractorsAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"BundledHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2","l":"BundleListRetriever"},{"p":"com.google.android.exoplayer2.util","l":"BundleUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSource"},{"p":"com.google.android.exoplayer2","l":"C"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.CacheDataSinkException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"CachedRegionTracker"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheEvictor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.CacheException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.CacheIgnoredReason"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheKeyFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheSpan"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener.Callback"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.Callback"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod.Callback"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget.Callback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Callback"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionListener"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionRenderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.Capabilities"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CaptionCallback"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingAudioSink"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingRenderersFactory"},{"p":"com.google.android.exoplayer2.ext.cast","l":"CastPlayer"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea608Decoder"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea708Decoder"},{"p":"com.google.android.exoplayer2.extractor","l":"CeaUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterTocFrame"},{"p":"com.google.android.exoplayer2.source.chunk","l":"Chunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkHolder"},{"p":"com.google.android.exoplayer2.extractor","l":"ChunkIndex"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearMediaItems"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.CleartextNotPermittedException"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearVideoSurface"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingConfiguration"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingProperties"},{"p":"com.google.android.exoplayer2.util","l":"Clock"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer.CodecMaxValues"},{"p":"com.google.android.exoplayer2.util","l":"CodecSpecificDataUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Colored"},{"p":"com.google.android.exoplayer2.video","l":"ColorInfo"},{"p":"com.google.android.exoplayer2.util","l":"ColorParser"},{"p":"com.google.android.exoplayer2","l":"C.ColorRange"},{"p":"com.google.android.exoplayer2","l":"C.ColorSpace"},{"p":"com.google.android.exoplayer2","l":"C.ColorTransfer"},{"p":"com.google.android.exoplayer2","l":"Player.Command"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CommandReceiver"},{"p":"com.google.android.exoplayer2","l":"Player.Commands"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"CommentFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.CommentHeader"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.source","l":"CompositeMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoader"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"ConditionVariable"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.Config"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Config"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Configuration"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.ConfigurationException"},{"p":"com.google.android.exoplayer2.extractor","l":"ConstantBitrateSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"Consumer"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ContainerMediaChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource.ContentDataSourceException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadata"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadataMutations"},{"p":"com.google.android.exoplayer2","l":"C.ContentType"},{"p":"com.google.android.exoplayer2.util","l":"CopyOnWriteMultiset"},{"p":"com.google.android.exoplayer2","l":"Bundleable.Creator"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSourceFactory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoConfig"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.CryptoData"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoException"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoInfo"},{"p":"com.google.android.exoplayer2","l":"C.CryptoMode"},{"p":"com.google.android.exoplayer2","l":"C.CryptoType"},{"p":"com.google.android.exoplayer2.text","l":"Cue"},{"p":"com.google.android.exoplayer2.text","l":"CueDecoder"},{"p":"com.google.android.exoplayer2.text","l":"CueEncoder"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CustomActionProvider"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.CustomActionReceiver"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.CustomCommandProvider"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource"},{"p":"com.google.android.exoplayer2.source.dash.offline","l":"DashDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifest"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashManifestStaleException"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashSegmentIndex"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashUtil"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashWrappingSegmentIndex"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseIOException"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"DataChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"DataReader"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSchemeDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceInputStream"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec"},{"p":"com.google.android.exoplayer2","l":"C.DataType"},{"p":"com.google.android.exoplayer2.util","l":"DebugTextViewHelper"},{"p":"com.google.android.exoplayer2.decoder","l":"Decoder"},{"p":"com.google.android.exoplayer2.audio","l":"DecoderAudioRenderer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderCounters"},{"p":"com.google.android.exoplayer2.testutil","l":"DecoderCountersUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderDiscardReasons"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer.DecoderInitializationException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil.DecoderQueryException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderReuseResult"},{"p":"com.google.android.exoplayer2.video","l":"DecoderVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultAllocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DefaultAllowedCommandProvider"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.DefaultAudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultCastOptionsProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultCompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"DefaultContentMetadata"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource"},{"p":"com.google.android.exoplayer2.database","l":"DefaultDatabaseProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSourceFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloadIndex"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorsFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultLoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.mediacodec","l":"DefaultMediaCodecAdapterFactory"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultMediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.DefaultMediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultPlaybackSessionManager"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"DefaultRenderersFactoryAsserts"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"DefaultRtpPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.DefaultSeekTimestampConverter"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.DefaultShuffleOrder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTimeBar"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTrackNameProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Definition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser.DeltaUpdateException"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Descriptor"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.DeviceComponent"},{"p":"com.google.android.exoplayer2","l":"DeviceInfo"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder.DialogCallback"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DisconnectedCallback"},{"p":"com.google.android.exoplayer2","l":"Player.DiscontinuityReason"},{"p":"com.google.android.exoplayer2.video","l":"DolbyVisionConfig"},{"p":"com.google.android.exoplayer2.offline","l":"Download"},{"p":"com.google.android.exoplayer2.testutil","l":"DownloadBuilder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadCursor"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader"},{"p":"com.google.android.exoplayer2.offline","l":"DownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper"},{"p":"com.google.android.exoplayer2.offline","l":"ActionFileUpgradeUtil.DownloadIdProvider"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadIndex"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager"},{"p":"com.google.android.exoplayer2.ui","l":"DownloadNotificationHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadProgress"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadService"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.DrmSessionException"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager.DrmSessionReference"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DtsReader"},{"p":"com.google.android.exoplayer2.audio","l":"DtsUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower.Dummy"},{"p":"com.google.android.exoplayer2.upstream","l":"DummyDataSource"},{"p":"com.google.android.exoplayer2.drm","l":"DummyExoMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread"},{"p":"com.google.android.exoplayer2.video","l":"DummySurface"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper.Dumpable"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpableFormat"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpFileAsserts"},{"p":"com.google.android.exoplayer2.text.dvb","l":"DvbDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.DvbSubtitleInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DvbSubtitleReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat.EdgeType"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"ElementaryStreamReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor.ElementType"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.EmbeddedSampleStream"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.EmphasizedText"},{"p":"com.google.android.exoplayer2.source","l":"EmptySampleStream"},{"p":"com.google.android.exoplayer2","l":"C.Encoding"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata.Entry"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.ErrorCode"},{"p":"com.google.android.exoplayer2.util","l":"ErrorMessageProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil.ErrorSource"},{"p":"com.google.android.exoplayer2.drm","l":"ErrorStateDrmSession"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.EsInfo"},{"p":"com.google.android.exoplayer2","l":"Player.Event"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.Event"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.Event"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventFlags"},{"p":"com.google.android.exoplayer2","l":"Player.EventListener"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.EventListener"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.EventListener"},{"p":"com.google.android.exoplayer2.util","l":"EventLogger"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessage"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageDecoder"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageEncoder"},{"p":"com.google.android.exoplayer2","l":"Player.Events"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.Events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"EventStream"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventTime"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndException"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndFormat"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ExecuteRunnable"},{"p":"com.google.android.exoplayer2.database","l":"ExoDatabaseProvider"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoHostedTest"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer"},{"p":"com.google.android.exoplayer2.text","l":"ExoplayerCuesDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayerLibraryInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory.ExtensionRendererMode"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.ExtractorFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorOutput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorsFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorUtil"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource.Factory"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink"},{"p":"com.google.android.exoplayer2.offline","l":"Download.FailureReason"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAudioRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeCryptoConfig"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunk"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunkIterator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaClockRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMetadataEntry"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream.FakeSampleStreamItem"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelection"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelector"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.FakeTransferListener"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackOptions"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackSelection"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackType"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegDecoderException"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegLibrary"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.FieldNumber"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.FileDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes"},{"p":"com.google.android.exoplayer2.offline","l":"FilterableManifest"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"FilteringHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.offline","l":"FilteringManifestParser"},{"p":"com.google.android.exoplayer2.trackselection","l":"FixedTrackSelection"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacConstants"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoderException"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacLibrary"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacSeekTableSeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader.FlacStreamMetadataHolder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Flags"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Flags"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Flags"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet"},{"p":"com.google.android.exoplayer2.extractor.flv","l":"FlvExtractor"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.FolderType"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.FontSizeUnit"},{"p":"com.google.android.exoplayer2","l":"Format"},{"p":"com.google.android.exoplayer2","l":"FormatHolder"},{"p":"com.google.android.exoplayer2","l":"C.FormatSupport"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.FormatSupport"},{"p":"com.google.android.exoplayer2.audio","l":"ForwardingAudioSink"},{"p":"com.google.android.exoplayer2.extractor","l":"ForwardingExtractorInput"},{"p":"com.google.android.exoplayer2","l":"ForwardingPlayer"},{"p":"com.google.android.exoplayer2.source","l":"ForwardingTimeline"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder.FramePredicate"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkCryptoConfig"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"GaplessInfoHolder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Decoder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1DecoderException"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Library"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"GeobFrame"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.GlException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.GlException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H262Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H263Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H264Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H265Reader"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.H265SpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock.HandlerMessage"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil.Header"},{"p":"com.google.android.exoplayer2","l":"HeartRating"},{"p":"com.google.android.exoplayer2.video","l":"HevcConfig"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls.offline","l":"HlsDownloader"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsManifest"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaPeriod"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry"},{"p":"com.google.android.exoplayer2.text.span","l":"HorizontalTextInVerticalContextSpan"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity.HostedTest"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException"},{"p":"com.google.android.exoplayer2.testutil","l":"HttpDataSourceTestEnv"},{"p":"com.google.android.exoplayer2.drm","l":"HttpMediaDrmCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.HttpMethod"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpUtil"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyDecoder"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyHeaders"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Frame"},{"p":"com.google.android.exoplayer2.extractor","l":"Id3Peeker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Id3Reader"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException"},{"p":"com.google.android.exoplayer2","l":"IllegalSeekPositionException"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil.Importance"},{"p":"com.google.android.exoplayer2.extractor","l":"IndexSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient.InitializationCallback"},{"p":"com.google.android.exoplayer2.source.chunk","l":"InitializationChunk"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.InitializationException"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource.InitialTimeline"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"InputReaderAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.InsufficientCapacityException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"InternalFrame"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector.InvalidationListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.InvalidAudioTrackTimestampException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidContentTypeException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidResponseCodeException"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.IterationFinishedEvent"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Iterator"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"JpegExtractor"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest"},{"p":"com.google.android.exoplayer2.drm","l":"KeysExpiredException"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyStatus"},{"p":"com.google.android.exoplayer2.text.span","l":"LanguageFeatureSpan"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"LatmReader"},{"p":"com.google.android.exoplayer2.ext.leanback","l":"LeanbackPlayerAdapter"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"LeastRecentlyUsedCacheEvictor"},{"p":"com.google.android.exoplayer2.ext.flac","l":"LibflacAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Libgav1VideoRenderer"},{"p":"com.google.android.exoplayer2.ext.opus","l":"LibopusAudioRenderer"},{"p":"com.google.android.exoplayer2.util","l":"LibraryLoader"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"LibvpxVideoRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.LicenseServer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.LineType"},{"p":"com.google.android.exoplayer2","l":"Player.Listener"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.Listener"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager.Listener"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"TranscodingTransformer.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Listener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.Listener"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Listener"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.LiveContentUnsupportedException"},{"p":"com.google.android.exoplayer2","l":"LivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Loadable"},{"p":"com.google.android.exoplayer2","l":"LoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.LoadErrorAction"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.LoadErrorInfo"},{"p":"com.google.android.exoplayer2.source","l":"LoadEventInfo"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LocalConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"LocalMediaDrmCallback"},{"p":"com.google.android.exoplayer2.util","l":"Log"},{"p":"com.google.android.exoplayer2.util","l":"LongArray"},{"p":"com.google.android.exoplayer2.source","l":"LoopingMediaSource"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkFill"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkShape"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MdtaMetadataEntry"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaButtonEventHandler"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunkIterator"},{"p":"com.google.android.exoplayer2.util","l":"MediaClock"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter"},{"p":"com.google.android.exoplayer2.audio","l":"MediaCodecAudioRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecDecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecSelector"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoDecoderException"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.MediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaDescriptionConverter"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallback"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallbackException"},{"p":"com.google.android.exoplayer2.util","l":"MediaFormatUtil"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaIdEqualityChecker"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaIdMediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"MediaItem"},{"p":"com.google.android.exoplayer2.ext.cast","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"Player.MediaItemTransitionReason"},{"p":"com.google.android.exoplayer2.source","l":"MediaLoadData"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaParserChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"MediaParserExtractorAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"MediaParserHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"MediaParserUtil"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriodId"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaPeriodId"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaSourceCaller"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaSourceTestRunner"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper.Message"},{"p":"com.google.android.exoplayer2","l":"Renderer.MessageType"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoder"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoderFactory"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataInputBuffer"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataOutput"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataRenderer"},{"p":"com.google.android.exoplayer2","l":"MetadataRetriever"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.MetadataType"},{"p":"com.google.android.exoplayer2.util","l":"MimeTypes"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser.MissingFieldException"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.MissingSchemeDataException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"MlltFrame"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Mode"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.Mode"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor.Mode"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MotionPhotoMetadata"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.MoveMediaItem"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"Mp4WebvttDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"MpegAudioReader"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.MultiSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.MultiSegmentRepresentation"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil"},{"p":"com.google.android.exoplayer2","l":"C.NetworkType"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver"},{"p":"com.google.android.exoplayer2.util","l":"NonNullApi"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"NoOpCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"NoSampleRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.NotificationListener"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"NoUidTimeline"},{"p":"com.google.android.exoplayer2.drm","l":"OfflineLicenseHelper"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OffloadMode"},{"p":"com.google.android.exoplayer2.extractor.ogg","l":"OggExtractor"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnExpirationUpdateListener"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.OnFrameRenderedListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.OnFullScreenModeChangedListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnKeyStatusChangeListener"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar.OnScrubListener"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.OpenException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoder"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoderException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusLibrary"},{"p":"com.google.android.exoplayer2.audio","l":"OpusUtil"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.OtherTrackScore"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"OutputConsumerAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderOutputBuffer.Owner"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.ParametersBuilder"},{"p":"com.google.android.exoplayer2.util","l":"ParsableBitArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableByteArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableNalUnitBitArray"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable.Parser"},{"p":"com.google.android.exoplayer2","l":"ParserException"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Part"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PassthroughSectionPayloadReader"},{"p":"com.google.android.exoplayer2","l":"C.PcmEncoding"},{"p":"com.google.android.exoplayer2","l":"PercentageRating"},{"p":"com.google.android.exoplayer2","l":"Timeline.Period"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Period"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PesReader"},{"p":"com.google.android.exoplayer2.text.pgs","l":"PgsDecoder"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"PictureFrame"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.PictureType"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource.PlaceholderTimeline"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler.PlatformSchedulerService"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackActions"},{"p":"com.google.android.exoplayer2","l":"PlaybackException"},{"p":"com.google.android.exoplayer2.robolectric","l":"PlaybackOutput"},{"p":"com.google.android.exoplayer2","l":"PlaybackParameters"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackPreparer"},{"p":"com.google.android.exoplayer2","l":"MediaItem.PlaybackProperties"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener"},{"p":"com.google.android.exoplayer2","l":"Player.PlaybackSuppressionReason"},{"p":"com.google.android.exoplayer2","l":"DeviceInfo.PlaybackType"},{"p":"com.google.android.exoplayer2","l":"Player"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerEmsgCallback"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerTrackEmsgHandler"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistEventListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistResetException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistStuckException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.PlaylistType"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.PlayUntilPosition"},{"p":"com.google.android.exoplayer2","l":"Player.PlayWhenReadyChangeReason"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation.Position"},{"p":"com.google.android.exoplayer2.extractor","l":"PositionHolder"},{"p":"com.google.android.exoplayer2","l":"Player.PositionInfo"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.PostConnectCallback"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.PpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Prepare"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod.PrepareListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PrimaryPlaylistListener"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Priority"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager.PriorityTooLowException"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"PrivateCommand"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"PrivFrame"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Program"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ProgramInformation"},{"p":"com.google.android.exoplayer2.transformer","l":"ProgressHolder"},{"p":"com.google.android.exoplayer2.offline","l":"ProgressiveDownloader"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader.ProgressListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter.ProgressListener"},{"p":"com.google.android.exoplayer2.transformer","l":"TranscodingTransformer.ProgressState"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.ProgressState"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2","l":"C.Projection"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.ProtectionElement"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.Provider"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.ProvisionRequest"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PsExtractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"PsshAtomUtil"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Purpose"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.QueueDataAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueNavigator"},{"p":"com.google.android.exoplayer2.robolectric","l":"RandomizedMp3Decoder"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"RangedUri"},{"p":"com.google.android.exoplayer2","l":"Rating"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.RatingCallback"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.RatingCallback"},{"p":"com.google.android.exoplayer2.extractor.rawcc","l":"RawCcExtractor"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource.RawResourceDataSourceException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadDataResult"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadFlags"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor.ReadResult"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException.Reason"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RelativeSized"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.ReleaseCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.ReleaseCallback"},{"p":"com.google.android.exoplayer2","l":"Timeline.RemotableTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItem"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItems"},{"p":"com.google.android.exoplayer2","l":"Renderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities"},{"p":"com.google.android.exoplayer2","l":"RendererConfiguration"},{"p":"com.google.android.exoplayer2","l":"RenderersFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Rendition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.RenditionReport"},{"p":"com.google.android.exoplayer2","l":"Player.RepeatMode"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"RepeatModeActionProvider"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil.RepeatToggleModes"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationHolder"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser.RepresentationInfo"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationSegmentIterator"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.RequestProperties"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts.RequestSet"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest.RequestType"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements.RequirementFlags"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.ResizeMode"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Resolver"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource"},{"p":"com.google.android.exoplayer2.robolectric","l":"RobolectricUtil"},{"p":"com.google.android.exoplayer2","l":"C.RoleFlags"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpAc3Reader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPayloadFormat"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpUtils"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.RtspPlaybackException"},{"p":"com.google.android.exoplayer2.text.span","l":"RubySpan"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RubyText"},{"p":"com.google.android.exoplayer2.util","l":"RunnableFutureTask"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.SampleDataPart"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader.SampleNumberHolder"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue"},{"p":"com.google.android.exoplayer2.source.hls","l":"SampleQueueMappingException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream"},{"p":"com.google.android.exoplayer2.scheduler","l":"Scheduler"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler.SchedulerWorker"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData.SchemeData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionReader"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.SecureMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Seek"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekOperationParams"},{"p":"com.google.android.exoplayer2","l":"SeekParameters"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekPoint"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.SeekPoints"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata.SeekTable"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekTimestampConverter"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData.Segment"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader.Segment"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Segment"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData.Segment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.SegmentBase"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentList"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTimelineElement"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SeiReader"},{"p":"com.google.android.exoplayer2","l":"C.SelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionOverride"},{"p":"com.google.android.exoplayer2","l":"C.SelectionReason"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Sender"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SendMessages"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.ServerControl"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideInsertedAdsUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ServiceDescriptionElement"},{"p":"com.google.android.exoplayer2.ext.cast","l":"SessionAvailabilityListener"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionPlayerConnector"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetAudioAttributes"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItems"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItemsResetPosition"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlaybackParameters"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRendererDisabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRepeatMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleModeEnabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetVideoSurface"},{"p":"com.google.android.exoplayer2.robolectric","l":"ShadowMediaCodecConfig"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource"},{"p":"com.google.android.exoplayer2.audio","l":"SilenceSkippingAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"SimpleCache"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoder"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer"},{"p":"com.google.android.exoplayer2.metadata","l":"SimpleMetadataDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SimpleSubtitleDecoder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.SimulatedIOException"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.SimulationConfig"},{"p":"com.google.android.exoplayer2.source.ads","l":"SinglePeriodAdTimeline"},{"p":"com.google.android.exoplayer2.source","l":"SinglePeriodTimeline"},{"p":"com.google.android.exoplayer2.source.chunk","l":"SingleSampleMediaChunk"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SingleSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.SingleSegmentRepresentation"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.SinkFormatSupport"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.SkipCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"SlidingPercentile"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SmtaMetadataEntry"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient"},{"p":"com.google.android.exoplayer2.audio","l":"SonicAudioProcessor"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject"},{"p":"com.google.android.exoplayer2.text.span","l":"SpanUtil"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInfoDecoder"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceNullCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.SpsData"},{"p":"com.google.android.exoplayer2.text.ssa","l":"SsaDecoder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","l":"SsDownloader"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource"},{"p":"com.google.android.exoplayer2.database","l":"StandaloneDatabaseProvider"},{"p":"com.google.android.exoplayer2.util","l":"StandaloneMediaClock"},{"p":"com.google.android.exoplayer2","l":"StarRating"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"StartOffsetExtractorOutput"},{"p":"com.google.android.exoplayer2","l":"Player.State"},{"p":"com.google.android.exoplayer2","l":"Renderer.State"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.State"},{"p":"com.google.android.exoplayer2.offline","l":"Download.State"},{"p":"com.google.android.exoplayer2.upstream","l":"StatsDataSource"},{"p":"com.google.android.exoplayer2","l":"C.StereoMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Stop"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.StreamElement"},{"p":"com.google.android.exoplayer2.offline","l":"StreamKey"},{"p":"com.google.android.exoplayer2","l":"C.StreamType"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo.StreamType"},{"p":"com.google.android.exoplayer2.testutil","l":"StubExoPlayer"},{"p":"com.google.android.exoplayer2.testutil","l":"StubPlayer"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.StyleFlags"},{"p":"com.google.android.exoplayer2.text.subrip","l":"SubripDecoder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"Subtitle"},{"p":"com.google.android.exoplayer2","l":"MediaItem.SubtitleConfiguration"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderException"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderFactory"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleExtractor"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleInputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleOutputBuffer"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter"},{"p":"com.google.android.exoplayer2.util","l":"SystemClock"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Target"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"TeeDataSource"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestDownloadManagerListener"},{"p":"com.google.android.exoplayer2.testutil","l":"TestExoPlayerBuilder"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestPlayerRunHelper"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread.TestRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"TestUtil"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.TextComponent"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"TextInformationFrame"},{"p":"com.google.android.exoplayer2.text","l":"TextOutput"},{"p":"com.google.android.exoplayer2.text","l":"TextRenderer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.TextSizeType"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.TextTrackScore"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.TextureImageListener"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ThrowPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ThumbRating"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar"},{"p":"com.google.android.exoplayer2.util","l":"TimedValueQueue"},{"p":"com.google.android.exoplayer2","l":"Timeline"},{"p":"com.google.android.exoplayer2.testutil","l":"TimelineAsserts"},{"p":"com.google.android.exoplayer2","l":"Player.TimelineChangeReason"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueNavigator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline.TimelineWindowDefinition"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException.TimeoutOperation"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"TimeSignalCommand"},{"p":"com.google.android.exoplayer2.util","l":"TimestampAdjuster"},{"p":"com.google.android.exoplayer2.source.hls","l":"TimestampAdjusterProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSearchResult"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSeeker"},{"p":"com.google.android.exoplayer2.upstream","l":"TimeToFirstByteEstimator"},{"p":"com.google.android.exoplayer2.util","l":"TraceUtil"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod.TrackDataFactory"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"TrackEncryptionBox"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroup"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroupArray"},{"p":"com.google.android.exoplayer2","l":"TracksInfo.TrackGroupInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.TrackIdGenerator"},{"p":"com.google.android.exoplayer2.ui","l":"TrackNameProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.TrackOutputProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionArray"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView.TrackSelectionListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionOverrides.TrackSelectionOverride"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionOverrides"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectorResult"},{"p":"com.google.android.exoplayer2","l":"TracksInfo"},{"p":"com.google.android.exoplayer2","l":"C.TrackType"},{"p":"com.google.android.exoplayer2.transformer","l":"TranscodingTransformer"},{"p":"com.google.android.exoplayer2.upstream","l":"TransferListener"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track.Transformation"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer"},{"p":"com.google.android.exoplayer2.extractor","l":"TrueHdSampleRechunker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsUtil"},{"p":"com.google.android.exoplayer2.text.ttml","l":"TtmlDecoder"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.TunnelingSupport"},{"p":"com.google.android.exoplayer2.text.tx3g","l":"Tx3gDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException.Type"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException.Type"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection.Type"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException.Type"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes.Type"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Typefaced"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource.UdpDataSourceException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.UnexpectedDiscontinuityException"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.UnexpectedLoaderException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.UnhandledAudioFormatException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.Uniform"},{"p":"com.google.android.exoplayer2.util","l":"UnknownNull"},{"p":"com.google.android.exoplayer2.source","l":"UnrecognizedInputFormatException"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.Unseekable"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.UnshuffledShuffleOrder"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.UnsupportedEglVersionException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.UnsupportedRequestException"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue.UpstreamFormatChangedListener"},{"p":"com.google.android.exoplayer2.util","l":"UriUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"UrlLinkFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UrlTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UtcTimingElement"},{"p":"com.google.android.exoplayer2.util","l":"Util"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist.Variant"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry.VariantInfo"},{"p":"com.google.android.exoplayer2.database","l":"VersionTable"},{"p":"com.google.android.exoplayer2.text","l":"Cue.VerticalType"},{"p":"com.google.android.exoplayer2","l":"C.VideoChangeFrameRateStrategy"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.VideoComponent"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderGLSurfaceView"},{"p":"com.google.android.exoplayer2.decoder","l":"VideoDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBufferRenderer"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameMetadataListener"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameReleaseHelper"},{"p":"com.google.android.exoplayer2","l":"C.VideoOutputMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoScalingMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoSize"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView.VideoSurfaceListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.VideoTrackScore"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView.ViewType"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Visibility"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisBitArray"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.VorbisIdHeader"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoder"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoderException"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxLibrary"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForIsLoading"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForMessage"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPendingPlayerCommands"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPositionDiscontinuity"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForTimelineChanged"},{"p":"com.google.android.exoplayer2","l":"C.WakeMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.WakeupListener"},{"p":"com.google.android.exoplayer2.extractor.wav","l":"WavExtractor"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.WavFileAudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"WavUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueInfo"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueParser"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttDecoder"},{"p":"com.google.android.exoplayer2.source.hls","l":"WebvttExtractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttParserUtil"},{"p":"com.google.android.exoplayer2.drm","l":"WidevineUtil"},{"p":"com.google.android.exoplayer2","l":"Timeline.Window"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.WithSpanFlags"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler"},{"p":"com.google.android.exoplayer2.offline","l":"WritableDownloadIndex"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.WriteException"},{"p":"com.google.android.exoplayer2.util","l":"XmlPullParserUtil"}] diff --git a/docs/doc/reference/type-search-index.zip b/docs/doc/reference/type-search-index.zip index f9e9df88c79690919ec503031b4ca5cb43c8f89b..3659c8cc3fdf54c3381deba80b4fb82c74a7611a 100644 GIT binary patch literal 10295 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 literal 10091 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 nW36CIoAOFlD@Ka(=%qX@I{OpHoVTW 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 CG9_&Q